@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
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
adr: 127
|
|
3
|
+
status: accepted
|
|
4
|
+
date: 2026-07-25
|
|
5
|
+
decision: enforcement-claims-must-resolve
|
|
6
|
+
supersedes: —
|
|
7
|
+
superseded_by: —
|
|
8
|
+
phase: road-to-enforcement-proof · P1–P5
|
|
9
|
+
type: structural
|
|
10
|
+
review_trigger: >-
|
|
11
|
+
When resolved enforcement coverage stops rising across two consecutive
|
|
12
|
+
releases while rules keep being added — that would mean the field is being
|
|
13
|
+
filled in to satisfy the gate rather than to record a real backstop, and the
|
|
14
|
+
ratchet has become ceremony. Also reopen if a `validator:` declaration is
|
|
15
|
+
found resolving green through an indirection that does not actually execute
|
|
16
|
+
it, which would mean the reachability test has itself become fail-open.
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# ADR-127 — An enforcement claim must resolve, not merely exist
|
|
20
|
+
|
|
21
|
+
## Status
|
|
22
|
+
|
|
23
|
+
**Accepted** · 2026-07-25.
|
|
24
|
+
|
|
25
|
+
## Context
|
|
26
|
+
|
|
27
|
+
A source-level comparison against an external governance reference surfaced one
|
|
28
|
+
defect class this package could not see from the inside: **prose that asserts
|
|
29
|
+
enforcement the code does not deliver.** Four verification agents re-read every
|
|
30
|
+
load-bearing claim against this repo's own source. Five instances survived
|
|
31
|
+
verification:
|
|
32
|
+
|
|
33
|
+
- `src/rules/output-discipline.md` asserted "violations cause a CI exit-code-2"
|
|
34
|
+
while `lint_output_slop.ts` shipped and was wired into nothing.
|
|
35
|
+
- `check_kernel_rule_bundle.ts` — the one-kernel-rule-per-PR slow-rollout gate —
|
|
36
|
+
watched `.agent-src.uncondensed/rules`, a tree retired in the ADR-051 move to
|
|
37
|
+
`src/`. A path that cannot exist never matches, so the gate reported "no kernel
|
|
38
|
+
rule touched" for every kernel-rule edit, indefinitely.
|
|
39
|
+
- `docs/contracts/subagent-boundary.md` stated as fact that "every floor applies
|
|
40
|
+
inside the subagent"; the brief schema, the spawn composer, and all eight
|
|
41
|
+
worker-prompt templates contained no floor text at all.
|
|
42
|
+
- The override layer documented no non-overridable class, so the shipped consumer
|
|
43
|
+
README described unconditional whole-file shadowing — an empty file at
|
|
44
|
+
`agents/overrides/rules/non-destructive-by-default.md` reading as a way to
|
|
45
|
+
remove the Hard Floor.
|
|
46
|
+
- 128 ADRs, zero naming a revisit condition, because ADR frontmatter was
|
|
47
|
+
**entirely unvalidated** — `validate_frontmatter.ts` covered skills, rules,
|
|
48
|
+
commands, and personas and nothing covered `docs/decisions/`.
|
|
49
|
+
|
|
50
|
+
Nothing in the existing gate set could detect any of them, for one shared reason:
|
|
51
|
+
**every gate checked that a pointer resolves, never that a claim is true.** The
|
|
52
|
+
claims ledger is the clearest case — three evidence forms, all existence checks
|
|
53
|
+
(file present, substring present, URL carries a date), and a `last_verified`
|
|
54
|
+
field that is parsed and compared to nothing.
|
|
55
|
+
|
|
56
|
+
The reference object's most transferable norm, and the one adopted here: a rule
|
|
57
|
+
with no feasible enforcement tier is deleted rather than kept as honor-system
|
|
58
|
+
theatre, and a check with no real input is left unwired rather than run as
|
|
59
|
+
decoration. Notably, the reference violates its own version of this in two places
|
|
60
|
+
(a nucleus its ADR sizes at "~15 lines" that is 9; a freshness check its ADR
|
|
61
|
+
promises as FAIL that registers WARN) — which is itself evidence that the defect
|
|
62
|
+
class is structural, not a lapse of care.
|
|
63
|
+
|
|
64
|
+
## Decision
|
|
65
|
+
|
|
66
|
+
**An enforcement claim is credited only when it resolves against the filesystem
|
|
67
|
+
AND the wiring. Declaration is not evidence.**
|
|
68
|
+
|
|
69
|
+
1. Rules carry `enforced_by:` — `hook:` / `validator:` / `test:` / `observer:` /
|
|
70
|
+
`none` — and `check_enforcement_coverage.ts` **resolves** each value. A
|
|
71
|
+
`validator:` whose script exists but is reachable from no taskfile, workflow,
|
|
72
|
+
or hook manifest resolves to `unwired`, not covered. Reachability is
|
|
73
|
+
transitive, so a sub-check running under a wired umbrella counts; a mention in
|
|
74
|
+
a comment does not.
|
|
75
|
+
2. **Blocking and instrumenting are different tiers.** A hook registered
|
|
76
|
+
`fail_closed: false` resolves to `observer`, never `validator`. Of 18
|
|
77
|
+
registered hooks, exactly one can block.
|
|
78
|
+
3. `none` is legal and **counted**. Undeclared rules count as uncovered, not as
|
|
79
|
+
excluded — a coverage number over only the rules that opted in would be
|
|
80
|
+
flattering and useless. The published figure is 14 of 107 (13.1%).
|
|
81
|
+
4. **Kernel and safety-floor rules are non-overridable, with a registry.** A
|
|
82
|
+
`replace`-mode override on one is refused; an `extend` (a tightening) requires
|
|
83
|
+
an entry in `agents/overrides/kernel-exceptions.yml`. Direction matters, not
|
|
84
|
+
identity — this package's own legitimate override *tightens*
|
|
85
|
+
`verify-before-complete`, and a blanket name ban would forbid it.
|
|
86
|
+
5. **The override audit reports; it does not pretend to police.** A build-failing
|
|
87
|
+
lint on kernel-named override files would guard one of several routes by which
|
|
88
|
+
a consumer can tell a model to ignore a rule, and would relocate the rest out
|
|
89
|
+
of sight while reading as coverage. It hard-fails only on this package's own
|
|
90
|
+
authoring surface, where the coverage claim is true.
|
|
91
|
+
6. **The subagent floor is generated and delivered.** Derived from the kernel rule
|
|
92
|
+
list, written into every dispatch prompt in `src/` **and** the shipped
|
|
93
|
+
`dist/agent-src/` projection, drift-gated with a FAIL.
|
|
94
|
+
7. **ADRs name a revisit condition, not a cadence.** Required from 2026-07-25
|
|
95
|
+
forward, grandfathered by date rather than by an allowlist. A bare "annually"
|
|
96
|
+
is rejected — a calendar review is ignored; an event fires.
|
|
97
|
+
8. **`exec:` evidence is scheduled by measurement, not by appeal.** The threshold
|
|
98
|
+
(≥ 10 pp of the backed ledger) was pre-registered before the count was taken;
|
|
99
|
+
the measured figure is 10 of 25 feasible (40 pp) against 0 today, so it
|
|
100
|
+
proceeds — in its own PR, not this one.
|
|
101
|
+
|
|
102
|
+
## Consequences
|
|
103
|
+
|
|
104
|
+
**Good.** The defect class is now continuously measurable and ratcheted: blocking
|
|
105
|
+
coverage may not fall and unwired declarations may not rise. Two live defects
|
|
106
|
+
were closed on the first run (D1, and the kernel gate watching a dead path), and
|
|
107
|
+
a third — the floor missing from the shipped projection — was caught by grepping
|
|
108
|
+
`dist/` after the generator's first pass. The kernel rule list is single-sourced,
|
|
109
|
+
ending three copies and two "kept in sync with…" comments.
|
|
110
|
+
|
|
111
|
+
**Cost.** 86 rules are undeclared and drag the published number down; that is
|
|
112
|
+
intended, and it means the headline figure will look bad until the field is
|
|
113
|
+
filled in honestly. `enforced_by` is a schema change on an
|
|
114
|
+
`additionalProperties: false` schema, so it cannot be added ad hoc.
|
|
115
|
+
|
|
116
|
+
**Accepted limits, stated rather than papered over.** The override carve-out is a
|
|
117
|
+
norm with a partial gate: the layer is model-resolved, so an `extend` block whose
|
|
118
|
+
prose says "ignore the above" passes, and other relax routes (a persona file,
|
|
119
|
+
host config, a direct instruction) are outside its view. The subagent floor
|
|
120
|
+
covers dispatches through this package's templates; whether a host-native spawn
|
|
121
|
+
inherits anything is a host property this package does not control and does not
|
|
122
|
+
claim. `non-destructive-by-default` remains `enforced_by: none` — no script can
|
|
123
|
+
enforce "ask before you deploy", and adjacent hooks guard hook-bypass rather than
|
|
124
|
+
destructive intent, so claiming them would inflate the number.
|
|
125
|
+
|
|
126
|
+
## Alternatives
|
|
127
|
+
|
|
128
|
+
- **Declaration-only `enforced_by`.** Rejected: it would have rated
|
|
129
|
+
`output-discipline` as enforced, which is the exact defect that motivated this.
|
|
130
|
+
- **Blanket ban on kernel overrides.** Rejected on both council members'
|
|
131
|
+
reasoning: it forbids legitimate tightening, including this repo's own.
|
|
132
|
+
- **A build-failing kernel-override lint.** Rejected as security theatre — see
|
|
133
|
+
Decision 5.
|
|
134
|
+
- **Build `exec:` evidence first.** Rejected on sequencing: without the coverage
|
|
135
|
+
baseline there was no way to know whether a new evidence form, validator, and
|
|
136
|
+
renderer would move falsifiability by 7% or 60%.
|
|
137
|
+
- **Retrofit `review_trigger` across all 83 structural/security ADRs.** Rejected:
|
|
138
|
+
it would mean inventing ~80 conditions to satisfy a field. Three ADRs with
|
|
139
|
+
demonstrably time-bound premises were retrofitted (ADR-016, ADR-109, ADR-110).
|
|
140
|
+
|
|
141
|
+
## References
|
|
142
|
+
|
|
143
|
+
- `internal/reports/enforcement-coverage.json` — the ratcheted baseline.
|
|
144
|
+
- `internal/reports/exec-evidence-feasibility.json` — the pre-registered
|
|
145
|
+
measurement and its decision.
|
|
146
|
+
- `docs/proof.md` § 2b — the published coverage figure and the ledger's own limit.
|
|
147
|
+
- `docs/contracts/subagent-boundary.md` § Honest scope of the floor guarantee.
|
|
148
|
+
- `src/agent-src/contexts/override-system.md` § The non-overridable class.
|
|
149
|
+
- ADR-051 (`src/` as source of truth) — the move that silently disarmed the
|
|
150
|
+
kernel-bundle gate.
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
---
|
|
2
|
+
adr: 128
|
|
3
|
+
status: accepted
|
|
4
|
+
date: 2026-07-25
|
|
5
|
+
decision: executable-evidence-and-measured-escalation
|
|
6
|
+
supersedes: —
|
|
7
|
+
superseded_by: —
|
|
8
|
+
phase: road-to-executable-evidence · P1–P4
|
|
9
|
+
type: structural
|
|
10
|
+
review_trigger: >-
|
|
11
|
+
When an `exec:` claim is found green while the thing it asserts is false —
|
|
12
|
+
which would mean the exit code stopped carrying the verdict and the form has
|
|
13
|
+
become a more expensive pointer. Also reopen when a ledger surface is edited
|
|
14
|
+
by anyone other than the maintainer, because contributor access is the
|
|
15
|
+
premise the deferred tamper-chain disagreement turned on and this package
|
|
16
|
+
does not have it yet.
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# ADR-128 — Evidence that re-derives itself, and escalation that is measured before it bites
|
|
20
|
+
|
|
21
|
+
## Status
|
|
22
|
+
|
|
23
|
+
**Accepted** · 2026-07-25. Continues ADR-127.
|
|
24
|
+
|
|
25
|
+
## Context
|
|
26
|
+
|
|
27
|
+
ADR-127 made an enforcement claim resolve against the wiring rather than merely
|
|
28
|
+
exist, and closed five live defects doing it. It deliberately left one thing
|
|
29
|
+
measured and unbuilt, in its own Decision 8: the claims ledger still checked
|
|
30
|
+
that an evidence pointer **resolves**, never that the claim is **true**. A ledger
|
|
31
|
+
entry reading "the suite is green" whose pointer resolves to a report nobody
|
|
32
|
+
regenerated stays `backed` indefinitely — the pointer resolves, the claim is
|
|
33
|
+
false. The pre-registered threshold for building the fix was ≥ 10 pp of the
|
|
34
|
+
backed ledger, set before counting; the measurement came back 11 of 26 feasible.
|
|
35
|
+
|
|
36
|
+
A second round of the same external comparison raised four further candidates
|
|
37
|
+
and a council was run over the cut (two members, two rounds). Both members
|
|
38
|
+
independently scoped in the `exec:` form and a content-driven risk axis, and
|
|
39
|
+
scoped out filling the 86 undeclared `enforced_by` fields and a
|
|
40
|
+
lifecycle-scenario cost model. The reasoning is recorded below because kills
|
|
41
|
+
that are not written down get re-proposed by the next analysis round.
|
|
42
|
+
|
|
43
|
+
The missing risk axis is concrete rather than theoretical.
|
|
44
|
+
`discipline_profile: auto` resolves rigor by host capability — *how much
|
|
45
|
+
governance can this environment afford*. Nothing asks *how dangerous is this
|
|
46
|
+
diff*. The live combination that leaves open: a weak host plus a diff in the
|
|
47
|
+
installer's provenance path resolves to minimum discipline, which is precisely
|
|
48
|
+
the change class hardened in 9.6.0. The fix landed; the process escalation for
|
|
49
|
+
the next change of that class did not.
|
|
50
|
+
|
|
51
|
+
## Decision
|
|
52
|
+
|
|
53
|
+
**1. `exec:` is the fourth evidence form, and it re-runs the command.**
|
|
54
|
+
`exec:<command> -> <exit-code>`. The exit code carries the verdict. The
|
|
55
|
+
allowlist is a set of argv prefix tuples in
|
|
56
|
+
`src/scripts/_lib/exec_evidence.ts`, never a regex over a command string — a
|
|
57
|
+
regex over shell text is the classic bypass. Every argument after the matched
|
|
58
|
+
prefix is re-checked for shell metacharacters and repo escape, **including the
|
|
59
|
+
right-hand side of `--flag=value`**, without which `--rootdir=/etc` clears an
|
|
60
|
+
allowlist that only inspected the flag name.
|
|
61
|
+
|
|
62
|
+
**2. Re-execution is CI-only; the static half runs everywhere.** Whether a
|
|
63
|
+
pointer is well-formed and allowlisted is a property of the *ledger*, so it
|
|
64
|
+
fails on a laptop too. Whether the command actually passes is a property of the
|
|
65
|
+
*environment*, so it runs only on an ephemeral CI runner and never in a
|
|
66
|
+
consumer's checkout. Locally the gate reports `UNVERIFIED — re-execution is
|
|
67
|
+
CI-only, skipped locally`, never a silent pass.
|
|
68
|
+
|
|
69
|
+
**3. A skip is not a failure, and a failure is not a skip.** "Ran and
|
|
70
|
+
disagreed" is a finding. "Could not run" is not. Collapsing the two turns the
|
|
71
|
+
verifier into a rubber stamp in one direction or a nuisance in the other.
|
|
72
|
+
|
|
73
|
+
**4. The feasibility count was corrected down by one, by building it.** Of the
|
|
74
|
+
11 measured feasible, 10 survived contact. `context-token-reduction` was counted
|
|
75
|
+
feasible because `check_token_regression` re-derives token figures with a real
|
|
76
|
+
tokenizer — but the script reads `internal/bench/reports/projection-cost.json`,
|
|
77
|
+
which is gitignored as a per-run artefact, so the command is not self-sufficient
|
|
78
|
+
in a fresh checkout and exits 1. The `exec:` gate found this on its first CI
|
|
79
|
+
run. The corrected figure is 10 of 26 (38.5 pp), still far above the
|
|
80
|
+
pre-registered 10 pp bar, so the decision to build stands on the corrected
|
|
81
|
+
number too — the over-count changed the margin, not the verdict.
|
|
82
|
+
|
|
83
|
+
**5. The residue is published, not rounded away.** `docs/proof.md` states how
|
|
84
|
+
many backed claims re-derive themselves versus rest on a pointer, and lists each
|
|
85
|
+
non-re-executable claim with the reason: external cite, paid or stochastic
|
|
86
|
+
benchmark output, or a prose contract with no exit code to carry a verdict.
|
|
87
|
+
|
|
88
|
+
**6. Trust-boundary risk is classified now and gated later.** The classifier is
|
|
89
|
+
path-based and reproducible from the diff alone — no model judgement about
|
|
90
|
+
whether a change "feels risky". Three classes: authentication and token
|
|
91
|
+
handling; installer, provenance, publish, and subagent-spawn paths; governance
|
|
92
|
+
surfaces. The docs exemption is scoped to prose *about* a system, not to any
|
|
93
|
+
markdown file: in this repo the rules, `AGENTS.md`, and the kernel set are all
|
|
94
|
+
`.md` and are executable policy. An extension-only test classified
|
|
95
|
+
`src/rules/icon-consistency.md` as unclassified, which a test caught before the
|
|
96
|
+
report shipped.
|
|
97
|
+
|
|
98
|
+
**7. Escalation is additive and the direction is encoded, not left to callers.**
|
|
99
|
+
The host profile sets a floor; a risk trigger may only raise it. A weak host
|
|
100
|
+
must never be able to lower an escalation — that inversion is the entire failure
|
|
101
|
+
mode the second axis exists to prevent, so `escalated_floor` takes a maximum
|
|
102
|
+
rather than trusting each call site to get the order right.
|
|
103
|
+
|
|
104
|
+
**8. The non-declinable escalation is justified by measurement, and still not
|
|
105
|
+
built here.** The threshold — ≥ 5 of ~100 first-parent merges landing in a
|
|
106
|
+
trust-boundary class — was written into the roadmap before the report was first
|
|
107
|
+
read. Measured: **11 of 99**. That clears the bar, so a non-declinable class for
|
|
108
|
+
trust-boundary diffs is warranted and gets its own ADR and its own PR. It is
|
|
109
|
+
deliberately not enabled by this one, because it trades away something the
|
|
110
|
+
authority model holds (`agent-authority`, `ask-when-uncertain`) and that trade
|
|
111
|
+
deserves its own decision record rather than riding along inside a measurement.
|
|
112
|
+
|
|
113
|
+
**9. The prevented-failure table is generated and gated.** Each row names a
|
|
114
|
+
failure mode rather than a feature, and cites a ledger claim. A cited id that is
|
|
115
|
+
missing or not `backed` **throws** during generation. The format was borrowed
|
|
116
|
+
from the reference; the discipline was not available to borrow — the reference's
|
|
117
|
+
own equivalent table carries a headline efficiency figure that appears nowhere
|
|
118
|
+
else, an order of magnitude below the cheapest scenario in its own generated
|
|
119
|
+
benchmark. A number with nowhere to resolve is exactly what this ledger exists
|
|
120
|
+
to catch, so the table is held to the ledger's bar.
|
|
121
|
+
|
|
122
|
+
**10. Three candidates are closed rather than left open.**
|
|
123
|
+
|
|
124
|
+
- **Filling the 86 undeclared `enforced_by` fields — deferred.** You cannot fill
|
|
125
|
+
them honestly without first building 86 enforcement points; what you get
|
|
126
|
+
otherwise is 86 `TODO` values, which is *strictly worse than a blank*. The
|
|
127
|
+
blank is honest about non-coverage; the TODO is a promise. This is the exact
|
|
128
|
+
failure ADR-127's own `review_trigger` names.
|
|
129
|
+
- **Adversarial governance evals — killed.** A corpus of "user pressures the
|
|
130
|
+
agent to skip a gate" scores refusal as the pass condition, while this
|
|
131
|
+
package's documented authority model says the user decides. An eval asserting
|
|
132
|
+
"the agent must refuse when the user says no" would declare `agent-authority`
|
|
133
|
+
a security failure. The narrower question — does the enforcement mechanism
|
|
134
|
+
return non-zero — is already answerable per rule.
|
|
135
|
+
- **A governed-writes lint — killed as the wrong layer.** A static scan for
|
|
136
|
+
`fs.writeFile` against protected paths is simultaneously too weak
|
|
137
|
+
(`child_process.exec('… > file')` walks past it) and too strong (fixture setup
|
|
138
|
+
trips it). Same reasoning as ADR-127 Decision 5: a gate covering one route of
|
|
139
|
+
several, while reading as coverage, is theatre. The type system is the right
|
|
140
|
+
layer if this is ever worth closing.
|
|
141
|
+
|
|
142
|
+
**11. Tamper-evident chains — deferred with the disagreement recorded, not
|
|
143
|
+
resolved by fiat.** Round 1 argued a hash chain adds nothing Git does not
|
|
144
|
+
already provide, and that the external `git merge-base` line-prefix witness does
|
|
145
|
+
all the work. Round 2 found the hole in that: a line-prefix witness catches
|
|
146
|
+
**tail truncation** and does **not** catch **mid-sequence deletion** — dropping
|
|
147
|
+
entries 50–90 out of the middle leaves a diff that is not a prefix violation and
|
|
148
|
+
reads as an ordinary divergent branch. Neither round produced the number that
|
|
149
|
+
settles it, which is how often a ledger surface is edited by someone other than
|
|
150
|
+
the maintainer. That number is the revisit condition in this ADR's frontmatter.
|
|
151
|
+
|
|
152
|
+
## Consequences
|
|
153
|
+
|
|
154
|
+
**Good.** Machine-re-verifiable claims went from **0 to 10** of 27 backed. The
|
|
155
|
+
form found a real defect on its first CI run — the over-counted feasibility
|
|
156
|
+
entry — which is the gate doing the job it was built for, on itself. The risk
|
|
157
|
+
classifier caught its own docs-exemption bug through a test before its report
|
|
158
|
+
was published. Both are the intended shape: the instrument fails visibly rather
|
|
159
|
+
than reporting a comfortable number.
|
|
160
|
+
|
|
161
|
+
**Cost.** 17 of 27 backed claims still rest on pointers and cannot re-derive
|
|
162
|
+
themselves; that is now stated on the proof page rather than implied away. The
|
|
163
|
+
`exec:` allowlist is a maintenance surface — a renamed script silently drops a
|
|
164
|
+
claim from re-verification to static-only, and nothing yet detects that
|
|
165
|
+
downgrade.
|
|
166
|
+
|
|
167
|
+
**Accepted limits, stated rather than discovered later.** The allowlist only
|
|
168
|
+
covers commands whose exit code *is* the verdict; nothing about this form helps
|
|
169
|
+
a claim resting on a paid benchmark. The path classifier sees paths, not intent:
|
|
170
|
+
a dangerous change in a file it does not know about classifies as `none`, and
|
|
171
|
+
the class list is a judgement that will need revisiting as the tree moves. The
|
|
172
|
+
shadow report measures what *would* have escalated, which is not the same as
|
|
173
|
+
what *should* have — it cannot tell whether those 11 merges were actually
|
|
174
|
+
handled carelessly, only that they were in the class.
|
|
175
|
+
|
|
176
|
+
## Alternatives
|
|
177
|
+
|
|
178
|
+
- **Build `exec:` for all 26 claims.** Not possible, and the attempt would have
|
|
179
|
+
produced fake pointers for benchmark claims. 10 honest re-verifications beat
|
|
180
|
+
26 that only look uniform.
|
|
181
|
+
- **Ship the non-declinable escalation in this PR.** Rejected on sequencing: the
|
|
182
|
+
measurement justifies it, but an authority-model trade deserves a decision
|
|
183
|
+
record a reader can find, not a paragraph inside a measurement PR.
|
|
184
|
+
- **Let `exec:` run locally too.** Rejected: "commands execute in the repository
|
|
185
|
+
root with full filesystem access" is a property to confine, not to trust, and
|
|
186
|
+
a consumer's checkout has no business re-running this package's evidence.
|
|
187
|
+
- **A regex allowlist.** Rejected — the reason the tuple form exists.
|
|
188
|
+
- **Skip the prevented-failure table as marketing.** Rejected: the format names
|
|
189
|
+
failure modes rather than features, which is a better description of what this
|
|
190
|
+
package does than any feature list, and the ledger gate makes it falsifiable.
|
|
191
|
+
|
|
192
|
+
## References
|
|
193
|
+
|
|
194
|
+
- `internal/reports/exec-evidence-feasibility.json` — the pre-registered
|
|
195
|
+
measurement, its correction, and the built outcome.
|
|
196
|
+
- `internal/reports/risk-escalation-shadow.json` — 11 of 99 first-parent merges,
|
|
197
|
+
against a threshold fixed before the first read.
|
|
198
|
+
- `src/scripts/_lib/exec_evidence.ts`, `src/scripts/_lib/risk_paths.ts`.
|
|
199
|
+
- `tests/scripts/exec_evidence.test.ts` — the abuse cases for the allowlist and
|
|
200
|
+
the argument hardening.
|
|
201
|
+
- ADR-127 — the enforcement-resolution decision this continues.
|
package/docs/decisions/INDEX.md
CHANGED
|
@@ -127,6 +127,11 @@ _Auto-generated by `scripts/adr/regenerate_index.py`. Do not edit._
|
|
|
127
127
|
| [ADR-121](ADR-121-knowledge-sensitivity-classes.md) | Knowledge Sensitivity Classes | accepted | 2026-07-12 | — |
|
|
128
128
|
| [ADR-122](ADR-122-adversarial-verification-council.md) | Adversarial Verification Council | accepted | 2026-07-14 | — |
|
|
129
129
|
| [ADR-123](ADR-123-runtime-security-scope-and-spawn-hardening.md) | Runtime Security Scope And Spawn Hardening | accepted | 2026-07-20 | — |
|
|
130
|
+
| [ADR-124](ADR-124-embedded-engine-doctrine.md) | Embedded Engine Doctrine | accepted | 2026-07-23 | ADR-088 (engine-adoption interpretation only), ADR-094 (engine-adoption interpretation only) |
|
|
131
|
+
| [ADR-125](ADR-125-doc-screenshot-anonymization.md) | Doc Screenshot Anonymization | accepted | 2026-07-23 | — |
|
|
132
|
+
| [ADR-126](ADR-126-internet-reach-operator-tooling.md) | Internet Reach Operator Tooling | accepted | 2026-07-24 | — |
|
|
133
|
+
| [ADR-127](ADR-127-enforcement-claims-must-resolve.md) | Enforcement Claims Must Resolve | accepted | 2026-07-25 | — |
|
|
134
|
+
| [ADR-128](ADR-128-executable-evidence-and-measured-escalation.md) | Executable Evidence And Measured Escalation | accepted | 2026-07-25 | — |
|
|
130
135
|
| [ADR-200](ADR-200-python-to-typescript-migration.md) | Python To Typescript Migration | accepted | 2026-06-11 | — |
|
|
131
136
|
|
|
132
137
|
## Unnumbered (legacy)
|
|
@@ -134,3 +139,19 @@ _Auto-generated by `scripts/adr/regenerate_index.py`. Do not edit._
|
|
|
134
139
|
| # | Title | Status | Date | Supersedes |
|
|
135
140
|
|---|---|---|---|---|
|
|
136
141
|
| [ADR-rule-kernel-and-router](ADR-rule-kernel-and-router.md) | Rule Kernel And Router Roadmap Closure | accepted | 2026-05-06 | — |
|
|
142
|
+
|
|
143
|
+
## Decision records outside this directory
|
|
144
|
+
|
|
145
|
+
Scanned, not hand-listed. These files are titled `# ADR — …` and record a
|
|
146
|
+
decision, but live elsewhere in the tree. They are indexed here so a decision
|
|
147
|
+
cannot be unfindable merely because of where it was filed; their paths are
|
|
148
|
+
unchanged and their inbound references still resolve.
|
|
149
|
+
|
|
150
|
+
| File | Title | Status |
|
|
151
|
+
|---|---|---|
|
|
152
|
+
| `agents/settings/contexts/adr-always-budget-relief-strategy.md` | Always-Budget Relief Strategy (parked, reactivation-gated) | Decided |
|
|
153
|
+
| `agents/settings/contexts/adr-always-rule-context-split-not-viable.md` | Splitting an Always-rule into rule + `load_context:` is not viable under Model (b) | Decided |
|
|
154
|
+
| `agents/settings/contexts/adr-artifact-engagement.md` | Artefact-Engagement Telemetry | Decided |
|
|
155
|
+
| `agents/settings/contexts/adr-auto-rule-consolidation.md` | Auto-Rule Consolidation (review-routing + transient-references pairs) | locked |
|
|
156
|
+
| `agents/settings/contexts/adr-frugality-savings-baseline.md` | Frugality Canon Savings Baseline | Decided |
|
|
157
|
+
| `agents/settings/contexts/adr-work-engine-rename.md` | Universal Execution Engine: rename `implement_ticket` → `work_engine` | Decided |
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Engine re-classification sweep (ADR-124 § 4)
|
|
2
|
+
|
|
3
|
+
> Committed 2026-07-23 as the mandatory re-evaluation sweep required by
|
|
4
|
+
> ADR-124 § 4. Population inventoried across every roadmap disposition
|
|
5
|
+
> (active, archive, later, skipped, stubs): **44 engine-shaped REJECT
|
|
6
|
+
> records** recorded 2026-06-01 → 2026-07-22. Each is re-classified under the
|
|
7
|
+
> ADR-124 class boundary — **A** (embedded, deterministic, in-process,
|
|
8
|
+
> command-invoked → adoptable), **B** (resident service/daemon → prohibited
|
|
9
|
+
> in core), **C** (network/LLM in the *build path* → prohibited by default).
|
|
10
|
+
>
|
|
11
|
+
> **Discipline this table enforces:** no silent re-openings, no silent
|
|
12
|
+
> re-affirmations. A Class-A re-opening becomes a *candidate* only — adoption
|
|
13
|
+
> stays demand- and benchmark-gated, and it enters build work solely through
|
|
14
|
+
> the ADR-124 sequencing rule (one native engine at a time). Class-B/C
|
|
15
|
+
> verdicts are re-affirmed with the class cited, so a later cycle cannot
|
|
16
|
+
> misattribute the reason to the runtime identity when it was really scope,
|
|
17
|
+
> demand, or redundancy.
|
|
18
|
+
>
|
|
19
|
+
> External references are cited by anonymized descriptor per
|
|
20
|
+
> `source-confidentiality`; no roadmap-file paths are linked per
|
|
21
|
+
> `no-roadmap-references` (this is a stable artifact).
|
|
22
|
+
|
|
23
|
+
## How to read a row
|
|
24
|
+
|
|
25
|
+
`class` is the ADR-124 verdict. `disposition`:
|
|
26
|
+
|
|
27
|
+
- **RE-OPENED (candidate)** — Class A; the old reason does not survive ADR-124;
|
|
28
|
+
now gated by the named gate, not by existence.
|
|
29
|
+
- **RE-AFFIRMED** — the reject stands; the class is why (B = residency, C =
|
|
30
|
+
network/LLM build path).
|
|
31
|
+
- **STAY-KILLED / CLOSED** — Class A by mechanism but re-affirmed on
|
|
32
|
+
redundancy or demand grounds, not identity.
|
|
33
|
+
|
|
34
|
+
## Headline engine rejects
|
|
35
|
+
|
|
36
|
+
| # | source cycle (anon.) | engine / capability | old verdict (quote) | class | disposition | gate |
|
|
37
|
+
|---|---|---|---|---|---|---|
|
|
38
|
+
| 1 | code-graph reference (Source G) | tree-sitter / AST extraction engine | "NO tree-sitter / AST engine in this repo" | **A** | **RE-OPENED** | this roadmap; falsification + Phase-5 bench for default-on |
|
|
39
|
+
| 2 | code-graph orchestration (skipped v1) | vector store / embedding service / always-on daemon in index path | "NO vector store, NO embedding service, NO always-on daemon" | split | vector-store **A** if embedded-deterministic; embedding-svc **C**; daemon **B** | per-item; vector-store not scheduled (no demand) |
|
|
40
|
+
| 3 | flow-learnings | MCP deferred-rule retrieval **server** | "council REJECT (2026-07-07)" | **B** | **RE-AFFIRMED** (resident server; residency is the trait — an MCP server can run stdio without network) | a *command-invoked* retriever is Class A → `later/road-to-deferred-rule-retriever`, unblock = 3 re-open conditions + Phase-5 verdict |
|
|
41
|
+
| 4 | flow-learnings | SQLite memory **service** / vector clocks / distributed memory | "SQLite memory *service* … sunset stands" | **B** | **RE-AFFIRMED** | embedded FTS5 (`node:sqlite`) is the Class-A slice, already pre-decided (ADR-116) |
|
|
42
|
+
| 5 | flow-learnings | web console / live monitoring UI | "no runtime to monitor" | **B** | **RE-AFFIRMED** | — |
|
|
43
|
+
| 6 | flow-learnings | runtime orchestration (work-stealing, load balancing) | cites ADR-088 | **B** | **RE-AFFIRMED** | ADR-088 literal text binds (federation); the work-stealing gloss is this council line, not ADR-088 |
|
|
44
|
+
| 7 | operator-runtime harvest (Source A/E) | browser **daemon** + L1–L6 security | "REJECT (core) → route to plugin … compiled runtime betrays no-runtime identity" | **B** | **RE-AFFIRMED**, plugin routing stands | reopen = the three domain-adoption hypotheses |
|
|
45
|
+
| 8 | operator-runtime harvest | `careful`/`freeze`/`guard` runtime enforcement | "REJECT (core) → route to plugin \| no-runtime scope trap" | **B** | **RE-AFFIRMED** (adopted as discipline only) | plugin repo |
|
|
46
|
+
| 9 | operator-runtime harvest | skill-graph / workflow-graph engine | "STAY KILLED … `work_engine/` already runs a directive graph" | **A** | **STAY-KILLED** (redundant with in-process `work_engine/`, not identity) | evidence of a real gap `work_engine` cannot serve |
|
|
47
|
+
| 10 | operator-runtime harvest | `model-overlays/` per-model behavioral patch | "GATE (default-off) … falsified at current scale (honest-null); duplicates RDP" | **A** | GATED (not forbidden) | reopen if a keystone probe exposes RDP failure on a real host |
|
|
48
|
+
| 11 | positioning-and-enforcement (Source A) | compiled **control plane** / runtime hooks | "no daemon … compiled control plane … runtime MCP hooks = Tier-2 opt-in/experimental" | **B** | **RE-AFFIRMED** (positioning asset) | flip if >60% of active users are on hook-capable hosts |
|
|
49
|
+
| 12 | subagent-value-realization (Source A subagent harvest) | in-process "swarm" Map / topology **engine** + consensus voting | "CUT → an in-process actor runtime is identity-rejected (no-runtime)" | **B** | **RE-AFFIRMED** by the ADR-109 identity floor (terminates-in-command is not enough) | the routing `_lib` deterministic fns are already Class A and shipped — only the runtime shell was rejected |
|
|
50
|
+
| 13 | orchestration-scope-decision (active) | swarm front (100+ agents, background daemon, memory DB) | "the swarm category ships … background daemon, memory DB" | **B** | **RE-AFFIRMED** | its own honest-exit decision; competitor shape stays out |
|
|
51
|
+
| 14 | persona-library harvest | host-plugin runtime router | "REJECT \| ADR-109 no-runtime floor + ADR-088 … reopen only via superseding ADR" | **B** | **RE-AFFIRMED** | needs its own superseding ADR (ADR-124 does not open it — runtime router on a host is Class B) |
|
|
52
|
+
| 15 | persona-library harvest | BYO MCP-memory 4-tool contract | "REJECT \| heavyweight memory removed (ADR-094)" | **C** | **RE-AFFIRMED** | ADR-094 binds |
|
|
53
|
+
| 16 | persona-library harvest | declarative projection-target registry + semantic adapters | "REJECT (council, unanimous) \| surface-matrix already stronger; zero demand" | **A** | **CLOSED** (redundancy + demand, not identity) | per-host defer on a real logged request |
|
|
54
|
+
| 17 | persona-library harvest | `catalog_delegate` auto-activation tool | "REJECT \| write-adjacent auto-activation; violates default-off + ADR-109" | **A** (logic) | **CLOSED** on auto-activation policy | not engine identity |
|
|
55
|
+
| 18 | universal-os reframe | UI control plane (Electron / web UI) | "Reject \| explicitly 'not a runtime'; host agents provide UI" | **B** | **RE-AFFIRMED** | — |
|
|
56
|
+
| 19 | universal-os reframe | memory governance per domain | "Reject \| stateless YAML/MD; memory is host responsibility" | **B** | **RE-AFFIRMED** | — |
|
|
57
|
+
| 20 | universal-os reframe | marketplace / pack-ecosystem infra | "Reject \| zero third-party packs exist … vapor work" | **B** | **RE-AFFIRMED** | when third-party packs exist |
|
|
58
|
+
| 21 | small-enhancements harvest | continuous-learning auto-write store; cron/dispatch; control-pane SQLite runtime; knowledge-graph MCP | "All other harvest REJECTS … stand" | **B**/**C** | **RE-AFFIRMED** | file-first `patterns/` was the only reversal |
|
|
59
|
+
| 22 | agent-memory removal | Layer-2 memory (PostgreSQL + pgvector + MCP + decay + trust) | "architecturally unsound for a 'no app runtime' suite" | **C** | **RE-AFFIRMED** (canonical Layer-2 sunset origin) | — |
|
|
60
|
+
| 23 | memory-retrieval economy | always-on worker/service, Chroma, Postgres; write-time LLM observation | Non-goals: "any always-on worker/service, Chroma, Postgres runtime"; "write-time LLM … unmetered cost" | **B**/**C** | **RE-AFFIRMED** | embedded FTS5 is the Class-A slice, measurement-gated (ADR-116) |
|
|
61
|
+
| 24 | opt-retrieval-and-memory (Source G protocol) | code-graph **engine** (vectors / embedded DB / background service) | "No vectors, no embedded DB, no background service — the Layer-2 sunset" | **B**/**C** for the rejected shapes | **RE-AFFIRMED** for services; the *protocol borrows* (edge confidence, BM25, budget envelope) were Class A and already shipped | the native deterministic engine (this roadmap) is the Class-A re-opening |
|
|
62
|
+
| 25 | knowledge-system | vector/semantic search, transcript-RAG; runtime policy engine | "Layer-2 sunset stands … no search infra"; "runtime policy engine … CUT" | **B**/**C** | **RE-AFFIRMED** (Jaccard similarity check adopted instead — Class A) | — |
|
|
63
|
+
| 26 | evidence-v2 project-intelligence | DB / vector store / daemon / runtime self-modifying store | "not add a DB, vector store, daemon, or runtime" | **B**/**C** | **RE-AFFIRMED** (suggestion-gated instead) | — |
|
|
64
|
+
| 27 | analysis-workbench | state-machine runtime / investigation daemon | "would violate the no-runtime boundary … human-gated re-invocation, not a daemon" | **B** | **RE-AFFIRMED** | achieved via human-gated re-invocation |
|
|
65
|
+
| 28 | second-brain | Obsidian vault; NLI contradiction detection; static HTML renderer | "rejected 2/2 … not in scope (decided, not deferred)" | NLI **C**; HTML renderer **B**; BM25 **A** (tripwire-gated) | **RE-AFFIRMED** | HTML renderer revisit-if browsing demand |
|
|
66
|
+
| 29 | retrieval-substrate hardening | watch-**daemon**; engine-fork / minisearch-class dep | "watch-daemon CUT … no engine-forks (ADR-061)" | watch-daemon **B**; BM25 core **A** (shipped) | **RE-AFFIRMED** | FTS5 pre-decided path |
|
|
67
|
+
| 30 | capability-governance | runtime gating **engine** / generic consent machinery | "deferred until N≥2 high-risk domains" | **A**/**B** | DEFERRED (not killed) | reopen at N≥2 high-risk domains; an in-process evaluator is Class A → see `later/road-to-policy-evaluation-core` |
|
|
68
|
+
| 31 | governance-moat | per-skill capability registry | "DO NOT BUILD. maintainability theater with no consumer" | **A** | **CLOSED** (demand/theater, positioning asset) | — |
|
|
69
|
+
| 32 | mcp-distribution | native SSE server | "explicitly rejected … build a bridge, not native" | **C** | **RE-AFFIRMED** | if revived, build a bridge |
|
|
70
|
+
| 33 | mcp-server | tools primitive / engine spawn / state writes / shell exec (Phase 1) | "read-only and instructional … no engine spawn, no state writes, no shell execution" | **C** | **RE-AFFIRMED** (hard read-only floor) | later phases |
|
|
71
|
+
| 34 | loop-engineering | closed measure→adjust loops (auto-demotion/pruning, bench-drift blocking) | "REJECT auto; stays manual … no daemon per ADR-088" | **B** | **RE-AFFIRMED** (manual gate adopted) | each row's revisit-if |
|
|
72
|
+
| 35 | video-deferred design | skill suite behaving as a runtime | "don't build a skill suite as if it were a runtime" | **B** | **RE-AFFIRMED** (meta-guardrail governing the whole class) | — |
|
|
73
|
+
| 36 | mcp-runtime stub | FastMCP / MCP TS SDK (runtime additions) | "FastMCP rejected on safety-audit width; MCP TS SDK on Node-runtime addition" | **C** | **RE-AFFIRMED** | minimal low-level SDK chosen |
|
|
74
|
+
| 37 | originality-gate / contributor-funnel (later/) | standalone zero-config validator engine | "KEEP, demand-gated — Phase-3 probe before any extraction" | **A** | DEMAND-GATED (extractable) | ≥N external-repo signals in the 90-day probe window |
|
|
75
|
+
| 38 | event-driven-discipline (skipped) | move discipline onto hook dispatcher (event-driven runtime) | "CANCELLED, all steps DROPPED … multi-week engineering" | **B** | **RE-AFFIRMED** (cost-rejected) | — |
|
|
76
|
+
|
|
77
|
+
## Supporting / engine-adjacent rejects (completeness)
|
|
78
|
+
|
|
79
|
+
| # | source cycle (anon.) | item | class note |
|
|
80
|
+
|---|---|---|---|
|
|
81
|
+
| 39 | competitive-borrow | standalone queryable state-store; second similarity engine | **A** — folded into an existing in-process command; do not build a second similarity engine |
|
|
82
|
+
| 40 | lean-initial-context | embedding-router; rule-virtualization; task-classifier | embedding-router **C**; others **A**, "do not build unless re-opened" |
|
|
83
|
+
| 41 | capability-discoverability | per-skill Skill-DAG auto-chaining | **A** — rejected on a sequencing chicken-egg; reopen when a real dependency appears |
|
|
84
|
+
| 42 | contract-integrity (later/) | no-runtime config-surface guard (forbids `vector`/`daemon`/`decay`/`pgvector` keys, `setInterval`/`setTimeout`) | **enforcement mechanism** for B/C rejects — MUST gain a Class-A exception when it lands (ADR-124 § 6); see below |
|
|
85
|
+
| 43 | recursive-verification | router-learning loop; GAN builder | **B** — learning loop/daemon |
|
|
86
|
+
| 44 | autonomous-verify-loop | opus-pinned 3-agent GAN loop | **C** — LLM-in-loop; N=3 cap + judge discipline kept |
|
|
87
|
+
|
|
88
|
+
## Class-A re-openings — the queue (sequencing rule: one at a time)
|
|
89
|
+
|
|
90
|
+
1. **Native code-graph engine** (#1, #24) — RE-OPENED, built by this roadmap.
|
|
91
|
+
2. **Command-invoked deferred-rule retriever** (#3) — `later/road-to-deferred-rule-retriever.md`, blocked on Phase-5 verdict + demand.
|
|
92
|
+
3. **Deterministic policy-evaluation core** (#12 slice, #30) — `later/road-to-policy-evaluation-core.md`, blocked on Phase-5 verdict + demand.
|
|
93
|
+
|
|
94
|
+
No other row is scheduled. Every future Class-A adoption exits this table only with a named demand signal and its own roadmap.
|
|
95
|
+
|
|
96
|
+
## Config-surface guard obligation (ADR-124 § 6)
|
|
97
|
+
|
|
98
|
+
Entry #42 is the live enforcement point: a planned no-runtime config-surface
|
|
99
|
+
guard denylists `vector`/`daemon`/`decay`/`pgvector` keys and
|
|
100
|
+
`setInterval`/`setTimeout` outside dev tooling. When that guard lands it MUST
|
|
101
|
+
carve out Class-A engine surfaces (this roadmap's `code_graph/` module and the
|
|
102
|
+
`hooks.code_graph` setting), or Class-A engines fail CI after the doctrine
|
|
103
|
+
flipped. This obligation is recorded here and cited from ADR-124 § 6; the guard
|
|
104
|
+
roadmap, when executed, cites this file back.
|
|
@@ -29,7 +29,7 @@ other install, no runtime.
|
|
|
29
29
|
|
|
30
30
|
**event4u/agent-config** — a governed, no-runtime configuration layer for AI
|
|
31
31
|
coding agents: audited skills, review personas, rules, and commands projected
|
|
32
|
-
into
|
|
32
|
+
into 20 hosts (Claude Code, Cursor, Windsurf, Copilot, Codex, Continue, …). Its distinguishing
|
|
33
33
|
discipline: **every public claim is machine-checked** — the README binds each
|
|
34
34
|
claim to resolvable evidence in a Claims-Ledger, and a generated proof page lets
|
|
35
35
|
anyone reproduce the checks (`docs/proof.md`). Bring your own model.
|
|
@@ -37,7 +37,7 @@ No bespoke `BREAKING_CHANGES.md` is maintained — the changelog is the authorit
|
|
|
37
37
|
|
|
38
38
|
| # | Registry | URL | Submission shape | Status | PR link |
|
|
39
39
|
|---|---|---|---|---|---|
|
|
40
|
-
| 1 | `punkpeye/awesome-mcp-servers` | <https://github.com/punkpeye/awesome-mcp-servers> | One-line entry under the Developer-Tools section + Glama score badge |
|
|
40
|
+
| 1 | `punkpeye/awesome-mcp-servers` | <https://github.com/punkpeye/awesome-mcp-servers> | One-line entry under the Developer-Tools section + Glama score badge | ❌ **PR closed unmerged 2026-06-11** (verified live 2026-07-25 via `gh pr view 6865`; this row previously read "PR open" for six weeks) | <https://github.com/punkpeye/awesome-mcp-servers/pull/6865> |
|
|
41
41
|
| 2 | `mcp.so` | <https://mcp.so/> | Submit via the directory form; same one-line shape | ✅ submitted (maintainer-confirmed 2026-06) | — |
|
|
42
42
|
| 3 | `mcpservers.org` | <https://mcpservers.org/> | Submit via the directory form; same one-line shape (verify URL current at submission time) | ✅ submitted (maintainer-confirmed 2026-06) | — |
|
|
43
43
|
| 4 | `glama.ai` | <https://glama.ai/mcp/servers/event4u-app/agent-config> | Server page live; score badge embedded in the awesome-mcp-servers entry (PR #6865) | ✅ listed (server page + badge return HTTP 200, verified 2026-06-08) | <https://glama.ai/mcp/servers/event4u-app/agent-config> |
|
|
@@ -50,37 +50,46 @@ Use this exact text for the awesome-list entry. Adjust the link anchor per direc
|
|
|
50
50
|
- [event4u/agent-config](https://github.com/event4u-app/agent-config#readme) — Universal AI Agent OS. Audited skills, governance rules, commands, and templates for Claude Code, Cursor, Windsurf, Copilot. Bring your own provider.
|
|
51
51
|
```
|
|
52
52
|
|
|
53
|
-
##
|
|
53
|
+
## Submission body — ledger-bound, version-agnostic
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
Reuse this block in any directory submission or PR description.
|
|
56
|
+
|
|
57
|
+
It deliberately carries **no artefact counts and no version number.** The block
|
|
58
|
+
this replaced described version 3.2.0 with figures like "4929 tests" and role
|
|
59
|
+
experiences that no longer exist; it sat here for months while the package
|
|
60
|
+
reached 9.7.0, because this file is not scanned by the artefact-count gate
|
|
61
|
+
(it is now — see § Drift guard). A stale number on a public growth surface is
|
|
62
|
+
precisely what this package positions against, so the shape below cannot rot:
|
|
63
|
+
every figure resolves through [`docs/CLAIMS.md`](../CLAIMS.md), and anything you
|
|
64
|
+
add needs a ledger entry or it does not go in.
|
|
62
65
|
|
|
63
66
|
```
|
|
64
|
-
event4u/agent-config
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
Bring your own provider (Anthropic / OpenAI / Google / Cloudflare).
|
|
78
|
-
No SaaS; no remote sync; npx-quickstart installs in ~3 minutes.
|
|
67
|
+
event4u/agent-config — a governance and content layer for AI coding agents,
|
|
68
|
+
compiled into each host's native format. Bring your own provider: no SaaS, no
|
|
69
|
+
remote sync, and no background daemon (claim: no-runtime-daemon).
|
|
70
|
+
|
|
71
|
+
What is different is falsifiability. Every public claim binds to evidence a
|
|
72
|
+
skeptic can reproduce on a fresh checkout, and the runs where the layer changed
|
|
73
|
+
nothing are published too (claim: positioning-honest-nulls). The measured wedge
|
|
74
|
+
is deliberately narrow: on weak or cheap hosts the `essential` tier transplants
|
|
75
|
+
scope and downstream-change discipline at a measured 1.71x corpus cost, and it
|
|
76
|
+
switches itself off on hosts where the effect measured null.
|
|
77
|
+
|
|
78
|
+
Start at the proof, not the catalog:
|
|
79
|
+
https://event4u-app.github.io/agent-config/proof/
|
|
79
80
|
```
|
|
80
81
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
Before pasting, verify: `task check-claims` is green on `main`, and each
|
|
83
|
+
`claim:` id above still resolves to a `backed` entry. Artefact counts belong in
|
|
84
|
+
the README badges (`update_counts` owns them) — never hand-typed into a listing.
|
|
85
|
+
|
|
86
|
+
## Drift guard
|
|
87
|
+
|
|
88
|
+
`docs/distribution/registries.md` is in
|
|
89
|
+
[`check_artefact_count_messaging`](../../src/scripts/check_artefact_count_messaging.ts)
|
|
90
|
+
`SURFACES`, so any artefact count that appears here must match the canonical
|
|
91
|
+
number or CI fails. That is the structural fix for the rot described above:
|
|
92
|
+
the previous block went stale silently because nothing watched this file.
|
|
84
93
|
|
|
85
94
|
## Submission checklist
|
|
86
95
|
|
|
@@ -31,6 +31,13 @@ it a two-tier experience — strong on Claude, absent on Cursor/Windsurf/Copilot
|
|
|
31
31
|
So the universal lever is the compile-time layer; runtime hooks are an opt-in
|
|
32
32
|
**bonus** on the hosts that can run them, never the floor.
|
|
33
33
|
|
|
34
|
+
The ADR-124 code-graph nudge is a case in point: on hook-capable hosts the
|
|
35
|
+
default-off `code-graph` PreToolUse hook surfaces "query the graph first" once
|
|
36
|
+
per session; on instruction-file hosts the same intent rides the always-loaded
|
|
37
|
+
[`external-code-graph-interop`](../src/rules/external-code-graph-interop.md)
|
|
38
|
+
rule and the [`code-intelligence`](../src/skills/code-intelligence/SKILL.md)
|
|
39
|
+
skill — the capability degrades gracefully, it does not disappear.
|
|
40
|
+
|
|
34
41
|
**Where MCP fits.** MCP is a *transport* surface, not a third enforcement layer.
|
|
35
42
|
On a host that runs MCP servers, MCP is one path by which a tool lifecycle (and
|
|
36
43
|
therefore the runtime-hook column above) can become available — but MCP presence
|
package/docs/featured-skills.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Featured Skills
|
|
2
2
|
|
|
3
|
-
A curated subset of the
|
|
3
|
+
A curated subset of the 281 skills. Three tiers, one per primary audience. Full catalog lives in [`dist/agent-src/skills/`](../dist/agent-src/skills/); see also [`docs/catalog.md`](catalog.md) for the complete index and [`docs/featured-commands.md`](featured-commands.md) for command-level highlights.
|
|
4
4
|
|
|
5
5
|
> **Eval-gated messaging note.** Until `task bench --corpus non-dev` reports `selection_accuracy >= 0.60` (see `road-to-product-adoption.md` Phase 1), this page is documentation, not marketing. The entries below are the candidates the corpus tests against; their description quality is what the eval validates.
|
|
6
6
|
|
|
@@ -92,4 +92,4 @@ task lint-featured-skills
|
|
|
92
92
|
|
|
93
93
|
CI runs this in `taskfiles/ci-fast.yml`. Stale entries (renamed / removed skill or command) fail the build. See [`scripts/lint_featured_skills.py`](../src/scripts/lint_featured_skills.py) for the matcher.
|
|
94
94
|
|
|
95
|
-
→ Browse all
|
|
95
|
+
→ Browse all 281 skills: [`dist/agent-src/skills/`](../dist/agent-src/skills/) · all 190 commands: [`dist/agent-src/commands/`](../dist/agent-src/commands/)
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> Pick the entry that matches what you do day-to-day. Each section names the three skills you will reach for first and shows whether MCP (no terminal) or CLI (terminal) is the simpler install path for that role.
|
|
4
4
|
|
|
5
|
-
`agent-config` ships
|
|
5
|
+
`agent-config` ships 281 skills, 107 governed rules, and 190 commands. You do not need all of them. Each role below filters to the slice that pays back in week one; the rest stays available and shows up on demand when a task references it.
|
|
6
6
|
|
|
7
7
|
> **Taglines at a glance →** [`docs/role-experiences.md`](role-experiences.md) — the one-line pitch per role experience, in one table.
|
|
8
8
|
|