@event4u/agent-config 14.6.0 → 14.8.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.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +255 -145
- package/README.md +1 -1
- package/dist/agent-src/commands/analyze/inbox.md +264 -10
- package/dist/agent-src/commands/analyze.md +1 -1
- package/dist/agent-src/commands/evals/git-pr-merge.json +13 -0
- package/dist/agent-src/commands/evals/roadmap.json +17 -1
- package/dist/agent-src/commands/pr/create.md +14 -2
- package/dist/agent-src/commands/pr/merge.md +379 -0
- package/dist/agent-src/commands/roadmap/process-full.md +272 -32
- package/dist/agent-src/commands/roadmap.md +1 -1
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +46 -36
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +37 -2
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +95 -2
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +289 -106
- package/dist/agent-src/rules/artifact-drafting-protocol.md +5 -1
- package/dist/agent-src/rules/context-hygiene.md +2 -0
- package/dist/agent-src/rules/decision-revisit-gate.md +67 -32
- package/dist/agent-src/rules/fix-what-you-see.md +108 -0
- package/dist/agent-src/rules/no-roadmap-references.md +0 -5
- package/dist/agent-src/rules/recurring-criticism.md +110 -0
- package/dist/agent-src/rules/roadmap-progress-sync.md +20 -1
- package/dist/agent-src/rules/rule-type-governance.md +0 -2
- package/dist/agent-src/rules/self-repair-loop.md +17 -0
- package/dist/agent-src/rules/skill-quality.md +0 -2
- package/dist/agent-src/rules/source-confidentiality.md +37 -7
- package/dist/agent-src/scripts/archival_sweep.ts +117 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +26 -7
- package/dist/agent-src/scripts/dashboard_mode.ts +212 -0
- package/dist/agent-src/scripts/gate_budget.ts +282 -0
- package/dist/agent-src/scripts/gate_execute.ts +72 -31
- package/dist/agent-src/scripts/roadmap_gates.ts +74 -3
- package/dist/agent-src/scripts/update_roadmap_progress.ts +296 -53
- package/dist/agent-src/skills/adr-create/SKILL.md +124 -5
- package/dist/agent-src/skills/ai-council/SKILL.md +48 -807
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +320 -0
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +99 -0
- package/dist/agent-src/skills/ai-council/references/execution-modes.md +162 -0
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +125 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +143 -0
- package/dist/agent-src/skills/decision-record/SKILL.md +61 -3
- package/dist/agent-src/skills/decision-review/SKILL.md +65 -0
- package/dist/agent-src/skills/merge-conflicts/SKILL.md +26 -0
- package/dist/agent-src/skills/quality-tools/SKILL.md +34 -326
- package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +113 -0
- package/dist/agent-src/skills/quality-tools/references/php-tools.md +222 -0
- package/dist/agent-src/skills/roadmap-management/SKILL.md +15 -409
- package/dist/agent-src/skills/roadmap-management/references/archival.md +226 -0
- package/dist/agent-src/skills/roadmap-management/references/authoring.md +107 -0
- package/dist/agent-src/skills/roadmap-management/references/dashboard.md +47 -0
- package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +58 -0
- package/dist/agent-src/skills/security/SKILL.md +8 -0
- package/dist/agent-src/skills/security-audit/SKILL.md +12 -1
- package/dist/agent-src/skills/skill-writing/SKILL.md +34 -570
- package/dist/agent-src/skills/skill-writing/references/procedure.md +275 -0
- package/dist/agent-src/skills/skill-writing/references/read-only-scripts.md +18 -0
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +298 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +65 -4
- package/dist/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
- package/dist/agent-src/templates/scripts/telemetry/remote.ts +160 -7
- package/dist/agent-src/templates/scripts/telemetry/transport.ts +169 -0
- package/dist/cli/registry.js +2 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli-delegate/chunk-2GNWGMAL.js +172 -0
- package/dist/cli-delegate/{chunk-P6LQDIWK.js → chunk-7PRE6ZV2.js} +338 -0
- package/dist/cli-delegate/{chunk-BKO2AZ7Z.js → chunk-B2ERU2VA.js} +1 -1
- package/dist/cli-delegate/chunk-E4XIZDIB.js +402 -0
- package/dist/cli-delegate/{chunk-3UCJWMMP.js → chunk-EEJUMCDZ.js} +16 -16
- package/dist/cli-delegate/{chunk-NXFWFAYV.js → chunk-G23AT6GD.js} +1 -0
- package/dist/cli-delegate/{chunk-XURJ4AQC.js → chunk-H4VIVD4C.js} +385 -284
- package/dist/cli-delegate/chunk-I3EIN2YG.js +36 -0
- package/dist/cli-delegate/{chunk-RLN73PR5.js → chunk-LPPWO5CE.js} +12 -8
- package/dist/cli-delegate/chunk-MWRD5YOH.js +100 -0
- package/dist/cli-delegate/{chunk-UEZ7D35A.js → chunk-N7CDDGI3.js} +4 -23
- package/dist/cli-delegate/{chunk-63WSP6YZ.js → chunk-PMEKGDED.js} +74 -167
- package/dist/cli-delegate/{chunk-GRRPEPRN.js → chunk-T7L2QK3K.js} +24 -5
- package/dist/cli-delegate/{chunk-EVTY7ISR.js → chunk-YM4GZDJG.js} +9 -1
- package/dist/cli-delegate/cmd_adr_effective.js +1162 -0
- package/dist/cli-delegate/cmd_conformance.js +466 -716
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +10 -10
- package/dist/cli-delegate/cmd_explain.js +1 -1
- package/dist/cli-delegate/cmd_export.js +10 -9
- package/dist/cli-delegate/cmd_handoff.js +10 -9
- package/dist/cli-delegate/cmd_memory_get.js +2 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +5 -5
- package/dist/cli-delegate/cmd_prune.js +11 -10
- package/dist/cli-delegate/cmd_route_audit.js +6 -5
- package/dist/cli-delegate/cmd_route_explain.js +3 -3
- package/dist/cli-delegate/cmd_session_recycle.js +840 -30
- package/dist/cli-delegate/cmd_settings_get.js +3 -3
- package/dist/cli-delegate/cmd_settings_migrate.js +10 -9
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +11 -10
- package/dist/cli-delegate/cmd_uninstall.js +13 -11
- package/dist/cli-delegate/cmd_update.js +4 -4
- package/dist/cli-delegate/cmd_upgrade.js +4 -4
- package/dist/cli-delegate/cmd_validate.js +11 -10
- package/dist/cli-delegate/cmd_versions.js +3 -3
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +111 -37
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +5 -5
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +15 -12
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +11 -8
- package/dist/hooks/dispatch.js +3165 -2192
- package/dist/install/claudePathsPlan.js +187 -0
- package/dist/install/claudePathsPlan.js.map +1 -0
- package/dist/install/globalRuleLayers.js +169 -0
- package/dist/install/globalRuleLayers.js.map +1 -0
- package/dist/install/hostLayerFingerprint.js +136 -0
- package/dist/install/hostLayerFingerprint.js.map +1 -0
- package/dist/install/install.mjs +553 -425
- package/dist/install/partitionEligibility.js +432 -0
- package/dist/install/partitionEligibility.js.map +1 -0
- package/dist/install/ruleLayerPartition.js +157 -0
- package/dist/install/ruleLayerPartition.js.map +1 -0
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1863 -1234
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_src.js +41 -0
- package/dist/scripts/_lib/agent_src.js.map +1 -1
- package/dist/scripts/_lib/install_layout.js +83 -0
- package/dist/scripts/_lib/install_layout.js.map +1 -0
- package/dist/scripts/_lib/installed_lock.js +444 -0
- package/dist/scripts/_lib/installed_lock.js.map +1 -0
- package/dist/scripts/_lib/prune_empty_dirs.js +85 -0
- package/dist/scripts/_lib/prune_empty_dirs.js.map +1 -0
- package/dist/scripts/condense.js +63 -251
- package/dist/scripts/condense.js.map +1 -1
- package/dist/server/schemas/settings.js +4 -0
- package/dist/server/schemas/settings.js.map +1 -1
- package/docs/contracts/settings-classes.md +12 -6
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +8 -3
- package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +45 -1
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +26 -0
- package/docs/guidelines/agent-infra/false-green.md +47 -1
- package/docs/guidelines/agent-infra/memory-access.md +17 -0
- package/docs/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
- package/package.json +1 -1
- package/src/agent-src/scripts/archival_sweep.ts +117 -0
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +26 -7
- package/src/agent-src/scripts/dashboard_mode.ts +212 -0
- package/src/agent-src/scripts/gate_budget.ts +282 -0
- package/src/agent-src/scripts/gate_execute.ts +72 -31
- package/src/agent-src/scripts/roadmap_gates.ts +74 -3
- package/src/agent-src/scripts/update_roadmap_progress.ts +296 -53
- package/src/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
- package/src/agent-src/templates/scripts/telemetry/remote.ts +160 -7
- package/src/agent-src/templates/scripts/telemetry/transport.ts +169 -0
- package/src/config/agent-settings.template.yml +27 -2
- package/src/config/ci-local-parity.yml +39 -0
- package/src/config/estate-count-budget.json +612 -3
- package/src/config/evaluator-budgets.json +3 -3
- package/src/config/gate-coverage.yml +220 -12
- package/src/config/gate-violation-baselines.json +73 -63
- package/src/config/gitignore-block.txt +15 -2
- package/src/config/hook-latency-budget.json +5 -0
- package/src/config/rule-activation-census.json +14 -6
- package/src/config/rule-stub-ceilings.json +34 -7
- package/src/install/claudePathsPlan.ts +196 -0
- package/src/install/globalRuleLayers.ts +197 -0
- package/src/install/hostLayerFingerprint.ts +145 -0
- package/src/install/partitionEligibility.ts +502 -0
- package/src/install/ruleLayerPartition.ts +212 -0
- package/src/scripts/_cli/cmd_adr_effective.ts +484 -0
- package/src/scripts/_cli/cmd_session_recycle.ts +9 -1
- package/src/scripts/_dispatch.bash +17 -1
- package/src/scripts/_lib/ac_heading.ts +30 -0
- package/src/scripts/_lib/adr_frontmatter.test.ts +365 -0
- package/src/scripts/_lib/adr_frontmatter.ts +459 -0
- package/src/scripts/_lib/agent_src.ts +42 -0
- package/src/scripts/_lib/bench_ab_pinned_repo.ts +162 -0
- package/src/scripts/_lib/bench_ab_workspace.ts +10 -1
- package/src/scripts/_lib/envelope_grounding.ts +49 -9
- package/src/scripts/_lib/installed_lock.ts +50 -5
- package/src/scripts/_lib/layer_overlap_notice.ts +11 -2
- package/src/scripts/_lib/md_section.ts +129 -0
- package/src/scripts/_lib/prune_empty_dirs.ts +80 -0
- package/src/scripts/_lib/scope_guard.sh +26 -3
- package/src/scripts/_lib/self_repair.ts +19 -0
- package/src/scripts/_lib/self_repair_class_b.ts +171 -0
- package/src/scripts/adr/evidence_census.ts +899 -0
- package/src/scripts/adr/regenerate_index.ts +12 -32
- package/src/scripts/adr_cite_check.ts +540 -39
- package/src/scripts/ai_council/cli_help.ts +55 -0
- package/src/scripts/audit_adr_coverage.ts +103 -17
- package/src/scripts/before_complete_hook.ts +153 -28
- package/src/scripts/bench_ab_v2_complexity.ts +27 -7
- package/src/scripts/bench_hook_latency.ts +204 -0
- package/src/scripts/build_archive_index.ts +34 -0
- package/src/scripts/check_adr_frontmatter.ts +574 -39
- package/src/scripts/check_hook_bundle_content.ts +219 -0
- package/src/scripts/check_new_adr_evidence.ts +529 -0
- package/src/scripts/check_references.ts +78 -0
- package/src/scripts/check_release_published.ts +32 -11
- package/src/scripts/check_rule_layer_partition.ts +531 -0
- package/src/scripts/check_single_delivery.ts +194 -17
- package/src/scripts/check_standing_rule_delivery.ts +8 -2
- package/src/scripts/ci_settle.ts +170 -0
- package/src/scripts/condense.ts +79 -259
- package/src/scripts/council_cli.ts +3 -3
- package/src/scripts/dispatch_r2_reviewer.ts +6 -14
- package/src/scripts/external_sources_denylist.json +4 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +77 -14
- package/src/scripts/hooks/block_no_verify.ts +61 -10
- package/src/scripts/hooks/block_unauthorized_git.ts +21 -1
- package/src/scripts/hooks/concern_registry.ts +4 -0
- package/src/scripts/hooks/dispatch_hook.ts +154 -187
- package/src/scripts/hooks/dispatch_issues.ts +38 -19
- package/src/scripts/hooks/fallback_yaml.ts +66 -0
- package/src/scripts/hooks/host_semantics.ts +21 -0
- package/src/scripts/hooks/injection_budget.ts +13 -3
- package/src/scripts/hooks/py_json_dumps.ts +103 -0
- package/src/scripts/hooks/rtk_wrap_hook.ts +8 -3
- package/src/scripts/hooks/run_continuation_hook.ts +8 -5
- package/src/scripts/hooks/ship_diff_volume_hook.ts +81 -15
- package/src/scripts/hooks/source_first_gate_hook.ts +464 -0
- package/src/scripts/hooks/state_io.ts +870 -21
- package/src/scripts/hooks/stdin_failure_policy.ts +96 -0
- package/src/scripts/hooks/subagent_ledger_hook.ts +44 -15
- package/src/scripts/hooks/telemetry_flush_hook.ts +139 -0
- package/src/scripts/hooks/telemetry_self_repair.ts +128 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +22 -4
- package/src/scripts/hooks/turn_end_gate_hook.ts +81 -15
- package/src/scripts/injection_scan_hook.ts +137 -5
- package/src/scripts/install.ts +16 -11
- package/src/scripts/language_mirror_hook.ts +561 -25
- package/src/scripts/lint_framework_leakage_allowlist.json +2 -2
- package/src/scripts/lint_hook_manifest.ts +49 -0
- package/src/scripts/lint_plan_risk_register.ts +4 -3
- package/src/scripts/lint_provenance_vocabulary.ts +472 -4
- package/src/scripts/lint_skill_router_head.ts +4 -4
- package/src/scripts/mcp_server/tools.ts +2 -2
- package/src/scripts/new_roadmap.ts +136 -0
- package/src/scripts/pack_mcp_content.ts +20 -5
- package/src/scripts/release.ts +37 -38
- package/src/scripts/report_layer_overlap.ts +6 -0
- package/src/scripts/routing_doctor.ts +5 -1
- package/src/scripts/self_repair_hook.ts +37 -5
- package/src/scripts/session_register_hook.ts +11 -0
- package/src/scripts/skill_usage_collect.ts +11 -1
- package/src/scripts/skill_usage_report.ts +278 -8
- package/src/scripts/sync_pr_branch.ts +170 -20
- package/src/server/schemas/settings.ts +8 -0
- package/dist/cli-delegate/chunk-EJITJBJX.js +0 -172
- package/dist/cli-delegate/chunk-PZWRPRWP.js +0 -38
- package/dist/cli-delegate/{chunk-PPQO4NGR.js → chunk-6RJA2F5A.js} +3 -3
- package/dist/cli-delegate/{chunk-RYNADUFG.js → chunk-LWTYTX6F.js} +0 -0
- package/dist/cli-delegate/{chunk-FBKL6JWT.js → chunk-MMSGVZKV.js} +3 -3
|
@@ -58,11 +58,11 @@
|
|
|
58
58
|
"deterministic": false
|
|
59
59
|
},
|
|
60
60
|
"cli_help_command_count": {
|
|
61
|
-
"max":
|
|
62
|
-
"last_measured":
|
|
61
|
+
"max": 102,
|
|
62
|
+
"last_measured": 102,
|
|
63
63
|
"last_measured_at": "2026-08-19",
|
|
64
64
|
"method": "registry enumeration — count of `{ name: '...', disposition` entries in src/cli/registry.ts (NOT --help prose parsing; methods historically disagreed 74 vs 76 vs 79)",
|
|
65
|
-
"baseline_note": "80 → 81 on 2026-08-03 (release 9.15.0 gate). This RECORDS growth that already shipped through its own reviewed PR; it does not authorize new surface. The +1 is f02db54c2 (fix(cli): register routing:doctor in the CLI registry) — the command existed, only its registry entry was missing, and the registering PR did not move this budget. The gate did its job again: breach WARNS on main and BLOCKS on release, which is the conscious-decision point rather than a silently raised cap. Re-measured 2026-08-03 via the pinned method: 81. Headroom stays zero by design — the next registry addition must move this number in its own PR. 81 → 82 on 2026-08-04: the `handoff` subcommand (road-to-agent-handoff-resume Phase 4) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 82. 82 → 84 on 2026-08-04: the `route:explain` + `route:audit` verbs (routing-correctness validation surface) register in the same PR that adds the surface. Re-measured via the pinned method: 84. 84 → 85 on 2026-08-05: the `settings:set` verb (road-to-zero-ceremony-settings Phase 2 — the one agent-reachable settings writer) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 85. 85 → 86 on 2026-08-06: the `conformance:behavior` verb (road-to-agent-behavior-conformance Phase 5 — replays the local transcript store through the four mechanised conformance checks) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 86. 86 → 88 on 2026-08-07: the `sessions:list` + `sessions:claim` verbs (road-to-parallel-session-coordination — the shell surface of the shared session register, needed because /roadmap:next is command markdown and can only reach the register through a shell call) register in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 88. 88 → 89 on 2026-08-08: the `council:status` verb registers in the same PR that adds the surface, per this record's own contract. It exists because an agent in a consumer project announced \"kein Council konfiguriert (keine .agent-settings.yml)\" and substituted a weaker path while the council was configured user-globally the whole time — there was no verb that answered availability, so the only route was an inference from a filename, and the intuitive filename is the one location ADR-104 guarantees is never consulted. Re-measured via the pinned method: 89. 89 → 91 on 2026-08-08: the `self-repair:status` + `self-repair:release` verbs (the queued-defect reader and the single Hard-Floor-gated outward step of the self-repair loop — the loop is deliberately unable to publish unless a human runs the release command) register in the same PR that adds the surface, per this record's own contract. Landed alongside the +1 council:status move in the same branch. Re-measured via the pinned method: 91. 91 → 94 on 2026-08-08: the `packs:active`, `settings:get` and `mcp:available` verbs (road-to-capability-answerability Phase 2 — the three capability probes for the gaps that had none) register in the same PR that adds the surface, per this record's own contract. Each answers a question that was previously only inferable from a filename: which packs are active and from which file, what a setting resolves to and which file set it, and what is declared in mcp.json versus what can actually launch. 94 -> 95 in the same PR: `brand:status` (Phase 2.4 — brand-layer presence, which the rule depended on and no surface could answer). Re-measured twice via the pinned method on the unchanged tree: 95/95. 95 → 96 on 2026-08-10: the `session:recycle` verb (road-to-token-economy-recycling Phase 2.2 — the deterministic producer of the main-session recycle envelope; the recycle advisory names this exact verb, so it must exist as a shell surface) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 96. 96 -> 97 on 2026-08-10: the `gates` verb registers in the same PR that adds the surface, per this record's own contract. It exists because the blocker fields the dashboard already parses (Owner, What to do, Resolved when — CI-enforced by lint_roadmap_blockers) had no owner-filtered reader: the dashboard counts the open blockers across a 600-line file and links each to a per-roadmap anchor, so \"which of these are mine\" was a manual read of every anchor. The same inference-from-a-filename shape as the council:status entry above, one layer up. This branch and the session:recycle branch each measured 96 independently and landed on the same number for different verbs; the merge makes it 97, re-measured twice via the pinned method on the merged tree: 97/97. 97 -> 98 on 2026-08-15: the `workspace:doctor` verb (road-to-inbox-harvest-2026-08-c-workspace-identity Phase 3 — the read-only report over the new `workspaceIdentity()` resolver) registers in the same PR that adds the surface, per this record's own contract. It exists for the same inference-from-a-filename shape as the council:status and gates entries above, one layer down: the tree answered \"where am I\" in eight ad-hoc places across six files, and the 12.0.0 span shipped the same worktree misclassification twice, so no verb could be asked which checkout is the main one. Read-only by construction — the roadmap's Non-goals put worktree disposal out of scope and its Risk 3 names \"the pressure read becomes a disposal path by accident\" as the failure to design against, so the command carries no --fix and no --prune. Re-measured twice via the pinned method on the unchanged tree: 98/98. 98 -> 99 on 2026-08-17: the `council:quota` verb (road-to-council-quota-accounting-truth Phase 2) registers in the same PR that adds the surface, per this record's own contract. Exactly the inference-from-a-filename shape as the council:status entry above, one layer down: `cmd_quota` had existed in council_cli.ts and been reachable only via `scripts-run`, so the documented recovery path for an exhausted shared counter -- read the usage, reset one provider -- did not resolve through `agent-config`, and an operator debugging a quota failure met `unknown command`. The verb is read-only apart from the pre-existing `--reset <provider>`, which already required `--confirm`. Re-measured twice via the pinned method on the unchanged tree: 99/99. 99 -> 100 on 2026-08-19: the `decision:memo` verb (road-to-long-horizon-execution Phase 2.2, sequencing UOTL Phase 4.3 -- the decision-memo channel) registers in the same PR that adds the surface, per this record's own contract. It exists because the question ladder gained a rung between \"halt and ask\" and \"decide silently\": a resolution the run makes without contacting the operator is only legitimate if it is reviewable afterwards, and there was no surface that wrote such a record with a fixed shape. Write-and-list only, local-only (agents/runtime/ is gitignored), and it gates nothing -- the locked decision classes are refused at the config schema, never in the ledger. 100 -> 101 in the same PR: `run:supervise` (Phase 3.1 -- the out-of-process watcher for runs whose session died with open steps left). It is the operator-facing half of session continuity: nothing anywhere had the job of noticing that a claimed run stopped moving, so a roadmap 40% done and a roadmap finished looked identical from outside the dead session. Report-only by default and it NEVER merges, pushes or closes -- the auto-merge the reference design carries is a named rejection in the roadmap's harvest section, not an unbuilt feature. Re-measured twice via the pinned method on the unchanged tree: 101/101."
|
|
65
|
+
"baseline_note": "80 → 81 on 2026-08-03 (release 9.15.0 gate). This RECORDS growth that already shipped through its own reviewed PR; it does not authorize new surface. The +1 is f02db54c2 (fix(cli): register routing:doctor in the CLI registry) — the command existed, only its registry entry was missing, and the registering PR did not move this budget. The gate did its job again: breach WARNS on main and BLOCKS on release, which is the conscious-decision point rather than a silently raised cap. Re-measured 2026-08-03 via the pinned method: 81. Headroom stays zero by design — the next registry addition must move this number in its own PR. 81 → 82 on 2026-08-04: the `handoff` subcommand (road-to-agent-handoff-resume Phase 4) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 82. 82 → 84 on 2026-08-04: the `route:explain` + `route:audit` verbs (routing-correctness validation surface) register in the same PR that adds the surface. Re-measured via the pinned method: 84. 84 → 85 on 2026-08-05: the `settings:set` verb (road-to-zero-ceremony-settings Phase 2 — the one agent-reachable settings writer) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 85. 85 → 86 on 2026-08-06: the `conformance:behavior` verb (road-to-agent-behavior-conformance Phase 5 — replays the local transcript store through the four mechanised conformance checks) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 86. 86 → 88 on 2026-08-07: the `sessions:list` + `sessions:claim` verbs (road-to-parallel-session-coordination — the shell surface of the shared session register, needed because /roadmap:next is command markdown and can only reach the register through a shell call) register in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 88. 88 → 89 on 2026-08-08: the `council:status` verb registers in the same PR that adds the surface, per this record's own contract. It exists because an agent in a consumer project announced \"kein Council konfiguriert (keine .agent-settings.yml)\" and substituted a weaker path while the council was configured user-globally the whole time — there was no verb that answered availability, so the only route was an inference from a filename, and the intuitive filename is the one location ADR-104 guarantees is never consulted. Re-measured via the pinned method: 89. 89 → 91 on 2026-08-08: the `self-repair:status` + `self-repair:release` verbs (the queued-defect reader and the single Hard-Floor-gated outward step of the self-repair loop — the loop is deliberately unable to publish unless a human runs the release command) register in the same PR that adds the surface, per this record's own contract. Landed alongside the +1 council:status move in the same branch. Re-measured via the pinned method: 91. 91 → 94 on 2026-08-08: the `packs:active`, `settings:get` and `mcp:available` verbs (road-to-capability-answerability Phase 2 — the three capability probes for the gaps that had none) register in the same PR that adds the surface, per this record's own contract. Each answers a question that was previously only inferable from a filename: which packs are active and from which file, what a setting resolves to and which file set it, and what is declared in mcp.json versus what can actually launch. 94 -> 95 in the same PR: `brand:status` (Phase 2.4 — brand-layer presence, which the rule depended on and no surface could answer). Re-measured twice via the pinned method on the unchanged tree: 95/95. 95 → 96 on 2026-08-10: the `session:recycle` verb (road-to-token-economy-recycling Phase 2.2 — the deterministic producer of the main-session recycle envelope; the recycle advisory names this exact verb, so it must exist as a shell surface) registers in the same PR that adds the surface, per this record's own contract. Re-measured via the pinned method: 96. 96 -> 97 on 2026-08-10: the `gates` verb registers in the same PR that adds the surface, per this record's own contract. It exists because the blocker fields the dashboard already parses (Owner, What to do, Resolved when — CI-enforced by lint_roadmap_blockers) had no owner-filtered reader: the dashboard counts the open blockers across a 600-line file and links each to a per-roadmap anchor, so \"which of these are mine\" was a manual read of every anchor. The same inference-from-a-filename shape as the council:status entry above, one layer up. This branch and the session:recycle branch each measured 96 independently and landed on the same number for different verbs; the merge makes it 97, re-measured twice via the pinned method on the merged tree: 97/97. 97 -> 98 on 2026-08-15: the `workspace:doctor` verb (road-to-inbox-harvest-2026-08-c-workspace-identity Phase 3 — the read-only report over the new `workspaceIdentity()` resolver) registers in the same PR that adds the surface, per this record's own contract. It exists for the same inference-from-a-filename shape as the council:status and gates entries above, one layer down: the tree answered \"where am I\" in eight ad-hoc places across six files, and the 12.0.0 span shipped the same worktree misclassification twice, so no verb could be asked which checkout is the main one. Read-only by construction — the roadmap's Non-goals put worktree disposal out of scope and its Risk 3 names \"the pressure read becomes a disposal path by accident\" as the failure to design against, so the command carries no --fix and no --prune. Re-measured twice via the pinned method on the unchanged tree: 98/98. 98 -> 99 on 2026-08-17: the `council:quota` verb (road-to-council-quota-accounting-truth Phase 2) registers in the same PR that adds the surface, per this record's own contract. Exactly the inference-from-a-filename shape as the council:status entry above, one layer down: `cmd_quota` had existed in council_cli.ts and been reachable only via `scripts-run`, so the documented recovery path for an exhausted shared counter -- read the usage, reset one provider -- did not resolve through `agent-config`, and an operator debugging a quota failure met `unknown command`. The verb is read-only apart from the pre-existing `--reset <provider>`, which already required `--confirm`. Re-measured twice via the pinned method on the unchanged tree: 99/99. 99 -> 100 on 2026-08-19: the `decision:memo` verb (road-to-long-horizon-execution Phase 2.2, sequencing UOTL Phase 4.3 -- the decision-memo channel) registers in the same PR that adds the surface, per this record's own contract. It exists because the question ladder gained a rung between \"halt and ask\" and \"decide silently\": a resolution the run makes without contacting the operator is only legitimate if it is reviewable afterwards, and there was no surface that wrote such a record with a fixed shape. Write-and-list only, local-only (agents/runtime/ is gitignored), and it gates nothing -- the locked decision classes are refused at the config schema, never in the ledger. 100 -> 101 in the same PR: `run:supervise` (Phase 3.1 -- the out-of-process watcher for runs whose session died with open steps left). It is the operator-facing half of session continuity: nothing anywhere had the job of noticing that a claimed run stopped moving, so a roadmap 40% done and a roadmap finished looked identical from outside the dead session. Report-only by default and it NEVER merges, pushes or closes -- the auto-merge the reference design carries is a named rejection in the roadmap's harvest section, not an unbuilt feature. Re-measured twice via the pinned method on the unchanged tree: 101/101. 101 → 102 on 2026-08-22: the `adr:effective` verb (road-to-evidence-based-adr-governance step 2.2 — the effective-state projection over one decision record) registers in the same PR that adds the surface, per this record's own contract. It exists because current truth about an ADR was only reconstructable from linear prose: an agent had to read the body, then every amendment, and decide for itself which clauses still stand. The verb reports status, the Decision verbatim, clauses the record's own amendments superseded, active amendments, the three descriptive axes and the review-trigger state. It AUTHORIZES NOTHING — Phase 2 of that roadmap is titled \"surfacing only; no authority\" and its AC-7 forbids any authority consequence, so the verb reports an absent axis as absent (`— (no provenance axis)`, `— (ungraded)`, `absent → evidence`) and an unresolvable trigger as `indeterminate` rather than inferring one. Re-measured twice via the pinned method on the unchanged tree: 102/102."
|
|
66
66
|
},
|
|
67
67
|
"mcp_public_tool_count": {
|
|
68
68
|
"max": 20,
|
|
@@ -42,16 +42,53 @@
|
|
|
42
42
|
#
|
|
43
43
|
# COVERAGE — THE HONEST DENOMINATOR (re-measured 2026-08-18)
|
|
44
44
|
# ----------------------------------------------------------
|
|
45
|
-
#
|
|
46
|
-
# (the count is computed, not asserted — `check_gate_coverage.count_gate_scripts
|
|
47
|
-
#
|
|
48
|
-
#
|
|
45
|
+
# 269 `lint_*` / `check_*` / `audit_*` scripts live under `src/scripts/`
|
|
46
|
+
# (the count is computed, not asserted — `check_gate_coverage.count_gate_scripts`,
|
|
47
|
+
# re-run 2026-08-21 and it returns 269).
|
|
48
|
+
# **45 of them emit the machine-readable `scanned: <N>` line under their
|
|
49
|
+
# CI-identical argv, and 42 of those 45 are listed below.** The manifest is
|
|
49
50
|
# therefore complete with respect to its own contract for every gate that can
|
|
50
|
-
# carry a floor, and covers ~
|
|
51
|
+
# carry a floor, and covers ~16 % of the population.
|
|
51
52
|
#
|
|
52
|
-
#
|
|
53
|
-
#
|
|
54
|
-
#
|
|
53
|
+
# Both halves were RE-DERIVED on 2026-08-21, not incremented, and the previous
|
|
54
|
+
# reading was off by one in a way worth recording: it said "42 … and 41 of those
|
|
55
|
+
# 42 are listed" while the file carried 42 rows AND named one deliberately
|
|
56
|
+
# unlisted emitter (`lint_evidence_artifacts`, below). Those three facts cannot
|
|
57
|
+
# all hold — 42 listed rows plus 1 unlisted emitter is 43 emitters, not 42. It
|
|
58
|
+
# is the same drift this section documents three times: an entry was added and
|
|
59
|
+
# the prose was adjusted by one instead of recounted.
|
|
60
|
+
#
|
|
61
|
+
# The derivation now, so the next reader can check it rather than trust it:
|
|
62
|
+
# `grep -c '^ - id:'` returns 42 (computable, and computed); every listed row
|
|
63
|
+
# is an emitter, because a row that did not emit could carry no floor and the
|
|
64
|
+
# guard would report it `failing`; THREE emitters are deliberately unlisted —
|
|
65
|
+
# `lint_evidence_artifacts` (below), `adr_cite_check` and
|
|
66
|
+
# `check_new_adr_evidence` (each in the block where its row would have sat);
|
|
67
|
+
# 42 + 3 = 45. The population figure comes from the function, and it stays 269
|
|
68
|
+
# because `check_new_adr_evidence` matches the population prefix whether or not
|
|
69
|
+
# it carries a row here.
|
|
70
|
+
#
|
|
71
|
+
# `adr/evidence_census` emits a `scanned:` line too and is NOT in either number:
|
|
72
|
+
# it carries no `lint|check|audit` prefix, so `count_gate_scripts()` never sees
|
|
73
|
+
# it. Named because the omission looks like a fourth miscount and is not one —
|
|
74
|
+
# an emitter outside the population cannot be an unlisted emitter within it.
|
|
75
|
+
#
|
|
76
|
+
# Corrected in completion review, and it is the third time this paragraph has
|
|
77
|
+
# been off by one — which is the argument for computing it rather than
|
|
78
|
+
# adjusting it. The previous reading said 43 listed and self-invited a `grep`
|
|
79
|
+
# that returns 42, so the check it offered refuted the sentence containing it.
|
|
80
|
+
# The cause each time is the same: a row was added or removed and the prose
|
|
81
|
+
# was incremented instead of recounted.
|
|
82
|
+
#
|
|
83
|
+
# A shape-grep over `src/scripts/` (`reportScanned(` or a literal `scanned: ${`)
|
|
84
|
+
# returns 63 files. That is a DIFFERENT population — any file carrying an emit
|
|
85
|
+
# shape, including gates that emit only in a non-CI mode — so it is not a
|
|
86
|
+
# recount of this sentence and must not be substituted for one.
|
|
87
|
+
#
|
|
88
|
+
# Three emitters are deliberately NOT listed, all for one reason. The first is
|
|
89
|
+
# `lint_evidence_artifacts`, for the same reason `check_rule_projection_integrity`
|
|
90
|
+
# is not (see the paragraph below): it is diff-scoped, so it legitimately emits
|
|
91
|
+
# `scanned: 0` on any
|
|
55
92
|
# branch that adds no evidence artifact, and `min_scanned: 0` is the
|
|
56
93
|
# false-count shape this file rejects. Its ledger half IS discharged — it
|
|
57
94
|
# adopts `_lib/gate_ledger.ts` and `_lib/scan_scope.ts`, so
|
|
@@ -182,6 +219,28 @@ gates:
|
|
|
182
219
|
the Taskfile parse degrades and the population silently collapses —
|
|
183
220
|
cannot pass.
|
|
184
221
|
|
|
222
|
+
- id: check_rule_layer_partition
|
|
223
|
+
argv: []
|
|
224
|
+
min_scanned: 0
|
|
225
|
+
corpus: "the five project rule directories that receive a projected tree (.claude/rules, .cursor/rules, .clinerules, .windsurf/rules, .augment/rules)"
|
|
226
|
+
status: enforced
|
|
227
|
+
note: >
|
|
228
|
+
`min_scanned: 0` is the honest floor and not the false-count shape this file
|
|
229
|
+
rejects elsewhere. This gate compares a project rule directory against its
|
|
230
|
+
host's GLOBAL layer, and on a fresh CI checkout neither side exists — the
|
|
231
|
+
project trees are gitignored and no CI leg installs at user scope. So the
|
|
232
|
+
population is legitimately zero there, exactly as it is for the diff-scoped
|
|
233
|
+
gates the header paragraph carves out.
|
|
234
|
+
What keeps a zero from reading as a pass is inside the gate rather than in
|
|
235
|
+
this floor: with nothing compared it prints "nothing compared — N skipped.
|
|
236
|
+
This is not a pass" instead of a success line, and every skip names the host
|
|
237
|
+
and the unreadable path. Teeth land on a working checkout, where `task
|
|
238
|
+
preflight` runs it against real global layers.
|
|
239
|
+
It never reports a duplicate for a host whose global layer cannot be read: a
|
|
240
|
+
project copy is the only carrier when the global one is absent, so demanding
|
|
241
|
+
its removal on unread evidence would delete the rule from that host —
|
|
242
|
+
the failure `partitionEligibility`'s fail-safe ordering exists to prevent.
|
|
243
|
+
|
|
185
244
|
- id: check_rule_activation_census
|
|
186
245
|
argv: []
|
|
187
246
|
min_scanned: 100
|
|
@@ -555,14 +614,62 @@ gates:
|
|
|
555
614
|
|
|
556
615
|
- id: lint_plan_risk_register
|
|
557
616
|
argv: []
|
|
558
|
-
min_scanned:
|
|
559
|
-
corpus: "ready roadmap files under agents/roadmaps/ top level (19 at baseline: 14 grandfathered + 4 draft-exempt + 1 carrying a live register)"
|
|
617
|
+
min_scanned: 1
|
|
618
|
+
corpus: "ready roadmap files under agents/roadmaps/ top level (6 as of 2026-08-21; 19 at the original baseline: 14 grandfathered + 4 draft-exempt + 1 carrying a live register)"
|
|
560
619
|
status: enforced
|
|
561
620
|
note: >
|
|
562
621
|
Gate R1 (docs/contracts/plan-review-gates.md § 1). The count is READY
|
|
563
622
|
FILES INSPECTED incl. grandfathered/draft-exempt ones — exemptions are
|
|
564
|
-
reported, never silently skipped
|
|
565
|
-
|
|
623
|
+
reported, never silently skipped.
|
|
624
|
+
|
|
625
|
+
Lowered 12 → 5 on 2026-08-21, and the SHAPE of the change matters more
|
|
626
|
+
than the number. The previous note asserted that "a collapse below the
|
|
627
|
+
floor means the roadmaps root moved, not that the corpus went clean."
|
|
628
|
+
That premise is falsified: archiving roadmaps at zero open and zero
|
|
629
|
+
deferred steps dropped the top-level count from 12 to 10 with the root
|
|
630
|
+
untouched — the corpus really did go cleaner, which is what
|
|
631
|
+
road-to-estate-drawdown exists to achieve. A floor pinned to the exact
|
|
632
|
+
corpus size fails on the drawdown succeeding, which is the wrong thing
|
|
633
|
+
to detect.
|
|
634
|
+
|
|
635
|
+
So the replacement is deliberately NOT today's count. Re-pinning at 10
|
|
636
|
+
would repeat the defect one archival later and force this note to be
|
|
637
|
+
rewritten every time a roadmap closes. 5 sits structurally below any
|
|
638
|
+
plausible active set while still catching the two failures this floor is
|
|
639
|
+
for: the roadmaps root moving, and the scanner silently reading nothing.
|
|
640
|
+
It is not a target for how many roadmaps ought to exist.
|
|
641
|
+
|
|
642
|
+
Count reconciliation, since two numbers move in this change and they
|
|
643
|
+
count different populations: this gate counts READY files at the top
|
|
644
|
+
level of agents/roadmaps/ (12 → 10 here), while
|
|
645
|
+
estate-count-budget.json::active_roadmaps counts NON-DRAFT candidates as
|
|
646
|
+
collect() sees them (11 → 10). The gap is the draft-status file each
|
|
647
|
+
population treats differently; neither number is derivable from the
|
|
648
|
+
other.
|
|
649
|
+
|
|
650
|
+
Revisit-if the active set is deliberately grown past ~15, at which point
|
|
651
|
+
5 is uninformatively low, or if a drop is ever traced to a scanner
|
|
652
|
+
defect rather than to archival — either falsifies the number, not the
|
|
653
|
+
obligation.
|
|
654
|
+
|
|
655
|
+
Lowered again 10 → 5 on 2026-08-21, during the PR drain that produced the
|
|
656
|
+
paragraph above. 10 was measured against 12 and the drain had already
|
|
657
|
+
taken the corpus to 11 — one file of headroom, so the next archival would
|
|
658
|
+
have reddened CI for the exact reason this entry says is the wrong thing to
|
|
659
|
+
detect. 5 keeps the root-moved / scanner-blind signal (both scan 0) and
|
|
660
|
+
stops the number from needing a commit per archived roadmap.
|
|
661
|
+
|
|
662
|
+
Lowered again 5 → 1, and this time the SHAPE changed rather than the
|
|
663
|
+
number. 5 was picked to have headroom and did not: the drain took the
|
|
664
|
+
corpus to 6, so a review provoked the red by archiving one roadmap. The
|
|
665
|
+
lesson is that no absolute floor survives here — this gate's sibling
|
|
666
|
+
`check_estate_count` forbids growth, so the corpus can only shrink and any
|
|
667
|
+
floor above 0 is met eventually. 1 is the smallest value that still
|
|
668
|
+
distinguishes "the scanner read something" from "the root moved or the
|
|
669
|
+
scope is dead", which is the only thing this field was ever asked to
|
|
670
|
+
detect. Revisit-if the gate gains a way to express "non-empty" directly,
|
|
671
|
+
or if a drop to 0 is ever traced to a scanner defect rather than to an
|
|
672
|
+
empty corpus.
|
|
566
673
|
|
|
567
674
|
- id: check_estate_count
|
|
568
675
|
argv: []
|
|
@@ -695,6 +802,18 @@ gates:
|
|
|
695
802
|
note: >
|
|
696
803
|
Emits on stderr, not stdout: `--format json` owns this gate's stdout and a
|
|
697
804
|
count written there would corrupt the payload. The guard reads both streams.
|
|
805
|
+
Corpus boundary, decided 2026-08-20 (council, `leave-unscanned`): `src/skills`
|
|
806
|
+
is deliberately OUT of this gate's corpus. Pointed at it the gate reports 13
|
|
807
|
+
findings (11 `buried_iron_law`, 2 `deep_iron_law`) that nobody currently sees.
|
|
808
|
+
Extending the corpus was declined on three grounds — the gate has no warn
|
|
809
|
+
level, so a staged extension would mean adding a warning mode to an enforced
|
|
810
|
+
blocking gate; the reverted `lint_skill_top_position` attempt showed two gates
|
|
811
|
+
defining one construct incompatibly, and the disputed `deep_iron_law` class is
|
|
812
|
+
still live in those 13; and the premise for scanning skills at all
|
|
813
|
+
(post-compaction truncation keeps the file start) is unverified, the tree's one
|
|
814
|
+
measured truncation fact being ENTRY-level. Re-opening this needs a measured
|
|
815
|
+
reason plus the reported-and-baselined ratchet, not a path added to `argv`.
|
|
816
|
+
See `agents/roadmaps/archive/road-to-context-fidelity.md` § Phase 3.
|
|
698
817
|
|
|
699
818
|
- id: check_cli_registry_budget_sync
|
|
700
819
|
argv: []
|
|
@@ -955,3 +1074,92 @@ gates:
|
|
|
955
1074
|
# an already-listed file that GREW while the file COUNT stayed at one. That
|
|
956
1075
|
# last case is what pins the metric as excess lines rather than a file count;
|
|
957
1076
|
# a count-based ratchet passes it, and this gate must not.
|
|
1077
|
+
|
|
1078
|
+
# check_new_adr_evidence is DELIBERATELY NOT REGISTERED here, following this
|
|
1079
|
+
# file's own two precedents rather than breaking them.
|
|
1080
|
+
#
|
|
1081
|
+
# It is diff-scoped: its corpus is the set of decision records ADDED on the
|
|
1082
|
+
# branch (`git diff --diff-filter=A` over `docs/decisions/ADR-*.md` and
|
|
1083
|
+
# `docs/adrs/<area>/NNNN-*.md`), so ZERO is the honest reading on almost every
|
|
1084
|
+
# run and any floor above 0 reds every branch that adds no ADR. A
|
|
1085
|
+
# `min_scanned: 0` row is the false-count shape this file's header rejects in
|
|
1086
|
+
# as many words, and `lint_evidence_artifacts` and
|
|
1087
|
+
# `check_rule_projection_integrity` both hit this exact wall and resolved it by
|
|
1088
|
+
# staying unregistered. A row was written first and then withdrawn: the
|
|
1089
|
+
# argument for it was that a registered gate at least runs under CI-identical
|
|
1090
|
+
# argv, and that is real but it is not worth being the one instance that
|
|
1091
|
+
# introduces the shape two neighbours were excluded to avoid. Three precedents
|
|
1092
|
+
# agreeing is a convention; two agreeing and one defecting is drift.
|
|
1093
|
+
#
|
|
1094
|
+
# It is NOT unwatched. `task check-new-adr-evidence` and the
|
|
1095
|
+
# `New accepted ADRs disclose their evidence` step in rule-backstops.yml both
|
|
1096
|
+
# run it, so a broken gate fails there.
|
|
1097
|
+
#
|
|
1098
|
+
# And it is NOT unproven, which is the part a floor could never have supplied.
|
|
1099
|
+
# This gate's normal reading is zero added records — precisely the state where
|
|
1100
|
+
# a working gate and a completely broken one emit identical output
|
|
1101
|
+
# (`scanned: 0`, green), so no floor separates them at any value. `--self-test`
|
|
1102
|
+
# does: seven cases, four rejecting, each building a throwaway repo and driving
|
|
1103
|
+
# the real CLI with `--base <sha>`, including the case an `authority_basis:
|
|
1104
|
+
# owner_intent` escape must NOT buy (that field governs authority, never
|
|
1105
|
+
# disclosure). Sabotage-verified — with the `## Evidence` check removed the
|
|
1106
|
+
# self-test exits 1 and names the two cases that stopped firing.
|
|
1107
|
+
#
|
|
1108
|
+
# What is LOST, stated rather than implied: no minimum scan is held against
|
|
1109
|
+
# this gate by this manifest, so a change that silently narrowed its path
|
|
1110
|
+
# regexes to nothing would pass here. The self-test is what catches that, and
|
|
1111
|
+
# it is a test rather than a manifest floor — it runs when someone runs it.
|
|
1112
|
+
|
|
1113
|
+
# adr/evidence_census is DELIBERATELY NOT REGISTERED here either, for the
|
|
1114
|
+
# same structural reason and with a different cost.
|
|
1115
|
+
#
|
|
1116
|
+
# `matchesGatePattern` classifies on a name PREFIX
|
|
1117
|
+
# (`lint|check|audit|skill|verify_`) and `evidence_census.ts` carries neither,
|
|
1118
|
+
# so a row here would red `gate_population.test.ts` exactly as the
|
|
1119
|
+
# `adr_cite_check` row did. The block below weighs the three fixes for that
|
|
1120
|
+
# case and they apply unchanged: widening the pattern, renaming the script, or
|
|
1121
|
+
# inverting the classification to be manifest-driven.
|
|
1122
|
+
#
|
|
1123
|
+
# What is DIFFERENT, and better than the adr_cite_check case: the census is not
|
|
1124
|
+
# unwatched. `task check-adr-evidence-census` regenerates it to a temp path and
|
|
1125
|
+
# diffs against the committed artifact, wired in the `ci` chain and as the
|
|
1126
|
+
# `ADR evidence census up to date` step in rule-backstops.yml, so a corpus that
|
|
1127
|
+
# drifted from the artifact fails there instead of here. The census emits a
|
|
1128
|
+
# `scanned:` line and adopts the ledger, so what is lost is only the MINIMUM
|
|
1129
|
+
# SCAN FLOOR — a change that narrowed its corpus to zero AND regenerated the
|
|
1130
|
+
# artifact to match would pass both. Stated rather than implied, because the
|
|
1131
|
+
# drift check is a byte-comparison and byte-agreement on an empty corpus is
|
|
1132
|
+
# still agreement. Closing it properly is the same rename, in the same change
|
|
1133
|
+
# that renames adr_cite_check.
|
|
1134
|
+
|
|
1135
|
+
# adr_cite_check is DELIBERATELY NOT REGISTERED here, and the reason is a
|
|
1136
|
+
# disagreement between two gates over the same file rather than an oversight.
|
|
1137
|
+
#
|
|
1138
|
+
# The script is gate-shaped by behaviour: it emits one `scanned:` line, adopts
|
|
1139
|
+
# the ledger, asserts its scan scope, and runs in CI as `ADR citations resolve`
|
|
1140
|
+
# (rule-backstops.yml) plus `task check-adr-citations`. So it certifies
|
|
1141
|
+
# something and can lie about it, which is this manifest's own criterion.
|
|
1142
|
+
#
|
|
1143
|
+
# But `gate_population.matchesGatePattern` classifies structurally, on a NAME
|
|
1144
|
+
# PREFIX (`lint|check|audit|skill|verify_`), and `adr_cite_check.ts` carries
|
|
1145
|
+
# `check` as a suffix. Registering it made `gate_population.test.ts` red:
|
|
1146
|
+
# "manifest lists adr_cite_check, population does not". The two gates read the
|
|
1147
|
+
# same file and disagree.
|
|
1148
|
+
#
|
|
1149
|
+
# Three fixes were weighed and each was worse than the gap:
|
|
1150
|
+
# - widening the pattern to a `_check$` suffix pulls in four unrelated
|
|
1151
|
+
# scripts (bench_drift_check, worktree_cleanup_check, update_check,
|
|
1152
|
+
# cmd_settings_check), forcing them into the ledger contract and reddening
|
|
1153
|
+
# the completeness ratchet for work nobody asked for;
|
|
1154
|
+
# - renaming the script to `check_adr_citations.ts` is the convention-conform
|
|
1155
|
+
# answer and touches 26 files, including archived review artefacts and a
|
|
1156
|
+
# committed diff.patch that must not be rewritten;
|
|
1157
|
+
# - manifest-driven classification is explicitly rejected by
|
|
1158
|
+
# gate_population.ts's own header (a new gate lands before anyone
|
|
1159
|
+
# registers it, so that inverts the real dependency).
|
|
1160
|
+
#
|
|
1161
|
+
# So the row is dropped and the floor is unregistered. What is LOST is stated
|
|
1162
|
+
# rather than implied: the gate runs, but nothing holds it to a minimum scan,
|
|
1163
|
+
# so a future change that silently narrowed its corpus to zero would pass. The
|
|
1164
|
+
# honest close is the rename, in its own change, where 26 files of churn are
|
|
1165
|
+
# the subject rather than a side effect.
|