Skip to content

Canon map duplication: the skill reads each criteria home from the home itself - #590

Merged
m2ux merged 5 commits into
mainfrom
skill-canon-solid
Sep 4, 2026
Merged

Canon map duplication: the skill reads each criteria home from the home itself#590
m2ux merged 5 commits into
mainfrom
skill-canon-solid

Conversation

@m2ux

@m2ux m2ux commented Sep 3, 2026

Copy link
Copy Markdown
Owner

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

  • No count of any home's contents survives in the skill, except where a number does work
  • No list of any home's headings survives; each home carries its path, unit grain, and reading command
  • The partial-walk check accounts for units read from the homes, not from a carried number
  • Detection criteria are admissible from a principle where no entry's criteria reach the shape
  • Every internal anchor resolves

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/

m2ux and others added 5 commits September 3, 2026 15:13
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>
@m2ux
m2ux merged commit 4d9d867 into main Sep 4, 2026
3 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant