@event4u/agent-config 8.11.0 → 8.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/AGENTS.md +1 -0
  3. package/CHANGELOG.md +49 -279
  4. package/README.md +2 -2
  5. package/dist/agent-src/contexts/execution/roadmap-ci-steps-mechanics.md +117 -0
  6. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +106 -94
  7. package/dist/agent-src/rules/architecture.md +6 -51
  8. package/dist/agent-src/rules/code-comment-discipline.md +10 -94
  9. package/dist/agent-src/rules/decision-revisit-gate.md +9 -77
  10. package/dist/agent-src/rules/improve-before-implement.md +7 -66
  11. package/dist/agent-src/rules/no-roadmap-references.md +13 -77
  12. package/dist/agent-src/rules/persona-governance.md +5 -47
  13. package/dist/agent-src/rules/provider-lifecycle-discipline.md +6 -32
  14. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +21 -104
  15. package/dist/agent-src/rules/untrusted-input-defense.md +3 -75
  16. package/dist/agent-src/skills/agent-docs-writing/SKILL.md +83 -0
  17. package/dist/agent-src/skills/decision-review/SKILL.md +86 -0
  18. package/dist/agent-src/skills/module-detect-on-the-fly/SKILL.md +58 -1
  19. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  20. package/dist/agent-src/templates/contexts/knowledge-card.md +12 -0
  21. package/dist/discovery/deprecation-report.md +1 -1
  22. package/dist/discovery/discovery-manifest.json +14 -14
  23. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  24. package/dist/discovery/discovery-manifest.summary.md +1 -1
  25. package/dist/discovery/orphan-report.md +1 -1
  26. package/dist/discovery/packs.json +2 -2
  27. package/dist/discovery/trust-report.md +1 -1
  28. package/dist/discovery/workspaces.json +2 -2
  29. package/dist/mcp/registry-manifest.json +1 -1
  30. package/dist/router.json +1 -1
  31. package/docs/CLAIMS.md +30 -2
  32. package/docs/architecture.md +1 -1
  33. package/docs/archive/CHANGELOG-pre-8.12.0.md +304 -0
  34. package/docs/benchmark.md +39 -0
  35. package/docs/contracts/ai-council-config.md +9 -4
  36. package/docs/contracts/persona-schema.md +49 -0
  37. package/docs/contracts/provider-lifecycle.md +29 -4
  38. package/docs/decisions/ADR-120-council-chairman-mode.md +70 -0
  39. package/docs/decisions/ADR-121-knowledge-sensitivity-classes.md +90 -0
  40. package/docs/decisions/INDEX.md +2 -0
  41. package/docs/design/council-vs-solo-baseline.md +92 -0
  42. package/docs/design/utilization-window-criteria.md +51 -0
  43. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +68 -0
  44. package/docs/guidelines/agent-infra/rule-body-migration-inventory.md +241 -0
  45. package/docs/guidelines/agent-infra/untrusted-input-spotlighting.md +80 -3
  46. package/docs/guidelines/code-clarity.md +86 -1
  47. package/docs/maintainers/branch-protection.md +87 -0
  48. package/docs/maintainers/system-map.md +85 -0
  49. package/docs/proof.md +14 -3
  50. package/package.json +1 -1
  51. package/src/config/agent-settings.template.yml +9 -0
  52. package/src/scripts/_cli/cmd_doctor.ts +95 -0
  53. package/src/scripts/_lib/knowledge_global.ts +44 -0
  54. package/src/scripts/_lib/knowledge_global_promote.ts +150 -0
  55. package/src/scripts/ai_council/orchestrator.ts +188 -1
  56. package/src/scripts/bench_persona_placebo.ts +308 -0
  57. package/src/scripts/bench_quality_rerun.ts +357 -0
  58. package/src/scripts/build_proof.ts +9 -0
  59. package/src/scripts/check_artefact_count_messaging.ts +56 -0
  60. package/src/scripts/check_knowledge_cards.ts +33 -4
  61. package/src/scripts/check_portability.ts +1 -0
  62. package/src/scripts/complexity_report.ts +776 -0
  63. package/src/scripts/consumer_matrix.ts +251 -12
  64. package/src/scripts/council_cli.ts +56 -1
  65. package/src/scripts/explain_run.ts +593 -0
  66. package/src/scripts/knowledge_global_cli.ts +234 -45
  67. package/src/scripts/rule_backlinks.ts +0 -0
@@ -0,0 +1,90 @@
1
+ ---
2
+ adr: 121
3
+ status: accepted
4
+ date: 2026-07-12
5
+ decision: knowledge-sensitivity-classes
6
+ supersedes: —
7
+ superseded_by: —
8
+ phase: feedback-8.11
9
+ type: structural
10
+ ---
11
+
12
+ # ADR-121 — Per-card sensitivity classes for the knowledge boundary
13
+
14
+ ## Status
15
+
16
+ Accepted (2026-07-12). Successor note to ADR-119 (global knowledge sharing
17
+ default ON) — adds boundary teeth; does NOT revert the flip.
18
+
19
+ ## Context
20
+
21
+ The 8.11.0 external reviews and the maintainer both name cross-project
22
+ context transfer as the riskiest open surface of the ADR-119 flip: the only
23
+ per-entry axis was origin tier (`public|vendor|proprietary` — where knowledge
24
+ came from), the binary page flag `visibility: private`, and a write-time
25
+ regex redaction gate. There was NO sensitivity taxonomy (how far an entry may
26
+ travel), no per-card owner/expiry on shared cards, no promotion-reason
27
+ capture, and no revocation trail — deletion was silent.
28
+
29
+ A two-round council debate (anthropic/claude-sonnet-4-5 + openai/gpt-4o,
30
+ 2026-07-12) split on scope: one member argued measure-first with a 2-level
31
+ enum at most (six classes over-fit a single-maintainer install — `team` /
32
+ `organization` are phantom categories today); the other argued the full
33
+ six-class taxonomy from the reviews. Resolution: a SMALL machine-anchored
34
+ axis now (the maintainer's danger is present, not speculative), the wider
35
+ enum behind a revisit-if.
36
+
37
+ ## Decision
38
+
39
+ Three sensitivity classes, each anchored to a machine check
40
+ (`agents/settings/contexts/knowledge-sensitivity.md` carries the full table):
41
+
42
+ - `prohibited` — redaction-class content; a redaction hit FORCES this class
43
+ (declared values cannot override it); hard linter error in the global
44
+ store (check G6).
45
+ - `project` — the DEFAULT; promotion structurally refused unless a human
46
+ reclassifies; unset/invalid resolves here, never upward.
47
+ - `shareable` — global-store eligible; requires passing redaction AND full
48
+ provenance: `source_repo`, `owner`, `review_after`, `promotion_reason`
49
+ (checks G4/G5); `promotion_reason` is mandatory human input — there is no
50
+ auto-`shareable` path.
51
+
52
+ Plus an append-only revocation ledger (`.revocations.jsonl` tombstones
53
+ written by `forget`/`purge` BEFORE deletion; rendered via
54
+ `knowledge:global:list --revoked`).
55
+
56
+ ADR-119's default-ON, `allowed_tiers: [public]`, measurement window, and
57
+ demotion trigger are unchanged.
58
+
59
+ ## Consequences
60
+
61
+ - Cross-project transfer now requires a recorded human decision per card
62
+ (class + reason), machine-verified in CI (`check_knowledge_cards` G4–G6)
63
+ and at promotion time (`gate_sensitivity_for_promotion`).
64
+ - Deletion is auditable; the demotion trigger of ADR-119 gains a per-entry
65
+ trail to point at.
66
+ - Cost: one more frontmatter field + four footer fields on shared cards;
67
+ no new subsystem, no read-time machinery.
68
+
69
+ ## Alternatives considered
70
+
71
+ - Six-class enum `{local-only, project, team, organization, confidential,
72
+ prohibited}` (the reviews' proposal) — rejected now: `team`/`organization`
73
+ have no consumer today; widening is cheap later, narrowing is not.
74
+ Revisit-if: a real multi-tenant org install exists.
75
+ - Revert ADR-119 to default-OFF — rejected: re-creates the ADR-103
76
+ measure-then-decide deadlock; the danger is contained by classes + gates,
77
+ not by turning the layer off.
78
+ - Semantic PII detection / k-anonymity — out of scope per ADR-119 §6
79
+ (write-time text gate, single-install trust boundary).
80
+
81
+ ## References
82
+
83
+ - `agents/settings/contexts/knowledge-sensitivity.md` — locked design table.
84
+ - ADR-119 — the flip this hardens.
85
+ - Implementation: `knowledge_global.ts` (SENSITIVITIES, footer fields),
86
+ `knowledge_global_promote.ts` (`resolve_effective_sensitivity`,
87
+ `gate_sensitivity_for_promotion`, tombstones), `knowledge_global_cli.ts`
88
+ (promote/forget/purge/list flags), `check_knowledge_cards.ts` (G4–G6);
89
+ 118 tests across 6 files incl. 3 cross-project-contamination adversarial
90
+ cases.
@@ -123,6 +123,8 @@ _Auto-generated by `scripts/adr/regenerate_index.py`. Do not edit._
123
123
  | [ADR-117](ADR-117-subagents-auto-default-on.md) | Subagents Auto Default On | accepted | 2026-07-09 | — |
124
124
  | [ADR-118](ADR-118-loop-engineering-boundaries.md) | Loop Engineering Boundaries | accepted | 2026-07-10 | — |
125
125
  | [ADR-119](ADR-119-global-knowledge-default-on.md) | Global Knowledge Default On | accepted | 2026-07-12 | 103 |
126
+ | [ADR-120](ADR-120-council-chairman-mode.md) | Council Chairman Mode | accepted | 2026-07-12 | — |
127
+ | [ADR-121](ADR-121-knowledge-sensitivity-classes.md) | Knowledge Sensitivity Classes | accepted | 2026-07-12 | — |
126
128
  | [ADR-200](ADR-200-python-to-typescript-migration.md) | Python To Typescript Migration | accepted | 2026-06-11 | — |
127
129
 
128
130
  ## Unnumbered (legacy)
@@ -0,0 +1,92 @@
1
+ # Council-vs-solo baseline eval — design (pre-registered)
2
+
3
+ > Design artifact for `road-to-feedback-8.11` Phase 3. It fixes the
4
+ > methodology **before** the first billable call; the run itself is
5
+ > spend-gated (blocker `council-baseline-spend-authorization` — the user
6
+ > confirms the rendered estimate in-session). This document is the "design
7
+ > the baseline" step — not the run. Companion claim:
8
+ > `docs/CLAIMS.md § council-vs-solo-baseline` (status: unbacked until the run
9
+ > resolves).
10
+
11
+ ## Why this exists
12
+
13
+ The council deliberation protocol (stance tally, chairman, debate gates,
14
+ anti-conformity) is well-built and default-off — but there is **no evidence
15
+ that convening the council beats a single strong model** on any decision
16
+ class. The 2026-07-12 feedback-disposition debate (claude-sonnet-4-5 +
17
+ gpt-4o) REJECTED adding a ≥2-of-5 admission gate for exactly this reason and
18
+ ADOPTED this baseline as the precondition for ANY further
19
+ deliberation-protocol expansion: admission criteria must be derived from
20
+ empirical decision characteristics, not a-priori heuristics.
21
+
22
+ Shadow-log status at design time (2026-07-12): `agents/runtime/council/
23
+ shadow-log.jsonl` is **absent/empty** on both the main checkout and the run
24
+ worktree — the shadow-dispatch agreement mechanism has produced zero
25
+ analyzable lines. That absence is itself the first finding: the only
26
+ council-vs-solo signal the package planned to collect has no data, so a
27
+ deliberate baseline run is the only path to a verdict.
28
+
29
+ ## Arms
30
+
31
+ | Arm | What runs | Cost profile |
32
+ |---|---|---|
33
+ | A — solo | ONE strong model (the council's strongest configured member, single call, standard prompt) | 1 call/decision |
34
+ | B — council | The full configured council in `debate` mode (2 members × ≤2 rounds, current defaults; stance tally ON so dissent is recorded) | 4–5 calls/decision |
35
+
36
+ Same decision text, same context budget, both arms blind to each other.
37
+
38
+ ## Corpus — ≥30 real decisions
39
+
40
+ - Source: real decision questions from the repo's own history — the
41
+ council-labelled golden set (labels final per the 2026-07-11 amendment; no
42
+ re-labelling) plus archived council question files whose ground-truth
43
+ disposition is now KNOWN (the decision shipped and survived, was reverted,
44
+ or was killed by later evidence). Minimum n = 30; pre-register the exact
45
+ list in the run manifest BEFORE the first call.
46
+ - Class mix: at least 8 decisions per impact class {low, medium, high} so the
47
+ per-class analysis (the whole point — which characteristics correlate with
48
+ council lift) is not vacuous.
49
+
50
+ ## Metrics — fixed before data
51
+
52
+ 1. **Quality**: blind post-hoc grading of both arms' verdicts against the
53
+ known ground-truth disposition — primary judge = strongest available
54
+ model, blind second judge, report Cohen's κ (reuse `cohensKappa()` /
55
+ `judgeKappa()` from `src/scripts/check_quality_regression.ts`); verdict
56
+ admissible only at κ ≥ 0.60.
57
+ 2. **Cost**: tokens + USD (from the council cost ledger) + wall-clock per
58
+ decision, per arm.
59
+ 3. **Characteristics capture**: per decision, record the five feedback-
60
+ proposed dimensions (reversibility cost, material spend/risk,
61
+ multi-perspective conflict, evidence tension, policy/governance change) as
62
+ booleans AT PRE-REGISTRATION TIME (not after results) — so the ≥2-of-5
63
+ hypothesis is testable as a POST-HOc correlate without having gated
64
+ anything.
65
+
66
+ ## Kill criterion (falsifiable, from the 2026-07-12 debate)
67
+
68
+ - **No lift anywhere**: if council decisions show no identifiable quality
69
+ lift on ANY decision subset (overall AND per impact class AND per
70
+ dimension-count stratum), further deliberation-protocol phases STOP and
71
+ the protocol goes maintenance-only; `road-to-opt-council-deliberation`
72
+ records the honest null.
73
+ - **Lift on a subset**: derive empirical admission criteria FROM that
74
+ subset's recorded characteristics (which may or may not match the ≥2-of-5
75
+ heuristic — the data decides), and only then design an admission gate.
76
+ - **Judge floor**: κ < 0.60 → record κ, withhold the win-rate, do not claim
77
+ either direction.
78
+
79
+ ## Spend gate
80
+
81
+ Execution requires in-session user confirmation of the rendered estimate
82
+ (existing council estimate machinery; ~30 decisions × (1 + ~4.5) calls —
83
+ estimate rendered by `council estimate` at run time). Authoring the corpus
84
+ manifest and this design is unblocked and free.
85
+
86
+ ## Non-goals
87
+
88
+ - Not a cross-provider capability comparison (both arms use the configured
89
+ members; provider identity is held constant per arm definition).
90
+ - Not a re-test of the deliberation features individually (stance tally,
91
+ chairman) — arm B runs the current default debate shape; feature ablations
92
+ are follow-ups only if B beats A at all.
@@ -0,0 +1,51 @@
1
+ # Utilization-window decision criteria — pre-registered
2
+
3
+ > Design artifact for `road-to-feedback-8.11-2` Phase 0. The engagement
4
+ > observation window (telemetry.artifact_engagement, id-only,
5
+ > PII-excluded-by-construction) has been RUNNING in the agent-config repo
6
+ > since 2026-07-12. Per the repo's claims convention, the window's decision
7
+ > rules are fixed HERE, BEFORE the numbers accumulate — the reviewer's
8
+ > warning was precise: without pre-fixed criteria "the window ends with
9
+ > many events and no decidable statement." Companion claim:
10
+ > `docs/CLAIMS.md § utilization-window-decidability`.
11
+
12
+ ## Observation floor (all three, else "underpowered")
13
+
14
+ 1. **≥ 100 recorded task boundaries** in `.agent-engagement.jsonl`
15
+ (boundary_kind `task` or `phase-step`).
16
+ 2. **≥ 2 distinct hosts** contributed records (host identity read from the
17
+ session context at analysis time, not stored in the event — the event
18
+ schema stays id-only; if host cannot be attributed without widening the
19
+ schema, the floor degrades to "≥ 2 distinct recording periods ≥ 14 days
20
+ apart" and this deviation is recorded in the closing report).
21
+ 3. **≥ 45 elapsed days** since 2026-07-12.
22
+
23
+ Below the floor at day 90 → the window is **underpowered**: extend ONCE by
24
+ 30 days. Still below → STOP, record the honest null ("insufficient natural
25
+ usage volume to decide utilization"), and do NOT rebuild collection
26
+ apparatus without a new demand signal.
27
+
28
+ ## Decision rules (fixed now — no goalpost-moving)
29
+
30
+ | # | Observation at window close | Bound decision |
31
+ |---|---|---|
32
+ | D1 | Artifact kind entry (skill/rule/command/guideline/persona id) **loaded-never-consulted** across the full window (requires the U1a `loaded` denominator; if U1a has not landed, D1 degrades to consulted-set analysis and says so) | Goes on the **retirement-candidate list** feeding U1's ranked cut list — candidate, not auto-cut; kernel + safety floors exempt by construction |
33
+ | D2 | Artifact **consulted-never-applied** with ≥ 5 consultations and applied-ratio < 10% | Goes on the **trigger-review queue** (description/trigger overhaul, not deletion) |
34
+ | D3 | Window closes **above the floor** | The first U1 report MUST name ≥ 1 concrete keep/cut/review decision per artifact kind, or record per kind why the data does not support one |
35
+ | D4 | Window closes **below the floor** (after the one extension) | Honest null; lifecycle-automation and field-outcome-ledger gates STAY closed (their revisit-if remains "≥ 1 full window") |
36
+
37
+ ## Explicitly out of scope for this window
38
+
39
+ - **Outcome-quality attribution** (did artifact X improve the result) —
40
+ needs the `loaded` denominator plus far more volume; stays with U1a.
41
+ - **Cost-vs-rework economics** — owned by the orchestration telemetry
42
+ track (`road-to-subagent-value-realization-followup`).
43
+ - **Cross-repo aggregation** — the window is this repo only (council
44
+ condition from the 8.11 disposition).
45
+
46
+ ## Kill criterion
47
+
48
+ If the window closes decidable (D3) but its decisions are cited by zero
49
+ actual portfolio changes within 2 releases, the analysis layer (not the
50
+ telemetry) is the dead weight — record that honest null before building
51
+ any further reporting on top.
@@ -95,6 +95,74 @@ When making decisions:
95
95
  - Avoid rework caused by wrong assumptions
96
96
  - Prefer: short clarification early → correct implementation once
97
97
 
98
+ ## 8. Improve before implement — pre-implementation validation
99
+
100
+ _Origin: migrated from `src/rules/improve-before-implement.md` per the P4 pattern of `road-to-kernel-and-router.md`. The rule keeps the activation lists and the golden rule ("Challenge to improve, never to refuse"); the check detail lives here._
101
+
102
+ Before coding a new feature, refactor, module, or behavior-altering change, quickly verify:
103
+
104
+ ### 8a. Is the request clear?
105
+
106
+ - Are acceptance criteria defined or derivable?
107
+ - Is the scope bounded? (not "make it better" but "add X to Y")
108
+ - Are edge cases considered?
109
+
110
+ **If unclear** → ask ONE focused question. Max 2 questions, never an interrogation.
111
+
112
+ ### 8b. Does it fit the existing architecture?
113
+
114
+ - Does similar functionality already exist?
115
+ - Does it follow established patterns in the codebase?
116
+ - Does it contradict existing conventions?
117
+ - Do **multiple valid patterns/frameworks** already exist (e.g. Tailwind + Flux, multiple form libraries, competing state stores)? If yes, do NOT pick one arbitrarily — ask which to use.
118
+ - Is the change a **second branch on the same discriminator** — second `match`/`switch` arm, second `if/elseif`, or second class hardcoded to one enum value (e.g. `Provider::FOO`, `'stripe'`)? If yes, run the Strategy sniff test before adding the branch — see [`strategy.md`](../php/patterns/strategy.md#sniff-test--when-an-enumstring-discriminator-wants-to-become-a-strategy).
119
+
120
+ **If misfit** → show evidence (file references), propose alternative.
121
+ **If multiple valid options** → list them, ask which to use. See [§ 2 — No blind implementation](#2-no-blind-implementation).
122
+
123
+ ### 8c. Is the approach sound?
124
+
125
+ - Is there a simpler way to achieve the same result?
126
+ - Are there known problems with the requested approach?
127
+ - Does the scope match the stated goal? (not over-engineered, not under-specified)
128
+
129
+ **If problematic** → explain the concern, propose a better approach.
130
+
131
+ ### How to challenge
132
+
133
+ - **Be concise** — one sentence per concern, not paragraphs
134
+ - **Show evidence** — reference existing code, patterns, or conventions
135
+ - **Offer alternatives** — don't just say "this is wrong"
136
+ - **Use numbered options** — let the user choose quickly
137
+ - **Respect "just do it"** — if the user insists after your challenge, execute immediately
138
+
139
+ Example:
140
+
141
+ ```
142
+ > ⚠️ `UserService` already has a `deactivate()` method that covers this case.
143
+ >
144
+ > 1. Use existing method — extend with new parameter
145
+ > 2. Create new method anyway — I'll explain the overlap in a comment
146
+ > 3. Skip validation — implement as requested
147
+ ```
148
+
149
+ After presenting concerns: user picks an option → execute immediately; user says "just do it" → execute immediately. Never argue twice about the same point. Never block work — delay is only justified if it prevents a clear mistake.
150
+
151
+ ### Scope limits
152
+
153
+ - **Max 1-2 challenges per task** — not every request needs validation
154
+ - **Max 1 minute of analysis** — if the check takes longer, skip it
155
+ - **Never validate simple tasks** — only features, architecture, significant changes
156
+ - **Never validate after the user already explained their reasoning**
157
+
158
+ ### Verify with concrete tools, not prose
159
+
160
+ If the challenge requires you to confirm current behavior before proposing an alternative, use a concrete probe — a `curl` against the endpoint, a Playwright spec, a debugger / `xdebug` step-through, or the project's test runner with a targeted filter. Asserting current behavior from memory is not validation.
161
+
162
+ ### Intent inference (RDP, standard host)
163
+
164
+ When the literal request and the underlying goal may differ, **state the inferred goal in one line and give ONE recommendation** — do not spread 2–3 framings (that is the overplanning [`direct-answers`](../../../src/rules/direct-answers.md) suppresses). Standard host only; a strong-reasoning host self-infers, so skip it there. Engage per [`rdp-gate`](../../../src/agent-src/contexts/execution/rdp-gate.md).
165
+
98
166
  ## Anti-patterns
99
167
 
100
168
  - Asking 5 complex questions at once
@@ -0,0 +1,241 @@
1
+ # Rule Body Migration Inventory
2
+
3
+ > Full classification of every `src/rules/*.md` file against the P4 pattern
4
+ > (thin Iron-Law stub + `Body migrated to skill:X / guideline:Y` routing
5
+ > line) — done vs. not-yet-done vs. must-never-be-done, with concrete
6
+ > target homes for the not-yet-done set.
7
+
8
+ _Compiled: 2026-07-12 · Scope: `src/rules/*.md` only (104 files) · Method
9
+ below._
10
+
11
+ ## Method
12
+
13
+ 1. Read every rule's frontmatter (`type`, `alwaysApply`, `tier`) and body
14
+ line count via `wc -l`.
15
+ 2. Checked kernel membership against
16
+ [`docs/contracts/kernel-membership.md`](../../contracts/kernel-membership.md)
17
+ § 4 — the 9 rules currently carrying `type: "always"` /
18
+ `alwaysApply: true` are the live kernel (`user-interrupt-priority` was
19
+ demoted from the kernel back to `type: auto` on 2026-07-06 per that
20
+ contract's provenance log, so it is **not** counted as kernel here even
21
+ though an earlier section of the same contract still labels it the
22
+ "10th kernel rule" — frontmatter is ground truth).
23
+ 3. Grepped case-insensitively for `migrated to` across `src/rules/*.md` to
24
+ find rules that already point their body at a skill/guideline/context —
25
+ including near-variants of the exact P4 phrase (`Portability body
26
+ migrated to …`, `Sync body migrated to …`).
27
+ 4. For rules **without** that marker, read the full body (already present
28
+ verbatim in-session from the `dist/agent-src/rules/` projection, which
29
+ preserves Iron Laws byte-for-byte and body structure per
30
+ `preservation-guard`) and judged: is the non-Iron-Law content (a)
31
+ already effectively a thin routing hub even without the literal phrase
32
+ (e.g. `source-of-truth.md`'s "Mechanics — … live in
33
+ `[…]`" pointer), (b) a tight, load-bearing enforcement surface — a
34
+ table, a literal-string marker set, a short numbered check — that
35
+ doesn't shrink usefully by relocating, or (c) genuine bulk (worked
36
+ examples, rationale essays, multi-step procedures, failure-mode
37
+ catalogs) with either an existing skill/guideline that already
38
+ half-references it, or an obvious net-new location.
39
+ 5. For every `should-migrate` candidate, verified the named target file
40
+ actually exists (`ls`/`find`) before citing it as "existing"; targets
41
+ that don't exist are marked "new guideline needed".
42
+
43
+ ## Classification table
44
+
45
+ Legend: **class** = `thin` (already-thin) / `migrate` (should-migrate) /
46
+ `stay` (must-stay-monolithic). **Kernel?** = Y only for the 9 live
47
+ always-loaded rules.
48
+
49
+ | rule | class | body lines | kernel? | target home | note |
50
+ |---|---|---:|:---:|---|---|
51
+ | active-remediation.md | migrate | 92 | | new guideline: `docs/guidelines/agent-infra/active-remediation-mechanics.md` | ladder detail, version-gated modernization, guardrails prose extractable; Iron Law + ladder tiers + live-security carve-out stay |
52
+ | agent-authority.md | stay | 26 | Y | — | kernel priority index; body IS the routing table |
53
+ | analysis-skill-routing.md | thin | 20 | | `skill:analysis-skill-router` (existing) | pure P4 stub |
54
+ | architecture.md | migrate | 96 | | `skill:module-detect-on-the-fly` (existing) | Project Detection / Build-Runner Detection / Module & Package docs sections migratable; keep Iron Law + General Principles (already pointer-heavy to laravel/symfony/nextjs skills) |
55
+ | artifact-drafting-protocol.md | migrate | 122 | | new guideline: `docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md` | Phase A/B/C detail + roadmap batch-mode carve-out extractable; keep Iron Law + phase headers + golden rules |
56
+ | artifact-engagement-recording.md | thin | 52 | | `contexts/contracts/artifact-engagement-flow.md` (existing) | routes via "Recording contract + privacy floor: […]" phrasing, functionally P4 |
57
+ | ask-when-uncertain.md | stay | 66 | Y | — | kernel Iron Law + ask-policy floor |
58
+ | augment-edit-discipline.md | thin | 29 | | `guideline:augment-portability-patterns` + `skill:agent-docs-writing` (both existing) | two explicit "body migrated to" sentences |
59
+ | autonomous-execution.md | thin | 81 | | `contexts/execution/autonomy-mechanics.md` + siblings (existing) | hybrid: several short Iron-Law-style blocks retained (Hard Floor pointer, N=3 budget headline), full mechanics already migrated |
60
+ | brand-consistency.md | stay | 75 | | — | gate definition is the enforcement surface itself; already routes deeper mechanics to `brand-identity`/`brand-to-tokens`/`design-intelligence` |
61
+ | brand-source-of-truth.md | stay | 65 | | — | explicitly "light by design"; precedence order is the whole rule |
62
+ | broken-access-control.md | thin | 68 | | `skill:authz-review` (existing) | hybrid: 2 short Iron-Law blocks (3 negative tests) retained, deep controls/matrix/backstop-grep content already migrated |
63
+ | cli-output-handling.md | thin | 40 | | `skill:rtk-output-filtering` (existing) | pure P4 stub |
64
+ | code-comment-discipline.md | migrate | 148 | | `docs/guidelines/code-clarity.md` (existing) | already cross-references this guideline as "canonical long-form"; 3 worked-example code blocks + carve-out detail duplicate it and can move, keeping Iron Law + banned-class table + scope boundary |
65
+ | command-suggestion-policy.md | stay | 47 | | — | tier `mechanical-already`; single Iron Law + 5-item subordination list is the whole enforcement surface |
66
+ | commit-conventions.md | thin | 20 | | `skill:conventional-commits-writing` (existing) | pure P4 stub |
67
+ | commit-policy.md | stay | 67 | Y | — | kernel Iron Law + commit exceptions |
68
+ | communication-through-line.md | stay | 42 | | — | short; 5-item checkable-behaviors list is the whole rule |
69
+ | content-quoting-floor.md | stay | 88 | | — | the 5 numbered floor rules + carve-outs ARE the enforcement; failure-modes list is short (4 bullets), not worth extracting |
70
+ | context-hygiene.md | migrate | 186 | | new guideline: `docs/guidelines/agent-infra/context-hygiene-mechanics.md` | **longest rule in the tree**; hook-fallback prose, state-dump template, Copilot-fallback procedure, Augment ignored-skills recovery all extractable; keep Iron-Law-style freshness/3-failure/loop-detection triggers |
71
+ | copilot-routing.md | thin | 20 | | `skill:copilot-config` (existing) | pure P4 stub |
72
+ | decision-revisit-gate.md | migrate | 128 | | `skill:decision-review` (existing) | lock-type catalog + failure-mode catalog extractable; keep Iron Law + "what to do when it fires" steps + "when NOT to fire" |
73
+ | delegation-policy.md | stay | 96 | | — | already a routing hub in all but name — 6 numbered obligations, each 1–2 lines pointing at an existing context file (`auto-orchestration-activation.md`, `subagent-steering.md`, etc.) |
74
+ | design-fidelity.md | migrate | 140 | | new guideline: `docs/guidelines/design-fidelity-mechanics.md` | "Surgical visual edits" + "Asset & imagery discipline" + failure-mode catalog are substantial illustrative content; keep Iron Law + strictness-mode table + when-fires/not |
75
+ | devcontainer-routing.md | thin | 21 | | `skill:devcontainer` (existing) | pure P4 stub |
76
+ | direct-answers.md | stay | 62 | Y | — | kernel — 3 Iron Laws |
77
+ | docker-commands.md | thin | 21 | | `skill:docker` (existing) | pure P4 stub |
78
+ | domain-adoption-policy.md | migrate | 158 | | new guideline: `docs/guidelines/agent-infra/domain-adoption-gates.md` | 3-gate rationale essays + "what to do when gates fail" procedure + failure-mode catalog are substantial and rarely-fired (only on new-domain proposals); keep Iron Law + 3 gate names |
79
+ | domain-safety-disclaimer.md | stay | 117 | | — | domain safety floor |
80
+ | domain-safety-pii.md | stay | 166 | | — | domain safety floor (2nd-longest rule; 4-surface redaction tables ARE the enforcement) |
81
+ | domain-safety-retention.md | stay | 87 | | — | domain safety floor |
82
+ | downstream-changes.md | stay | 80 | | — | the "what to check" table + breaking-change lists ARE the checklist |
83
+ | engineering-safety-floor.md | stay | 91 | | — | domain safety floor |
84
+ | external-code-graph-interop.md | stay | 65 | | — | narrow, tight; numbered steps are the whole rule |
85
+ | external-reference-deep-dive.md | stay | 70 | | — | failure-mode catalog + case-zero anchor are load-bearing recognition material, not filler; below the bulk threshold applied elsewhere |
86
+ | fast-path-marker-visibility.md | stay | 83 | | — | body IS literal marker strings the agent must reproduce verbatim; cannot be paraphrased into a skill |
87
+ | finance-safety-floor.md | stay | 103 | | — | domain safety floor |
88
+ | framework-neutrality-in-generic-skills.md | migrate | 131 | | new guideline: `docs/guidelines/agent-infra/framework-neutrality-patterns.md` | 10-row forbidden-pattern table + cross-stack/carve-out examples extractable; keep Iron Law + scope + enforcement pointer (linter is the backstop either way) |
89
+ | git-history-discipline.md | thin | 90 | | `skill:git-workflow` (existing) | hybrid: 3 short Iron-Law blocks retained, full mechanics already migrated |
90
+ | guidelines.md | thin | 30 | | `contexts/communication/rules-auto/guidelines-mechanics.md` (existing) | "Index — see mechanics" pointer, functionally P4 |
91
+ | icon-consistency.md | stay | 52 | | — | tight; already routes deeper mechanics to `iconography` skill |
92
+ | image-likeness-and-rights.md | stay | 65 | | — | explicit "Compose — do NOT duplicate" section pointing at 5 media policy files; gate table is short |
93
+ | improve-before-implement.md | migrate | 124 | | `docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md` (existing) | already cross-referenced twice ("no blind implementation"); worked-example block + scope-limits detail extractable |
94
+ | invite-challenge.md | stay | 72 | | — | worked-example block is short and essential; below bulk threshold |
95
+ | language-and-tone.md | stay | 62 | Y | — | kernel Iron Law |
96
+ | laravel-routing.md | thin | 26 | | `skill:laravel` (existing) | pure P4 stub |
97
+ | laravel-translations.md | thin | 26 | | `skill:laravel` (existing) | pure P4 stub |
98
+ | legal-safety-floor.md | stay | 134 | | — | domain safety floor — but note: already the **best existing exemplar** of the P4 pattern applied *within* a safety floor (5 Iron Laws kept inline, all operating mechanics migrated to `skill:legal-practice-profile`); a template for the other 6 safety floors below, none of which do this yet |
99
+ | lethal-trifecta-guard.md | stay | 86 | | — | conceptual (3 legs) + short decision list; no removable bulk |
100
+ | linked-projects-onboarding-gate.md | thin | 35 | | `guideline:agent-infra/linked-projects-onboarding-gate` (existing) | pure P4 stub |
101
+ | low-impact-corpus-privacy-floor.md | stay | 77 | | — | 8-class forbidden-content table IS the redactor spec (mirrors `scripts/ai_council/redact_low_impact_entry.ts`) |
102
+ | markdown-safe-codeblocks.md | stay | 23 | | — | trivial |
103
+ | media-governance-routing.md | stay | 83 | | — | already a routing rule by design (7 pointers into `agents/settings/policies/media/`); rationale essay is short |
104
+ | media-sync-ground-truth.md | stay | 74 | | — | 6-step procedure is the whole rule |
105
+ | minimal-safe-diff.md | migrate | 166 | | new guideline: `docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md` | **tied-longest rule**; "Anti-over-engineering", "Own-orphan cleanup", "Break-glass exception", "Bounded remediation carve-out" are each self-contained essays with worked criteria; keep Iron Law + "the rule" + "before writing the diff" + red flags |
106
+ | missing-tool-handling.md | thin | 20 | | `guideline:agent-infra/missing-tool-handling` (existing) | pure P4 stub |
107
+ | model-recommendation.md | thin | 23 | | `guideline:agent-infra/model-recommendation` (existing) | pure P4 stub |
108
+ | no-attribution-footers.md | stay | 55 | | — | short; forbidden-pattern list is the check |
109
+ | no-cheap-questions.md | stay | 72 | Y | — | kernel — 6 Iron Laws + self-check |
110
+ | no-decorative-emojis-in-git-surfaces.md | stay | 110 | | — | whitelist/blacklist/legend-carve-out tables ARE the enforcement surface, must stay verbatim |
111
+ | no-pr-progress-comments.md | stay | 105 | | — | gated/not-gated lists ARE the enforcement surface |
112
+ | no-roadmap-references.md | migrate | 139 | | `skill:agent-docs-writing` (existing) | already cross-referenced ("roadmap layer conventions"); structural-carveout table + 4-step "what to do instead" + narrative failure modes extractable |
113
+ | non-destructive-by-default.md | stay | 59 | Y | — | kernel Hard Floor |
114
+ | notes-first-reasoning.md | stay | 69 | | — | structural section list is the whole rule |
115
+ | onboarding-gate.md | stay | 31 | | — | trivial |
116
+ | output-discipline.md | stay | 83 | | — | banned-placeholder-pattern table IS the enforcement surface (mirrors `lint_output_slop.ts`) |
117
+ | package-ci-checks.md | thin | 20 | | `skill:lint-skills` (existing) | pure P4 stub |
118
+ | persona-governance.md | migrate | 91 | | `docs/contracts/persona-schema.md` (existing) | already routes schema/catalog there; "four checks" full elaboration + day-one historical note extractable, keep Iron Law + check names + failure modes |
119
+ | php-coding.md | thin | 25 | | `guideline:php/php-coding-patterns` (existing) | pure P4 stub |
120
+ | prefer-enums-over-literals.md | stay | 65 | | — | all content directly operative (when/when-not/how); no removable bulk |
121
+ | preservation-guard.md | stay | 95 | | — | body IS the condensation-quality checklist consumed by `check_condensation.ts` |
122
+ | provider-lifecycle-discipline.md | migrate | 78 | | `docs/contracts/provider-lifecycle.md` (existing) | already the primary reference; "why agent-in-the-loop, not Python gate" rationale essay + day-one state note extractable |
123
+ | question-not-instruction.md | stay | 76 | | — | short "the trap" narrative + 3-step protocol is the whole rule |
124
+ | reviewer-awareness.md | thin | 27 | | `skill:review-routing` (existing) | pure P4 stub |
125
+ | roadmap-ci-steps-policy.md | migrate | 155 | | `contexts/execution/roadmap-process-loop.md` (existing) | already cross-referenced ("§5 owns the inline-skip mechanics"); forbidden-pattern table + authoring/execution procedure detail extractable |
126
+ | roadmap-progress-sync.md | thin | 90 | | `guideline:agent-infra/roadmap-progress-mechanics` (existing) | hybrid: 3 Iron Laws + PR-gate + mandatory pre-send self-check retained, long-form detail already migrated |
127
+ | role-mode-adherence.md | stay | 59 | | — | short; already delegates contract detail to `docs/guidelines/agent-infra/role-contracts.md` |
128
+ | rule-type-governance.md | thin | 18 | | `guideline:agent-infra/rule-type-governance` (existing) | pure P4 stub |
129
+ | runtime-safety.md | stay | 49 | | — | trivial |
130
+ | scope-control.md | stay | 67 | Y | — | kernel — git-ops permission gate |
131
+ | security-sensitive-stop.md | stay | 103 | | — | surface table + "what to do when it fires" table + memory-lookup command block ARE the enforcement surface; security-critical, kept loaded rather than gated behind a fetch |
132
+ | senior-engineering-discipline.md | stay | 82 | | — | already delegates deep detail to `skill:ai-code-blindspots`; remaining prose is the anchor summary |
133
+ | size-enforcement.md | stay | 35 | | — | trivial |
134
+ | skill-improvement-trigger.md | thin | 20 | | `skill:skill-improvement-pipeline` (existing) | pure P4 stub |
135
+ | skill-quality.md | thin | 18 | | `guideline:agent-infra/skill-quality-checklist` (existing) | pure P4 stub |
136
+ | slash-command-routing-policy.md | thin | 21 | | `skill:command-routing` (existing) | pure P4 stub |
137
+ | source-confidentiality.md | stay | 97 | | — | two short Iron-Law-style blocks; each section is directly operative |
138
+ | source-discovery-gate.md | stay | 96 | | — | two short Iron-Law-style blocks; already delegates the procedure to `skill:source-discovery` and 2 context files |
139
+ | source-of-truth.md | thin | 78 | | `contexts/communication/rules-auto/source-of-truth-mechanics.md` (existing) | explicit "Mechanics — … live in […]" pointer, functionally P4 |
140
+ | spreadsheet-source-quality.md | stay | 61 | | — | source-priority list is the whole rule |
141
+ | strategy-safety-floor.md | stay | 104 | | — | domain safety floor |
142
+ | symfony-routing.md | thin | 26 | | `skill:symfony-workflow` (existing) | pure P4 stub |
143
+ | telegraph-speak.md | stay | 85 | | — | self-describing condensation mechanism; algorithm must stay next to the Iron Law it governs (applies to every reply) |
144
+ | think-before-action.md | thin | 64 | | `contexts/communication/rules-auto/think-before-action-mechanics.md` (existing) | explicit "obligation surface / lookup material" split, functionally P4 |
145
+ | token-budget-discipline.md | stay | 118 | | — | 2 Iron-Law-style blocks + 2 classification tables ARE the governance criteria |
146
+ | token-efficiency.md | thin | 35 | | `contexts/communication/rules-auto/token-efficiency-mechanics.md` (existing) | explicit "Mechanics — …" pointer, functionally P4 |
147
+ | token-optimizer-maintenance.md | stay | 69 | | — | narrow, self-referential meta-rule about one skill's catalog freshness |
148
+ | tool-safety.md | stay | 53 | | — | short; constraints list is the whole rule |
149
+ | ui-audit-gate.md | thin | 59 | | `skill:existing-ui-audit` (existing) | hybrid: Iron Law + allow-list retained, rest migrated |
150
+ | untrusted-input-defense.md | migrate | 142 | | `docs/guidelines/agent-infra/untrusted-input-spotlighting.md` (existing) | injection-signal taxonomy (dark patterns, session integrity, autofill, card-from-chat) is substantial and already half-covered by this guideline; keep Iron Law + found-instructions quarantine + "what to do" |
151
+ | upstream-proposal.md | thin | 20 | | `skill:upstream-contribute` (existing) | pure P4 stub |
152
+ | user-interaction.md | thin | 74 | | `contexts/communication/rules-auto/user-interaction-mechanics.md` (existing) | explicit "obligation surface / lookup material" split, functionally P4 |
153
+ | user-interrupt-priority.md | stay | 58 | | — | short; classify-table + 3-step protocol is the whole rule (demoted from kernel 2026-07-06, still foundational authority content) |
154
+ | verify-before-complete.md | stay | 80 | Y | — | kernel — already partially delegates to `contexts/execution/verification-mechanics.md` |
155
+
156
+ ## Summary counts
157
+
158
+ | class | count |
159
+ |---|---:|
160
+ | `already-thin` | 32 |
161
+ | `should-migrate` | 16 |
162
+ | `must-stay-monolithic` | 56 |
163
+ | **total** | **104** |
164
+
165
+ `must-stay-monolithic` breakdown: 9 kernel + 7 domain-safety-floor
166
+ (`finance-safety-floor`, `legal-safety-floor`, `strategy-safety-floor`,
167
+ `engineering-safety-floor`, `domain-safety-disclaimer`, `domain-safety-pii`,
168
+ `domain-safety-retention`) + 40 other (short/tight/table-is-the-law rules).
169
+
170
+ `already-thin` breakdown: 27 carry the literal (or near-literal, e.g.
171
+ "Portability body migrated to …") P4 routing phrase; 5 more
172
+ (`guidelines.md`, `source-of-truth.md`, `think-before-action.md`,
173
+ `token-efficiency.md`, `user-interaction.md`) achieve the same
174
+ obligation-surface / lookup-material split via an explicit "Mechanics — …
175
+ live in `[…]`" pointer instead of the exact phrase, and are counted as
176
+ thin because their residual body is small and non-duplicative.
177
+
178
+ ## Full should-migrate list with targets
179
+
180
+ | rule | body lines | target home | status |
181
+ |---|---:|---|---|
182
+ | context-hygiene.md | 186 | `docs/guidelines/agent-infra/context-hygiene-mechanics.md` | new guideline needed |
183
+ | minimal-safe-diff.md | 166 | `docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md` | new guideline needed |
184
+ | domain-adoption-policy.md | 158 | `docs/guidelines/agent-infra/domain-adoption-gates.md` | new guideline needed |
185
+ | roadmap-ci-steps-policy.md | 155 | `src/agent-src/contexts/execution/roadmap-process-loop.md` | existing — extend |
186
+ | code-comment-discipline.md | 148 | `docs/guidelines/code-clarity.md` | existing — extend |
187
+ | untrusted-input-defense.md | 142 | `docs/guidelines/agent-infra/untrusted-input-spotlighting.md` | existing — extend |
188
+ | design-fidelity.md | 140 | `docs/guidelines/design-fidelity-mechanics.md` | new guideline needed |
189
+ | no-roadmap-references.md | 139 | `skill:agent-docs-writing` | existing — extend |
190
+ | framework-neutrality-in-generic-skills.md | 131 | `docs/guidelines/agent-infra/framework-neutrality-patterns.md` | new guideline needed |
191
+ | decision-revisit-gate.md | 128 | `skill:decision-review` | existing — extend |
192
+ | improve-before-implement.md | 124 | `docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md` | existing — extend |
193
+ | artifact-drafting-protocol.md | 122 | `docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md` | new guideline needed |
194
+ | architecture.md | 96 | `skill:module-detect-on-the-fly` | existing — extend |
195
+ | active-remediation.md | 92 | `docs/guidelines/agent-infra/active-remediation-mechanics.md` | new guideline needed |
196
+ | persona-governance.md | 91 | `docs/contracts/persona-schema.md` | existing — extend |
197
+ | provider-lifecycle-discipline.md | 78 | `docs/contracts/provider-lifecycle.md` | existing — extend |
198
+
199
+ 7 new guidelines needed; 9 target an existing skill/guideline/context file.
200
+
201
+ ## Batching proposal (input to the follow-on rule-load roadmap, not edited here)
202
+
203
+ Grouped by target-home affinity into 3 batches of 5–6, ordered so the
204
+ new-guideline-heavy batch (more authoring work, less risk of touching a
205
+ kernel-adjacent surface) lands first and the safety/security-adjacent batch
206
+ lands last (extra review scrutiny, smallest batch):
207
+
208
+ **Batch 1 — new agent-infra guidelines (5 rules, all net-new targets)**
209
+ `context-hygiene.md`, `minimal-safe-diff.md`, `domain-adoption-policy.md`,
210
+ `artifact-drafting-protocol.md`, `active-remediation.md` → each gets its own
211
+ new `docs/guidelines/agent-infra/*-mechanics.md` (or `*-gates.md`). No
212
+ cross-rule dependency; can land in any order inside the batch.
213
+
214
+ **Batch 2 — extend existing docs/contracts + docs/guidelines (6 rules)**
215
+ `code-comment-discipline.md` → `docs/guidelines/code-clarity.md`;
216
+ `decision-revisit-gate.md` → `skill:decision-review`;
217
+ `improve-before-implement.md` → `docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md`;
218
+ `architecture.md` → `skill:module-detect-on-the-fly`;
219
+ `persona-governance.md` → `docs/contracts/persona-schema.md`;
220
+ `provider-lifecycle-discipline.md` → `docs/contracts/provider-lifecycle.md`.
221
+ Each target already has partial coverage of the migrating content — lowest
222
+ risk of duplication/contradiction, good second batch.
223
+
224
+ **Batch 3 — execution/security-adjacent (5 rules, extra review)**
225
+ `roadmap-ci-steps-policy.md` → `contexts/execution/roadmap-process-loop.md`;
226
+ `no-roadmap-references.md` → `skill:agent-docs-writing`;
227
+ `untrusted-input-defense.md` → `docs/guidelines/agent-infra/untrusted-input-spotlighting.md`;
228
+ `design-fidelity.md` → `docs/guidelines/design-fidelity-mechanics.md` (new);
229
+ `framework-neutrality-in-generic-skills.md` → `docs/guidelines/agent-infra/framework-neutrality-patterns.md` (new).
230
+ Grouped last because 2 of the 5 touch security/untrusted-input adjacent
231
+ surfaces (`untrusted-input-defense`, and indirectly `no-roadmap-references`
232
+ via the CI-reference-integrity gate) and 2 are linter-companion rules
233
+ (`roadmap-ci-steps-policy`, `framework-neutrality-in-generic-skills`) where
234
+ the migrated prose must stay in lockstep with the corresponding
235
+ `scripts/lint_*.ts` — worth a slower, more careful pass.
236
+
237
+ ## See also
238
+
239
+ - [`docs/contracts/kernel-membership.md`](../../contracts/kernel-membership.md) — the 9-rule kernel this inventory treats as permanently must-stay.
240
+ - [`docs/guidelines/agent-infra/model-recommendation.md`](model-recommendation.md) / [`docs/guidelines/agent-infra/roadmap-progress-mechanics.md`](roadmap-progress-mechanics.md) — worked examples of the target-file header/format convention this inventory's proposed new guidelines should follow (`# Title` + `>` one-line summary + `_Origin: migrated from …`_ + Iron-Law restatement + sections; no frontmatter).
241
+ - The roadmap layer's "P4" migration pattern — the mechanism this inventory audits; not cited by filepath per [`no-roadmap-references`](../../../src/rules/no-roadmap-references.md) (roadmap files are transient, this inventory is durable).