Skip to content

docs: own consumer-config layering as a Convention registry concern - #692

Merged
kyle-sexton merged 3 commits into
mainfrom
docs/648-consumer-config-layering-owner-doc
Jul 20, 2026
Merged

docs: own consumer-config layering as a Convention registry concern#692
kyle-sexton merged 3 commits into
mainfrom
docs/648-consumer-config-layering-owner-doc

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

Closes #648

Summary

The tracked-rich-config seam in docs/MIGRATION-PLAYBOOK.md fixes the resolution order for every consumer-config surface in the fleet. docs/PLUGIN-PHILOSOPHY.md states that fleet audits check conformance per registry row — and this rule had no row, so nothing audited it.

Adds docs/conventions/consumer-config-layering/ (README + CHANGELOG, following the hook-telemetry shape), registers it in the Convention registry, and points seam 2 at it rather than restating the rules in two places.

The contract owns the axis, never the keys. Layer set, precedence, override semantics, overlay naming, and the resolution algorithm. Which keys a surface has and how they validate stay with that concern's own owner doc. That boundary is what keeps this from colliding with "One owner doc per shared concern" — layering is genuinely cross-cutting; keys are not.

Deviations are recorded as observed, not ratified. Ruling on them is a separate human-gated decision (#649) and nothing here rules on anything.

Correction to the issue's evidence table

The issue cites 15 surfaces. A direct re-census found 12, and two of the issue's verdicts do not survive reading the files:

Issue's claim What the files say
songwriting — undeclared deviation, "first-match-wins, freezes the template" songwriting has no consumer-config surface at all. Its only .claude/ read is the consuming project's CLAUDE.md / .claude/rules (skills/setup/SKILL.md:58) — that is seam 3 steering, not seam 2 tracked config. Not a row.
code-tidying — undeclared deviation ("overrides this file entirely") The phrase is real (skills/tidy/lanes/docs-prose.md:14), but the thing being overridden is the plugin's own bundled lane file, not a consumer layer. That is a bundled-default rung, structurally the same as toolchain's rung 4. Recorded as single-layer over a bundled default.
work-items (×2), standards.yaml, out-of-scope counted as separate single-layer surfaces out-of-scope is not a plugin. standards.yaml is the root-relocation knob of the standards surface, not a second surface. work-items is one surface — and it is the one the census nearly missed, because its config is .work-item-tracker.json at the repo root rather than under .claude/. It is in the table.

Net: fewer surfaces, and one genuinely new finding — ai-briefing advertises an overlay layer it does not implement. Its setup recommends a .claude/ai-briefing/**/*.local.* gitignore line, but no read path resolves a .local.* file and nothing defines what one would do. That is the only surface telling consumers to gitignore a layer that has no effect.

Every file:line in the table was re-read directly rather than taken from a summary.

Also: security criterion 4

Narrowed per the maintainer ruling on #660. Its "no absolute paths, no reading consumer files outside ${CLAUDE_PROJECT_DIR}" wording read as forbidding the ~/.claude/<plugin>.md user-global that seam 2 mandates and that criterion 3 already uses for consumer credentials — a self-contradiction a reviewer hit in practice on #660. It now says consumer repository files and carves out the operator's own Claude Code home explicitly, so the next plugin author does not re-litigate it.

Test plan

  • markdownlint-cli2 across docs/**/*.md with the repo config — 0 errors.
  • typos --config _typos.toml docs/ — clean.
  • Every relative link in the four changed/added files resolved against the working tree by hand. link-check is a weekly fail: false cron, so nothing gates this at PR time.
  • Census citations spot-checked by reading the cited line directly: toolchain/reference/resolution-ladder.md:32, autonomy/skills/setup/SKILL.md:355, docs/conventions/standards/README.md:35, disk-hygiene/skills/clean/SKILL.md:77, code-tidying/skills/tidy/SKILL.md:58, docs/conventions/topic-docs/README.md:224, ai-briefing/skills/generate/SKILL.md:63, codebase-health/skills/audit/SKILL.md:70, repo-fleet-hygiene/skills/setup/SKILL.md:20.

Docs-only; no plugin behavior changes.

Related

The tracked-rich-config seam fixes the resolution order for every
consumer-config surface in the fleet, and `PLUGIN-PHILOSOPHY.md` states
that fleet audits check conformance per registry row. This rule had no
row, so nothing audited it, and the fleet drifted: of twelve consumer-
tracked config surfaces, five are single-layer, three carry declared
deviations, and two diverge with no rationale recorded anywhere.

Extracts the layering axis into an owner doc and registers it. The
contract governs layering and precedence only — layer set, order,
override semantics, overlay naming, and the resolution algorithm. Keys
and schema stay with each concern's own owner doc, which is what keeps
this from colliding with one-owner-doc-per-shared-concern. Seam 2 now
points at the contract instead of restating it.

Deviations are recorded as observed, not ratified; ruling on them stays
a separate human-gated decision. The implementers table names every
surface and its current conformance state, so the gap is tracked rather
than the doctrine pretending it is closed.

Also narrows security criterion 4, per the maintainer ruling on #660.
Its "no absolute paths / no reading consumer files outside
CLAUDE_PROJECT_DIR" wording read as forbidding the `~/.claude/`
user-global that seam 2 mandates and that criterion 3 already uses for
credentials — a self-contradiction a reviewer surfaced in practice. The
criterion now says consumer *repository* files and carves out the
operator's own Claude Code home explicitly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 6m 39s —— View job


PR Review

  • Gather context and read changed files
  • Review docs/conventions/consumer-config-layering/README.md
  • Review docs/conventions/consumer-config-layering/CHANGELOG.md
  • Review changes to docs/MIGRATION-PLAYBOOK.md
  • Review changes to docs/PLUGIN-PHILOSOPHY.md
  • Cross-check internal consistency and census claims against source files
  • Post final review

Summary

Solid structural addition — a cross-cutting layering contract that was missing a registry row is now owned in one place, the shape matches hook-telemetry, and the security criterion 4 clarification resolves a real self-contradiction. However, I found one factual error in the census that should be corrected before merge, one missing deviation description, and two smaller wording issues.


Findings

1. codebase-health merge semantics are documented — the census entry is wrong

Severity: blocking

docs/conventions/consumer-config-layering/README.md:151 lists codebase-health as an Undeclared Deviation with "merge semantics undocumented."

Reading the file directly:

plugins/codebase-health/skills/audit/SKILL.md:75-80

Merge semantics when the same dimension name appears in two layers: additive by default — the later layer's primary-sources and verification-sources globs UNION with the earlier layer's (not replace), and example-claims concatenate with duplicate claim text collapsed. A layer removes an inherited dimension by declaring it with empty source lists (an explicit opt-out)...

Merge semantics are explicitly documented, per-key style. The PR body cites codebase-health/skills/audit/SKILL.md:70 as a spot-check, but line 70 is the layer list; the merge semantics are four lines below at 75–80. The census entry needs correction — this surface either conforms or has a different deviation to record.

Fix this →


2. autonomy declared deviation is incomplete — the org rung is undescribed

Severity: should-fix

The Implementers table at README.md:165 lists autonomy with "all three, plus an org rung | declared deviation" but the Declared Deviations section only describes the security-axis exemption. It says nothing about the org rung.

From plugins/autonomy/skills/setup/SKILL.md:22-26, the actual resolution order is:

user-global → org binding (when org_policy_home is pointed) → project → local overlay

That is two deviations: an extra conditional layer AND a different insertion point (between user-global and team, not appended). Both should appear in the Declared Deviations section, not only in the table column. The table column says "declared deviation" — implying the rationale is recorded — but a reader who goes looking won't find it in the Deviations prose.


3. "below" and "fixes" in the MIGRATION-PLAYBOOK seam 2 edit

Severity: minor

docs/MIGRATION-PLAYBOOK.md:222:

the same additive semantics the layering contract below fixes

Two problems:

  • "below" — the old text used this to cross-reference the inline resolution rule that used to follow in the same document. That rule is now in a separate file. "below" now points nowhere, and a reader scanning down the page will not find the referenced contract.
  • "fixes" — implies the layering contract corrects an error rather than defines a rule. The old text said "as the resolution rule below" (descriptive); the new text implies the contract exists to patch something broken.

Suggested replacement: the same additive semantics the layering contract defines —

Fix this →


4. "overlays" in the disk-hygiene deviation text collides with a contract term of art

Severity: minor

README.md:143:

disk-hygiene's --policy replaces both standing layers. Its standing layers merge additively (overlays may disable or add hints and add protected globs, never weaken a hard guard)

This document uses "local overlay" as a precise technical term for .local.* files. "overlays" in the parenthetical appears to mean "later layers" (i.e., the team layer overlaying the user-global layer) — not the third .local.* layer. The table confirms disk-hygiene has only two layers (user-global + team; no overlay layer). A reader of this document will likely parse "overlays may disable or add hints" as a statement about the .local.* layer, then look at the table and find there is no overlay layer, and be confused.

Suggested fix: replace "overlays" with "later layers" or "the team layer" to remove the ambiguity.


Verification spot-checks (passed)

  • standards inverted precedence — confirmed at docs/conventions/standards/README.md:35-39: "Personal layers may ADD new standards or TIGHTEN team ones; on a direct conflict, the team-tracked layer wins."
  • ai-briefing overlay finding — confirmed: plugins/ai-briefing/skills/setup/SKILL.md:82 recommends .claude/ai-briefing/**/*.local.* gitignore, and no read path in the plugin resolves a .local.* file. The finding is correct.
  • code-tidying "overrides this file entirely" — confirmed at plugins/code-tidying/skills/tidy/lanes/docs-prose.md:14: the thing overridden is the plugin's own bundled lane, not a consumer config layer. Correctly excluded from the deviation list.
  • work-items CWD-to-root climb — confirmed at plugins/work-items/tools/work-item-tracker/lib/binding.sh:9: "climb from CWD toward the [root]".
  • Relative links in changed files resolve correctly against the working tree.
  • CHANGELOG shape matches hook-telemetry/CHANGELOG.md.
  • Security criterion 4 clarification is logically consistent: criterion 3 already uses ~/.claude/.credentials.json, so forbidding all ~/.claude/ reads was self-contradictory. The "consumer repository" qualifier and the explicit carve-out bullet resolve this cleanly.

Informational note (no action needed)

The table marks source-control as "conforms (declared per-key override)." PR #647/#660 (the source-control conformance migration) is still under do-not-merge. If the per-key override declaration lives only in that pending branch and not in main, the conformance claim is forward-looking. This is not a blocker — the PR description acknowledges #647/#660 is independent — but a reader checking the citation today won't find the conformance docs in main.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4a1e8481a1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/conventions/consumer-config-layering/README.md
Comment thread docs/conventions/consumer-config-layering/README.md Outdated
Comment thread docs/conventions/consumer-config-layering/README.md Outdated
The layer table gave the user-global path as `~/.claude/<name>` with
`<name>` described as the surface's filename. For a folder-form surface
that resolves to `~/.claude/<ecosystem>.yaml` while the team layer reads
`.claude/ecosystems/<ecosystem>.yaml` — two different files for one
surface. `<name>` is now defined as the whole path relative to `.claude/`.

The recommended consumer `.gitignore` was `.claude/*.local.*` plus a
recursive line "as well", which asks for two lines and leaves a nested
overlay unignored for anyone who adds only the first. Verified against
git that `.claude/**/*.local.*` alone matches flat, one-deep, and
two-deep overlays while leaving team files tracked, so the contract now
recommends that single line.

`codebase-health` was recorded as leaving its merge semantics
undocumented. It does not: `skills/audit/SKILL.md:75-80` declares glob
union, example-claim concatenation with duplicate collapse, and an
explicit empty-list opt-out. Corrected to conforming in both the
deviations section and the implementers table.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 3m 34s —— View job


PR Review — after corrections (9b02f19)

  • Gather context and read changed files
  • Review corrections made in latest commit (9b02f19)
  • Cross-check remaining findings against source files
  • Post final review

What the correction commit fixed

Three of the four previous findings were addressed:

  • codebase-health census entry — correctly moved from "undeclared deviation / merge semantics undocumented" to "conforms (concatenating, with a declared empty-list opt-out)" in both the Implementers table and the Undeclared Deviations section. ✓
  • <name> folder-path ambiguity (Codex P2 chore: initialize marketplace scaffold #1) — the definition now explicitly says <name> is the path relative to .claude/, not just the leaf, with a worked example showing ecosystems/<ecosystem>.yaml preserving the folder hierarchy. ✓
  • Two .gitignore lines (Codex P2 fix: correct plugin-system inaccuracies and harden references #2) — collapsed to a single recursive rule (.claude/**/*.local.*) with prose explaining why it subsumes all four current fleet spellings. ✓

Remaining issues

1. autonomy declared deviation prose is incomplete — org rung still absent

Severity: should-fix

The Implementers table at README.md:169 labels autonomy as "declared deviation". That label implies a rationale is recorded. A reader who looks will find only the security-axes exemption in the Declared Deviations section (README.md:143–146):

autonomy exempts its security axes. Layers refine additively as the contract requires, except that no repo-local value may supply or override a security axis at all — a stricter rule than this contract, in the direction of safety.

The org rung is a separate, independent deviation — a conditional fourth layer inserted when the merged base layers carry an org_policy_home pointer (confirmed in plugins/autonomy/skills/setup/SKILL.md:22–26). Neither the prose nor the table column says why that extra rung is there or where it inserts in the order. The table column saying "declared deviation" is a forward claim the document does not fulfil.

Fix this →


2. "below" and "fixes" in MIGRATION-PLAYBOOK seam 2 edit

Severity: minor (unchanged from previous review)

docs/MIGRATION-PLAYBOOK.md:222:

the same additive semantics the layering contract below fixes — a named profile refines the root

"below" previously cross-referenced the inline resolution rule that used to follow in the same section. That rule was removed and extracted to the new convention file. "below" now points nowhere. "fixes" implies the contract corrects an error rather than defines a rule.

Suggested replacement: the same additive semantics the layering contract defines —

Fix this →


3. "overlays" in disk-hygiene deviation prose collides with a contract term of art

Severity: minor (unchanged from previous review)

README.md:148:

Its standing layers merge additively (overlays may disable or add hints and add protected globs, never weaken a hard guard)

This document uses "local overlay" as a precise technical term for the .local.* layer. But disk-hygiene has only two layers — user-global and team, no overlay layer (confirmed in the table at line 171). A reader parses "overlays may disable or add hints" as a statement about the .local.* overlay, then finds no overlay layer in the table for this surface. The word "overlays" here means "later layers" (the team layer overlaying the user-global), not the third contract layer.

Suggested fix: replace overlays may disable or add hints with later layers may disable or add hints.

Fix this →


Verification spot-checks (passed)

  • codebase-health table and deviation prose — now consistent. Table: "conforms (concatenating, with a declared empty-list opt-out)". Undeclared Deviations: no entry. ✓
  • ai-briefing overlay finding — README.md:153–157 correctly states no read path resolves a .local.* file. ✓
  • .claude/**/*.local.* recursive rule — prose correctly explains it matches zero or more directories, covering flat, one-deep, and profiled surfaces. ✓
  • Folder-form <name> example — ~/.claude/ecosystems/<ecosystem>.yaml in the table matches the corrected <name> definition. ✓
  • Security criterion 4 clarification — logically consistent; carves out ~/.claude/ user-global reads explicitly while targeting cross-repo wandering. ✓
  • CHANGELOG shape — matches hook-telemetry/CHANGELOG.md template. ✓

Summary

The blocking finding (codebase-health) is resolved, and two Codex findings are addressed. Three issues remain: one should-fix (autonomy org rung not described in the Declared Deviations prose despite the table labeling it "declared deviation") and two minor wording fixes. The doc is otherwise structurally sound.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9b02f19435

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/conventions/consumer-config-layering/README.md Outdated
…nded

The implementers table credited `source-control` with all three layers,
but its layering change is still in flight and unmerged — on `main` the
plugin reads only the repo-root team file. A registry row that runs ahead
of the code reports a closed gap that is still open, which defeats the
point of tracking conformance at all. The row now reads single-layer with
the migration named, and the table states the as-on-main rule so the next
row does not repeat it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 54s —— View job


PR Review — after corrections (5bc0a31)

  • Gather context and read changed files
  • Review corrections made in latest commit (5bc0a31)
  • Cross-check remaining findings against source files
  • Post final review

What the latest commit fixed

The source-control row in the Implementers table was updated from "conforms (all three)" to "single-layer; migration to all three in flight (#647)." This was the correct fix — the Codex finding was accurate: the PR cannot claim a conformance state that only holds after an unmerged PR lands. The table now records what is true on main, consistent with the table's own stated rule at README.md:162–164. ✓


Remaining issues (all carried from prior review rounds — no new issues introduced by 5bc0a31)

1. autonomy declared deviation prose is incomplete — org rung still absent

Severity: should-fix

The Implementers table at README.md:171 labels autonomy as "declared deviation". That label implies a rationale is recorded. The Declared Deviations section (README.md:143–146) describes only the security-axes exemption. No prose mentions the org rung.

The org rung is confirmed in plugins/autonomy/skills/setup/SKILL.md:22–26:

resolve the effective binding across ALL rungs … PLUS the org rung when the merged layers carry an org_policy_home pointer: fetch the org binding via the host CLI … and fold it in at its ladder position

That is a conditional fourth layer with a specific insertion point — a deviation that is structurally independent from the security-axes rule. Both should appear in Declared Deviations, but only one does.

Fix this →


2. "below" and "fixes" in the MIGRATION-PLAYBOOK seam 2 edit

Severity: minor

docs/MIGRATION-PLAYBOOK.md:222:

the same additive semantics the layering contract below fixes — a named profile refines the root

"below" previously cross-referenced the inline resolution rule that used to follow in this section. That rule was extracted to the new convention file in this PR. "below" now has nothing to point at on the page. "fixes" implies the contract corrects an error rather than defining a rule.

Suggested replacement: the same additive semantics the layering contract defines —

Fix this →


3. "overlays" in disk-hygiene deviation prose collides with a contract term of art

Severity: minor

README.md:148:

Its standing layers merge additively (overlays may disable or add hints and add protected globs, never weaken a hard guard)

"local overlay" is a precise technical term defined in the Layers table for the .local.* third layer. disk-hygiene has no overlay layer — the table at line 173 confirms user-global + team only. "overlays" here means "later layers" (the team layer overlaying the user-global), which a reader will not infer when the document uses the word as a term of art.

Suggested fix: replace overlays may disable or add hints with later layers may disable or add hints.

Fix this →


Verification spot-checks (passed)

  • source-control row — correctly records single-layer on main with migration named (source-control: tracked config is single-layer — no ~/.claude user-global or *.local.* overlay, diverging from seam 2 #647). ✓
  • source-control row is consistent with the table's as-on-main rule stated at lines 162–164. ✓
  • codebase-health — "conforms (concatenating, with a declared empty-list opt-out)" in both the table and Undeclared Deviations (no entry). ✓
  • ai-briefing undeclared deviation — confirmed: setup recommends the gitignore line; no read path resolves a .local.* file. ✓
  • .claude/**/*.local.* recursive rule — prose correctly explains zero-or-more-directory match. ✓
  • autonomy org rung — confirmed at plugins/autonomy/skills/setup/SKILL.md:22–26; table says "declared deviation" but Declared Deviations prose does not describe it. ✗ (remaining)
  • MIGRATION-PLAYBOOK line 222 — "the layering contract below fixes" still present. ✗ (remaining)
  • disk-hygiene line 148 — "overlays" still present. ✗ (remaining)

Summary

The source-control row correction (5bc0a31) is exactly right — the table's own stated rule ("as it exists on main") demands it. The PR is structurally sound. One should-fix remains (autonomy org rung missing from Declared Deviations prose despite the table asserting "declared deviation") and two minor wording issues (dangling "below fixes", term-of-art "overlays" collision). All are carry-overs from prior review rounds; nothing new was introduced.

@kyle-sexton

Copy link
Copy Markdown
Contributor Author

Control tower — HOLD for operator review (checkpoint 2026-07-20 ~16:30Z). Digest: the extraction itself is faithful (no rule changed; deviations recorded as observed, not ratified — does not pre-empt #649). Two reasons this stays in the operator queue rather than decide-and-log:

  1. docs/governance: rule needed on three consumer-config layering deviations (standards inversion, code-tidying + songwriting wholesale replace) #649 coupling: the pending docs/governance: rule needed on three consumer-config layering deviations (standards inversion, code-tidying + songwriting wholesale replace) #649 ruling (e.g. ratifying the standards precedence inversion as a named exception class) would change this contract's content immediately after publication — reviewing both together avoids a same-day contract major-bump.
  2. Retained Class C: the MIGRATION-PLAYBOOK cache-isolation edit sanctions plugin reads of the operator's own ~/.claude/ documented config paths. Reasoned and precedent-backed, but it modifies a security-review criterion — security-posture stays operator-only under the delegation.

RECOMMENDED: review with #649 in the morning batch (batch item 3); merge after ruling, folding any named-exception-class language into the contract in the same pass.

@kyle-sexton kyle-sexton added the do-not-merge Hard merge gate: do not merge while applied. label Jul 20, 2026
@kyle-sexton kyle-sexton removed the do-not-merge Hard merge gate: do not merge while applied. label Jul 20, 2026
@kyle-sexton
kyle-sexton merged commit bd8ec5f into main Jul 20, 2026
18 of 19 checks passed
@kyle-sexton
kyle-sexton deleted the docs/648-consumer-config-layering-owner-doc branch July 20, 2026 15:54
kyle-sexton added a commit that referenced this pull request Jul 23, 2026
…ascade (#1190)

## Summary

Renames the marketplace-wide consumer-config layering seam from the
clunky three-noun
`consumer-config-layering` to **`config-cascade`**.

Name chosen via `/naming:name-it-better` (blind 3-lens fan-out):
"cascade" (CSS `@layer`/`!important`)
is the one established term of art that natively carries **both**
per-key override **and** a ratified
precedence-inversion — matching the seam's user→team→local +
policy-floor model. Runner-ups:
`config-layering`, `layer-cascade`, `config-precedence`.

- `git mv docs/conventions/consumer-config-layering → config-cascade`.
- All **live** references updated (name + path): MIGRATION-PLAYBOOK,
PLUGIN-PHILOSOPHY, loop-lane seam,
code-tidying (SKILL + docs-prose lane), testing (README + run-e2e
SKILL/context), `.gitignore`.
- Seam README records the former name (discoverability); CHANGELOG
records the rename with **no
  `contract_version` bump** — name/path only, contract unchanged.
- code-tidying `0.7.1→0.7.2`, testing `0.3.1→0.3.2` (patch) so consumers
receive the corrected doc-URL.
- **Historical** topic docs / CHANGELOGs retain the former name as
frozen record (bare-text mentions,
  not links).

**Provenance context:** the rename was gated (issue #1187) on whether
the seam was legitimately
ratified. Finding: all 12 `docs/conventions/*` seams are PR-introduced
across the repo's whole history;
`consumer-config-layering` (#692) is unremarkable. The shared
`kyle-sexton` identity (human + agents)
makes metadata-level "human-ratified vs agent-accreted" undecidable — a
**repo-wide** property, not a
disqualifier for this seam. The operator's direct direction this session
is the ratification.

## Test plan

- `lychee --offline './**/*.md'` — **0 errors** (2754 links checked); no
dead relative link to the old path.
- `grep -rn '](.*conventions/consumer-config-layering' .` — none (no
dead relative links).
- `scripts/check-changelog-parity.sh --check-bump origin/main` — both
bumped plugins have entries.
- Remaining `consumer-config-layering` mentions are historical bare-text
only (topic PLANs, CHANGELOGs, `.work/`).

## Related

- Closes #1188
- Provenance context: #1187 (audit finding recorded above)
- Follows #1185 (well-known path, which dogfoods the
`docs/conventions/<concern>/` location)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
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.

docs/governance: consumer-config layering has no Convention registry row — 11 of 15 surfaces diverge from the seam-2 precedence rule

1 participant