@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +207 -942
- package/README.md +21 -21
- package/dist/agent-src/README.md +2 -2
- package/dist/agent-src/commands/commit/in-chunks.md +8 -0
- package/dist/agent-src/commands/commit.md +17 -0
- package/dist/agent-src/commands/pr/create.md +4 -0
- package/dist/agent-src/contexts/override-system.md +75 -5
- package/dist/agent-src/rules/context-hygiene.md +2 -0
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +97 -0
- package/dist/agent-src/rules/domain-safety-pii.md +1 -0
- package/dist/agent-src/rules/downstream-changes.md +31 -1
- package/dist/agent-src/rules/external-code-graph-interop.md +13 -3
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +2 -0
- package/dist/agent-src/rules/git-history-discipline.md +2 -0
- package/dist/agent-src/rules/language-and-tone.md +2 -0
- package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -0
- package/dist/agent-src/rules/media-governance-routing.md +2 -0
- package/dist/agent-src/rules/minimal-safe-diff.md +2 -0
- package/dist/agent-src/rules/no-roadmap-references.md +3 -0
- package/dist/agent-src/rules/non-destructive-by-default.md +20 -0
- package/dist/agent-src/rules/onboarding-gate.md +2 -0
- package/dist/agent-src/rules/output-discipline.md +2 -0
- package/dist/agent-src/rules/persona-governance.md +2 -0
- package/dist/agent-src/rules/preservation-guard.md +3 -0
- package/dist/agent-src/rules/roadmap-progress-sync.md +2 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +106 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +1 -1
- package/dist/agent-src/rules/skill-quality.md +2 -0
- package/dist/agent-src/rules/source-confidentiality.md +2 -0
- package/dist/agent-src/rules/source-of-truth.md +2 -0
- package/dist/agent-src/rules/telegraph-speak.md +2 -0
- package/dist/agent-src/rules/token-optimizer-maintenance.md +2 -0
- package/dist/agent-src/rules/tool-safety.md +1 -0
- package/dist/agent-src/rules/verify-before-complete.md +2 -0
- package/dist/agent-src/skills/adr-create/SKILL.md +17 -1
- package/dist/agent-src/skills/agent-docs-writing/SKILL.md +34 -16
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +9 -9
- package/dist/agent-src/skills/code-intelligence/SKILL.md +94 -0
- package/dist/agent-src/skills/gated-reach/SKILL.md +185 -0
- package/dist/agent-src/skills/gated-reach/evals/triggers.json +72 -0
- package/dist/agent-src/skills/image-analyser/SKILL.md +14 -12
- package/dist/agent-src/skills/image-editing/SKILL.md +1 -0
- package/dist/agent-src/skills/readme-writing/SKILL.md +6 -1
- package/dist/agent-src/skills/screenshot-hygiene/SKILL.md +171 -0
- package/dist/agent-src/skills/secrets-management/SKILL.md +44 -1
- package/dist/agent-src/skills/subagent-orchestration/prompts/adversarial-verification-council.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge-two-stage.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-competitively.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-parallel.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-worktrees.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/judge-with-debate.md +29 -0
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +4 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/github-workflows/doc-impact.yml +101 -0
- package/dist/agent-src/templates/github-workflows/secret-scan.yml +65 -0
- package/dist/cli/configRoot.js +112 -0
- package/dist/cli/configRoot.js.map +1 -0
- package/dist/cli/configRoot.test.js +97 -0
- package/dist/cli/configRoot.test.js.map +1 -0
- package/dist/cli/help.js +4 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/main.js +19 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/registry.js +1 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +164 -47
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +13 -8
- package/dist/discovery/trust-report.md +11 -11
- package/dist/discovery/workspaces.json +11 -6
- package/dist/install/install.mjs +16 -0
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
- package/dist/mcp/registry-manifest.json +4 -4
- package/dist/router.json +1 -1
- package/dist/server/app.js +10 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/routes/ping.js +18 -0
- package/dist/server/routes/ping.js.map +1 -1
- package/dist/server/schemas/settings.js +8 -0
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/server/serverInfo.js +6 -2
- package/dist/server/serverInfo.js.map +1 -1
- package/dist/server/token.js +11 -4
- package/dist/server/token.js.map +1 -1
- package/dist/server/writeRoot.js +15 -1
- package/dist/server/writeRoot.js.map +1 -1
- package/dist/shared/capabilities.js +33 -0
- package/dist/shared/capabilities.js.map +1 -0
- package/dist/shared/capabilities.test.js +39 -0
- package/dist/shared/capabilities.test.js.map +1 -0
- package/dist/ui/assets/{index-BiEZiZ31.js → index-CrmZ34Rg.js} +16 -16
- package/dist/ui/assets/index-CrmZ34Rg.js.map +1 -0
- package/dist/ui/index.html +14 -5
- package/docs/CLAIMS.md +64 -38
- package/docs/architecture.md +2 -2
- package/docs/archive/CHANGELOG-6.0.0-overview.md +953 -0
- package/docs/benchmark.md +170 -9
- package/docs/catalog.md +8 -3
- package/docs/comparison.yaml +44 -2
- package/docs/contracts/local-server-ports.md +53 -0
- package/docs/contracts/no-runtime-boundary.md +1 -1
- package/docs/contracts/subagent-boundary.md +15 -0
- package/docs/customization.md +14 -3
- package/docs/decisions/ADR-016-installer-architecture.md +2 -0
- package/docs/decisions/ADR-088-no-external-runtime-federation.md +1 -1
- package/docs/decisions/ADR-094-agent-memory-layer-removal.md +1 -1
- package/docs/decisions/ADR-109-subagent-v1-contract.md +2 -0
- package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +2 -0
- package/docs/decisions/ADR-113-ci-native-release-label-trigger.md +11 -3
- package/docs/decisions/ADR-122-adversarial-verification-council.md +30 -0
- package/docs/decisions/ADR-123-runtime-security-scope-and-spawn-hardening.md +31 -0
- package/docs/decisions/ADR-124-embedded-engine-doctrine.md +255 -0
- package/docs/decisions/ADR-125-doc-screenshot-anonymization.md +131 -0
- package/docs/decisions/ADR-126-internet-reach-operator-tooling.md +254 -0
- package/docs/decisions/ADR-127-enforcement-claims-must-resolve.md +150 -0
- package/docs/decisions/ADR-128-executable-evidence-and-measured-escalation.md +201 -0
- package/docs/decisions/INDEX.md +21 -0
- package/docs/decisions/engine-reclassification-2026-07.md +104 -0
- package/docs/distribution/awesome-list-submission.md +1 -1
- package/docs/distribution/registries.md +36 -27
- package/docs/enforcement-by-host.md +7 -0
- package/docs/featured-skills.md +2 -2
- package/docs/getting-started-by-role.md +1 -1
- package/docs/getting-started.md +1 -1
- package/docs/governance-advantage.md +1 -1
- package/docs/guides/gated-platform-reads.md +221 -0
- package/docs/positioning-evidence.md +1 -1
- package/docs/proof.md +92 -16
- package/docs/spawn-site-policy.md +72 -0
- package/docs/threat-model.md +2 -1
- package/package.json +6 -3
- package/src/agent-src/README.md +2 -2
- package/src/config/agent-settings.template.yml +43 -0
- package/src/config/reach-channels.yml +217 -0
- package/src/config/reach-prescriptions-intake.yml +200 -0
- package/src/scripts/_dispatch.bash +15 -0
- package/src/scripts/_lib/adversarial_bench_score.ts +106 -0
- package/src/scripts/_lib/exec_evidence.ts +251 -0
- package/src/scripts/_lib/fixtures/secret-detector/negatives.txt +10 -0
- package/src/scripts/_lib/fixtures/secret-detector/positives.txt +11 -0
- package/src/scripts/_lib/kernel_rules.ts +46 -0
- package/src/scripts/_lib/reddit_thread_parse.ts +598 -0
- package/src/scripts/_lib/risk_paths.ts +160 -0
- package/src/scripts/_lib/secret_detector.test.ts +103 -0
- package/src/scripts/_lib/secret_detector.ts +319 -0
- package/src/scripts/_lib/spawn_env.ts +24 -4
- package/src/scripts/_lib/tool_probe.ts +359 -0
- package/src/scripts/adr/regenerate_index.ts +81 -6
- package/src/scripts/audit_adr_coverage.ts +33 -0
- package/src/scripts/bench_adversarial_council.ts +292 -0
- package/src/scripts/build_proof.ts +162 -0
- package/src/scripts/check_adr_frontmatter.ts +195 -0
- package/src/scripts/check_artefact_count_messaging.ts +4 -0
- package/src/scripts/check_backstop_debt.ts +200 -0
- package/src/scripts/check_claims.ts +188 -8
- package/src/scripts/check_comparison.ts +12 -0
- package/src/scripts/check_enforcement_coverage.ts +592 -0
- package/src/scripts/check_kernel_rule_bundle.ts +16 -12
- package/src/scripts/check_no_new_legacy_path.ts +2 -0
- package/src/scripts/check_reach_channels.ts +407 -0
- package/src/scripts/check_reach_staleness.ts +364 -0
- package/src/scripts/check_secret_leak.test.ts +47 -0
- package/src/scripts/check_secret_leak.ts +290 -0
- package/src/scripts/check_source_pointer_freshness.ts +165 -0
- package/src/scripts/code_graph/build.ts +0 -0
- package/src/scripts/code_graph/cli.ts +207 -0
- package/src/scripts/code_graph/detect.ts +134 -0
- package/src/scripts/code_graph/extract.ts +386 -0
- package/src/scripts/code_graph/loader.ts +123 -0
- package/src/scripts/code_graph/query.ts +176 -0
- package/src/scripts/code_graph/sanitize.ts +30 -0
- package/src/scripts/code_graph/types.ts +83 -0
- package/src/scripts/code_graph/validate.ts +63 -0
- package/src/scripts/external_sources_denylist.json +3 -1
- package/src/scripts/generate_subagent_floor.ts +194 -0
- package/src/scripts/hook_manifest.yaml +13 -3
- package/src/scripts/hooks/code_graph_nudge_hook.ts +184 -0
- package/src/scripts/hooks/dispatch_hook.ts +5 -1
- package/src/scripts/iron_law_sha.ts +3 -12
- package/src/scripts/lint_override_kernel_guard.ts +219 -0
- package/src/scripts/lint_readme_serial_comma.ts +169 -0
- package/src/scripts/measure_rule_budget.ts +3 -12
- package/src/scripts/postinstall_gui.ts +129 -0
- package/src/scripts/reach_doctor.ts +1651 -0
- package/src/scripts/release.ts +24 -3
- package/src/scripts/risk_escalation_shadow.ts +160 -0
- package/src/scripts/schemas/agent-settings.schema.json +23 -0
- package/src/scripts/schemas/reach-channels.schema.json +134 -0
- package/src/scripts/schemas/reach-doctor-payload.schema.json +220 -0
- package/src/scripts/schemas/rule.schema.json +10 -0
- package/src/scripts/skill_linter.ts +55 -0
- package/src/scripts/validate_reach_prescriptions.ts +751 -0
- package/src/server/schemas/settings.ts +16 -0
- package/src/shared/capabilities.test.ts +43 -0
- package/src/shared/capabilities.ts +75 -0
- package/src/templates/minimal/agents-overrides-readme.md +20 -0
- 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 —
|
|
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:
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
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
|
+
`—` 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 **
|
|
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 (
|
|
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 (
|
|
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 |
|
package/docs/comparison.yaml
CHANGED
|
@@ -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
|
|
package/docs/customization.md
CHANGED
|
@@ -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.
|
|
493
|
-
and is enforced by
|
|
494
|
-
|
|
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
|
|
@@ -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`
|
|
116
|
-
removes the approval requirement entirely — documented as
|
|
117
|
-
zero-friction upgrade path in `release.yml`'s header comment.
|
|
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.
|