@event4u/agent-config 9.6.0 → 9.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.
Files changed (204) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +207 -942
  3. package/README.md +21 -21
  4. package/dist/agent-src/README.md +2 -2
  5. package/dist/agent-src/commands/commit/in-chunks.md +8 -0
  6. package/dist/agent-src/commands/commit.md +17 -0
  7. package/dist/agent-src/commands/pr/create.md +4 -0
  8. package/dist/agent-src/contexts/override-system.md +75 -5
  9. package/dist/agent-src/rules/context-hygiene.md +2 -0
  10. package/dist/agent-src/rules/doc-screenshot-hygiene.md +97 -0
  11. package/dist/agent-src/rules/domain-safety-pii.md +1 -0
  12. package/dist/agent-src/rules/downstream-changes.md +31 -1
  13. package/dist/agent-src/rules/external-code-graph-interop.md +13 -3
  14. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +2 -0
  15. package/dist/agent-src/rules/git-history-discipline.md +2 -0
  16. package/dist/agent-src/rules/language-and-tone.md +2 -0
  17. package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -0
  18. package/dist/agent-src/rules/media-governance-routing.md +2 -0
  19. package/dist/agent-src/rules/minimal-safe-diff.md +2 -0
  20. package/dist/agent-src/rules/no-roadmap-references.md +3 -0
  21. package/dist/agent-src/rules/non-destructive-by-default.md +20 -0
  22. package/dist/agent-src/rules/onboarding-gate.md +2 -0
  23. package/dist/agent-src/rules/output-discipline.md +2 -0
  24. package/dist/agent-src/rules/persona-governance.md +2 -0
  25. package/dist/agent-src/rules/preservation-guard.md +3 -0
  26. package/dist/agent-src/rules/roadmap-progress-sync.md +2 -0
  27. package/dist/agent-src/rules/secret-vcs-guard.md +106 -0
  28. package/dist/agent-src/rules/security-sensitive-stop.md +1 -1
  29. package/dist/agent-src/rules/skill-quality.md +2 -0
  30. package/dist/agent-src/rules/source-confidentiality.md +2 -0
  31. package/dist/agent-src/rules/source-of-truth.md +2 -0
  32. package/dist/agent-src/rules/telegraph-speak.md +2 -0
  33. package/dist/agent-src/rules/token-optimizer-maintenance.md +2 -0
  34. package/dist/agent-src/rules/tool-safety.md +1 -0
  35. package/dist/agent-src/rules/verify-before-complete.md +2 -0
  36. package/dist/agent-src/skills/adr-create/SKILL.md +17 -1
  37. package/dist/agent-src/skills/agent-docs-writing/SKILL.md +34 -16
  38. package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +9 -9
  39. package/dist/agent-src/skills/code-intelligence/SKILL.md +94 -0
  40. package/dist/agent-src/skills/gated-reach/SKILL.md +185 -0
  41. package/dist/agent-src/skills/gated-reach/evals/triggers.json +72 -0
  42. package/dist/agent-src/skills/image-analyser/SKILL.md +14 -12
  43. package/dist/agent-src/skills/image-editing/SKILL.md +1 -0
  44. package/dist/agent-src/skills/readme-writing/SKILL.md +6 -1
  45. package/dist/agent-src/skills/screenshot-hygiene/SKILL.md +171 -0
  46. package/dist/agent-src/skills/secrets-management/SKILL.md +44 -1
  47. package/dist/agent-src/skills/subagent-orchestration/prompts/adversarial-verification-council.md +29 -0
  48. package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge-two-stage.md +29 -0
  49. package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge.md +29 -0
  50. package/dist/agent-src/skills/subagent-orchestration/prompts/do-competitively.md +29 -0
  51. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-parallel.md +29 -0
  52. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +29 -0
  53. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-worktrees.md +29 -0
  54. package/dist/agent-src/skills/subagent-orchestration/prompts/judge-with-debate.md +29 -0
  55. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +4 -0
  56. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  57. package/dist/agent-src/templates/github-workflows/doc-impact.yml +101 -0
  58. package/dist/agent-src/templates/github-workflows/secret-scan.yml +65 -0
  59. package/dist/cli/configRoot.js +112 -0
  60. package/dist/cli/configRoot.js.map +1 -0
  61. package/dist/cli/configRoot.test.js +97 -0
  62. package/dist/cli/configRoot.test.js.map +1 -0
  63. package/dist/cli/help.js +4 -1
  64. package/dist/cli/help.js.map +1 -1
  65. package/dist/cli/main.js +19 -2
  66. package/dist/cli/main.js.map +1 -1
  67. package/dist/cli/registry.js +1 -0
  68. package/dist/cli/registry.js.map +1 -1
  69. package/dist/discovery/deprecation-report.md +1 -1
  70. package/dist/discovery/discovery-manifest.json +164 -47
  71. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  72. package/dist/discovery/discovery-manifest.summary.md +4 -4
  73. package/dist/discovery/orphan-report.md +1 -1
  74. package/dist/discovery/packs.json +13 -8
  75. package/dist/discovery/trust-report.md +11 -11
  76. package/dist/discovery/workspaces.json +11 -6
  77. package/dist/install/install.mjs +16 -0
  78. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  79. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  80. package/dist/mcp/registry-manifest.json +4 -4
  81. package/dist/router.json +1 -1
  82. package/dist/server/app.js +10 -0
  83. package/dist/server/app.js.map +1 -1
  84. package/dist/server/routes/ping.js +18 -0
  85. package/dist/server/routes/ping.js.map +1 -1
  86. package/dist/server/schemas/settings.js +8 -0
  87. package/dist/server/schemas/settings.js.map +1 -1
  88. package/dist/server/serverInfo.js +6 -2
  89. package/dist/server/serverInfo.js.map +1 -1
  90. package/dist/server/token.js +11 -4
  91. package/dist/server/token.js.map +1 -1
  92. package/dist/server/writeRoot.js +15 -1
  93. package/dist/server/writeRoot.js.map +1 -1
  94. package/dist/shared/capabilities.js +33 -0
  95. package/dist/shared/capabilities.js.map +1 -0
  96. package/dist/shared/capabilities.test.js +39 -0
  97. package/dist/shared/capabilities.test.js.map +1 -0
  98. package/dist/ui/assets/{index-BiEZiZ31.js → index-CrmZ34Rg.js} +16 -16
  99. package/dist/ui/assets/index-CrmZ34Rg.js.map +1 -0
  100. package/dist/ui/index.html +14 -5
  101. package/docs/CLAIMS.md +64 -38
  102. package/docs/architecture.md +2 -2
  103. package/docs/archive/CHANGELOG-6.0.0-overview.md +953 -0
  104. package/docs/benchmark.md +170 -9
  105. package/docs/catalog.md +8 -3
  106. package/docs/comparison.yaml +44 -2
  107. package/docs/contracts/local-server-ports.md +53 -0
  108. package/docs/contracts/no-runtime-boundary.md +1 -1
  109. package/docs/contracts/subagent-boundary.md +15 -0
  110. package/docs/customization.md +14 -3
  111. package/docs/decisions/ADR-016-installer-architecture.md +2 -0
  112. package/docs/decisions/ADR-088-no-external-runtime-federation.md +1 -1
  113. package/docs/decisions/ADR-094-agent-memory-layer-removal.md +1 -1
  114. package/docs/decisions/ADR-109-subagent-v1-contract.md +2 -0
  115. package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +2 -0
  116. package/docs/decisions/ADR-113-ci-native-release-label-trigger.md +11 -3
  117. package/docs/decisions/ADR-122-adversarial-verification-council.md +30 -0
  118. package/docs/decisions/ADR-123-runtime-security-scope-and-spawn-hardening.md +31 -0
  119. package/docs/decisions/ADR-124-embedded-engine-doctrine.md +255 -0
  120. package/docs/decisions/ADR-125-doc-screenshot-anonymization.md +131 -0
  121. package/docs/decisions/ADR-126-internet-reach-operator-tooling.md +254 -0
  122. package/docs/decisions/ADR-127-enforcement-claims-must-resolve.md +150 -0
  123. package/docs/decisions/ADR-128-executable-evidence-and-measured-escalation.md +201 -0
  124. package/docs/decisions/INDEX.md +21 -0
  125. package/docs/decisions/engine-reclassification-2026-07.md +104 -0
  126. package/docs/distribution/awesome-list-submission.md +1 -1
  127. package/docs/distribution/registries.md +36 -27
  128. package/docs/enforcement-by-host.md +7 -0
  129. package/docs/featured-skills.md +2 -2
  130. package/docs/getting-started-by-role.md +1 -1
  131. package/docs/getting-started.md +1 -1
  132. package/docs/governance-advantage.md +1 -1
  133. package/docs/guides/gated-platform-reads.md +221 -0
  134. package/docs/positioning-evidence.md +1 -1
  135. package/docs/proof.md +92 -16
  136. package/docs/spawn-site-policy.md +72 -0
  137. package/docs/threat-model.md +2 -1
  138. package/package.json +6 -3
  139. package/src/agent-src/README.md +2 -2
  140. package/src/config/agent-settings.template.yml +43 -0
  141. package/src/config/reach-channels.yml +217 -0
  142. package/src/config/reach-prescriptions-intake.yml +200 -0
  143. package/src/scripts/_dispatch.bash +15 -0
  144. package/src/scripts/_lib/adversarial_bench_score.ts +106 -0
  145. package/src/scripts/_lib/exec_evidence.ts +251 -0
  146. package/src/scripts/_lib/fixtures/secret-detector/negatives.txt +10 -0
  147. package/src/scripts/_lib/fixtures/secret-detector/positives.txt +11 -0
  148. package/src/scripts/_lib/kernel_rules.ts +46 -0
  149. package/src/scripts/_lib/reddit_thread_parse.ts +598 -0
  150. package/src/scripts/_lib/risk_paths.ts +160 -0
  151. package/src/scripts/_lib/secret_detector.test.ts +103 -0
  152. package/src/scripts/_lib/secret_detector.ts +319 -0
  153. package/src/scripts/_lib/spawn_env.ts +24 -4
  154. package/src/scripts/_lib/tool_probe.ts +359 -0
  155. package/src/scripts/adr/regenerate_index.ts +81 -6
  156. package/src/scripts/audit_adr_coverage.ts +33 -0
  157. package/src/scripts/bench_adversarial_council.ts +292 -0
  158. package/src/scripts/build_proof.ts +162 -0
  159. package/src/scripts/check_adr_frontmatter.ts +195 -0
  160. package/src/scripts/check_artefact_count_messaging.ts +4 -0
  161. package/src/scripts/check_backstop_debt.ts +200 -0
  162. package/src/scripts/check_claims.ts +188 -8
  163. package/src/scripts/check_comparison.ts +12 -0
  164. package/src/scripts/check_enforcement_coverage.ts +592 -0
  165. package/src/scripts/check_kernel_rule_bundle.ts +16 -12
  166. package/src/scripts/check_no_new_legacy_path.ts +2 -0
  167. package/src/scripts/check_reach_channels.ts +407 -0
  168. package/src/scripts/check_reach_staleness.ts +364 -0
  169. package/src/scripts/check_secret_leak.test.ts +47 -0
  170. package/src/scripts/check_secret_leak.ts +290 -0
  171. package/src/scripts/check_source_pointer_freshness.ts +165 -0
  172. package/src/scripts/code_graph/build.ts +0 -0
  173. package/src/scripts/code_graph/cli.ts +207 -0
  174. package/src/scripts/code_graph/detect.ts +134 -0
  175. package/src/scripts/code_graph/extract.ts +386 -0
  176. package/src/scripts/code_graph/loader.ts +123 -0
  177. package/src/scripts/code_graph/query.ts +176 -0
  178. package/src/scripts/code_graph/sanitize.ts +30 -0
  179. package/src/scripts/code_graph/types.ts +83 -0
  180. package/src/scripts/code_graph/validate.ts +63 -0
  181. package/src/scripts/external_sources_denylist.json +3 -1
  182. package/src/scripts/generate_subagent_floor.ts +194 -0
  183. package/src/scripts/hook_manifest.yaml +13 -3
  184. package/src/scripts/hooks/code_graph_nudge_hook.ts +184 -0
  185. package/src/scripts/hooks/dispatch_hook.ts +5 -1
  186. package/src/scripts/iron_law_sha.ts +3 -12
  187. package/src/scripts/lint_override_kernel_guard.ts +219 -0
  188. package/src/scripts/lint_readme_serial_comma.ts +169 -0
  189. package/src/scripts/measure_rule_budget.ts +3 -12
  190. package/src/scripts/postinstall_gui.ts +129 -0
  191. package/src/scripts/reach_doctor.ts +1651 -0
  192. package/src/scripts/release.ts +24 -3
  193. package/src/scripts/risk_escalation_shadow.ts +160 -0
  194. package/src/scripts/schemas/agent-settings.schema.json +23 -0
  195. package/src/scripts/schemas/reach-channels.schema.json +134 -0
  196. package/src/scripts/schemas/reach-doctor-payload.schema.json +220 -0
  197. package/src/scripts/schemas/rule.schema.json +10 -0
  198. package/src/scripts/skill_linter.ts +55 -0
  199. package/src/scripts/validate_reach_prescriptions.ts +751 -0
  200. package/src/server/schemas/settings.ts +16 -0
  201. package/src/shared/capabilities.test.ts +43 -0
  202. package/src/shared/capabilities.ts +75 -0
  203. package/src/templates/minimal/agents-overrides-readme.md +20 -0
  204. package/dist/ui/assets/index-BiEZiZ31.js.map +0 -1
package/docs/benchmark.md CHANGED
@@ -559,7 +559,7 @@ replication on a per-token-billed key.
559
559
  - Runner: `src/scripts/bench_ab_v2_run.ts --host codex` (checkpoint-resumable).
560
560
  - Roadmap: `agents/roadmaps/archive/road-to-opt-measurement-unblock.md` Phase 2.
561
561
 
562
- ## adversarial-verification-council finding coverage — UNBACKED (pending corpus + run)
562
+ ## adversarial-verification-council finding coverage — HONEST NULL (resolved 2026-07-21)
563
563
 
564
564
  Pre-registered claim `adversarial-council-finding-coverage` (docs/CLAIMS.md,
565
565
  ADR-122): on the RESIDUAL defect pool — defects that survive a single strong
@@ -574,14 +574,38 @@ controversial-but-correct control.
574
574
  **AND** absolute >= +8 pp, **AND** panel FP not worse than baseline within
575
575
  noise — encoded + tested in
576
576
  [`src/scripts/_lib/adversarial_council_gate.ts`](../src/scripts/_lib/adversarial_council_gate.ts).
577
- - **Status: UNBACKED.** The corpus-validity gate BLOCKS the registered run: the
578
- existing `internal/bench/orchestration/corpus/` was built for cross-vendor
579
- *parity* (obvious, model-differentiating defects), not judge-survivable
580
- residual subtleties, so a run on it would be a measurement artifact (the
581
- council's Round-1 critique). Resolving the claim needs (1) a curated
582
- judge-survivable-subtlety corpus with a published distribution, then (2) a
583
- maintainer-gated paid cross-vendor run. Honest-null on that run keeps the
584
- surface default-off permanently, like recursive-verification.
577
+ - **Status: HONEST NULL (resolved 2026-07-21).** A curated judge-survivable
578
+ corpus was built (`internal/bench/adversarial-council/`: 12 planted-defect
579
+ fixtures across 4 subtlety classes + 3 controversial-but-correct clean
580
+ controls; subtlety distribution published; passed an independent validity
581
+ audit after one fixture was repaired). The registered cross-vendor run
582
+ (anthropic `claude-sonnet-4-5` + openai `gpt-4o`, spend-authorized) resolved
583
+ the claim NEGATIVE:
584
+
585
+ | quantity | value |
586
+ |---|--:|
587
+ | judge-passed residual pool | 5–7 defects (missed by both neutral passes) |
588
+ | single-skeptic residual recall | 0.60 |
589
+ | 2-vendor panel residual recall | 0.60 (**zero lift**) |
590
+ | single-skeptic FP on clean controls | 1.00 |
591
+ | panel FP on clean controls | 1.00 |
592
+
593
+ The second vendor's residual catches were a **strict subset** of the first's,
594
+ so the panel added no marginal coverage; both recall thresholds (+25% rel,
595
+ +8 pp abs) missed → **honest-null**. Under the adversarial-skeptic posture
596
+ both the single skeptic and the panel false-flagged **all three**
597
+ controversial-but-correct controls (100% FP) — the posture over-flags correct
598
+ code. Stable across two runs. Per the locked gate, the Mode 9 surface stays
599
+ **default-off permanently** (like recursive-verification). Reproducible
600
+ artifact: `internal/bench/adversarial-council/runs/`.
601
+ - **Transport lesson.** The first run attempted via `council_cli run` was
602
+ REJECTED as a measurement artifact: that transport runs multi-round
603
+ peer-review with cross-member visibility and returns prose ("Round 2 …
604
+ Reviewer A"), which both violates the independent-skeptic requirement and
605
+ defeats JSON scoring. The valid run uses direct, independent per-vendor
606
+ client calls (`bench_adversarial_council.ts`) with a strict-JSON system
607
+ prompt and a deterministic, pre-validated scorer
608
+ (`adversarial_bench_score.ts` + its synthetic red/green test).
585
609
 
586
610
 
587
611
  ## Defect-finding: team vs self-review vs council (2026-07-20) — HONEST NULL (ceiling-limited) {#honest-null-defect}
@@ -622,3 +646,140 @@ defect-finding *quality/lift* claim binds; team mode stays documented as
622
646
  judge-survivable-subtlety corpus that breaks the recall ceiling, or (b) a new
623
647
  model generation. The worker-via-bundle delegate (roadmap Phase 3 Step 4) stays
624
648
  deferred — it re-opened only on a measured review lift, which did not occur.
649
+
650
+ ## Internet-reach prescriptions vs host-native web tools (2026-07-24) — HONEST NULL (capability), cost signal unregistered {#honest-null-reach}
651
+
652
+ **Question (pre-registered before the run):** does a reach-prescription layer —
653
+ `gh api` for repository metadata, a local feed parser, a keyless discussion-search
654
+ API, `curl` + local HTML→text — beat the host's own web-search / web-fetch tools
655
+ on credential-free dev-research tasks, and at what token cost? The layer was
656
+ prototyped in gitignored scratch first, so both arms were real at scoring time.
657
+
658
+ **Design.** 12 tasks × 2 arms (`native` = host web tools only; `reach` = the
659
+ prototype prescriptions), 4 parallel subagents, arms judged independently on
660
+ pre-declared acceptance evidence — no arm-vs-arm comparison at scoring time.
661
+ Thresholds, verdict bands and the run protocol were committed **before** the run
662
+ (`internal/bench/reach-vs-native/README.md`); the report is
663
+ `internal/bench/reach-vs-native/VERDICT.md`, raw rows in `results.csv`.
664
+
665
+ **Result — capability: NULL.** The native arm passed **12/12**. Under the
666
+ pre-registered rule (reach wins only where native fails; **ties are native
667
+ wins**) the reach arm scored **0 outright wins of 12** → band **`stop`**. Two
668
+ reach failures were prescription defects (a 400-char excerpt cap; a `jq`
669
+ projection dropping the release body), and repairing them **cannot** move the
670
+ band: the native arm passed those tasks too, so a repaired reach arm scores a
671
+ tie. Zero native failures ⇒ zero possible reach wins.
672
+
673
+ **Consequence: no router skill shipped.** The `internet-reach` router was
674
+ cancelled pre-authoring by its own Phase-0 gate. What did ship is the
675
+ verdict-independent operator tooling — a schema-validated channel registry, a
676
+ five-state probe engine with stale-shim detection, a read-only `reach:doctor`,
677
+ and a CI gate that fails on any unpinned install prescription.
678
+
679
+ **Honest bound.** The credential-free constraint (needed for reproducibility)
680
+ structurally excluded the two cases where a reach advantage was hypothesized:
681
+ video subtitles (backend absent → `untested`) and authenticated / rate-limited
682
+ platform access (impossible in a keyless set). The null therefore reads narrowly:
683
+ *on public, credential-free dev-research tasks, a reach prescription layer buys
684
+ no capability the host does not already have.* It says nothing about gated-platform
685
+ access. Testing that needs a credentialed task set with its own pre-registration.
686
+
687
+ **Unregistered observation — cost, not capability.** On all 8 tasks both arms
688
+ solved, the reach arm was cheaper: **3,070 vs 6,730 tokens (0.46×)**, largest
689
+ gaps on repository metadata (0.26×) and discussion search (0.31×). The native
690
+ arm's overhead was *discovery*: it repeatedly had to find the machine-readable
691
+ endpoint the prescription already knows. This is recorded **outside** the
692
+ decision — S0b was authored as a ≤1.5× guardrail, never a win condition, and
693
+ promoting it to one after seeing the data would be the post-hoc rigging the bands
694
+ exist to prevent. Acting on it requires a separate, cost-primary pre-registration
695
+ (equal-evidence tasks, token cost as the primary metric, a stated minimum saving
696
+ worth the maintenance burden).
697
+
698
+ ## Gated-platform reads (2026-07-25) — SHIP (3 channels), with a narrowed gap on one {#ship-gated-reach}
699
+
700
+ **Question (pre-registered before the run):** on platforms the host's own web tools
701
+ cannot reach at all, are credential-free prescriptions **reliable** enough to justify
702
+ their maintenance weight — measured **per channel**, never aggregated?
703
+
704
+ This is deliberately not the question the parent bench asked. The
705
+ [internet-reach null](#honest-null-reach) measured whether a prescription layer beats
706
+ native tools on credential-free dev research, answered **no** (0/12, band `stop`), and
707
+ named its own bound: *"It says nothing about gated-platform access. Testing that needs
708
+ a credentialed task set with its own pre-registration."* This run is that test —
709
+ except it turned out **no credentials are needed**, which is itself the finding that
710
+ made it worth running.
711
+
712
+ **The capability gap is established, not assumed.** Measured the same session, first
713
+ hand: `reddit.com` is refused at the domain level by the host's own tool (a
714
+ client-side refusal, not a 403 from Reddit); `x.com/<user>/status/<id>` answers **HTTP
715
+ 402**; a YouTube watch page answers 200 with metadata and no transcript.
716
+
717
+ **Design.** 6 tasks per channel with pre-declared acceptance evidence, each with a
718
+ **native-arm control**, thresholds frozen before the run (≥5/6 ship · 3–4/6 park ·
719
+ ≤2/6 drop), one documented repair per task allowed, verdicts never aggregated.
720
+ Pre-registration: `internal/bench/gated-reach/README.md`; rows and evidence:
721
+ `internal/bench/gated-reach/results.md`.
722
+
723
+ | Channel | reach | native | Verdict |
724
+ |---|---|---|---|
725
+ | `reddit` tier 1 — Atom text | **6/6** | 0/6 | **ship** |
726
+ | `reddit` tier 2 — ranking + thread structure | **6/6** | 0/6 | **ship** — time-bounded |
727
+ | `twitter-oembed` — single tweet | **6/6** | 2/6 | **ship** — narrowed gap, below |
728
+ | `youtube-transcripts` | not run | — | **park** — unexercised (backend absent by design) |
729
+
730
+ **Reddit is a real, unambiguous capability.** Post text, comment text with authors
731
+ (147 feed entries on the test thread, 135 author-bearing), and — via server-rendered
732
+ HTML — **comment scores and reply nesting** (134 comments across 7 depth levels,
733
+ scores cross-checked against the rendered page). Native scores 0/6 by construction:
734
+ there is no native path to a domain the host refuses. The rate limiting that makes
735
+ this fragile is solved with **no new code** — `curl --retry 8 --retry-max-time 110`
736
+ measured 5/5 against 2/6 without it, because curl treats 429 as retryable and backs
737
+ off exponentially when `--retry-delay` is omitted.
738
+
739
+ **Tier 2 ships with an expiry, not a promise.** Reddit announced a login requirement
740
+ for the server-rendered interface on 2026-06-30 and withdrew its earlier commitment to
741
+ keep it available. Logged-out access still worked on 2026-07-25. It therefore ships
742
+ with a kill-switch keyed on an **observed** login wall — never on the announcement —
743
+ and with tier 1 as the permanent fallback. Degradation is a documented output
744
+ (`login_wall: true`, "ranking unavailable"), because presenting unranked text as
745
+ ranked is the one failure mode here that produces wrong conclusions rather than a
746
+ missing answer.
747
+
748
+ **The control rule fired, and the Twitter story is narrower than its 6/6.** The first
749
+ task set used the most-quoted tweets in existence; native scored **5/6** on them — not
750
+ by reading `x.com`, but because a canonical tweet's text is reproduced everywhere.
751
+ Those five tasks were **removed and replaced** per the pre-registered control rule.
752
+ On five genuinely obscure tweets native dropped to **2/6**, and one of its two
753
+ "passes" came from the author's Threads and Mastodon cross-posts rather than Twitter.
754
+ Where it failed it failed usefully badly: on one tweet it produced a paraphrase and a
755
+ **confidently wrong month**, and it cannot distinguish a deleted tweet from a live one
756
+ (both answer 402). So the honest reading of Twitter's 6/6 is: *the channel is reliable,
757
+ and the gap it closes is narrow* — for any tweet discussed anywhere, native search
758
+ already recovers the content; the channel earns its place on the case where a specific
759
+ URL is in hand and nothing mirrors it.
760
+
761
+ **A bench limitation, published rather than engineered away.** The control rule says a
762
+ native pass means the task was mis-scoped, so the two native-passed Twitter tasks
763
+ should have been replaced again. They were not, and the reason is structural: every
764
+ tweet-sourcing channel available to a host that cannot read Twitter — HN links, Reddit
765
+ links, search — selects for tweets that *were* discussed publicly, which is exactly the
766
+ population native search recovers. Sourcing an undiscussed tweet requires the access
767
+ this bench exists because we lack. The 6/6 stands on the frozen threshold; the caveat
768
+ is recorded here so nobody later reads it as "six things only this channel can do".
769
+
770
+ **YouTube is parked, not scored.** `yt-dlp` is absent and the package never
771
+ auto-installs. Per the pre-registered unexercised rule, a channel that cannot be
772
+ exercised cannot reach ship and is not counted as a drop — an uninstalled tool is a
773
+ fact about this machine, not about the channel. What did ship for it is the readiness
774
+ check that closes the blind spot the parent bench left open: a passing `yt-dlp
775
+ --version` does **not** imply extraction works, because full YouTube support needs an
776
+ external JS runtime, so the doctor inspects the yt-dlp config semantically and reports
777
+ a distinct `not-ready` state with an idempotent fix command.
778
+
779
+ **Three prescription defects were found by executing the prescriptions verbatim** —
780
+ none would have been caught by review: a single HTML-entity decode pass leaves
781
+ `&mdash;` in tweet text; a missing `-f` makes a deleted tweet answer **exit 0 with
782
+ 3,663 bytes of error HTML** that a caller reads as success; and a dropped `-L` makes
783
+ the oEmbed endpoint answer 301 with an empty body, which looks like a dead service.
784
+ All three are fixed and documented as load-bearing in
785
+ [`docs/guides/gated-platform-reads.md`](guides/gated-platform-reads.md).
package/docs/catalog.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # agent-config — Public Catalog
2
2
 
3
- Consumer-facing catalog of all **673 public artefacts** shipped by
3
+ Consumer-facing catalog of all **678 public artefacts** shipped by
4
4
  this package. Internal package-maintenance rules and deprecation shims
5
5
  are excluded.
6
6
 
7
7
  > **Regenerate:** `./scripts-run src/scripts/generate_index`
8
8
  > Auto-generated — do not edit manually.
9
9
 
10
- ## Skills (278)
10
+ ## Skills (281)
11
11
 
12
12
  > **Behavioural-eval coverage is measured, not implied.** A skill is
13
13
  > behaviourally evaluated only if it ships `evals/evals.json`; most do
@@ -61,6 +61,7 @@ are excluded.
61
61
  | skill | [`character-consistency`](../dist/agent-src/skills/character-consistency/SKILL.md) | official | Use when a character must stay visually identical across AI video scenes — locks identity tokens (silhouette, palette, wardrobe, prop) in JSON. Triggers 'character lock', 'same character'. |
62
62
  | skill | [`check-refs`](../dist/agent-src/skills/check-refs/SKILL.md) | official | Use when verifying cross-references between skills, rules, commands, guidelines, and context documents are not broken after edits, renames, or deletions. |
63
63
  | skill | [`churn-prevention`](../dist/agent-src/skills/churn-prevention/SKILL.md) | official | Use when designing churn defence — health-score signals, churn-cause split (involuntary / value / relationship / fit), early-warning loop. Triggers on 'why are accounts leaving'. |
64
+ | skill | [`code-intelligence`](../dist/agent-src/skills/code-intelligence/SKILL.md) | official | Route codebase-structure questions (who calls X, where used, what imports, change-impact) to a code-graph first, grep fallback. Triggers 'who calls', 'where is this used', 'call graph'. |
64
65
  | skill | [`code-refactoring`](../dist/agent-src/skills/code-refactoring/SKILL.md) | official | Use when the user says 'refactor this', 'rename class', or 'move method'. Safely refactors code in any language — finds all callers, updates downstream dependencies, verifies via quality tools. |
65
66
  | skill | [`code-review`](../dist/agent-src/skills/code-review/SKILL.md) | official | Use when the user says \"review this\", \"check my code\", or wants feedback on changes. Reviews for correctness, quality, security, and coding standards. |
66
67
  | skill | [`command-routing`](../dist/agent-src/skills/command-routing/SKILL.md) | official | Use when the user invokes a slash command like /create-pr, /commit, /fix-ci, or pastes command file content — routes to the right command with context inference and GitHub API patterns. |
@@ -124,6 +125,7 @@ are excluded.
124
125
  | skill | [`frontend-render-security`](../dist/agent-src/skills/frontend-render-security/SKILL.md) | official | Writing/reviewing client-side UI (React/Vue/vanilla) — insecure-render + client-trust gaps AI ships: XSS via innerHTML, client secrets, client-only auth, CORS wildcard, token in localStorage |
125
126
  | skill | [`fundraising-narrative`](../dist/agent-src/skills/fundraising-narrative/SKILL.md) | official | Use when shaping a capital-raise pitch — why-now / why-us / why-this framing, market-size reasoning, traction-story construction. Triggers on 'tighten the pitch', 'why-now is weak'. |
126
127
  | skill | [`funnel-analysis`](../dist/agent-src/skills/funnel-analysis/SKILL.md) | official | Use when diagnosing where a SaaS or product funnel leaks — visitor → signup → activation → paid → retained — channel-agnostic, conversion-rate-driven. |
128
+ | skill | [`gated-reach`](../dist/agent-src/skills/gated-reach/SKILL.md) | official | Read a Reddit thread or single tweet the host cannot fetch — 'what does this Reddit thread say', 'top comment on this post', 'what does this tweet say' — when reddit.com is refused or x.com 402s. |
127
129
  | skill | [`git-workflow`](../dist/agent-src/skills/git-workflow/SKILL.md) | official | Use when working with Git — branch naming, commit messages, PR creation, rebasing, or the code review process — even when the user says 'push this' or 'merge the branch' without naming Git. |
128
130
  | skill | [`github-ci`](../dist/agent-src/skills/github-ci/SKILL.md) | official | Use when working with GitHub Actions — workflow YAML, quality gates, test matrices, deployment triggers, reusable workflows — even when the user just says 'my CI is failing' or 'add a check'. |
129
131
  | skill | [`grafana`](../dist/agent-src/skills/grafana/SKILL.md) | official | Use when working with Grafana — dashboards, Loki LogQL queries, alerting rules, monitoring panels — even when the user just says 'build me a dashboard' or 'query the logs' without naming Grafana. |
@@ -256,6 +258,7 @@ are excluded.
256
258
  | skill | [`runway-cognition`](../dist/agent-src/skills/runway-cognition/SKILL.md) | official | Use when reasoning about cash runway — burn shape, fundraise triggers, layoff-vs-cut-vs-grow decisions. Triggers on 'how long do we have', 'should we raise', 'cut or grow'. |
257
259
  | skill | [`scenario-modeling`](../dist/agent-src/skills/scenario-modeling/SKILL.md) | official | Use when constructing base / upside / downside scenarios — three-statement modeling, sensitivity analysis, optionality reasoning. Triggers on 'model the scenarios', 'what if growth halves'. |
258
260
  | skill | [`scene-expander`](../dist/agent-src/skills/scene-expander/SKILL.md) | official | Use when expanding a one-line idea into the 12-block Cinematic Scene Blueprint — provider-agnostic, includes optional dialogue + ambient. Triggers 'expand this scene', 'blueprint for X'. |
261
+ | skill | [`screenshot-hygiene`](../dist/agent-src/skills/screenshot-hygiene/SKILL.md) | official | Use when creating and embedding a documentation screenshot — detect and redact sensitive data, human-gate data-bearing shots before ship. Triggers 'screenshot for docs', 'screenshot admin panel'. |
259
262
  | skill | [`script-writing`](../dist/agent-src/skills/script-writing/SKILL.md) | official | Use when adding or editing any script under `scripts/` — `--quiet`, `_lib/script_output`, silent Taskfile wiring, Iron-Law carve-outs; fires on 'add a check script for X'. |
260
263
  | skill | [`secrets-management`](../dist/agent-src/skills/secrets-management/SKILL.md) | official | Use when picking a secrets store, designing rotation, or wiring scanning gates — multi-cloud (Vault, AWS, Azure, GCP), CI, and Kubernetes — decision framework, provider deep-dives externalized. |
261
264
  | skill | [`security`](../dist/agent-src/skills/security/SKILL.md) | official | Use when applying security best practices — authentication, authorization, CSRF protection, input sanitization, rate limiting, or secure coding — stack-agnostic. |
@@ -306,7 +309,7 @@ are excluded.
306
309
  | skill | [`wireframe`](../dist/agent-src/skills/wireframe/SKILL.md) | official | Explore a flow or layout with 3+ disposable lo-fi greyscale wireframes on a named axis, before any hi-fi work. Use when the user wants to sketch directions or explore structure. |
307
310
  | skill | [`worktree-lifecycle`](../dist/agent-src/skills/worktree-lifecycle/SKILL.md) | official | Use when governing a worktree across its whole life — scope-lock declaration, merge-readiness status, scoped verification, and safe cleanup that refuses while unique unmerged commits exist. |
308
311
 
309
- ## Rules (104)
312
+ ## Rules (106)
310
313
 
311
314
  | kind | name | type | description |
312
315
  |---|---|---|---|
@@ -337,6 +340,7 @@ are excluded.
337
340
  | rule | [`design-fidelity`](../dist/agent-src/rules/design-fidelity.md) | auto | A provided prototype/mockup/design system is the spec — build 1:1; never swap fonts, controls, or layout unconfirmed |
338
341
  | rule | [`devcontainer-routing`](../dist/agent-src/rules/devcontainer-routing.md) | auto | Wiring DevContainers/Codespaces (devcontainer.json, features, ports) — route to the devcontainer skill |
339
342
  | rule | [`direct-answers`](../dist/agent-src/rules/direct-answers.md) | always | Always — direct, unembellished answers. No flattery, no invented facts (verify load-bearing claims, otherwise ask). Emojis only as functional markers. Brevity is the default. |
343
+ | rule | [`doc-screenshot-hygiene`](../dist/agent-src/rules/doc-screenshot-hygiene.md) | auto | Screenshots for docs — anonymize sensitive data before shipping; data-bearing shots are human-gated (published egress); terminal/CLI/IDE screenshots forbidden |
340
344
  | rule | [`docker-commands`](../dist/agent-src/rules/docker-commands.md) | auto | Running PHP inside Docker — artisan, composer, phpstan, rector, ecs, phpunit, tests, migrations, any CLI tool |
341
345
  | rule | [`domain-adoption-policy`](../dist/agent-src/rules/domain-adoption-policy.md) | auto | Adopting a new domain track (mobile, ML, IoT…) — demand/owner/CI gates BEFORE harvest |
342
346
  | rule | [`domain-safety-disclaimer`](../dist/agent-src/rules/domain-safety-disclaimer.md) | auto | Advisory content (legal, medical, financial, consulting) — matching 'not X advice' disclaimer; refuse diagnosis/dosage |
@@ -391,6 +395,7 @@ are excluded.
391
395
  | rule | [`rule-type-governance`](../dist/agent-src/rules/rule-type-governance.md) | auto | Creating/editing rules, or auditing rule types — decides when a rule should be always vs auto |
392
396
  | rule | [`runtime-safety`](../dist/agent-src/rules/runtime-safety.md) | auto | Skill declares execution metadata — enforce safety constraints for assisted/automated execution types |
393
397
  | rule | [`scope-control`](../dist/agent-src/rules/scope-control.md) | always | Scope control — no unsolicited architectural changes, refactors, or library replacements |
398
+ | rule | [`secret-vcs-guard`](../dist/agent-src/rules/secret-vcs-guard.md) | auto | About to write a credential into a tracked file or stage/commit one in any VCS (git/svn/hg) — STOP, show the match, ask, offer alternatives; never silently commit, never silently strip |
394
399
  | rule | [`security-sensitive-stop`](../dist/agent-src/rules/security-sensitive-stop.md) | auto | Security-sensitive paths (auth, billing, tenants, secrets, uploads, webhooks) — threat-model BEFORE editing |
395
400
  | rule | [`senior-engineering-discipline`](../dist/agent-src/rules/senior-engineering-discipline.md) | auto | Writing/generating code — generalize (no overfit or tautological tests), supply the invisible cross-cutting controls the prompt didn't name, never invent an API/field/package |
396
401
  | rule | [`size-enforcement`](../dist/agent-src/rules/size-enforcement.md) | manual | Creating or editing rules, skills, commands, guidelines, AGENTS.md, or copilot-instructions.md — enforce size and scope limits |
@@ -12,34 +12,76 @@
12
12
  # check_claims pointer resolver); every `checkable: true` row's `our_evidence`
13
13
  # resolves. build_proof renders these rows. check_no_external_sources guarantees
14
14
  # no named source leaks in.
15
+ #
16
+ # `failure_mode` (optional) — what this row's claim prevents, in adopter-facing
17
+ # voice. A populated row ALSO renders in the "What each one prevents" view on the
18
+ # proof page; an empty field is the honest signal that the row is comparative
19
+ # only. Membership in that view is therefore a data property, never a curated
20
+ # short-list that can drift from this table.
21
+ #
22
+ # THE PIN SHAPE IS REFUSED HERE, DELIBERATELY. A number in these rows is bound by
23
+ # a resolving pointer — never by a test asserting that a literal string appears in
24
+ # a doc. A comparable suite pinned a marketing figure with an
25
+ # `assertIn("<number> tokens", …)` test; its own published formula yields a value
26
+ # ~4x larger, and the pin turned the wrong number into a protected invariant that
27
+ # CI actively defended. A pointer can go stale and be re-derived; a pin makes
28
+ # staleness the passing condition.
15
29
 
16
30
  rows:
17
- - claim: "No runtime — no background daemon, no state database, no auto-write memory."
31
+ - claim: "No resident runtime — no background daemon, no state database or service, no auto-write memory; deterministic, rebuildable file indexes only."
18
32
  our_evidence: "docs/contracts/no-runtime-boundary.md#file-first"
19
- their_evidence: "Swarm-runtime tools in this category ship a background process and/or a state store by design; that is an architectural fact of the runtime approach, not a defect."
33
+ their_evidence: "Swarm-runtime tools in this category ship a background process and/or a resident state store by design; that is an architectural fact of the runtime approach, not a defect."
20
34
  checkable: true
35
+ failure_mode: >-
36
+ A background process keeps running after you stop using it, holds state you did not write, and has to be kept alive and upgraded.
21
37
 
22
38
  - claim: "Capability/benchmark results are published — including the runs where the package changed nothing."
23
39
  our_evidence: "docs/benchmark.md"
24
40
  their_evidence: "A category headline figure (e.g. an '84.8%' score) appears across marketing surfaces with no reproducible methodology published — so it cannot be verified either way."
25
41
  checkable: true
42
+ failure_mode: >-
43
+ You adopt on a headline number nobody can re-run, and never learn which of its measurements changed nothing.
26
44
 
27
45
  - claim: "Every public claim binds to machine-checked evidence."
28
46
  our_evidence: "docs/CLAIMS.md"
29
47
  their_evidence: "Marketing claims in this category are not bound to a machine-checked ledger a reader can reproduce."
30
48
  checkable: true
49
+ failure_mode: >-
50
+ A shipped number drifts from the artefact it came from and stays published, because nothing re-checks the claim against its source.
31
51
 
32
52
  - claim: "Skills publish their own known limits, each with a witness test."
33
53
  our_evidence: "tests/scripts/witness/check_refs_relative_gap.test.ts"
34
54
  their_evidence: "Published known-limitation surfaces backed by reproducing tests are not a standard artifact in this category."
35
55
  checkable: true
56
+ failure_mode: >-
57
+ A limitation is discovered by you, in your repo, at the moment it costs you something — instead of being stated up front and held by a test.
36
58
 
37
59
  - claim: "A 30-second single-file wedge exists — one read-only subagent, one command, verdict with file:line — and its promise is a scoped, published eval, not a feature list."
38
60
  our_evidence: "internal/bench/orchestration/pv-a3-results.md#token_delta_provenance: measured"
39
61
  their_evidence: "Category entry points typically install the full platform (profiles, packs, runtime) before the first felt win; single-artifact entries with a published eval behind the promise are not a standard artifact."
40
62
  checkable: true
63
+ failure_mode: >-
64
+ Evaluating the tool means installing the whole platform first, so the first thing you learn is the setup cost rather than whether it works.
41
65
 
42
66
  - claim: "The persona-identity question was tested and published as an honest null (identity swap ~zero effect, provider choice ~15x larger) instead of being shipped as theater."
43
67
  our_evidence: "internal/bench/reports/persona-placebo.json#honest-null"
44
68
  their_evidence: "Named-persona prompts are shipped as a feature across the category without a published A/B separating identity from method."
45
69
  checkable: true
70
+ failure_mode: >-
71
+ You pay tokens for prompt theater that was never measured against the method text it wraps.
72
+
73
+ - claim: "Every upstream-tool install prescription the package ships is version-pinned, intake-recorded, and enforced offline in CI — an unpinned version, a branch/archive install source, or a pipe-remote-to-shell instruction fails the build."
74
+ our_evidence: "src/scripts/validate_reach_prescriptions.ts"
75
+ their_evidence: "Capability layers in this category commonly install themselves and their upstream dependencies from a moving target (a branch archive or an unpinned package) via a piped remote installer; whether any given one pins is observable per repo, but a CI gate that fails the build on an unpinned prescription is not a standard artifact."
76
+ checkable: true
77
+ failure_mode: >-
78
+ An install instruction silently follows a moving target — an unpinned package or a piped remote script — so what lands in your repo is whatever the source held that day.
79
+
80
+ - claim: "Platform reads that the host's own web tools cannot perform at all (a refused domain, an HTTP 402) are shipped as credential-free prescriptions whose reliability was measured per channel against a native control, with the thresholds frozen before the run and the narrowing caveat published alongside the pass."
81
+ our_evidence: "docs/benchmark.md#ship-gated-reach"
82
+ their_evidence: "Reaching gated platforms is commonly solved in this category by asking for an API key or a session cookie, and the capability is asserted from a feature list rather than a per-channel reliability measurement with a native-arm control; publishing the case where the native tools already suffice, next to the pass, is not a standard artifact."
83
+ checkable: true
84
+ failure_mode: >-
85
+ You hand over a credential — or your account — for a read the tools could
86
+ already do, and you cannot tell which channels actually work because the
87
+ capability was claimed rather than measured.
@@ -0,0 +1,53 @@
1
+ # Contract: local server ports + host integration
2
+
3
+ > The loopback/port contract `src/server/port.ts` enforces, plus the
4
+ > host-integration surface (config root + embed) a host like agent-switch binds
5
+ > to. This file resolves the long-standing pointer in `src/server/port.ts`.
6
+
7
+ ## Port range
8
+
9
+ - The GUI/API server binds on **loopback `127.0.0.1` only**, on a free port in
10
+ **41000–41999** (per ADR-012). `src/server/port.ts` picks a free port by
11
+ actually binding (no is-free → bind race) and refuses any range that overlaps
12
+ the privileged ports `[0, 1024]` or strays outside this documented range —
13
+ both are anti-regression guards (`validateRange`).
14
+ - The chosen port is ephemeral per process; a host discovers the live port from
15
+ the server-info readout, never by assuming a fixed value.
16
+
17
+ ## Auth token
18
+
19
+ - `src/server/token.ts`: a 32-byte hex token, per-process, mode `0600`, replaced
20
+ on every boot. The SPA reads it once from `?token=` at boot, then strips it
21
+ from the URL; subsequent calls use the `Authorization: Bearer` header. There is
22
+ no cookie. A host must re-read the token after every respawn.
23
+
24
+ ## Host integration — config root
25
+
26
+ - `agent-config --config-root <path>` (flag) or `EVENT4U_CONFIG_HOME` (env) sets
27
+ AC's config home. Precedence: **flag > env > default**; absent → default
28
+ behavior is unchanged. This lets a host give AC a per-profile config root so
29
+ profile-scoped settings do not silently collide.
30
+
31
+ ## Host integration — embed
32
+
33
+ - `?embed=1` renders AC chrome-stripped (no standalone nav/brand, no theme
34
+ toggle — the host owns the theme); settings deep-links `#/settings` and
35
+ `#/settings/<section>` keep working.
36
+ - **Framing:** AC sends CSP `frame-ancestors 'none'` and is **never** iframe-able
37
+ — a host renders AC's URL in a **separate top-level window**, not a frame.
38
+ - `?theme=light|dark` feeds the pre-paint `data-theme` stamp (no flash).
39
+
40
+ ## Capability discovery
41
+
42
+ - `GET /api/v1/ping` and `agent-config --version --json` carry a `capabilities`
43
+ block: `{ configRoot: true, embed: { supported: true, version: 1, features:
44
+ ['theme', 'deepLink'] } }`. A host checks a capability, not a version number —
45
+ an older AC omits the block and the host degrades to a clear "not supported".
46
+
47
+ ## References
48
+
49
+ - Port range: ADR-012. Enforcement: `src/server/port.ts`.
50
+ - Token transport: `src/server/token.ts`.
51
+ - Capabilities source: `src/shared/capabilities.ts`.
52
+ - Host-side plans: `agents/roadmaps/road-to-ac-embeddable-gui.md`,
53
+ `agents/roadmaps/road-to-reciprocal-ecosystem.md`.
@@ -37,7 +37,7 @@ and violating the no-runtime principle).
37
37
  | Category | Why |
38
38
  |---|---|
39
39
  | **Background processes / daemons** | No spawned subprocesses that outlive the current agent turn |
40
- | **Cross-session persistent state stores** | No SQLite, pgvector, MCP memory servers, Redis, or any store that persists beyond the git working tree — agent-memory layer sunset applies here |
40
+ | **Cross-session persistent state stores** | No SQLite, pgvector, MCP memory servers, Redis, or any store that persists beyond the git working tree — agent-memory layer sunset applies here. **Carve-out (ADR-124 § 6): a gitignored, deterministic, rebuildable build/index artifact under `agents/runtime/state/` is a build output, not a state store** — it carries no authority, is reproducible from the working tree, and is never auto-written memory. State-store test: if deleting the artifact changes *what* the tool can answer rather than only *how fast* it answers, it is a state store and prohibited (a code-graph cache passes — deletion only slows recompute; a vector/embedding index fails — it enables query semantics absent from source, and stays Class C). |
41
41
  | **Event loops / polling** | No `while true; do …; done`, no `inotifywait`, no cron-inside-mission |
42
42
  | **Auto-PR / auto-push** | Hard-Floor (`non-destructive-by-default`): missions never push to remote or open PRs autonomously; those gates require explicit user confirmation every turn |
43
43
  | **Network egress from mission scripts** | Mission scripts may not initiate outbound HTTP calls; skills that need network access declare `allowed_tools` explicitly and go through the normal lethal-trifecta gate |
@@ -43,6 +43,21 @@ the whole of its authority.
43
43
  - **Verify, never adopt blind** — a subagent return is evidence, not truth; the orchestrator verifies per [`delegation-policy`](../../src/rules/delegation-policy.md)'s Iron Law before adopting it.
44
44
  - **Tier-size the slice, not the agent** — dispatch at the slice's complexity, not the session's.
45
45
  - **Own the safety decision** — a Hard-Floor or egress action surfaced by a subagent is decided by the orchestrator + human, never executed by the subagent.
46
+ - **Re-confirm; the subagent's confirmation does not count** — a destructive or irreversible mutation *proposed by a subagent* is subject to the same Hard Floor as one the orchestrator proposed, and the subagent's own "I checked, it's fine" does not satisfy the gate. Without this clause, delegation is a detour around it: ask a subagent, receive a blessing, act.
47
+ - **Deliver the floor, do not assume it** — the floor reaches a worker because [`generate_subagent_floor.ts`](../../src/scripts/generate_subagent_floor.ts) writes it into every dispatch prompt and CI fails on drift.
48
+
49
+ ### Honest scope of the floor guarantee
50
+
51
+ The invariant above — *a subagent cannot do what its parent may not* — is now
52
+ **delivered** for subagents dispatched through this package's prompt templates:
53
+ the floor is generated from the kernel rules and drift-gated. It was previously
54
+ asserted here and carried by nothing; the brief schema, the spawn composer, and
55
+ all eight prompt templates contained no floor text at all.
56
+
57
+ What stays unproven, and is therefore not claimed: whether a subagent spawned by
58
+ a host primitive outside these templates inherits any of it. That is a host
59
+ property this package does not control and does not test. A contract that
60
+ quietly covered it would repeat the exact defect this section exists to close.
46
61
 
47
62
  ## Failure modes
48
63
 
@@ -473,6 +473,14 @@ defaults"* above). The cascade is **per-file** by basename — the
473
473
  deepest existing `agents/<kind>/<name>.md` wins; the rest are silently
474
474
  shadowed.
475
475
 
476
+ **One exception, and it is not silent.** Kernel and `tier: safety-floor`
477
+ rules sit outside the cascade: a `Mode: replace` override on one is
478
+ refused and reported, and a `Mode: extend` (a tightening) needs a
479
+ registered entry in `agents/overrides/kernel-exceptions.yml`. See
480
+ [`override-system`](../src/agent-src/contexts/override-system.md)
481
+ § *The non-overridable class* — including its stated limit, since the
482
+ class is a norm with a partial gate, not a proof.
483
+
476
484
  | Subdir | Cascade? | User-global allowed? | Why |
477
485
  |---|---|---|---|
478
486
  | `agents/overrides/` | ✅ Yes — deepest wins by basename. | ✅ Yes — weakest layer. | Personal developer overrides. |
@@ -489,10 +497,13 @@ fallback). Files under `~/.event4u/agent-config/agents/settings/contexts/` or
489
497
  project-shaped and must not leak across projects.
490
498
 
491
499
  The resolver lives at
492
- [`scripts/_lib/agents_overlay.py`](../src/scripts/_lib/agents_overlay.py)
493
- and is enforced by `scripts/check_overlay_cascade_subdirs.py` — drift
494
- between the code constants (`CASCADE_ELIGIBLE_KINDS`,
500
+ [`scripts/_lib/agents_overlay.ts`](../src/scripts/_lib/agents_overlay.ts)
501
+ and is enforced by
502
+ [`scripts/check_overlay_cascade_subdirs.ts`](../src/scripts/check_overlay_cascade_subdirs.ts)
503
+ — drift between the code constants (`CASCADE_ELIGIBLE_KINDS`,
495
504
  `USER_GLOBAL_OVERLAY_KINDS`) and the table above breaks the build.
505
+ (Both were `.py` before the ADR-200 TypeScript port; the old paths were
506
+ cited here long after they were deleted.)
496
507
 
497
508
  ---
498
509
 
@@ -7,6 +7,8 @@ supersedes: —
7
7
  superseded_by: —
8
8
  phase: v2.x · monorepo-phase-3-typescript-installer
9
9
  type: prospective
10
+ review_trigger: >-
11
+ When a consumer reports losing a local edit to a framework-authoritative file on update, OR when any framework file legitimately needs to move between the force-update and scaffold classes — the conflict-resolution half (skip | overwrite | merge) is the part under review, not the TypeScript choice
10
12
  ---
11
13
 
12
14
  # ADR-016 — TypeScript Installer Architecture
@@ -4,7 +4,7 @@ status: accepted
4
4
  date: 2026-06-11
5
5
  decision: no-external-runtime-federation
6
6
  supersedes: —
7
- superseded_by: —
7
+ superseded_by: ADR-124 (engine-adoption interpretation only)
8
8
  phase: external-runtime-coexistence
9
9
  type: structural
10
10
  ---
@@ -4,7 +4,7 @@ status: accepted
4
4
  date: 2026-06-14
5
5
  decision: agent-memory-layer-removal
6
6
  supersedes: —
7
- superseded_by: —
7
+ superseded_by: ADR-124 (engine-adoption interpretation only)
8
8
  phase: memory-layer-cleanup
9
9
  type: structural
10
10
  ---
@@ -7,6 +7,8 @@ supersedes: —
7
7
  superseded_by: —
8
8
  phase: road-to-final-state-and-market-readiness
9
9
  type: standing
10
+ review_trigger: >-
11
+ When a host ships a spawn primitive whose memory-inheritance semantics are documented, OR when a dispatched subagent is observed taking an action the floor forbids
10
12
  ---
11
13
 
12
14
  # ADR-109 — The `subagent-v1` contract (new discovery category, default-off, static projection)
@@ -7,6 +7,8 @@ supersedes: —
7
7
  superseded_by: —
8
8
  phase: road-to-discipline-profile-tiering
9
9
  type: standing
10
+ review_trigger: >-
11
+ When a diff in a downstream-trust-boundary path (installer, provenance, kernel rules, spawn path) is found to have run under minimum discipline because the HOST was weak — host capability is only one axis, and diff risk is the missing one
10
12
  ---
11
13
 
12
14
  # ADR-110 — `discipline_profile` resolves at runtime (agent-in-the-loop); projection stays configuration-independent
@@ -112,9 +112,17 @@ maintainer approves the run once per release.
112
112
  on deploys, a single human checkpoint before a release's own CI even
113
113
  runs is arguably a feature, not friction.
114
114
  - `RELEASE_PR_TOKEN` (a fine-grained PAT or GitHub App installation
115
- token with `contents: write` + `pull-requests: write` on this repo)
116
- removes the approval requirement entirely — documented as the
117
- zero-friction upgrade path in `release.yml`'s header comment. Adding
115
+ token with `contents: write` + `pull-requests: write` + `actions: write`
116
+ on this repo) removes the approval requirement entirely — documented as
117
+ the zero-friction upgrade path in `release.yml`'s header comment. The
118
+ `actions: write` scope ("Actions: read and write" on a fine-grained PAT,
119
+ or the classic `workflow` scope) is required by release.ts step 9's
120
+ explicit `gh workflow run` dispatch of the tag-triggered workflows
121
+ (release-guard / publish-npm / cloud-release); without it that dispatch
122
+ returns HTTP 403. As of 2026-07-21 that dispatch is **non-fatal** — the
123
+ release is already complete when it runs, and a PAT-pushed tag fires
124
+ those workflows on the push regardless — so a missing scope degrades to
125
+ a logged warning, never a failed-but-shipped release. Adding
118
126
  it is a maintainer action, not part of this ADR.
119
127
 
120
128
  ## Verified facts (not assumed)
@@ -134,3 +134,33 @@ Each settled decision this roadmap does NOT touch:
134
134
  ADR-120 (council chairman mode), ADR-109 (subagent-v1 contract).
135
135
  - `docs/CLAIMS.md#adversarial-council-finding-coverage` — the pre-registered claim.
136
136
  - `cross-vendor-parity` (backed) — the evidence the finding-coverage scope rests on.
137
+
138
+ ## Addendum (2026-07-21) — finding-coverage claim resolved HONEST-NULL
139
+
140
+ The pre-registered `adversarial-council-finding-coverage` claim was executed and
141
+ resolved **negative**. A curated judge-survivable corpus
142
+ (`internal/bench/adversarial-council/`: 12 planted-defect fixtures across
143
+ multi-file-interaction / logic-inversion / security-masked / complex-state + 3
144
+ controversial-but-correct clean controls; subtlety distribution published;
145
+ passed an independent validity audit after one fixture was repaired) was run
146
+ cross-vendor (anthropic `claude-sonnet-4-5` + openai `gpt-4o`) under the
147
+ maintainer spend authorization.
148
+
149
+ **Result:** on the judge-passed residual, the 2-vendor skeptic panel matched the
150
+ single skeptic exactly (residual recall 0.60 = 0.60, **zero lift** — the second
151
+ vendor's catches were a strict subset of the first's), at a **100%** false-
152
+ positive rate on the controversial-but-correct controls under the adversarial-
153
+ skeptic posture. Both locked recall thresholds missed -> honest-null. **The
154
+ Mode 9 `adversarial-verification-council` surface stays default-off permanently**
155
+ (no settings change — it already ships off), recorded like recursive-verification
156
+ (ADR-106). Detail + reproducible artifact:
157
+ `docs/benchmark.md#adversarial-verification-council`,
158
+ `internal/bench/adversarial-council/runs/`.
159
+
160
+ **Transport lesson (durable):** `council_cli run`/`debate` is a *deliberation*
161
+ transport — multi-round peer-review with cross-member visibility, prose output.
162
+ It is the WRONG tool for an independent-skeptic, structured-output benchmark (it
163
+ violated the independence requirement and defeated JSON scoring; the first run
164
+ through it was rejected as an artifact). The valid measurement uses direct,
165
+ independent per-vendor client calls with a strict-JSON contract and a
166
+ deterministic, pre-validated scorer.
@@ -109,3 +109,34 @@ are also rejected: per-file pragma containment (`security_lint.ts`) only.
109
109
  costs nothing to keep.
110
110
  - **Env allowlist instead of deny-by-family.** Rejected — would strip env the
111
111
  provider CLIs need and rot as new good vars appear.
112
+
113
+ ## Follow-up (2026-07-21) — `road-to-spawn-env-completion`
114
+
115
+ The 9.6.0 external review reproduced a working exploit against the fix this ADR
116
+ shipped: `GIT_CONFIG_COUNT` / `GIT_CONFIG_KEY_<n>` / `GIT_CONFIG_VALUE_<n>` (and
117
+ `GIT_CONFIG_GLOBAL` / `_SYSTEM`) survived the deny-by-family scrub — the
118
+ `GIT_*_COMMAND` family missed them (no `_COMMAND` suffix) — letting an attacker
119
+ set arbitrary git config (`core.fsmonitor` runs shell on every `git status`,
120
+ which the consumer-runtime hooks trigger). `GIT_ALTERNATE_OBJECT_DIRECTORIES`
121
+ and `HOSTALIASES` also leaked. **Confirmed empirically (all 5) and closed:**
122
+ `hardenedSpawnEnv` now denies the whole `GIT_CONFIG`/`GIT_CONFIG_*` family by
123
+ prefix plus the two exact vars, with falsifiable test vectors (red without the
124
+ fix, green with it).
125
+
126
+ **`maintainer-ci-spawn-sweep` blocker — resolved by classification, not mass
127
+ migration.** Rather than migrate ~15 low-risk maintainer/CI sites, all spawn
128
+ sites are now classified in `docs/spawn-site-policy.md` (Consumer Runtime /
129
+ Maintainer CLI / trusted CI / install-time). The consumer-runtime dispatcher
130
+ (`hooks/dispatch_hook.ts`) — missed in PR #984 — now routes through
131
+ `hardenedSpawnEnv`; the maintainer/CI/install sites are documented exempt with
132
+ rationale (env is maintainer- or workflow-controlled, not attacker-influenced).
133
+
134
+ **Secure-spawn lint — rejected (council 2026-07-21, claude-sonnet-4-5 +
135
+ gpt-4o).** A CI lint forbidding raw spawn in runtime paths was proposed (P0 in
136
+ the review) but rejected: it is net-new governance surface (a CI gate +
137
+ allowlist + exemption-adjudication + false-positive triage), which the folded
138
+ complexity-budget lock (PR #983) forbids — the lock text explicitly lists
139
+ "linter". The "retires ad-hoc review" justification failed the retirement test
140
+ (no such review gate exists to retire). `docs/spawn-site-policy.md` is the
141
+ self-enforcing substitute: its completeness claim is checked by git-diff
142
+ visibility at review time, not a build gate.