Every symbol carries a tag, and what carries no rule says so
Every symbol of the system's code — a function, a class or a member of one, a type, a constant, a component — carries a tag naming the node it implements, wherever in the code it stands and whichever domain the node belongs to; a symbol inside another is covered by the tag of the one it stands in.
A symbol that implements none of the system's logic but is required by the technology the system is built with — a framework, a library, the infrastructure — such as a module's re-exports or the glue a library needs, carries instead a tag that names no node and gives its reason.
The repository's tools, its configuration and its tests are exempt by where they live.
Only a symbol whose code a commit changes must name a checked node. A change to its tags is a change to its code; rewording the rest of its comments, moving a citation onto another sid or renaming an identifier everywhere it is spelled changes no code.
A tag on every symbol is what makes logic without a rule visible: a symbol left untagged until somebody changes it hides until then whether any rule asks for it, one tag per file lets every symbol added to it later go untraced, and a binding read by the domain a file stands in misses code that implements another domain's rule.
Code that serves the stack exists because of how the system is built, not because of what it does, so there is no rule for it to cite; demanding one teaches people to attach whichever id is nearest, and marking it explicitly keeps 'nobody tagged it' apart from 'there is nothing to tag'.
Only a symbol whose code changes must name a checked node, since a rule under revision is unchecked while the code written against its earlier wording still stands, and a comment reworded, a citation moved or a name changed everywhere it is spelled changes nothing the code does. A tag counts as code because it decides which node the code is held to: were a change to it not counted, a tag could be moved onto an unchecked node, or onto one the code does not implement, with nothing refusing it.
The links made to it
The decisions taken on it
- Problem
One tag per changed file was owed, and only in a domain with a checked rule of its own, so code implementing two checked rules of another domain shipped with no tag, and logic no rule stated passed beside it.
- Ruling
The owner: code changes only through the specification and never the reverse, enforced by scripts that refuse logic without a reference back to the specification and by an independent reviewer; every declaration a commit adds or changes carries a tag, in every domain and in contracts.
- Problem
A tag was owed only by a declaration a commit added or changed, so code nobody had touched since the rules were written stayed untagged, and whether a rule asked for it could not be seen.
- Ruling
The owner: every declaration always carries a tag; a project adopting the method tags its code before the check is turned on.
The tests bound to it
- skills/tools/test/unit/binding.test.ts · s-kgbzk2ph9e6jfb4 counts a change to a tag as a change to the symbol's code
- skills/tools/test/unit/binding.test.ts · s-kgbzk2ph9e6jfb4 counts as changed a line whose text after // or # stands inside a string
- skills/tools/test/unit/binding.test.ts · s-kgbzk2ph9e6jfb4 counts as changed a symbol where a name is replaced but the old one is still spelled
- skills/tools/test/unit/binding.test.ts · s-kgbzk2ph9e6jfb4 counts as unchanged a symbol whose lines differ only in a comment, a citation's sid or a name renamed throughout
- skills/tools/test/unit/binding.test.ts · s-kgbzk2ph9e6jfb4 counts as unchanged a symbol whose only change is a line inside a comment of several lines
- skills/tools/test/unit/binding.test.ts · s-kgbzk2ph9e6jfb4 lets a symbol the commit leaves unchanged keep a tag naming an unchecked node