Canon map duplication: the skill reads each criteria home from the home itself - #590
Merged
Conversation
The canon map names where every home's unit enumeration is read from and what judgement each needs on top of it, so the walk enumerates against the canon at the commit audited. Reach is a property each unit states for itself, read at walk time. The per-home boundaries admit Detect from the principles home where no catalog entry's Detect reaches the shape, which is the class that home declares it covers. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The coverage obligation is every unit of every home, enumerated from each home's own headings. A ledger measured against a carried count reports a clean sweep over units the count omits. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The Homes table carries each home's path and what it owns; unit grain, size and enumeration live with the home. The audit walk reads its unit list from the canon at the commit audited, and a file kind's binding units follow from each unit's own stated reach. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A principle's stance spans every spelling of its defect; the entry it names keys on the spellings it names. The pairing settles only the shapes that Detect reaches, so a stance reaching further leaves the principle as the sole detector for the remainder, and that distance is a finding against operative-criteria-need-a-home. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The skill that reads our design canon had copied pieces of the canon into itself: lists of section
headings, counts of how many sections each file holds, and one file's length in lines. Every copy
agreed with the canon only for as long as nobody added to the canon, and nothing anywhere compared
the two. Four had already fallen out of step.
One of those copies decided whether an audit had covered everything. Because it was built from
numbers that were too low, an audit could account for every unit the numbers named, satisfy the
check, and report a clean sweep — having never looked at some of the criteria at all.
This replaces each copy with the location of the thing it was copying and the command that reads it.
What happens today
The skill's reference file reproduces the anti-pattern catalogue's thirteen family headings. The
reason given is that catalogue entries sit outside those family sections, so scanning for headings
would silently drop them. Nothing sits outside them — every entry lives under one of the thirteen,
and a heading scan returns exactly the same thirteen. The reproduced table is character-for-character
what that scan prints, and the same file tells the reader to run that scan twenty lines further down.
Three more copies are simply wrong. The file says the design-principles home holds thirty numbered
principles; it holds thirty-five. It says the schema construct inventory holds six sections and names
six; the file has seven. It describes the catalogue as roughly 1,700 lines; it is 1,974.
The missing seventh section is the serious one. It is the inventory's first section, and it carries
that home's binding rule — every piece of prose is checked against the inventory, and where a formal
construct exists it is used. Listing six sections put that rule outside the set an audit walks. The
sentence immediately after the list paraphrases part of that same section, which makes the omission
read as covered.
The reporting reference then decides whether a walk was partial by counting: thirteen catalogue
units, six inventory units, thirty principles, one conformance unit. Two of those three counts are
low. A walk that reached neither the inventory's binding rule nor five of the principles could
account for everything the counts named and be reported complete. Fifty-eight lines later, the same
file forbids citing the catalogue by any count of its entries.
Several facts also had more than one home inside the skill: the unit counts appeared in three files,
the rule about citing principles by title rather than by anchor appeared twice with different
examples, and the description of what an audit's change surface includes appeared twice, one copy
naming the other as authoritative.
Separately, the skill forbade taking detection criteria from the principles home outright. That home
states in its own overview that it covers "related failures not yet catalogued" — so the one class
of defect it uniquely carries was the one class the skill could not act on. The reason for the ban
was sound (a single defect should not be reported twice, once under a principle and once under the
catalogue entry that already names it), but written as an absolute it also silenced the principle
where no entry claims the shape at all.
The fix
Read each home from the home. Each criteria home now gets its path, the grain of one unit, and
the command that reads its enumeration. No list, no count. This is the shape the guard-suite entry in
the same table already used — the registry is the enumeration, read it rather than assuming a roster.
Account for coverage against the homes. The partial-walk check now requires one row per unwalked
unit of every home, enumerated from each home's own headings at the commit being audited.
Let each unit state its own reach. A table mapping file kinds to unit titles was the one fact in
the skill that no canon home stated, so it would go stale on every canon addition with nothing able
to detect the drift. Every unit now binds every file kind until its own text excludes one, and a unit
that cannot reach the surface is recorded as not-applicable with that unit's own wording as the
reason.
Test a named entry's reach before deferring to it. Detection criteria may come from a principle
where no catalogue entry's criteria reach the shape in hand. A principle names its covering entry
where one exists, and that name now settles the pairing only for the spellings the entry actually
keys on: a stance spans every spelling of its defect, an entry keys on the ones it names, and where
the stance reaches further the principle is the sole detector for the remainder. The distance between
them is itself reportable.
Why now is cheap
The four wrong copies are wrong today and every one is a one-line correction. Left alone they get
worse on their own — the counts fall further behind on each canon addition, and the coverage check
keeps certifying partial walks the whole time.
Scope
Three files, all in the workflow-canon skill: the skill definition and its two reference files. Net
smaller, because the change is mostly removal.
Acceptance criteria
Non-goals
The six GitNexus skills carry the same class of defect — one lists seven of sixteen available tools,
and one copies a graph schema four lines after telling the reader to fetch that schema from its
resource. They are untracked local configuration and a generated region of AGENTS.md, so edits there
are overwritten on the next index run. Recorded, not fixed here.
Investigation detail
Full duplication register, the SOLID reading behind it, and the audit surface:
.engineering/artifacts/planning/2026-09-03-manual-technique-review/