@event4u/agent-config 9.2.0 → 9.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +111 -0
  3. package/CONTRIBUTING.md +14 -0
  4. package/README.md +12 -4
  5. package/dist/agent-src/commands/contribution-precheck.md +100 -0
  6. package/dist/agent-src/commands/fix/route.md +49 -0
  7. package/dist/agent-src/commands/fix.md +4 -2
  8. package/dist/agent-src/commands/tdd/green.md +32 -0
  9. package/dist/agent-src/commands/tdd/red.md +33 -0
  10. package/dist/agent-src/commands/tdd/refactor.md +31 -0
  11. package/dist/agent-src/commands/tdd.md +50 -0
  12. package/dist/agent-src/commands/team.md +4 -0
  13. package/dist/agent-src/contexts/communication/rules-auto/guidelines-mechanics.md +1 -0
  14. package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +81 -2
  15. package/dist/agent-src/contexts/model-recommendations.md +6 -0
  16. package/dist/agent-src/rules/architecture.md +7 -0
  17. package/dist/agent-src/rules/token-efficiency.md +7 -0
  18. package/dist/agent-src/skills/adversarial-review/SKILL.md +5 -0
  19. package/dist/agent-src/skills/ai-council/SKILL.md +3 -0
  20. package/dist/agent-src/skills/build-buy-partner/SKILL.md +1 -0
  21. package/dist/agent-src/skills/decision-record/SKILL.md +35 -1
  22. package/dist/agent-src/skills/decision-record/evals/triggers.json +82 -12
  23. package/dist/agent-src/skills/decision-record/references/weighted-matrix.md +119 -0
  24. package/dist/agent-src/skills/evaluate-llm-feature/SKILL.md +142 -0
  25. package/dist/agent-src/skills/fe-design/SKILL.md +1 -0
  26. package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -0
  27. package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -0
  28. package/dist/agent-src/skills/learning-tutor/SKILL.md +215 -0
  29. package/dist/agent-src/skills/persona-improvement/SKILL.md +81 -0
  30. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +10 -0
  31. package/dist/agent-src/skills/rice-prioritization/SKILL.md +1 -0
  32. package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +3 -1
  33. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +14 -24
  34. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  35. package/dist/discovery/deprecation-report.md +1 -1
  36. package/dist/discovery/discovery-manifest.json +253 -30
  37. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  38. package/dist/discovery/discovery-manifest.summary.md +4 -4
  39. package/dist/discovery/orphan-report.md +1 -1
  40. package/dist/discovery/packs.json +19 -10
  41. package/dist/discovery/trust-report.md +3 -3
  42. package/dist/discovery/workspaces.json +15 -6
  43. package/dist/mcp/registry-manifest.json +3 -3
  44. package/docs/CLAIMS.md +16 -2
  45. package/docs/announcements/2026-07-honest-cost-sweep-launch.md +84 -0
  46. package/docs/anti-reskin-gate.md +60 -0
  47. package/docs/architecture.md +3 -3
  48. package/docs/catalog.md +303 -278
  49. package/docs/command-flows.md +10 -3
  50. package/docs/comparison.yaml +10 -0
  51. package/docs/contracts/adoption-signal-floor.md +17 -0
  52. package/docs/contracts/ai-council-config.md +25 -0
  53. package/docs/contracts/command-clusters.md +2 -1
  54. package/docs/contracts/mcp-tool-inventory.md +25 -22
  55. package/docs/contracts/tier-3-contrib-plugin.md +12 -4
  56. package/docs/decisions/ADR-122-adversarial-verification-council.md +1 -1
  57. package/docs/development.md +10 -1
  58. package/docs/featured-skills.md +2 -2
  59. package/docs/getting-started-by-role.md +1 -1
  60. package/docs/getting-started.md +1 -1
  61. package/docs/governance-advantage.md +1 -1
  62. package/docs/guidelines/component-oriented-and-oop-development.md +181 -0
  63. package/docs/proof.md +10 -6
  64. package/docs/self-review-gate.md +14 -0
  65. package/docs/setup/per-ide/antigravity.md +8 -3
  66. package/docs/us-vs-the-category.md +38 -0
  67. package/docs/wedge/production-validator/README.md +24 -0
  68. package/docs/wedge/production-validator/first-run-check.sh +42 -0
  69. package/package.json +3 -2
  70. package/src/scripts/_lib/catalog_score.ts +64 -0
  71. package/src/scripts/_lib/shingle_similarity.ts +146 -0
  72. package/src/scripts/ai_council/clients.ts +50 -1
  73. package/src/scripts/ai_council/config.ts +28 -3
  74. package/src/scripts/ai_council/low_impact.ts +16 -0
  75. package/src/scripts/ai_council/necessity.ts +11 -0
  76. package/src/scripts/ai_council/orchestrator.ts +78 -26
  77. package/src/scripts/ai_council/pricing.ts +59 -0
  78. package/src/scripts/ai_council/prompts.ts +7 -0
  79. package/src/scripts/ai_council/stance_tally.ts +42 -5
  80. package/src/scripts/build_catalog_index.ts +188 -0
  81. package/src/scripts/council_cli.ts +56 -1
  82. package/src/scripts/generate_index.ts +6 -3
  83. package/src/scripts/hook_manifest.yaml +17 -6
  84. package/src/scripts/install-hooks.sh +32 -17
  85. package/src/scripts/lint_originality.ts +464 -0
  86. package/src/scripts/mcp_server/catalog_tools.ts +114 -0
  87. package/src/scripts/mcp_server/consumer_tool_catalog.json +46 -0
  88. package/src/scripts/pr_url_reminder_hook.ts +177 -0
  89. package/src/scripts/schemas/flow.schema.json +17 -0
  90. package/src/scripts/schemas/skill.schema.json +166 -32
  91. package/src/scripts/self_review_gate.test.ts +48 -0
  92. package/src/scripts/self_review_gate.ts +73 -5
  93. package/src/scripts/validate_flow_teams.ts +127 -0
@@ -7,7 +7,7 @@
7
7
 
8
8
  > Every command is classified in `src/flows/surface-map.yaml` (coverage enforced by `scripts/lint_command_flow_coverage.py`). The four user-work flows carry rich definitions in `src/flows/<flow>.yaml`.
9
9
 
10
- **184 commands** across **10 surfaces** (4 user-work flows + 6 platform/domain surfaces).
10
+ **190 commands** across **10 surfaces** (4 user-work flows + 6 platform/domain surfaces).
11
11
 
12
12
  ## User-work flows
13
13
 
@@ -56,6 +56,10 @@ _Build it. The core "make the change" front — drive a prompt, ticket, or featu
56
56
  - `jira-ticket` — Read Jira ticket from branch name, analyze linked Sentry issues, implement feature or fix bug
57
57
  - `mission-upgrade` — Gated Laravel major-version upgrade mission — provisional branch, breaking-change catalog, size-tier surfac…
58
58
  - `module-create` — Create a new module from .module-template with interactive setup
59
+ - `tdd` — TDD orchestrator — routes to red (failing test), green (minimum code), refactor (clean while green)
60
+ - `tdd-green` — TDD green phase — write the minimum production code to make the failing test pass; no test edits
61
+ - `tdd-red` — TDD red phase — enumerate cases, write ONE failing test, watch it fail at an assertion (not an import error)
62
+ - `tdd-refactor` — TDD refactor phase — clean up (rename, deduplicate) while keeping the test green
59
63
  - `tests` — Tests orchestrator — routes to create, execute, e2e-plan, e2e-heal
60
64
  - `tests-create` — Write meaningful tests for the current branch — stack-adaptive (pest / phpunit / vitest / jest / pytest / …)
61
65
  - `tests-e2e-heal` — Find, debug, and fix failing Playwright E2E tests
@@ -79,6 +83,7 @@ _Check it. Self-review, judge, fix/quality, and threat-model a change before it
79
83
 
80
84
  - `fix-ci` — Fetch CI errors from GitHub Actions and fix them
81
85
  - `fix-quality` — Run quality pipeline (PHP and/or JS/TS) and fix all errors — auto-detects language from changed files
86
+ - `fix-route` — Classify a vaguely-described problem and dispatch to the right fix sub-command (or name the specialist skil…
82
87
  - `judge` — Judge orchestrator — routes to solo, steps, on-diff
83
88
  - `judge-on-diff` — Run a single change through an implementer→judge loop with a two-revision ceiling, then hand back to the user
84
89
  - `judge-solo` — Run a standalone judge on an existing diff or code change — no implementer, no revision loop, verdict only
@@ -135,11 +140,11 @@ _Deliberately-started features — not daily flow members, never buried as skill
135
140
  - `roadmap-process-full` — Autonomously process every open step across every phase of a roadmap until the file is fully closed. Larges…
136
141
  - `roadmap-process-phase` — Autonomously process every open step in the next or current phase of a roadmap, then stop. Default executio…
137
142
  - `roadmap-process-step` — Autonomously process the single next open step of a roadmap and stop. Smallest execution scope of the /road…
138
- - `team` — Team orchestrator — cross-model depth review (one strong model builds, a second reviews the real diff); rou…
143
+ - `team` — Team orchestrator — governed cross-model access layer (a second strong model reviews the real diff; read-on…
139
144
  - `team-adversarial` — Thin wrapper — adversarial cross-model review on a named focus via the official plugin (/codex:adversarial-…
140
145
  - `team-delegate` — Thin wrapper — hand a task to the second model as a native worker via the official plugin (/codex:rescue).…
141
146
  - `team-review` — Thin wrapper — cross-model review of the current diff via the official plugin (/codex:review). Gated on ai_…
142
- - `team-status` — Thin wrapper — plugin job status via /codex:status plus a ledger line with today's cli_call_budget openai c…
147
+ - `team-status` — Thin wrapper — plugin job status via /codex:status plus a quota block (shared openai counter vs team + coun…
143
148
 
144
149
  ### Platform surface — `agent-admin`
145
150
 
@@ -165,9 +170,11 @@ _The system/admin surface (NOT a flow): memory · analytics · governance · con
165
170
  - `context` — Context orchestrator — routes to create, refactor
166
171
  - `context-create` — Analyze a codebase area and create a structured context document
167
172
  - `context-refactor` — Analyze, update, and extend an existing context document
173
+ - `contribution-precheck` — Contributor self-service precheck — run the PR-relevant lint subset (skill linter, originality gate, frontm…
168
174
  - `cost` — Cost orchestrator — routes to report (session token cost + budget ladder) and profile (change the rule_load…
169
175
  - `cost-profile` — Change the rule_loading_tier in .agent-settings.yml — shows each profile's meaning and applies the selection
170
176
  - `cost-report` — Capture token cost from the active Claude Code session, append to the local sessions store, and surface the…
177
+ - `explain-run` — Read-only 'why did that happen' run report — resolved rule set, rules fired, artefact engagement, subagent…
171
178
  - `knowledge` — Knowledge orchestrator — routes to ingest, list, forget. Local-only file ingestion into the agent memory na…
172
179
  - `knowledge-cross-repo` — Targeted, read-only retrieval over opted-in linked-project siblings (ADR-032 Option A). Pulls a shared type…
173
180
  - `knowledge-forget` — Drop a knowledge ingest from `agents/memory/knowledge/` by id prefix. Atomic, no partial state. Pinning pro…
@@ -33,3 +33,13 @@ rows:
33
33
  our_evidence: "tests/scripts/witness/check_refs_relative_gap.test.ts"
34
34
  their_evidence: "Published known-limitation surfaces backed by reproducing tests are not a standard artifact in this category."
35
35
  checkable: true
36
+
37
+ - 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
+ our_evidence: "internal/bench/orchestration/pv-a3-results.md#token_delta_provenance: measured"
39
+ 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
+ checkable: true
41
+
42
+ - 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
+ our_evidence: "internal/bench/reports/persona-placebo.json#honest-null"
44
+ their_evidence: "Named-persona prompts are shipped as a feature across the category without a published A/B separating identity from method."
45
+ checkable: true
@@ -84,6 +84,23 @@ must clear before the code lands:
84
84
  Until all four gates are written and reviewed, consumer-side
85
85
  telemetry is **forbidden** even as a discussion item in roadmaps.
86
86
 
87
+ ## Extraction demand gate — lint_originality standalone probe
88
+
89
+ Added 2026-07-20 (road-to-originality-gate-and-contributor-funnel Phase 3,
90
+ council 2026-07-20: extraction is demand-gated; the floor IS the demand gate,
91
+ applied post-probe). Uses **allowed public signals only** — inbound GitHub
92
+ issues/PRs and their authors; no consumer telemetry, consistent with the Iron
93
+ Law above.
94
+
95
+ | Field | Value |
96
+ |---|---|
97
+ | **Probe surface** | [`docs/anti-reskin-gate.md`](../anti-reskin-gate.md) — run-from-clone recipe + signal instructions |
98
+ | **Signal definition** | A distinct external (non-maintainer) GitHub account opening an issue titled `anti-reskin gate: standalone request`, or referencing `lint_originality` in an inbound issue/PR about their own catalog |
99
+ | **Floor** | ≥ 3 distinct external signals |
100
+ | **Window** | 90 days from the probe page landing on `main` |
101
+ | **Floor met** | Extract `lint_originality` as a standalone zero-config npx package (`--changed` mode, no repo coupling, regression suite included); npm publish remains a maintainer decision (name, scope, moment) |
102
+ | **Floor missed** | Extraction **cancelled** — recorded via decision-record; not relitigated without new evidence |
103
+
87
104
  ## Re-audit cadence
88
105
 
89
106
  Re-audit on each of:
@@ -679,6 +679,31 @@ regression breaks `task consistency`, never the live council.
679
679
  `parse_corpus_strict` (Markdown). It runs **before** `task sync`
680
680
  rebuilds the lockfile, so it must read whatever the user just edited.
681
681
 
682
+ ## `model_downgrade` — auto-tiering + the A1↔A3 cache coupling
683
+
684
+ Since the A3 slice of `road-to-api-cost-optimization` (2026-07-20):
685
+
686
+ ```yaml
687
+ model_downgrade:
688
+ enabled: true # default; false disables the size-fit gate entirely
689
+ auto_apply: true # DEFAULT since A3 — auto-downgrade is opt-OUT
690
+ model_tier_override: # per-run escape hatch: member -> pinned model id
691
+ anthropic: claude-sonnet-4-5
692
+ ```
693
+
694
+ - Small / low-complexity artefacts (per `necessity.classify_size_fit`,
695
+ character-based) auto-downgrade one ladder rung; the `debate` lens never
696
+ downgrades.
697
+ - **Cache coupling:** a downgrade is applied only when the model saving beats
698
+ the forfeited model-scoped prompt-cache reads
699
+ (`pricing.downgrade_coupling`: `downgrade_savings > lost_cache_savings`,
700
+ expected reads = rounds − 1). One-shot paths (the low-impact fast-path)
701
+ have no reads to lose and downgrade to the CHEAPEST ladder rung outright.
702
+ - `model_tier_override` pins a member to a model for the run — classifier and
703
+ coupling both skipped. Set it per artefact when a specific tier is needed.
704
+ - Requires `model_ladder` on the member (smallest → largest, must include the
705
+ active `model`).
706
+
682
707
  ## `api_key_ref` forms
683
708
 
684
709
  Exactly two forms. Raw keys in the yml are a hard validation error.
@@ -28,7 +28,7 @@ column 1 of this table.
28
28
 
29
29
  | Cluster | Phase | Sub-commands | Replaces |
30
30
  |---|:-:|---|---|
31
- | `fix` | 1 | `ci` · `pr-comments` · `pr-bot-comments` · `pr-developer-comments` · `portability` · `refs` · `seeder` · `comments` · `quality` | `fix-ci` · `fix-pr-comments` · `fix-pr-bot-comments` · `fix-pr-developer-comments` · `fix-portability` · `fix-references` · `fix-seeder`; `comments` added 2026-06-22 — audits the **code comments** in the current branch's diff (simplify / shorten / remove), distinct from the PR-review-thread `pr-comments` sub; `quality` added 2026-07-08 — replaces `quality-fix` (slug reorder, `replaces:` alias) |
31
+ | `fix` | 1 | `ci` · `pr-comments` · `pr-bot-comments` · `pr-developer-comments` · `portability` · `refs` · `seeder` · `comments` · `quality` · `route` | `fix-ci` · `fix-pr-comments` · `fix-pr-bot-comments` · `fix-pr-developer-comments` · `fix-portability` · `fix-references` · `fix-seeder`; `comments` added 2026-06-22 — audits the **code comments** in the current branch's diff (simplify / shorten / remove), distinct from the PR-review-thread `pr-comments` sub; `quality` added 2026-07-08 — replaces `quality-fix` (slug reorder, `replaces:` alias); `route` added 2026-07-15 (ecosystem-harvest ergonomics U1) — the classify-and-dispatch entry (adapted from the source's `/smart-fix`; folded into the `fix` verb family to satisfy the ADR-041 controlled-verb vocabulary without a new verb) |
32
32
  | `optimize` | 1 | `agents-dir` · `augmentignore` · `rtk` · `skills` · `project` · `prompt` | `optimize-augmentignore` · `optimize-rtk-filters` · `optimize-skills` · former `/optimize agents` and `/optimize agents-md` moved to the `/agents` file-family cluster 2026-05-09; `/agents prepare/audit/cleanup` collapsed into the single `/optimize agents-dir` (flags or wizard) per the agent-doc consolidation; `project` (slug-neutral nest of `optimize-project`, pack move engineering-base → meta) + `prompt` (slug-neutral nest of `optimize-prompt`) added 2026-07-08 — the head now spans agent-layer / project-wide / prompt scopes with a disambiguating menu |
33
33
  | `feature` | 1 | `explore` · `plan` · `refactor` · `roadmap` · `dev` | `feature-explore` · `feature-plan` · `feature-refactor` · `feature-roadmap` · `feature-dev` |
34
34
  | `chat-history` | 2 | `show` · `import` · `learn` | `chat-history` (legacy status) — `resume` / `clear` / `checkpoint` removed in `road-to-chat-history-hook-only` (auto-adopt + structural hooks); `import` (verbatim cross-session render) and `learn` (project-improving learning extraction) added in the v4 stateless schema |
@@ -37,6 +37,7 @@ column 1 of this table.
37
37
  | `roadmap` | 2 | `create` · `ai-council` · `process-step` · `process-phase` · `process-full` | `roadmap-create` · `roadmap-execute` (replaced — autonomous, no per-step gate; `process-phase` is the default execution scope); `ai-council` added 2026-05-07 — wraps `/council default` with `--input-mode roadmap --depth deep` |
38
38
  | `module` | 2 | `create` · `explore` | `module-create` · `module-explore` |
39
39
  | `tests` | 2 | `create` · `execute` · `e2e-plan` · `e2e-heal` | `tests-create` · `tests-execute`; `e2e-plan` / `e2e-heal` added 2026-07-08 — replace the flat `e2e-plan` / `e2e-heal` (slug reorders, `replaces:` aliases; composite sub-names per ADR-003 §2) |
40
+ | `tdd` | 2 | `red` · `green` · `refactor` | new cluster 2026-07-15 (ecosystem-harvest ergonomics U2) — thin per-phase ergonomic split over the `test-driven-development` skill; each sub drives one TDD phase, no logic duplication. Internal visibility. Bare `/tdd` shows the menu. |
40
41
  | `context` | 2 | `create` · `refactor` | `context-create` · `context-refactor` |
41
42
  | `override` | 2 | `create` · `manage` | `override-create` · `override-manage` |
42
43
  | `judge` | 2 | `solo` · `on-diff` · `steps` | `judge` (legacy standalone) · `do-and-judge` · `do-in-steps` |
@@ -14,22 +14,22 @@ keep-beta-until: 2026-08-14
14
14
 
15
15
  ## Summary
16
16
 
17
- - **Total tools:** 28
17
+ - **Total tools:** 31
18
18
  - **By transport:** stdio=19
19
- - **By side-effect:** fs-write=8, ro=17, shell=3
20
- - **Discovery-only stubs (no implementation):** 9
19
+ - **By side-effect:** fs-write=8, ro=20, shell=3
20
+ - **Discovery-only stubs (no implementation):** 12
21
21
 
22
22
  ## Tools
23
23
 
24
24
  | Tool | Side-effect | Transports | Catalog | Handler |
25
25
  |---|---|---|---|---|
26
- | `lint_skills` | `ro` | stdio | [`consumer_tool_catalog.json:7`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L7) | [`tools.ts:1200`](../../src/scripts/mcp_server/tools.ts#L1200) |
27
- | `chat_history_append` | `fs-write` | stdio | [`consumer_tool_catalog.json:24`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L24) | [`tools.ts:1228`](../../src/scripts/mcp_server/tools.ts#L1228) |
28
- | `chat_history_read` | `ro` | stdio | [`consumer_tool_catalog.json:43`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L43) | [`tools.ts:1289`](../../src/scripts/mcp_server/tools.ts#L1289) |
29
- | `memory_lookup` | `ro` | stdio | [`consumer_tool_catalog.json:63`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L63) | [`tools.ts:1365`](../../src/scripts/mcp_server/tools.ts#L1365) |
30
- | `memory_get` | `ro` | stdio | [`consumer_tool_catalog.json:81`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L81) | [`tools.ts:1432`](../../src/scripts/mcp_server/tools.ts#L1432) |
31
- | `memory_signal` | `fs-write` | stdio | [`consumer_tool_catalog.json:95`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L95) | [`tools.ts:1541`](../../src/scripts/mcp_server/tools.ts#L1541) |
32
- | `memory_status` | `ro` | stdio | [`consumer_tool_catalog.json:111`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L111) | [`tools.ts:1456`](../../src/scripts/mcp_server/tools.ts#L1456) |
26
+ | `lint_skills` | `ro` | stdio | [`consumer_tool_catalog.json:7`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L7) | [`tools.ts:1198`](../../src/scripts/mcp_server/tools.ts#L1198) |
27
+ | `chat_history_append` | `fs-write` | stdio | [`consumer_tool_catalog.json:24`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L24) | [`tools.ts:1226`](../../src/scripts/mcp_server/tools.ts#L1226) |
28
+ | `chat_history_read` | `ro` | stdio | [`consumer_tool_catalog.json:43`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L43) | [`tools.ts:1287`](../../src/scripts/mcp_server/tools.ts#L1287) |
29
+ | `memory_lookup` | `ro` | stdio | [`consumer_tool_catalog.json:63`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L63) | [`tools.ts:1363`](../../src/scripts/mcp_server/tools.ts#L1363) |
30
+ | `memory_get` | `ro` | stdio | [`consumer_tool_catalog.json:81`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L81) | [`tools.ts:1430`](../../src/scripts/mcp_server/tools.ts#L1430) |
31
+ | `memory_signal` | `fs-write` | stdio | [`consumer_tool_catalog.json:95`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L95) | [`tools.ts:1539`](../../src/scripts/mcp_server/tools.ts#L1539) |
32
+ | `memory_status` | `ro` | stdio | [`consumer_tool_catalog.json:111`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L111) | [`tools.ts:1454`](../../src/scripts/mcp_server/tools.ts#L1454) |
33
33
  | `skill_trigger_eval` | `ro` | _(stub)_ | [`consumer_tool_catalog.json:118`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L118) | _stub-only_ |
34
34
  | `suggest_command` | `ro` | _(stub)_ | [`consumer_tool_catalog.json:134`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L134) | _stub-only_ |
35
35
  | `suggest_skill_for_task` | `ro` | _(stub)_ | [`consumer_tool_catalog.json:149`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L149) | _stub-only_ |
@@ -37,20 +37,23 @@ keep-beta-until: 2026-08-14
37
37
  | `update_form_request_messages` | `fs-write` | _(stub)_ | [`consumer_tool_catalog.json:178`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L178) | _stub-only_ |
38
38
  | `sync_gitignore` | `fs-write` | _(stub)_ | [`consumer_tool_catalog.json:193`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L193) | _stub-only_ |
39
39
  | `sync_agent_settings` | `fs-write` | _(stub)_ | [`consumer_tool_catalog.json:206`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L206) | _stub-only_ |
40
- | `run_tests` | `shell` | stdio | [`consumer_tool_catalog.json:220`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L220) | [`tools.ts:1716`](../../src/scripts/mcp_server/tools.ts#L1716) |
40
+ | `run_tests` | `shell` | stdio | [`consumer_tool_catalog.json:220`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L220) | [`tools.ts:1714`](../../src/scripts/mcp_server/tools.ts#L1714) |
41
41
  | `run_quality_checks` | `shell` | _(stub)_ | [`consumer_tool_catalog.json:234`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L234) | _stub-only_ |
42
- | `list_skills` | `ro` | stdio | [`consumer_tool_catalog.json:247`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L247) | [`tools.ts:1470`](../../src/scripts/mcp_server/tools.ts#L1470) |
43
- | `list_commands` | `ro` | stdio | [`consumer_tool_catalog.json:254`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L254) | [`tools.ts:1485`](../../src/scripts/mcp_server/tools.ts#L1485) |
44
- | `list_rules` | `ro` | stdio | [`consumer_tool_catalog.json:261`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L261) | [`tools.ts:1500`](../../src/scripts/mcp_server/tools.ts#L1500) |
42
+ | `list_skills` | `ro` | stdio | [`consumer_tool_catalog.json:247`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L247) | [`tools.ts:1468`](../../src/scripts/mcp_server/tools.ts#L1468) |
43
+ | `list_commands` | `ro` | stdio | [`consumer_tool_catalog.json:254`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L254) | [`tools.ts:1483`](../../src/scripts/mcp_server/tools.ts#L1483) |
44
+ | `list_rules` | `ro` | stdio | [`consumer_tool_catalog.json:261`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L261) | [`tools.ts:1498`](../../src/scripts/mcp_server/tools.ts#L1498) |
45
45
  | `compile_router` | `shell` | _(stub)_ | [`consumer_tool_catalog.json:268`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L268) | _stub-only_ |
46
- | `read_resource_body` | `ro` | stdio | [`consumer_tool_catalog.json:281`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L281) | [`tools.ts:1516`](../../src/scripts/mcp_server/tools.ts#L1516) |
47
- | `roadmap_progress` | `fs-write` | stdio | [`consumer_tool_catalog.json:295`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L295) | [`tools.ts:1575`](../../src/scripts/mcp_server/tools.ts#L1575) |
48
- | `roadmap_archive` | `fs-write` | stdio | [`consumer_tool_catalog.json:308`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L308) | [`tools.ts:1598`](../../src/scripts/mcp_server/tools.ts#L1598) |
49
- | `capabilities_index` | `fs-write` | stdio | [`consumer_tool_catalog.json:315`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L315) | [`tools.ts:1614`](../../src/scripts/mcp_server/tools.ts#L1614) |
50
- | `doctor_report` | `ro` | stdio | [`consumer_tool_catalog.json:328`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L328) | [`tools.ts:1637`](../../src/scripts/mcp_server/tools.ts#L1637) |
51
- | `conformance_check` | `ro` | stdio | [`consumer_tool_catalog.json:335`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L335) | [`tools.ts:1651`](../../src/scripts/mcp_server/tools.ts#L1651) |
52
- | `telemetry_report` | `ro` | stdio | [`consumer_tool_catalog.json:342`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L342) | [`tools.ts:1665`](../../src/scripts/mcp_server/tools.ts#L1665) |
53
- | `council_estimate` | `ro` | stdio | [`consumer_tool_catalog.json:355`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L355) | [`tools.ts:1687`](../../src/scripts/mcp_server/tools.ts#L1687) |
46
+ | `read_resource_body` | `ro` | stdio | [`consumer_tool_catalog.json:281`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L281) | [`tools.ts:1514`](../../src/scripts/mcp_server/tools.ts#L1514) |
47
+ | `roadmap_progress` | `fs-write` | stdio | [`consumer_tool_catalog.json:295`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L295) | [`tools.ts:1573`](../../src/scripts/mcp_server/tools.ts#L1573) |
48
+ | `roadmap_archive` | `fs-write` | stdio | [`consumer_tool_catalog.json:308`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L308) | [`tools.ts:1596`](../../src/scripts/mcp_server/tools.ts#L1596) |
49
+ | `capabilities_index` | `fs-write` | stdio | [`consumer_tool_catalog.json:315`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L315) | [`tools.ts:1612`](../../src/scripts/mcp_server/tools.ts#L1612) |
50
+ | `doctor_report` | `ro` | stdio | [`consumer_tool_catalog.json:328`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L328) | [`tools.ts:1635`](../../src/scripts/mcp_server/tools.ts#L1635) |
51
+ | `conformance_check` | `ro` | stdio | [`consumer_tool_catalog.json:335`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L335) | [`tools.ts:1649`](../../src/scripts/mcp_server/tools.ts#L1649) |
52
+ | `telemetry_report` | `ro` | stdio | [`consumer_tool_catalog.json:342`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L342) | [`tools.ts:1663`](../../src/scripts/mcp_server/tools.ts#L1663) |
53
+ | `catalog_search` | `ro` | _(stub)_ | [`consumer_tool_catalog.json:355`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L355) | _stub-only_ |
54
+ | `catalog_inspect` | `ro` | _(stub)_ | [`consumer_tool_catalog.json:372`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L372) | _stub-only_ |
55
+ | `catalog_load` | `ro` | _(stub)_ | [`consumer_tool_catalog.json:387`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L387) | _stub-only_ |
56
+ | `council_estimate` | `ro` | stdio | [`consumer_tool_catalog.json:401`](../../src/scripts/mcp_server/consumer_tool_catalog.json#L401) | [`tools.ts:1685`](../../src/scripts/mcp_server/tools.ts#L1685) |
54
57
 
55
58
  ## Glossary
56
59
 
@@ -16,7 +16,7 @@ promotion path from Tier-3 → Tier-2, and the non-implementation
16
16
  guarantee. Does **not** ship code: `agents/manifests/contrib/` is
17
17
  unmanifested until a user asks for an entry by name.
18
18
 
19
- Last refreshed: 2026-05-12.
19
+ Last refreshed: 2026-07-16.
20
20
 
21
21
  ## Tier definitions
22
22
 
@@ -35,8 +35,16 @@ Tier-3 is the explicit overflow bucket.
35
35
  The following surfaces are Tier-3 candidates as of 2026-05-12. They
36
36
  were surfaced during the
37
37
  [`2026-05-12-installer-expansion`](../../agents/runtime/council/sessions/2026-05-12-installer-expansion/synthesis.md)
38
- council round and have **no entries** in `_VALID_TOOLS`,
39
- `USER_SCOPE_PATHS`, `SCOPE_SUPPORT`, or the bash `VALID_TOOLS` set.
38
+ council round and had **no entries** in `_VALID_TOOLS`,
39
+ `USER_SCOPE_PATHS`, `SCOPE_SUPPORT` or the bash `VALID_TOOLS` set at
40
+ proposal time.
41
+
42
+ **Status update (2026-07-16):** the candidates below have since been
43
+ promoted to shipped hosts — each now has entries in `_VALID_TOOLS`,
44
+ `USER_SCOPE_PATHS` and `SCOPE_SUPPORT`, deployed as the universal
45
+ global skill bundle. The bullets are kept as the frozen proposal-time
46
+ record; their rationales describe the pre-promotion state and no
47
+ longer reflect current shipping status.
40
48
 
41
49
  - `qoder` — community fork, no public adoption signal
42
50
  - `trae` — ByteDance IDE, behind login wall
@@ -44,7 +52,7 @@ council round and have **no entries** in `_VALID_TOOLS`,
44
52
  - `codebuddy` — Tencent-internal, no public install path
45
53
  - `droid` — proposed CLI agent, alpha
46
54
  - `warp` — terminal-with-AI; integration shape unclear (PTY vs file marker)
47
- - `antigravity` — Google research project, no shipping surface
55
+ - `antigravity` — Google's agentic IDE (public since 2026); shipped as a global bundle host (see status update above)
48
56
 
49
57
  Inclusion in this list is **not** a commitment to ship. Promotion
50
58
  requires a real user asking by name (issue, PR, council session, or
@@ -129,7 +129,7 @@ Each settled decision this roadmap does NOT touch:
129
129
 
130
130
  ## References
131
131
 
132
- - `agents/roadmaps/road-to-adversarial-verification-council.md` — the roadmap.
132
+ - `agents/roadmaps/archive/road-to-adversarial-verification-council.md` — the roadmap.
133
133
  - ADR-106 (recursive-verification honest-null), ADR-117 (subagents.auto flip),
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.
@@ -112,9 +112,18 @@ task tool-validate # Validate tool declarations
112
112
 
113
113
  ```bash
114
114
  task install -- --target <dir> # Run the installer orchestrator on a target
115
- task install-hooks # Install git hooks (pre-commit marketplace lint, pre-push sync check, chat-history bridges)
115
+ task install-hooks # Install git hooks (pre-commit marketplace lint, pre-push consistency gate, chat-history bridges)
116
116
  ```
117
117
 
118
+ The **pre-push hook runs `task consistency`** — the exact local mirror of the CI
119
+ "Sync + Generate Tools Consistency" gate (sync + hashes + generate-tools +
120
+ router + corpus + `git diff --quiet`). Any derived-output drift (counts, dist,
121
+ generated tool trees) is blocked **before** the push instead of failing remote
122
+ CI; the fix is `task consistency-fix`, stage, re-push. The hook auto-installs on
123
+ `npm install` in a git clone (the `prepare` script); run `task install-hooks`
124
+ manually if you skipped install scripts. Bypass a genuine WIP push with
125
+ `git push --no-verify`.
126
+
118
127
  ### Local dev install (no release)
119
128
 
120
129
  Use these tasks to run the working tree as if it were a published
@@ -1,6 +1,6 @@
1
1
  # Featured Skills
2
2
 
3
- A curated subset of the 275 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.
3
+ A curated subset of the 278 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 275 skills: [`dist/agent-src/skills/`](../dist/agent-src/skills/) · all 184 commands: [`dist/agent-src/commands/`](../dist/agent-src/commands/)
95
+ → Browse all 278 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 275 skills, 105 governed rules, and 184 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.
5
+ `agent-config` ships 278 skills, 105 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
 
@@ -174,7 +174,7 @@ Your agent now understands slash commands:
174
174
  | `/fix quality` | Run and fix all quality checks |
175
175
  | `/chat-history import` | Pull a prior session into the current chat (resume) |
176
176
 
177
- → [Browse all 184 active commands](../dist/agent-src/commands/)
177
+ → [Browse all 190 active commands](../dist/agent-src/commands/)
178
178
 
179
179
  ---
180
180
 
@@ -33,7 +33,7 @@ the host lacks (a static host gives it no runtime attention guarantee, but a
33
33
  runtime-only system gives it nothing at all here). A runtime-only system contributes *nothing* on these hosts.
34
34
 
35
35
  ### 2. Intent routing, not a 500-artefact dump
36
- A prompt does not load all 275 skills. `dist/router.json` (101 routed rules, intent →
36
+ A prompt does not load all 278 skills. `dist/router.json` (101 routed rules, intent →
37
37
  skill, keyword/phrase/path triggers) carries the right skill on intent. The
38
38
  governance value is *selection discipline* — the host gets the relevant rule
39
39
  set, not the whole catalogue as context ballast.
@@ -0,0 +1,181 @@
1
+ # Component-Oriented & Object-Oriented Development
2
+
3
+ > Cross-cutting development standard: **think in reusable units, and — in an
4
+ > object-oriented / class-based codebase — treat object-oriented design as a
5
+ > high-priority default where it reduces complexity.** Split by surface below
6
+ > (frontend / backend), each pointing to the stack-specific carve-outs rather
7
+ > than restating them. Framework-neutral by construction — React / Storybook /
8
+ > Laravel / Symfony specifics live in their own skills, never here.
9
+
10
+ ## Paradigm-appropriate first — detect, then apply
11
+
12
+ **Reuse is universal; OOP is paradigm-scoped.** Detect the codebase's paradigm
13
+ before applying the object-oriented half: class-based / OO code (PHP, Java, C#,
14
+ typical TS/React service layers) → this standard's OOP guidance is the
15
+ high-priority default. A **functional / pipeline / actor-model** codebase
16
+ (Elixir/Phoenix, Clojure, Haskell, Go-idiomatic, heavy FP-in-TS) → apply *that*
17
+ paradigm's principles (immutability, pure functions, pattern-matching,
18
+ composition of functions), and read the OOP bullets as "the same rigor, its
19
+ paradigm's shape." **Never impose classes on functional code to satisfy this
20
+ standard** — consistency with the codebase's chosen paradigm wins over OOP
21
+ advocacy, always.
22
+
23
+ ## The standard, in one breath
24
+
25
+ - **Reuse before you build** (every paradigm). Compose from units that already
26
+ exist — audit first, reuse the design system / shared abstractions, extract a
27
+ new unit only when the same shape repeats.
28
+ - **Object-oriented where it fits** (in an OO codebase). Encapsulation, single
29
+ responsibility, composition over inheritance, and behavior-rich objects are
30
+ the high-priority default *when they reduce complexity* — not a quota to hit,
31
+ and not imposed on a codebase that has chosen a different paradigm.
32
+
33
+ ## The load-bearing caveat — reuse/OOP is a tool, never a mandate to abstract
34
+
35
+ This standard **never** authorizes speculative abstraction. It is bounded by the
36
+ package's restraint posture and defers to it on every conflict:
37
+
38
+ - [`minimal-safe-diff`](../../src/rules/minimal-safe-diff.md) (+ its
39
+ anti-over-engineering mechanics) — smallest change; no premature abstraction,
40
+ no speculative feature, no rewrite for taste.
41
+ - [`senior-engineering-discipline`](../../src/rules/senior-engineering-discipline.md)
42
+ — reuse the *existing* abstraction; generalize, don't overfit; never invent an
43
+ API to look object-oriented.
44
+ - [`improve-before-implement`](../../src/rules/improve-before-implement.md) —
45
+ "does it fit the existing architecture?" before adding structure.
46
+ - **When NOT to use a pattern** ([`php/patterns.md`](php/patterns.md) §) — KISS &
47
+ YAGNI trump pattern purity: no interface for a single implementation, no
48
+ pattern for a five-line function, no class where a function is clearer.
49
+
50
+ Rule of thumb: **two real repetitions (or a genuine second axis of change)
51
+ before you extract.** One occurrence is not a component; one branch is not a
52
+ Strategy. A reviewer should be able to name the concrete duplication or the
53
+ concrete change-axis the abstraction removes.
54
+
55
+ **Precedence (explicit): `minimal-safe-diff` / YAGNI always trump OOP
56
+ advocacy.** When "prefer OO shape" and "smallest change" conflict, the smallest
57
+ change wins — this standard adds a *consideration*, never a competing objective
58
+ that pressures preemptive abstraction. The review lens (below) may flag OO shape
59
+ only where the duplication or the growing branch is **already present in the
60
+ diff**, never as "this could grow later."
61
+
62
+ ## Frontend — think in reusable components
63
+
64
+ Component-first is the default mindset, not an afterthought: decompose a screen
65
+ into composable units, reuse the project's primitives, and extract shared shells
66
+ when they repeat. Depth and mechanics already live in dedicated skills — consult
67
+ them, don't duplicate:
68
+
69
+ - [`fe-design`](../../src/skills/fe-design/SKILL.md) § Component Architecture —
70
+ the stack-agnostic "kind, not framework" taxonomy, granularity, extract-on-3+.
71
+ - [`ui-component-architect`](../../src/skills/ui-component-architect/SKILL.md) —
72
+ how to *shape* a reusable component: composition over inheritance, slot
73
+ contracts, prop-API caps, controlled/uncontrolled, the componentization
74
+ threshold (repeat **and** real state).
75
+ - [`existing-ui-audit`](../../src/skills/existing-ui-audit/SKILL.md) — the
76
+ reuse-before-invent gate: inventory existing components/tokens/primitives
77
+ first (enforced by [`ui-audit-gate`](../../src/rules/ui-audit-gate.md)).
78
+ - [`design-tokens`](../../src/skills/design-tokens/SKILL.md) /
79
+ [`design-system-capture`](../../src/skills/design-system-capture/SKILL.md) —
80
+ the shared token/design-system layer components draw from.
81
+
82
+ **Component workshop (Storybook et al.) — when the project is large enough.**
83
+ For a project with a real, growing shared-component library, isolating and
84
+ documenting each reusable component in a component workshop (Storybook or the
85
+ ecosystem equivalent) pays for itself — it makes components discoverable,
86
+ reviewable in isolation, and reused instead of re-invented. It is **not** worth
87
+ the setup for a small surface with a handful of one-off components. The
88
+ framework-specific setup is a carve-out, not a generic mandate — React /
89
+ Storybook specifics: [`react-shadcn-ui`](../../src/skills/react-shadcn-ui/SKILL.md)
90
+ § Component workshop.
91
+
92
+ Framework carve-outs (never restated here): React →
93
+ [`react-shadcn-ui`](../../src/skills/react-shadcn-ui/SKILL.md); Next.js
94
+ server/client component boundary →
95
+ [`nextjs-patterns`](../../src/skills/nextjs-patterns/SKILL.md); Laravel FE →
96
+ [`blade-ui`](../../src/skills/blade-ui/SKILL.md) /
97
+ [`livewire`](../../src/skills/livewire/SKILL.md) /
98
+ [`flux`](../../src/skills/flux/SKILL.md); styling →
99
+ [`tailwind-engineer`](../../src/skills/tailwind-engineer/SKILL.md).
100
+
101
+ ## Backend — object-oriented where it reduces complexity
102
+
103
+ The structural half — thin handlers, business logic in services / use-cases,
104
+ behavior-rich domain models, validation at the boundary — is owned by
105
+ [`architecture`](../../src/rules/architecture.md) and holds across paradigms. In
106
+ an **object-oriented / class-based** service layer, layer the OO principles below
107
+ on top of it, each applied only where it earns its place. In a **functional /
108
+ pipeline** codebase, apply that paradigm's equivalent (pure functions +
109
+ composition instead of behavior-rich objects; a dispatch map / pattern-match
110
+ instead of a Strategy class) — the goal (encapsulate change, one responsibility,
111
+ compose don't duplicate) is paradigm-independent; only its *shape* is OO here:
112
+
113
+ - **Encapsulation** — objects own their data + the behavior over it; no anemic
114
+ bags mutated from the outside.
115
+ - **Single responsibility** — one class, one reason to change; no god services.
116
+ - **Composition over inheritance** — inject collaborators; reach for a base
117
+ class only for genuine is-a substitutability, not code sharing.
118
+ - **Behavior-rich domain objects** — push rules into the model, keep services
119
+ orchestration-thin.
120
+ - **Patterns where they earn their place** — a Strategy when a branch on a
121
+ discriminator will grow (`if-else` chain → polymorphism); a Factory when
122
+ construction is non-trivial; DI on an abstraction when there is a *real*
123
+ second implementation. Not before.
124
+
125
+ Language / framework carve-outs (never restated here): PHP →
126
+ [`php-coding-patterns`](php/php-coding-patterns.md) +
127
+ [`patterns.md`](php/patterns.md) (+ `patterns/strategy.md`,
128
+ `patterns/dependency-injection.md`, `patterns/factory.md`, `patterns/service-layer.md`)
129
+ + skills [`php-coder`](../../src/skills/php-coder/SKILL.md) /
130
+ [`php-service`](../../src/skills/php-service/SKILL.md); Laravel →
131
+ [`laravel`](../../src/skills/laravel/SKILL.md); Symfony →
132
+ [`symfony-workflow`](../../src/skills/symfony-workflow/SKILL.md); Next.js / TS →
133
+ [`nextjs-patterns`](../../src/skills/nextjs-patterns/SKILL.md); cross-language
134
+ clean-code baseline → [`code-clarity`](code-clarity.md).
135
+
136
+ ## Enums over scattered literals
137
+
138
+ A field with two or more non-boolean states is an enum, not a bare string /
139
+ magic number — the small OO move that keeps a codebase greppable and safe to
140
+ change. Full rule + the defer-and-ask flow for pre-existing literals:
141
+ [`prefer-enums-over-literals`](../../src/rules/prefer-enums-over-literals.md).
142
+
143
+ ## How this is reviewed
144
+
145
+ "Reuse existing components + object-oriented shape (where it reduces
146
+ complexity)" is a check on the code-quality review lens
147
+ ([`judge-code-quality`](../../src/skills/judge-code-quality/SKILL.md)), so it
148
+ reaches `/review-changes`, `/judge`, the subagent judge modes, and team-mode's
149
+ fallback review frame. It fires **only where the duplication or the growing
150
+ branch is already present in the diff** — never "this could grow later" — and
151
+ in the **codebase's own paradigm** (it will not tell a functional service to
152
+ grow a class). It stays a human-judgment call that defers to the codebase's own
153
+ conventions — never a generic SOLID dogma imposed over a project that has chosen
154
+ differently.
155
+
156
+ ## Council review (2026-07-15)
157
+
158
+ Deep debate, 3 rounds, cross-vendor (`anthropic/claude-sonnet-4-5` +
159
+ `openai/gpt-4o`), $0.16. Split verdict; the load-bearing (anthropic) critique —
160
+ that an "OOP-supreme default" over-indexes on OOP for a multi-paradigm consumer
161
+ base and can conflict with `minimal-safe-diff` — was applied, bounded by this
162
+ standard's stated purpose (OOP *is* a deliberate high priority for the operator):
163
+
164
+ - **Paradigm-appropriate framing** — OOP is the high-priority default *within an
165
+ OO / class-based codebase*; detect and defer to a functional / pipeline /
166
+ actor paradigm; never impose classes on functional code (§ Paradigm-appropriate).
167
+ - **Explicit precedence** — `minimal-safe-diff` / YAGNI win on conflict; the
168
+ review lens flags only *already-present* duplication / complexity, never
169
+ preemptive (§ caveat, § How this is reviewed).
170
+
171
+ Divergence held: the frontend section stays (an intentional FE / backend
172
+ entry-point + carve-out index, per the operator's explicit "split by FE /
173
+ backend" ask) — against the anthropic "delete as redundant"; it is a cohesive
174
+ index of the existing FE surfaces, not a claim of novel guidance. Trace:
175
+ `agents/runtime/council/responses/component-oop-standard.json/` (gitignored, local-only).
176
+
177
+ ## See also
178
+
179
+ - [`architecture`](../../src/rules/architecture.md) — the structural home this layers onto.
180
+ - [`code-clarity`](code-clarity.md) — the cross-language clean-code baseline.
181
+ - [`minimal-safe-diff`](../../src/rules/minimal-safe-diff.md) · [`senior-engineering-discipline`](../../src/rules/senior-engineering-discipline.md) — the restraint anchors this standard is bounded by.
package/docs/proof.md CHANGED
@@ -27,7 +27,7 @@ evidence pointer, or `task check-claims` fails the build.
27
27
  | Claim | Kind | Evidence | Resolves |
28
28
  |---|---|---|---|
29
29
  | The release process is documented as an inheritable runbook + succession doc, and the project's bus-factor (trailing-90-day distinct human reviewers) is tracked and reported truthfully — currently 1, not implied to be more. | qual | `docs/succession.md#trailing 90 days` | ✅ |
30
- | 184 commands. | quant | `src/scripts/check_artefact_count_messaging.ts#Artefact-count messaging gate` | ✅ |
30
+ | 190 commands. | quant | `src/scripts/check_artefact_count_messaging.ts#Artefact-count messaging gate` | ✅ |
31
31
  | A MEASURED-BUT-NOT-SHIPPED experiment — the thin rule projection reduced eager rule load 78,513 → 13,881 GPT-tokens (whole always-loaded projection 98,529 → 33,897, ~65.6%), but FAILED the quality gate (thin win-rate 36.2% vs required 48%) and does not ship; it un-defers only behind `discipline_profile: essential`. Shipped behavior does NOT include this reduction. Method: `agent-config benchmark` over the pinned token baseline; the baseline is the honest "what the user pays if everything loads eagerly", NOT a synthetic full-corpus strawman (council Q4); quality gate per the Phase-0 paired judge run. | quant | `internal/bench/reports/token-baseline.json#eager_rule_load` | ✅ |
32
32
  | The first cross-vendor parity pass (5 orchestration-corpus tasks × 2 vendors × 3 repeats, identical prompts via the council transport, $0.16) measured real per-host finding-count differences — claude-sonnet-4-5 surfaced ~2× the findings of gpt-4o on the multi-file analysis task (median 11 vs 5) while both vendors were identical on the planted hollow-implementation task (2 vs 2) and perfectly silent on the clean-code negative control (0 vs 0, no spurious findings). The per-task `finding_floor` values are calibrated from the cross-host lower envelope and the gate is armed. | quant | `internal/bench/reports/parity-count.json#min over hosts of median` | ✅ |
33
33
  | On a weak host (claude-haiku-4-5) the package produces a significant, placebo-controlled discipline lift on scope/downstream traps; on a strong host the same measurement is a published null — the package transplants discipline a weak model lacks, not model intelligence. | quant | `docs/benchmark.md#weak-host-specific` | ✅ |
@@ -40,15 +40,17 @@ evidence pointer, or `task check-claims` fails the build.
40
40
  | A hand-rolled, dependency-free BM25 + trigram lexical index resolves the "recalls but does not rank" gap: on the retrieval-precision corpus (9 keyword-overlapping-confuser tasks) it drives the mean top tie-set from 3.333 (the `_score` bucket scorer) to 1.0 — every needed decision uniquely top-ranked — with precision@1 and precision@5 unchanged at 1.0. Method: deterministic, model-free re-ranking of the SAME retrieved entry set; both scorers measured over the identical store via `measure_lexical_ranking.ts`. | quant | `internal/bench/reports/lexical-ranking.json` | ✅ |
41
41
  | The whole layer is compiled into host agents with zero runtime daemon. | qual | `docs/contracts/no-runtime-boundary.md#file-first, no-runtime suite` | ✅ |
42
42
  | On a 12-fixture option-decision corpus (3 arms × 2 providers, blind rubric judge claude-opus-4-8, pre-registered hypotheses), famous-figure identity framing added nothing beyond the underlying method text (method 5.04 vs figure 4.88, Δ=0.17, sign-test p=0.607), and provider diversity moved judged quality ~15× more than persona identity (provider Δ=2.58 vs identity Δ=0.17); the whole persona layer lifted only +0.08 over bare prompts. Honest null — persona panel-mode stays CUT, evidence-closed. | quant | `internal/bench/reports/persona-placebo.json#honest-null` | ✅ |
43
+ | The only agent layer that publishes the runs where it changed nothing. Deliberately falsifiable — if a reader finds a comparable agent layer publishing its own honest-null benchmark runs, this line updates; that is the point. | comparative | `docs/benchmark.md#honest` | ✅ |
43
44
  | On the live end-to-end retrieval benchmark (9 tasks × 3 arms × 3 seeds on claude-haiku, fixture store with keyword-overlapping confusers), the memory retrieval substrate scored precision@5 = 100% (9/9) with 100% poisoned-entry rejection, and the retrieval-on arm passed 27/27 model-scored tasks vs 2/27 with retrieval off and 4/27 with a placebo injection. Known limit stays published: mean tie-set 4.1 means top-k ties break by store order, not relevance (the ADR-116/FTS5 signal). | quant | `internal/bench/reports/second-brain-retrieval.json#retrieval-on` | ✅ |
44
45
  | 105 governed rules. | quant | `src/scripts/check_artefact_count_messaging.ts#Artefact-count messaging gate` | ✅ |
45
46
  | On a deterministic multi-session recall corpus, the memory substrate produces a measured, placebo-controlled recall lift — memory-on 27/27 vs no-memory 10/27 and vs equal-byte placebo 9/27 (claude-haiku-4-5, n=9 tasks x 3 seeds, sign test p=0.031 for BOTH pairings). Scoped honestly: this is the context-value upper bound (perfect retrieval on a one-fact-per-task corpus), not retrieval precision under a large store. | quant | `internal/bench/reports/second-brain-delta.json` | ✅ |
46
47
  | Removing the perfect-retrieval assumption, the substrate's REAL keyword retrieval recalls the needed decision into the top-5 under keyword-overlapping confusers (precision@5 9/9) and the model disambiguates it from the co-injected confusers — retrieval-on 27/27 vs no-memory 5/27 and vs equal-count placebo 5/27 (claude-haiku-4-5, 9 tasks x 3 seeds, sign test p=0.008 both). Named limit: retrieval RECALLS but does not RANK (mean tie-set 3.3, ties broken by store order, not relevance) — the discrimination gap that motivates the SQLite-FTS5 activation path (ADR-116) at larger scale. | quant | `internal/bench/reports/second-brain-retrieval.json` | ✅ |
47
48
  | Every artifact the package ships — source AND the condensed projection that reaches consumers — is machine-scanned in CI for hidden-Unicode, mixed-script-confusable, and instruction-smuggling payloads (the rules-file-backdoor class); a finding blocks the release before `npm publish`, not just the merge. | qual | `.github/workflows/publish-npm.yml#lint_agent_security` | ✅ |
48
- | 275 skills. | quant | `src/scripts/check_artefact_count_messaging.ts#Artefact-count messaging gate` | ✅ |
49
+ | 278 skills. | quant | `src/scripts/check_artefact_count_messaging.ts#Artefact-count messaging gate` | ✅ |
49
50
  | Removes only its own keys from a shared host config (matched by JSON-pointer + SHA-256), never a neighbour tool's entries. | qual | `docs/contracts/install-layout.md#JSON-pointer` | ✅ |
51
+ | On the A3 orchestration eval (deterministic verify, measured token deltas), the production-validator subagent returned the correct verdict on both fixtures — NOT READY with the exact `file:line` citation on a planted hollow implementation, READY with zero spurious findings on the clean control — while consuming ~45k fewer tokens than the inline-host baseline on each task. Scope: two planted fixtures on a Claude Code host, not a broad hit-rate. | quant | `internal/bench/orchestration/pv-a3-results.md#token_delta_provenance: measured` | ✅ |
50
52
 
51
- **21 backed claim(s)** — all evidence pointers resolve in CI.
53
+ **23 backed claim(s)** — all evidence pointers resolve in CI.
52
54
 
53
55
  Artefact counts in public prose (skills, commands, governed rules,
54
56
  guidelines, personas) are **generated from source and CI-drift-checked**:
@@ -77,11 +79,11 @@ shipping theater; the full per-cell data is committed at
77
79
  `internal/bench/reports/persona-placebo.json`.
78
80
 
79
81
  **Behavioural-eval coverage — the honest baseline.** Skill *quality* is only
80
- as good as its measurement. Today **42 of 275** skills carry a behavioural
82
+ as good as its measurement. Today **42 of 278** skills carry a behavioural
81
83
  `evals.json`; the highest-traffic / highest-cost tiers (default-surface +
82
84
  `rich` + routers) are **fully covered (35 of 35)**, the long tail
83
- (7 of 240) is not. We publish that gap rather than imply
84
- "275 evaluated skills": coverage is measured per tier
85
+ (7 of 243) is not. We publish that gap rather than imply
86
+ "278 evaluated skills": coverage is measured per tier
85
87
  (`./scripts-run src/scripts/skill_eval_coverage`), **CI-ratcheted so it can
86
88
  only rise**, and the priority tiers carry a hard **tier floor**: every
87
89
  rich / default-surface / router skill MUST have a behavioural eval or an
@@ -152,6 +154,8 @@ that (`task check-comparison`), so this column can never lie.
152
154
  | Capability/benchmark results are published — including the runs where the package changed nothing. | [`docs/benchmark.md`](../docs/benchmark.md) | 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. | ✅ |
153
155
  | Every public claim binds to machine-checked evidence. | [`docs/CLAIMS.md`](../docs/CLAIMS.md) | Marketing claims in this category are not bound to a machine-checked ledger a reader can reproduce. | ✅ |
154
156
  | Skills publish their own known limits, each with a witness test. | [`tests/scripts/witness/check_refs_relative_gap.test.ts`](../tests/scripts/witness/check_refs_relative_gap.test.ts) | Published known-limitation surfaces backed by reproducing tests are not a standard artifact in this category. | ✅ |
157
+ | 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. | [`internal/bench/orchestration/pv-a3-results.md#token_delta_provenance: measured`](../internal/bench/orchestration/pv-a3-results.md) | 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. | ✅ |
158
+ | 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. | [`internal/bench/reports/persona-placebo.json#honest-null`](../internal/bench/reports/persona-placebo.json) | Named-persona prompts are shipped as a feature across the category without a published A/B separating identity from method. | ✅ |
155
159
 
156
160
  ## 5. Verify it yourself
157
161
 
@@ -37,6 +37,20 @@ no-op** (never a failing check) — exactly the `cross-model-canary.yml` pattern
37
37
  `enforce: false` (advisory always returns `0` and reports the would-block
38
38
  set).
39
39
 
40
+ ## Escalation on large / claim-affecting diffs
41
+
42
+ The two in-session lenses are a floor. A **large** diff (≥ 400 changed lines
43
+ across reviewable files) or one that touches a **claim-affecting surface**
44
+ (`docs/CLAIMS.md`, `docs/proof.md`, `docs/comparison.yaml`, or `README.md`)
45
+ warrants the full `ai-council` advisor panel — a spend-bearing multi-model run.
46
+
47
+ Per blocker `self-review-gate-cost`, the paid council stays governed by the
48
+ standing spend-authorization discipline **at run time**. So the gate does not
49
+ fire council calls itself: `escalationReasons(files, changedLines)` (pure,
50
+ unit-tested) DETECTS the condition, the dry-run plan prints it, and the posted
51
+ review RECOMMENDS a maintainer `/council:pr` run. Detection is deterministic
52
+ and zero-spend; the multi-model run is the maintainer's run-time act.
53
+
40
54
  ## Arming it (maintainer, one flip)
41
55
 
42
56
  1. Add the `ANTHROPIC_API_KEY` repo secret (per-PR budget sign-off) — turns