@event4u/agent-config 15.0.0 → 16.1.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 (283) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +301 -347
  5. package/CONTRIBUTING.md +9 -0
  6. package/README.md +2 -2
  7. package/dist/agent-src/commands/analyze/inbox.md +26 -0
  8. package/dist/agent-src/commands/analyze/roadmap-repos.md +27 -0
  9. package/dist/agent-src/commands/challenge-me/closure.md +178 -0
  10. package/dist/agent-src/commands/challenge-me.md +9 -2
  11. package/dist/agent-src/commands/council/default.md +25 -5
  12. package/dist/agent-src/commands/feature/plan.md +28 -1
  13. package/dist/agent-src/commands/feature/roadmap.md +28 -1
  14. package/dist/agent-src/commands/implement-ticket.md +27 -0
  15. package/dist/agent-src/commands/jira-ticket.md +27 -0
  16. package/dist/agent-src/commands/pr/create.md +29 -0
  17. package/dist/agent-src/commands/pr/merge.md +60 -9
  18. package/dist/agent-src/commands/roadmap/ai-council.md +7 -1
  19. package/dist/agent-src/commands/roadmap/create.md +77 -29
  20. package/dist/agent-src/commands/roadmap/materialize.md +27 -0
  21. package/dist/agent-src/commands/roadmap/process-full.md +123 -18
  22. package/dist/agent-src/commands/team.md +22 -0
  23. package/dist/agent-src/contexts/authority/scope-growth-ownership.md +80 -0
  24. package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +97 -0
  25. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +44 -3
  26. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +15 -15
  27. package/dist/agent-src/contexts/execution/decision-closure-execution.md +93 -0
  28. package/dist/agent-src/contexts/execution/fix-loop-ladder.md +108 -0
  29. package/dist/agent-src/contexts/execution/plan-confidence-gate.md +4 -2
  30. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +75 -6
  31. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
  32. package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
  33. package/dist/agent-src/guidelines/design-fidelity-routing.md +29 -0
  34. package/dist/agent-src/rules/autonomous-execution.md +15 -8
  35. package/dist/agent-src/rules/delegation-policy.md +23 -45
  36. package/dist/agent-src/rules/design-fidelity.md +32 -37
  37. package/dist/agent-src/rules/evaluator-independence.md +43 -49
  38. package/dist/agent-src/rules/test-first.md +41 -0
  39. package/dist/agent-src/rules/user-interaction.md +31 -30
  40. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
  41. package/dist/agent-src/skills/ai-council/SKILL.md +11 -3
  42. package/dist/agent-src/skills/api-design/data/manifest.json +3 -3
  43. package/dist/agent-src/skills/database/data/manifest.json +4 -4
  44. package/dist/agent-src/skills/database/data/query-tuning.csv +3 -3
  45. package/dist/agent-src/skills/design-review/SKILL.md +50 -0
  46. package/dist/agent-src/skills/error-handling-patterns/SKILL.md +9 -0
  47. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -4
  48. package/dist/agent-src/skills/experiment-loop/SKILL.md +31 -1
  49. package/dist/agent-src/skills/roadmap-writing/SKILL.md +1 -1
  50. package/dist/agent-src/skills/storybook-workshop/SKILL.md +42 -3
  51. package/dist/agent-src/skills/threat-modeling/SKILL.md +9 -4
  52. package/dist/agent-src/skills/threat-modeling/data/manifest.json +4 -4
  53. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +37 -3
  54. package/dist/agent-src/templates/agent-settings.md +1 -1
  55. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  56. package/dist/agent-src/templates/roadmaps.md +188 -0
  57. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
  58. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
  59. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
  60. package/dist/cli-delegate/check_update_banner.js +40 -2
  61. package/dist/cli-delegate/chunk-4E2W63DA.js +335 -0
  62. package/dist/cli-delegate/chunk-5R7HOLAF.js +99 -0
  63. package/dist/cli-delegate/{chunk-IVBPRCQO.js → chunk-6KFEC3G7.js} +1 -1
  64. package/dist/cli-delegate/{chunk-2TAQ2K4V.js → chunk-6KM6ORRY.js} +55 -386
  65. package/dist/cli-delegate/{chunk-2XY7ILBT.js → chunk-FC75PGJE.js} +42 -2
  66. package/dist/cli-delegate/{chunk-GYC3VRYN.js → chunk-FXYUYU4N.js} +57 -13
  67. package/dist/cli-delegate/{chunk-55ACLDUE.js → chunk-GJCBB2UG.js} +168 -10
  68. package/dist/cli-delegate/{chunk-AK6HODNQ.js → chunk-HDVVGPQW.js} +873 -539
  69. package/dist/cli-delegate/chunk-NUHLI2RX.js +80 -0
  70. package/dist/cli-delegate/{chunk-HZ52BRGG.js → chunk-P6ZHP5W2.js} +15 -90
  71. package/dist/cli-delegate/{chunk-TYSY33MD.js → chunk-QJWAUMJW.js} +12 -2
  72. package/dist/cli-delegate/{chunk-57PN4GYJ.js → chunk-RGNIWTEA.js} +1 -1
  73. package/dist/cli-delegate/chunk-ROYYTEZU.js +39 -0
  74. package/dist/cli-delegate/{chunk-2KKXJW25.js → chunk-S3VFXMTM.js} +1 -1
  75. package/dist/cli-delegate/{chunk-3FKR64R5.js → chunk-UNCRJBT3.js} +31 -7
  76. package/dist/cli-delegate/{chunk-2DK2VJWG.js → chunk-WGXTVKCQ.js} +20 -6
  77. package/dist/cli-delegate/chunk-YDPILCOL.js +152 -0
  78. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  79. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  80. package/dist/cli-delegate/cmd_conformance.js +918 -325
  81. package/dist/cli-delegate/cmd_doctor.js +7 -5
  82. package/dist/cli-delegate/cmd_explain.js +5 -3
  83. package/dist/cli-delegate/cmd_export.js +9 -7
  84. package/dist/cli-delegate/cmd_fleet.js +4 -2
  85. package/dist/cli-delegate/cmd_handoff.js +6 -6
  86. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  87. package/dist/cli-delegate/cmd_migrate.js +2 -2
  88. package/dist/cli-delegate/cmd_packs_active.js +3 -2
  89. package/dist/cli-delegate/cmd_preflight.js +4 -2
  90. package/dist/cli-delegate/cmd_prune.js +10 -8
  91. package/dist/cli-delegate/cmd_route_audit.js +2 -2
  92. package/dist/cli-delegate/cmd_route_explain.js +1 -1
  93. package/dist/cli-delegate/cmd_session_recycle.js +4 -4
  94. package/dist/cli-delegate/cmd_settings_get.js +28 -2
  95. package/dist/cli-delegate/cmd_settings_migrate.js +9 -7
  96. package/dist/cli-delegate/cmd_settings_set.js +14 -1
  97. package/dist/cli-delegate/cmd_sync.js +10 -8
  98. package/dist/cli-delegate/cmd_uninstall.js +16 -13
  99. package/dist/cli-delegate/cmd_update.js +1 -1
  100. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  101. package/dist/cli-delegate/cmd_validate.js +12 -10
  102. package/dist/cli-delegate/cmd_versions.js +1 -1
  103. package/dist/discovery/deprecation-report.md +1 -1
  104. package/dist/discovery/discovery-manifest.json +87 -40
  105. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  106. package/dist/discovery/discovery-manifest.summary.md +4 -4
  107. package/dist/discovery/dormancy-report.md +1 -1
  108. package/dist/discovery/orphan-report.md +1 -1
  109. package/dist/discovery/packs.json +10 -8
  110. package/dist/discovery/trust-report.md +3 -3
  111. package/dist/discovery/workspaces.json +8 -6
  112. package/dist/hooks/dispatch.js +2601 -1073
  113. package/dist/install/claudeRuleRewrite.js +14 -3
  114. package/dist/install/conflict.js +60 -10
  115. package/dist/install/conflictTracker.js +218 -0
  116. package/dist/install/fsPrimitives.js +54 -0
  117. package/dist/install/install.mjs +2008 -1481
  118. package/dist/install/manifestFiles.js +259 -0
  119. package/dist/install/preflight.js +14 -2
  120. package/dist/install/preserve.js +157 -0
  121. package/dist/install/recordedOwnership.js +132 -0
  122. package/dist/install/txlog.js +11 -2
  123. package/dist/mcp/registry-manifest.json +3 -3
  124. package/dist/mcp/server.json +2 -2
  125. package/dist/mcp/server.mjs +1612 -667
  126. package/dist/router.json +1 -1
  127. package/dist/scripts/_lib/agent_settings.js +3 -2
  128. package/dist/scripts/_lib/fs_atomic.js +167 -0
  129. package/dist/scripts/_lib/installed_lock.js +1 -1
  130. package/dist/scripts/_lib/installed_tools.js +460 -0
  131. package/dist/scripts/_lib/lean_projection_mode.js +3 -2
  132. package/dist/scripts/_lib/settings_renamed_keys.js +78 -0
  133. package/dist/server/io/yamlIO.js +50 -0
  134. package/dist/server/routes/install.js +8 -0
  135. package/dist/server/routes/wizard.js +9 -3
  136. package/dist/server/schemas/settings.js +17 -5
  137. package/dist/shared/missionExecution.js +97 -0
  138. package/dist/ui/assets/{index-D0jaCRPM.js → index-DH1xc62v.js} +17 -17
  139. package/dist/ui/index.html +1 -1
  140. package/docs/MIGRATION.md +103 -0
  141. package/docs/contracts/settings-classes.md +26 -7
  142. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
  143. package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
  144. package/docs/guidelines/design-fidelity-routing.md +29 -0
  145. package/package.json +1 -1
  146. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
  147. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
  148. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
  149. package/src/config/agent-settings.template.yml +139 -27
  150. package/src/config/auto-rule-budget.json +16 -0
  151. package/src/config/ci-local-parity.yml +18 -5
  152. package/src/config/continuity-surface.json +28 -0
  153. package/src/config/gate-coverage.yml +146 -13
  154. package/src/config/gate-violation-baselines.json +6 -6
  155. package/src/config/hook-token-budget.json +2 -0
  156. package/src/config/host-injection-effect.json +1 -1
  157. package/src/config/loop-surfaces.yaml +215 -0
  158. package/src/config/platform-anchor.json +3 -2
  159. package/src/config/preamble-payload-budget.json +12 -7
  160. package/src/config/preamble-payload-exceptions.json +28 -0
  161. package/src/config/release-gate-locality.yml +11 -0
  162. package/src/config/routing-coverage-seed.json +18 -4
  163. package/src/config/rule-enforcement-baseline.json +0 -1
  164. package/src/install/claudeRuleRewrite.ts +16 -2
  165. package/src/install/conflict.ts +65 -9
  166. package/src/install/conflictTracker.ts +299 -0
  167. package/src/install/fsPrimitives.ts +54 -0
  168. package/src/install/manifestFiles.ts +312 -0
  169. package/src/install/preflight.ts +16 -2
  170. package/src/install/preserve.ts +205 -0
  171. package/src/install/recordedOwnership.ts +149 -0
  172. package/src/install/txlog.ts +11 -2
  173. package/src/install/types.ts +19 -4
  174. package/src/scripts/_cli/cmd_conformance.ts +88 -15
  175. package/src/scripts/_cli/cmd_doctor.ts +4 -3
  176. package/src/scripts/_cli/cmd_route_explain.ts +9 -2
  177. package/src/scripts/_cli/cmd_settings_get.ts +44 -0
  178. package/src/scripts/_cli/doctor_execution.ts +90 -0
  179. package/src/scripts/_dispatch.bash +3 -1
  180. package/src/scripts/_lib/activation_payload.ts +247 -0
  181. package/src/scripts/_lib/agent_settings.ts +4 -2
  182. package/src/scripts/_lib/authority_path.ts +102 -0
  183. package/src/scripts/_lib/base_ref_payload.ts +315 -0
  184. package/src/scripts/_lib/cascade_base.ts +94 -0
  185. package/src/scripts/_lib/changelog_eras.ts +7 -2
  186. package/src/scripts/_lib/continuation_ladder.ts +149 -2
  187. package/src/scripts/_lib/council_transport.ts +129 -0
  188. package/src/scripts/_lib/delivery_ready.ts +112 -0
  189. package/src/scripts/_lib/dropped_decision.ts +142 -0
  190. package/src/scripts/_lib/forge_protection.ts +267 -0
  191. package/src/scripts/_lib/hook_platform_keys.ts +27 -0
  192. package/src/scripts/_lib/installed_lock.ts +1 -1
  193. package/src/scripts/_lib/json_python_parity.ts +127 -0
  194. package/src/scripts/_lib/lean_projection_mode.ts +14 -3
  195. package/src/scripts/_lib/loop_surfaces.ts +382 -0
  196. package/src/scripts/_lib/measured_payload_ceiling.ts +424 -0
  197. package/src/scripts/_lib/mission_record.ts +190 -0
  198. package/src/scripts/_lib/obligation_frequency.ts +217 -0
  199. package/src/scripts/_lib/obligations.ts +402 -0
  200. package/src/scripts/_lib/orchestration_record.ts +11 -20
  201. package/src/scripts/_lib/payload_catalogue_completeness.ts +211 -0
  202. package/src/scripts/_lib/release_findings_ingest.ts +324 -0
  203. package/src/scripts/_lib/release_highlights.ts +199 -10
  204. package/src/scripts/_lib/release_holds.ts +493 -0
  205. package/src/scripts/_lib/release_migration_gate.ts +184 -0
  206. package/src/scripts/_lib/release_tag_dispatch.ts +63 -0
  207. package/src/scripts/_lib/review_baseline.ts +254 -0
  208. package/src/scripts/_lib/review_skipped_record.ts +61 -1
  209. package/src/scripts/_lib/rides_along.ts +102 -0
  210. package/src/scripts/_lib/settings_renamed_keys.ts +82 -0
  211. package/src/scripts/_lib/standing_bound_ratchet.ts +216 -103
  212. package/src/scripts/_lib/test_delta.ts +166 -0
  213. package/src/scripts/_lib/test_provenance.ts +171 -0
  214. package/src/scripts/_lib/turn_end_refusals.ts +51 -4
  215. package/src/scripts/_lib/typed_op_grant.ts +246 -0
  216. package/src/scripts/_lib/typed_op_watch.ts +185 -0
  217. package/src/scripts/ai_council/config.ts +8 -11
  218. package/src/scripts/ai_council/fallback_config.ts +5 -3
  219. package/src/scripts/ai_council/ownership_classes.ts +118 -0
  220. package/src/scripts/ask_block_census.ts +285 -15
  221. package/src/scripts/check_beta_review_markers.ts +35 -4
  222. package/src/scripts/check_enforcement_matrix.ts +624 -0
  223. package/src/scripts/check_finding_dispositions.ts +167 -16
  224. package/src/scripts/check_gate_reachability.ts +173 -10
  225. package/src/scripts/check_generator_sync.ts +954 -0
  226. package/src/scripts/check_held_object_arrivals.ts +381 -0
  227. package/src/scripts/check_preamble_payload_budget.ts +474 -124
  228. package/src/scripts/check_release_highlights.ts +33 -1
  229. package/src/scripts/check_release_holds.ts +567 -0
  230. package/src/scripts/check_release_published.ts +1 -1
  231. package/src/scripts/check_reply_consistency.ts +86 -17
  232. package/src/scripts/check_rule_projection_integrity.ts +22 -12
  233. package/src/scripts/check_test_delta.ts +294 -0
  234. package/src/scripts/check_test_weakening.ts +299 -0
  235. package/src/scripts/closure_scan.ts +333 -0
  236. package/src/scripts/compile_hook_manifest.ts +43 -3
  237. package/src/scripts/council_record_shape.ts +209 -0
  238. package/src/scripts/hook_manifest.json +1 -1
  239. package/src/scripts/hook_manifest.yaml +127 -12
  240. package/src/scripts/hooks/block_kernel_rule_writes.ts +12 -2
  241. package/src/scripts/hooks/concern_registry.ts +6 -0
  242. package/src/scripts/hooks/design_pass_hook.ts +128 -3
  243. package/src/scripts/hooks/end_review_nudge_hook.ts +101 -21
  244. package/src/scripts/hooks/evidence_independence.ts +96 -0
  245. package/src/scripts/hooks/memory_recall_hook.ts +540 -0
  246. package/src/scripts/hooks/obligation_settle_hook.ts +182 -0
  247. package/src/scripts/hooks/review_baseline_hook.ts +130 -0
  248. package/src/scripts/hooks/rule_inject_hook.ts +49 -1
  249. package/src/scripts/hooks/run_continuation_hook.ts +17 -20
  250. package/src/scripts/hooks/turn_end_gate_hook.ts +232 -14
  251. package/src/scripts/hooks_doctor.ts +89 -1
  252. package/src/scripts/hooks_status.ts +19 -0
  253. package/src/scripts/install.ts +107 -207
  254. package/src/scripts/interruption_report.ts +8 -2
  255. package/src/scripts/janitor.ts +15 -1
  256. package/src/scripts/lint_decision_classes.ts +464 -0
  257. package/src/scripts/lint_hook_manifest.ts +11 -0
  258. package/src/scripts/lint_major_migration_sections.ts +450 -0
  259. package/src/scripts/lint_plan_risk_register.ts +47 -3
  260. package/src/scripts/lint_roadmap_blockers.ts +61 -0
  261. package/src/scripts/lint_roadmap_producers.ts +202 -0
  262. package/src/scripts/measure_rule_budget.ts +101 -5
  263. package/src/scripts/measure_turn_end_gate.ts +302 -5
  264. package/src/scripts/new_roadmap.ts +37 -0
  265. package/src/scripts/orchestration_record.ts +0 -5
  266. package/src/scripts/release.ts +66 -162
  267. package/src/scripts/release_drill.ts +460 -15
  268. package/src/scripts/release_env.ts +1 -1
  269. package/src/scripts/release_publication.ts +52 -1
  270. package/src/scripts/report_enforcement_drift.ts +566 -0
  271. package/src/scripts/report_held_object_arrivals.ts +456 -0
  272. package/src/scripts/report_host_injection_effect.ts +3 -11
  273. package/src/scripts/report_standing_payload_by_host.ts +26 -152
  274. package/src/scripts/schemas/agent-settings.schema.json +23 -0
  275. package/src/scripts/schemas/command.schema.json +4 -0
  276. package/src/scripts/scope_growth.ts +219 -0
  277. package/src/scripts/sync_agent_settings.ts +140 -18
  278. package/src/scripts/trigger_eval_grandfather.json +0 -1
  279. package/src/scripts/ui_conformance_probe.ts +622 -0
  280. package/src/server/io/yamlIO.ts +48 -0
  281. package/src/server/schemas/settings.ts +31 -7
  282. package/src/shared/missionExecution.ts +126 -0
  283. package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
@@ -19,9 +19,10 @@ obligation_frequency: "per-turn"
19
19
 
20
20
  # User Interaction
21
21
 
22
- Two Iron Laws govern every reply that contains numbered options.
23
- They override conversation momentum, brevity, and the urge to defer
24
- to the user. **Missing a recommendation is a rule violation, not a slip.**
22
+ Three Iron Laws govern a decision put to the user — two on the reply that
23
+ carries it, one on what happens if the agent runs again before the answer.
24
+ They override conversation momentum, brevity, and the urge to defer to the
25
+ user. **Missing a recommendation is a rule violation, not a slip.**
25
26
 
26
27
  ## Iron Law 1 — Single-Source Recommendation
27
28
 
@@ -43,14 +44,28 @@ EVERY REPLY WITH NUMBERED OPTIONS RUNS THE SELF-CHECK. NO EXCEPTIONS.
43
44
  SKIPPING IT IS A RULE VIOLATION, NOT A SLIP.
44
45
  ```
45
46
 
46
- Mechanical backstop:
47
+ Mechanical backstop for Iron Laws 1 and 2 (non-zero exit on either), a safety
48
+ net under the self-scan rather than a replacement for it:
47
49
  `./scripts-run src/scripts/check_reply_consistency --stdin < draft.md`
48
- (non-zero exit on any rule below). Self-scan is the primary gate;
49
- the script is the deterministic safety net.
50
+ It takes a DRAFT, so it cannot see Iron Law 3, which is about a transcript.
51
+
52
+ ## Iron Law 3 — A Decision Outlives the Turn
53
+
54
+ ```
55
+ A DECISION HANDED TO THE USER STAYS LIVE UNTIL THE USER ANSWERS IT.
56
+ THE AGENT RUNS AGAIN WITHOUT AN ANSWER — HOOK CONTINUATION, NOTIFICATION,
57
+ WAKE, RETRY — AND THE BLOCK PLUS ITS RECOMMENDATION LINE ARE RE-PRESENTED
58
+ IN THE SAME FORM. A SUBORDINATE CLAUSE IS NOT A RE-PRESENTATION.
59
+ A HOOK'S CONCERN MAY BE ADDED TO A PENDING DECISION, NEVER REPLACE ONE.
60
+ ONLY THE USER CLOSES IT — BY ANSWERING, OR BY MAKING IT MOOT.
61
+ ```
62
+
63
+ Carrier: the `pending-decision` detector on `turn-end-gate`, one user turn on
64
+ one host; the rest is model-carried. Mechanics carries the measured failure.
50
65
 
51
66
  ## Question pacing — one decision point per turn
52
67
 
53
- [`ask-when-uncertain`](ask-when-uncertain.md)'s Iron Law is canonical: **one question per turn**. What counts as "one question" is **one decision point** — a single numbered-options block is ONE question even when its options span multiple dimensions (a depth-and-framework matrix answered with a single number is one decision). Multiple separate asks in one reply, or a block whose answer would need a structured reply (`1a, 2b`), violate the kernel rule's self-check.
68
+ [`ask-when-uncertain`](ask-when-uncertain.md)'s Iron Law is canonical: **one question per turn**. What counts as "one question" is **one decision point** — one numbered-options block is ONE question even when its options span several dimensions, provided a single number answers it. Multiple separate asks in one reply, or a block needing a structured reply (`1a, 2b`), violate the kernel rule's self-check.
54
69
 
55
70
  If in doubt, split into serial turns — never a long batched prompt.
56
71
 
@@ -62,33 +77,19 @@ NOT ON THE PRESENCE OF A NUMBERED LIST.
62
77
  A TRAILING FREE-TEXT OFFER IS AN ASK. A BARE YES/NO IS AN ASK.
63
78
  ```
64
79
 
65
- Measured (30-session conformance audit, 2026-08-06): **every** malformed ask was
66
- a one-line parenthetical or a trailing free-text offer — *"sag Bescheid, wenn
67
- ich die drei Zeilen mitnehmen soll"*, *"Soll ich das so umsetzen?"* — while the
68
- same sessions formatted their **large** asks perfectly. So the rule is being
69
- read as *if numbered options, then a recommendation line*. It is the other way
70
- round, and an ask that feels too small for a block is exactly the one that
71
- escapes the format. Three further caught shapes: a contentless filler option; an
72
- inline `(Empfohlen)` tag **beside** the recommendation line (the dual source
73
- Iron Law 1 forbids); an option set answerable only as `1,3,4`.
74
-
75
- **No gate ships for this.** `check_reply_consistency` can read a draft on stdin,
76
- but it inspects *numbered-option blocks* — and every measured failure had no
77
- block by construction, so it scans exactly the surface that did not fail. `conformance:behavior` deliberately does not score ask-shape,
78
- so an unmoved rate is a finding rather than a silence.
80
+ Measured (30-session audit, 2026-08-06): **every** malformed ask was a one-line
81
+ parenthetical or a trailing offer, while the same sessions formatted their
82
+ **large** asks perfectly — the ask that feels too small for a block is the one
83
+ that escapes the format. **No gate ships for this**: the backstop inspects
84
+ numbered-option blocks, and every measured failure had none. Detail: mechanics.
79
85
 
80
86
  ## Mechanics — rationale, failure modes, format details, examples
81
87
 
82
- The "why take a position", position-agnostic clause, format
83
- specification (neutral block + bolded recommendation line + caveat),
84
- no-trailing-open-question rule, "what does NOT count" catalog, full
85
- five-step pre-send self-check, named failure-mode catalog (end-of-turn
86
- menu, trailing-question hedge, no-preference hedge, multi-block reply,
87
- …), slip-handling protocol, numbered-options rules, format examples,
88
- progress indicators, and summary-table patterns all live in
88
+ The rule above is the obligation surface. Everything you look up rather than
89
+ obey — why to take a position, the format spec, the five-step self-check, the
90
+ named failure-mode catalog, slip handling, examples, progress indicators and
91
+ summary patterns — is in
89
92
  [`contexts/communication/rules-auto/user-interaction-mechanics.md`](../contexts/communication/rules-auto/user-interaction-mechanics.md).
90
- The rule above is the obligation surface; the mechanics file is the
91
- lookup material.
92
93
 
93
94
  When the user pastes large tool output, logs, JSON, or API responses,
94
95
  keep the reply narrow: extract only the relevant fields with targeted
@@ -28,7 +28,7 @@
28
28
  "refresh_cadence": "quarterly",
29
29
  "upstream": {
30
30
  "repo": "derived: W3C ARIA Authoring Practices Guide + WCAG 2.2",
31
- "sha": "APG 2026 / WCAG 2.2",
32
- "last_checked": "2026-06-07"
31
+ "sha": "APG 2026 / WCAG 2.2 (W3C Recommendation 12 Dec 2024) \u2014 verified not superseded 2026-09-18",
32
+ "last_checked": "2026-09-18"
33
33
  }
34
- }
34
+ }
@@ -271,9 +271,17 @@ Every council reply MUST contain, in this order:
271
271
  / `accept-with-modification` / `reject` / `needs-input` plus a
272
272
  one-line reason citing host evidence (file:line, ADR, contract).
273
273
  See *Critical evaluation* above.
274
- 5. **User-facing options** — numbered block per `user-interaction`,
275
- carrying the host verdict in each option, with "discard council
276
- input" always present as an option.
274
+ 5. **User-facing options — CONDITIONAL, on ownership.** A conclusive
275
+ **technical** verdict emits **no** options block: it is a resolution,
276
+ and handing it over as options routes a technical decision to a person
277
+ because it was hard (ADR-268 § 10). The block is owed when the verdict
278
+ is owner-owned (`product-owned`, `business-owned`, `destructive-owned`)
279
+ or when the council did not converge — then it is a numbered block per
280
+ `user-interaction`, carrying the host verdict in each option, with
281
+ "discard council input" always present. Convergence is read from the
282
+ record, never inferred: a record that does not say whether its members
283
+ converged is itself the finding. Checkable in both directions with
284
+ `./scripts-run src/scripts/council_record_shape <record.md>`.
277
285
 
278
286
  The host agent NEVER ships council output as its own reasoning, and
279
287
  NEVER ships the host verdict as council output. Provider attribution
@@ -28,7 +28,7 @@
28
28
  "refresh_cadence": "quarterly",
29
29
  "upstream": {
30
30
  "repo": "derived: RFC 9110/9457/7396/8288 + httpapi WG drafts",
31
- "sha": "RFC set as of 2026-06",
32
- "last_checked": "2026-06-07"
31
+ "sha": "RFC 9110 (STD 97) / 9457 / 7396 / 8288 \u2014 verified 2026-09-18: 9110 neither obsoleted nor updated; 9457 current and obsoletes 7807",
32
+ "last_checked": "2026-09-18"
33
33
  }
34
- }
34
+ }
@@ -28,8 +28,8 @@
28
28
  "owner": "package-maintainer",
29
29
  "refresh_cadence": "quarterly",
30
30
  "upstream": {
31
- "repo": "derived: PostgreSQL 16 + MySQL 8 reference docs",
32
- "sha": "PostgreSQL 16.x / MySQL 8.4 docs",
33
- "last_checked": "2026-06-07"
31
+ "repo": "derived: PostgreSQL 18 + MySQL 9.7 reference docs (previously PostgreSQL 16 + MySQL 8)",
32
+ "sha": "re-derived 2026-09-27 against PostgreSQL 18.x / MySQL 9.7: all 12 rows of query-tuning.csv still apply as written on both engines. Three rows gained a version-scoped annotation for a genuinely new capability rather than a rewrite \u2014 row 1 (Slow WHERE on large table) notes PG18's B-tree skip scan, which relaxes the equality-first composite-index rule on PG18+ only; row 5 (JOIN explosion) notes MySQL 9.7's Hypergraph Optimizer, now GA in Community Edition, improving join-order choices automatically; row 12 (JSON column filtering) notes that PG18 flips the GENERATED-column default from STORED to VIRTUAL, and VIRTUAL columns are not indexable, so STORED must now be explicit. PostgreSQL 16.x and MySQL 8.4 remain supported and the patterns apply there unchanged",
33
+ "last_checked": "2026-09-18"
34
34
  }
35
- }
35
+ }
@@ -1,13 +1,13 @@
1
1
  Symptom,Keywords,Root Cause,Strategy,Code Good,Anti-Pattern,Verification,Severity
2
- Slow WHERE on large table,slow query where filter full scan seq scan,Sequential scan despite selective predicate,B-tree index on the filtered column(s); composite index ordered by equality-first then range,"CREATE INDEX idx_orders_status_created ON orders (status, created_at)",Indexing low-cardinality boolean alone; composite ordered range-first,EXPLAIN (ANALYZE) shows Index Scan; rows estimate ≈ actual,HIGH
2
+ Slow WHERE on large table,slow query where filter full scan seq scan,Sequential scan despite selective predicate,B-tree index on the filtered column(s); composite index ordered by equality-first then range (PostgreSQL 18+: skip scan lets the planner use later columns without a leading-column equality predicate — MySQL and pre-18 Postgres still need equality-first ordering),"CREATE INDEX idx_orders_status_created ON orders (status, created_at)",Indexing low-cardinality boolean alone; composite ordered range-first,EXPLAIN (ANALYZE) shows Index Scan (PG 18+: or Index Searches for a skip scan); rows estimate ≈ actual,HIGH
3
3
  ORDER BY ... LIMIT slow,order by limit sort top n latest,Sort node over the whole table for a top-N query,Index matching the ORDER BY direction (including DESC/NULLS) so LIMIT walks the index,CREATE INDEX idx_events_created_desc ON events (created_at DESC),OFFSET pagination for infinite feeds (use keyset),Plan shows Index Scan Backward / no Sort node,HIGH
4
4
  N+1 query loop,n+1 loop per row lazy load orm repeated query,Hundreds of identical queries differing only by id,Eager-load relations / batch with IN(...) or JOIN; dataloader pattern at the API layer,SELECT * FROM comments WHERE post_id IN (...),Fixing with a cache instead of the access pattern,Query count per request flat vs item count,HIGH
5
5
  LIKE '%term%' search,like contains search wildcard fulltext,Leading-wildcard LIKE can't use B-tree,Trigram index (pg_trgm GIN) or full-text search (tsvector + GIN); dedicated engine beyond ~10M rows,CREATE INDEX idx_users_name_trgm ON users USING gin (name gin_trgm_ops),Forcing LOWER() without an expression index,Plan shows Bitmap Index Scan on the GIN index,MEDIUM
6
- JOIN explosion,join many tables slow hash join nested loop,Mis-estimated join order / missing join keys index,Index every FK used in joins; verify row estimates; break monster joins into CTE/temp stages when estimates collapse,ANALYZE tables; index fk columns,Disabling nested loops globally; hint-chasing before stats are fresh,Estimates within ~10x of actuals at every join node,HIGH
6
+ JOIN explosion,join many tables slow hash join nested loop,Mis-estimated join order / missing join keys index,Index every FK used in joins; verify row estimates; break monster joins into CTE/temp stages when estimates collapse (MySQL 9.7: the Hypergraph Optimizer is now GA in Community Edition and can materially improve join-order choices on its own — verify estimates before assuming a manual rewrite is still needed),ANALYZE tables; index fk columns,Disabling nested loops globally; hint-chasing before stats are fresh,Estimates within ~10x of actuals at every join node,HIGH
7
7
  Aggregation over millions of rows,group by count sum report aggregate slow,Repeated full-table aggregation for dashboards,Pre-aggregate: materialized view / rollup table refreshed on schedule or trigger; partial indexes for hot subsets,CREATE MATERIALIZED VIEW daily_rev AS ... REFRESH CONCURRENTLY,Caching in app memory only (cold-start storms),"Dashboard reads hit the rollup, not base tables",MEDIUM
8
8
  Pagination deep offset,offset page 10000 slow deep pagination,OFFSET N scans+discards N rows,Keyset/cursor pagination on a unique ordered key,"WHERE (created_at,id) < (:c,:i) ORDER BY created_at DESC,id DESC LIMIT 20",Hiding offset behind a 'page' param and capping at 1000 as a fix,p99 latency flat across page depth,HIGH
9
9
  Write contention / lock waits,deadlock lock wait contention update hot row,"Hot-row updates serialize (counters, balances)",Row-level design: ledger inserts over UPDATE-in-place; batch with SKIP LOCKED queues; keep transactions short,SELECT ... FOR UPDATE SKIP LOCKED for workers,Retrying deadlocks blindly without ordering writes,Lock wait time ~0 under load test; deadlock rate 0,HIGH
10
10
  Missing/stale statistics,wrong plan estimate stale statistics analyze,Optimizer estimates wildly off → bad plans,Auto-analyze tuned for big tables; manual ANALYZE after bulk loads; extended statistics for correlated columns,"CREATE STATISTICS s_dist (dependencies) ON city,country FROM addr",Hinting every query instead of fixing stats,Plan estimates ≈ actuals after ANALYZE,MEDIUM
11
11
  Over-indexing writes,insert slow many indexes write amplification,Each extra index taxes every INSERT/UPDATE,Audit with index-usage stats; drop unused; covering index to replace several near-duplicates,pg_stat_user_indexes idx_scan = 0 candidates,Adding an index per slow query without retiring old ones,Write p95 recovers; no unused-index rows,MEDIUM
12
12
  SELECT * over wide rows,select star wide row toast network payload,Fetching unused columns (TOAST/LOB) dominates IO,Project needed columns; covering index enables index-only scans,"SELECT id,status,total FROM orders ...",Compressing payloads instead of trimming the select list,Plan shows Index Only Scan where applicable,LOW
13
- JSON column filtering,json jsonb attribute filter schemaless,Filtering inside JSON without index = full scan,"GIN index on jsonb path ops, or generated column + B-tree for hot keys",ALTER TABLE t ADD COLUMN status text GENERATED ALWAYS AS (doc->>'status') STORED; CREATE INDEX ...,Stuffing relational data into one JSON blob,Plan uses the GIN/generated-column index,MEDIUM
13
+ JSON column filtering,json jsonb attribute filter schemaless,Filtering inside JSON without index = full scan,"GIN index on jsonb path ops, or generated column + B-tree for hot keys",ALTER TABLE t ADD COLUMN status text GENERATED ALWAYS AS (doc->>'status') STORED; CREATE INDEX ...; -- PG18+: STORED must be explicit (default flipped to VIRTUAL — not indexable),Stuffing relational data into one JSON blob; relying on the pre-PG18 STORED default,Plan uses the GIN/generated-column index,MEDIUM
@@ -234,6 +234,56 @@ THE Q1-Q6 FLOOR SET IS IDENTICAL IN ALL FOUR MODES.
234
234
  Do not re-derive any of these fields here. This skill is a declared consumer of
235
235
  that object, and the contract's consumer table names it.
236
236
 
237
+ ## Fidelity proof — the chapter matrix
238
+
239
+ ```
240
+ A 1:1 CLAIM IS PROVEN BY A COMMITTED MATRIX, NEVER BY A GREEN SUITE.
241
+ ONE ROW PER HANDOVER CHAPTER. ONE EVIDENCE KIND PER ROW. NO EMPTY CELL.
242
+ A BEHAVIOR TEST ANSWERS "DOES IT WORK", NOT "DOES IT MATCH".
243
+ ```
244
+
245
+ This discharges [`design-fidelity`](../../rules/design-fidelity.md)'s proof
246
+ clause. It fires when a numbered handover is the spec — chapters like
247
+ `10-datenmodell-api.md` … `46-roadmap-achse-randtage.md`, each an abgegrenzter
248
+ contract. Such a handover is already a checklist; the failure it prevents is
249
+ reading it and never working it as one.
250
+
251
+ **Build the matrix from the handover's own numbering**, one row per chapter:
252
+
253
+ | Chapter | Claim it makes | Evidence | Status |
254
+
255
+ **Evidence is exactly one of four kinds**, and the row names which:
256
+
257
+ 1. **Element-scoped screenshot baseline** — `toHaveScreenshot` on the component,
258
+ not the page. Built into Playwright via pixelmatch, so no new dependency
259
+ ([`playwright-testing`](../playwright-testing/SKILL.md)). Mask dynamic
260
+ content (timestamps, running numbers, ids) or the baseline flakes on data
261
+ rather than on design.
262
+ 2. **`toHaveCSS` assertion on the value the chapter names** — the right kind
263
+ when the chapter states a token, a spacing step or a color rather than a
264
+ shape.
265
+ 3. **Behavior spec with a sensitivity probe** — legitimate where the chapter
266
+ describes an interaction. The probe is not optional: neutralise the
267
+ mechanism, watch the spec go red, restore it. A spec never seen red has
268
+ unknown sensitivity and is not evidence.
269
+ 4. **Explicitly not implemented, with the reason** — a real row, not a gap. An
270
+ honest `not implemented` is what makes the other three trustworthy.
271
+
272
+ **The matrix is committed**, not written into a reply. A matrix that lives in a
273
+ chat message dies with the session, which is the difference between a method and
274
+ an artifact — and the whole reason this section exists rather than a paragraph
275
+ telling a reviewer to be thorough.
276
+
277
+ **The staleness trap.** A new handover version ships and the baselines stay
278
+ pinned to the old one, so every screenshot row passes against a reference nobody
279
+ uses any more. Check the baseline timestamps against the handover's own
280
+ CHANGELOG before reading a green matrix as a pass.
281
+
282
+ **What the matrix does not do.** It records what was compared, never that the
283
+ comparison was honest — nothing in this tree reads a handover, so a row naming
284
+ evidence nobody took looks exactly like one naming evidence that was. The
285
+ control is that a reviewer can open it.
286
+
237
287
  ## Review independence — two passes, isolated, in this order
238
288
 
239
289
  ```
@@ -79,6 +79,15 @@ Every produced error must carry: `code` (stable string), `message` (human-readab
79
79
 
80
80
  Forbidden: secrets, raw SQL, full stack traces in user-facing surfaces, internal class names leaked through API boundaries.
81
81
 
82
+ **"User-facing" means PRODUCTION, and the missing half of that sentence cost a real failure.** Read without the qualifier — as it stood until 2026-09-11 — this clause forbids the developer's own diagnostics in their own dev environment, which is the opposite of what it is for. The measured consequence, reported by the maintainer: a feature whose detail view crashed on open and showed a blank region, so neither the developer nor the agent could see *what* was missing, and the failure had to be reconstructed by hand.
83
+
84
+ | Environment | What a failed render or request shows |
85
+ |---|---|
86
+ | local / dev / preview | the **full** diagnostic, visibly: what was expected, what arrived, which field or endpoint, the stack. A toast, an error overlay, an inline panel — anything the developer cannot miss. Silence here is the defect. |
87
+ | production | the sanitized payload above, plus a correlation id the developer can look up. Never the stack. |
88
+
89
+ **A blank page is never an acceptable failure mode in dev.** If a component cannot render because data is missing or a contract changed, it says so on screen in dev and degrades to a stated empty/error state in production — never to nothing. That is the same obligation the four completeness rows in [`ai-code-blindspots`](../ai-code-blindspots/SKILL.md) put on the render surface, stated here for the error path that reaches it.
90
+
82
91
  ### Step 5 — Define the boundary
83
92
 
84
93
  Exactly **one** layer translates internal errors to the egress format (HTTP status + body, queue requeue policy, CLI exit code). Anywhere else doing this duplication is the bug.
@@ -163,10 +163,20 @@ Read `components.json` for the registered style + base color, then read the `pac
163
163
  ### 4b. Prefer a live Storybook read over the hand-read inventory — when one is running
164
164
 
165
165
  When the project carries `@storybook/addon-mcp` **and** a Storybook is running, query it
166
- instead of reading files: `list-all-documentation` for the inventory, then `get-documentation`
167
- for the components that matter. **The live read wins; the hand-read inventory of step 4 is the
168
- fallback and is never removed** — an agent that cannot reach a running Storybook must still be
169
- able to inventory the library. The channel disappearing is normal, not an error.
166
+ instead of reading files: `docs-list` for the inventory, then `docs-show` for the components
167
+ that matter. **The live read wins; the hand-read inventory of step 4 is the fallback and is
168
+ never removed** — an agent that cannot reach a running Storybook must still be able to
169
+ inventory the library. The channel disappearing is normal, not an error.
170
+
171
+ **The names are version-bound, and these are the current ones.** Own derivation, from a
172
+ throwaway `npm install` on 2026-09-13, not from any document: at `@storybook/addon-mcp@10.6.0`
173
+ the docs tools are registered by `storybook`'s own `createDocsToolset` under the method ids
174
+ `docs.list` / `docs.show` / `docs.showStory`, and `toMcpToolName` renders those as `docs-list`,
175
+ `docs-show` and `docs-show-story`. The older `list-all-documentation` / `get-documentation` were
176
+ the literal names at `@storybook/addon-mcp@0.7.0` (via `@storybook/mcp@0.8.0`); at 10.6.0 they
177
+ survive only as the tools' human-readable **titles**. There is no 10.5.x of the addon — it goes
178
+ 0.7.0 → 10.6.0 — so a project on the current scaffold gets the `docs-*` names. If a live
179
+ `tools/list` disagrees, the live read wins over this paragraph.
170
180
 
171
181
  **React-only while the toolset is in preview.** Storybook's own MCP FAQ (docs **10.5**,
172
182
  `docs/ai/mcp/overview` § FAQ) states the documentation toolset supports React only during
@@ -91,7 +91,37 @@ twice, leaving the branch one iteration ahead of its own record.
91
91
  1. **The register path**, and the iteration count actually run against the bound.
92
92
  2. **A metric line**: baseline → final, and the number of keeps versus reverts.
93
93
  3. **The exit condition that fired**, named — bound reached, or exit signal.
94
- 4. **Every reverted iteration listed** with its reason. A revert is a result the
94
+ 4. **A `run_terminal` value** — the exit in the vocabulary every other loop in
95
+ this tree reports in, so a reader can count this run's stop alongside the
96
+ continuation hook's and the self-fix lanes' without a per-surface
97
+ translation table.
98
+
99
+ | exit condition | `run_terminal` |
100
+ |---|---|
101
+ | `score >= target` — the run had a destination and reached it | `success` |
102
+ | `iterations_run >= max_iterations` — the declared bound | `exhausted` |
103
+ | `consecutive_reverts >= N` — the exit signal fired | `stagnated` |
104
+ | the evaluator was red on the unchanged tree, so no iteration ran | `clean-no-op` |
105
+ | the run stopped on a missing precondition (metric unreadable, verifier absent) | `blocked` |
106
+
107
+ The value set is `RunTerminalState` — `success`, `clean-no-op`, `blocked`,
108
+ `approval-required`, `exhausted`, `stagnated`, `premise-invalidated` —
109
+ declared once at `src/scripts/_lib/outcome_vocabularies.ts`
110
+ (`RUN_TERMINAL_STATES`) and described in
111
+ [`terminal-states`](../../agent-src/contexts/execution/terminal-states.md).
112
+ A new exit condition maps onto an existing member or it is not a terminal
113
+ state; never invent a value here.
114
+
115
+ `exhausted` and `stagnated` stay distinct on purpose. This skill's own pivot
116
+ ladder already treats them differently — a spent bound may deserve a larger
117
+ one, while consecutive reverts mean the hypothesis class is done and route to
118
+ the ladder instead. Reporting both as "stopped" throws away the part that
119
+ decides what happens next.
120
+
121
+ Reaching the bound is a normal exit, not a failure, and `exhausted` does not
122
+ say otherwise — it says where the run stopped, never whether it was worth
123
+ running. A published null is still a result.
124
+ 5. **Every reverted iteration listed** with its reason. A revert is a result the
95
125
  next run needs, not noise to summarise away.
96
126
 
97
127
  ## Gotcha
@@ -191,7 +191,7 @@ the owner can decide in one sitting: one option named and why, what the delay
191
191
  costs, a command or path per option rather than prose, and an offer to walk
192
192
  them through it. Ratcheted by `lint_roadmap_blockers`. Full shape:
193
193
  [`templates/roadmaps.md` rule 20](../../agent-src/templates/roadmaps.md).
194
- Omit it entirely when there is no such gate; run the § 4c gate-test first.
194
+ Omit it entirely when there is no such gate; run the § 4c gate-test first. A **hold** is the publication-side twin — a blocker stops execution, a hold stops publication; ask once whether an intermediate tree state must stay unpublished (default **no**; roadmap incompleteness never is one), walk `re-sequence → guard → hold`, and record the avoided outcome as well as the taken one, per [`templates/roadmaps.md` rule 28](../../agent-src/templates/roadmaps.md) and the § 5c self-check in [`/roadmap:create`](../../domains/product-basic/roadmap/create/command.md).
195
195
 
196
196
  ### 5c. Risk review (Gate R1) — after draft, before save
197
197
 
@@ -52,6 +52,43 @@ single prop's effect because every value is co-present. Split it, one axis per s
52
52
  Stories render under the **same semantic tokens** as the app and the `.dark` class; a
53
53
  hardcoded preview theme makes the workshop lie about what the component looks like in place.
54
54
 
55
+ ### The five behavioral stories — assert a value, never an image
56
+
57
+ `Hover`, `Focus`, `Active`, `Keyboard` and `ReducedMotion` join the set above, and they
58
+ carry one extra rule: **each asserts a resolved computed style or a handler effect, never a
59
+ screenshot.** A component that owes a state checklist and proves it with a pixel diff has
60
+ not proved it — a screenshot is a resting frame, and none of these five is a resting frame.
61
+
62
+ | Story | Drive | Assert |
63
+ |---|---|---|
64
+ | `Hover` | `userEvent.hover(el)` | the resolved property the hover rule is supposed to change actually changed |
65
+ | `Focus` | focus the element | the `:focus` styles resolve as intended |
66
+ | `Keyboard` | `userEvent.tab()` until the element is active | a visible `:focus-visible` indicator resolves — programmatic focus does **not** set it in Chromium, so a `.focus()` call reports a real focus ring as absent |
67
+ | `Active` | press and hold | what pressing adds **on top of hover** — a pointer cannot press without hovering, so asserting against the resting style makes one removed hover rule fail two stories |
68
+ | `ReducedMotion` | emulate `prefers-reduced-motion: reduce` | what the surface presents *instead of* the motion, per [`accessibility-auditor`](../accessibility-auditor/SKILL.md) § 2 — not that the media block exists |
69
+
70
+ The `Active` and `Keyboard` rows are not style advice. Both are measured failure modes from
71
+ building the probe that backs this set, recorded here so the next author does not rediscover
72
+ them: the first produced a duplicate finding for a single defect, the second reports a focus
73
+ ring that is present as missing.
74
+
75
+ ### Responsive rows — one row per declared breakpoint
76
+
77
+ Beside the state stories, each responsive component owes a row per declared breakpoint
78
+ (1440 / 768 / 375 / 320) asserting **the layout property that is supposed to change there** —
79
+ `flex-direction`, `grid-template-columns`, `display`. One row per breakpoint, not one per
80
+ property: a single media rule usually moves several properties at once, and one finding each
81
+ counts one defect several times.
82
+
83
+ **Where a workshop is absent, this set is still assertable.** These stories are a contract
84
+ about what is asserted, not about a particular runner — the `ui_conformance_probe` script
85
+ exercises the same five states and the same breakpoint rows against a file URL. It and its
86
+ sensitivity fixture live in the package repository and are **not** shipped to consumers,
87
+ which is why both are named rather than linked: a path to either resolves nowhere in an
88
+ install. The fixture is the evidence for the two sensitivity claims above — removing one
89
+ hover rule turns exactly the hover assertion red and nothing else, and removing one media
90
+ rule turns exactly the matching breakpoint row red.
91
+
55
92
  ## JSDoc `@summary` is required, and the reason is mechanical
56
93
 
57
94
  The manifest an agent reads **truncates descriptions**. A component whose summary is a
@@ -81,7 +118,7 @@ files otherwise — and only then decide whether anything needs writing.
81
118
  1. **Inspect the existing story set before authoring anything.** Read what the library
82
119
  already has — via the MCP channel below when it is available, otherwise by reading the
83
120
  story files — and check the component against it by name and by shape.
84
- - **Source of truth:** the story files, or `list-all-documentation` over a running Storybook.
121
+ - **Source of truth:** the story files, or `docs-list` over a running Storybook.
85
122
  - **Verify:** the component you are about to write does not already exist under another name.
86
123
  2. **One story per concept**, named from the state set above.
87
124
  - **Verify:** no story name joins two axes with `And`.
@@ -142,10 +179,12 @@ up yet"*, so its presence is not evidence the channel works.
142
179
 
143
180
  When the project has `@storybook/addon-mcp` **and** a running Storybook,
144
181
  [`existing-ui-audit`](../existing-ui-audit/SKILL.md) prefers the live tools —
145
- `list-all-documentation`, then `get-documentation` for the components that matter — over the
182
+ `docs-list`, then `docs-show` for the components that matter — over the
146
183
  hand-read inventory. **The live read wins; the file read is the fallback**, and the fallback
147
184
  is never removed: an agent that cannot reach a running Storybook must still be able to
148
- inventory the library.
185
+ inventory the library. The tool names are version-bound and were re-derived from a throwaway
186
+ installation on 2026-09-13 — [`existing-ui-audit`](../existing-ui-audit/SKILL.md) § 4b carries
187
+ the derivation and the version boundary; do not restate it here.
149
188
 
150
189
  **React-only while in preview.** Storybook's own MCP FAQ (docs 10.5) states the documentation
151
190
  toolset supports React only during preview, so Vue, Angular, and Web Components take the
@@ -25,8 +25,8 @@ triggers:
25
25
  > "<surface description>"` returns the surface class, ATT&CK/CWE-cited
26
26
  > threats, required controls, and negative tests, with confidence +
27
27
  > evidence-gap. Propose grounded findings; the human confirms. Corpus:
28
- > [`data/threats.csv`](data/threats.csv) (MITRE ATT&CK v16 / OWASP
29
- > ASVS-derived, owner + cadence in the manifest).
28
+ > [`data/threats.csv`](data/threats.csv) (MITRE ATT&CK v19.x / OWASP
29
+ > ASVS 5.0.0-derived, owner + cadence in the manifest).
30
30
 
31
31
  > You are a reviewer specialized in **pre-implementation threat analysis**.
32
32
  > Your only job is to produce a compact threat model for a planned change —
@@ -215,8 +215,13 @@ run tests**.
215
215
  *Threat Modeling: Designing for Security* (2014). Framing basis for the
216
216
  Actors / Assets / Entry Points / Trust Boundaries / Abuse Cases rubric.
217
217
  [learn.microsoft.com/en-us/security/engineering/threat-modeling-tool-threats](https://learn.microsoft.com/en-us/security/engineering/threat-modeling-tool-threats)
218
- - **OWASP ASVS v4.0.3** — Authorization (V4), Validation & Encoding (V5),
219
- Session Management (V3) — default baseline for "Missing control" entries.
218
+ - **OWASP ASVS v5.0.0** — Authorization (V8), Encoding and Sanitization (V1)
219
+ + Validation and Business Logic (V2), Session Management (V7) — default
220
+ baseline for "Missing control" entries. Renumbered from 4.0.3's V4/V5/V3
221
+ per the standard's own 4.0→5.0 migration guide (`5.0/en/0x05-For-Users-Of-4.0.md`
222
+ in the ASVS repo) — 5.0.0 splits the old V5 Validation/Sanitization/Encoding
223
+ chapter into separate Encoding-and-Sanitization and Validation-and-Business-Logic
224
+ chapters, and drops direct CWE/NIST cross-mappings from the requirements.
220
225
  [owasp.org/www-project-application-security-verification-standard/](https://owasp.org/www-project-application-security-verification-standard/)
221
226
  - **OWASP Top 10 2021** — A01 Broken Access Control, A04 Insecure Design,
222
227
  A05 Security Misconfiguration — cross-reference when naming abuse cases.
@@ -76,8 +76,8 @@
76
76
  "owner": "package-maintainer",
77
77
  "refresh_cadence": "quarterly",
78
78
  "upstream": {
79
- "repo": "derived: MITRE ATT&CK + CWE + OWASP API Top 10 / ASVS 4.0",
80
- "sha": "ATT&CK v16 / ASVS 4.0.3",
81
- "last_checked": "2026-06-07"
79
+ "repo": "derived: MITRE ATT&CK + CWE + OWASP API Top 10 / ASVS 5.0",
80
+ "sha": "re-derived 2026-09-27 against ATT&CK v19.x and ASVS 5.0.0: every ATT&CK id cited in threats.csv's Source Refs column (T1110, T1563, T1105, T1090, T1499, T1552, T1552.001, T1190, T1078.004) resolves in the current Enterprise matrix and none is deprecated or revoked \u2014 threats.csv itself carries no ASVS identifiers, so there is nothing to remap there. SKILL.md's References section cited ASVS 4.0.3's V3/V4/V5 by the old numbering; updated to 5.0.0's V7 Session Management, V8 Authorization, and V1 Encoding and Sanitization + V2 Validation and Business Logic, per the standard's own 4.0\u21925.0 migration guide",
81
+ "last_checked": "2026-09-18"
82
82
  }
83
- }
83
+ }
@@ -83,7 +83,15 @@ regressions are detectable. Pick the verdict commands per the project's
83
83
 
84
84
  Each iteration is agent turns, never executing control-flow code:
85
85
 
86
- 1. **Generate / revise** — make the smallest change toward the contract.
86
+ 1. **Read the failure, then revise** — before changing a line, inspect what the
87
+ previous run actually reported: which checks failed, the assertion text, and
88
+ whether this failure signature matches the last one. Analyze the existing
89
+ code path the failing check exercises rather than pattern-matching the error
90
+ string. A revision written without reading the failure is the blind retry
91
+ both the plateau rule below and
92
+ [`autonomous-execution`](../../rules/autonomous-execution.md) exist to stop —
93
+ and on attempt 1 there is no previous run, so this is the baseline green set
94
+ from step 1. Then make the smallest change toward the contract.
87
95
  2. **Run** — execute the verdict commands; parse the **structured** result
88
96
  (counts green/total, which checks failed). This is one tool call, read in
89
97
  context.
@@ -183,6 +191,7 @@ verify-repair-loop
183
191
  Contract: <one-line requirement> · threshold <X> · allow_regressions false
184
192
  Attempts: <k>/<max> scores: [s1, s2, …] stop: threshold|plateau|cap|regression|reject
185
193
  Verdict: DONE | DONE_WITH_CONCERNS | BLOCKED
194
+ run_terminal: success | blocked | exhausted | stagnated
186
195
  Judge: <judge skill> → apply|revise|reject
187
196
  Evidence: <green/total> · regressions: none | <named checks>
188
197
  ```
@@ -193,9 +202,34 @@ Required fields (ordered):
193
202
  2. **Attempts** — `k/max`, the score history, and the exact stop reason
194
203
  (`threshold` / `plateau` / `cap` / `regression` / `reject`).
195
204
  3. **Verdict** — `DONE`, `DONE_WITH_CONCERNS`, or `BLOCKED`.
196
- 4. **Judge** — the dispatched judge skill and its `apply` / `revise` /
205
+ 4. **run_terminal** — this loop's stop in the vocabulary every other loop in
206
+ this tree reports in. The verdict above is local to this skill; this field is
207
+ the one a reader can aggregate across the continuation hook, the self-fix
208
+ lanes and this loop without a per-surface translation table.
209
+
210
+ | stop reason | `run_terminal` | why |
211
+ |---|---|---|
212
+ | `threshold` (judge `apply`) | `success` | the contract is met |
213
+ | `cap` | `exhausted` | the attempt budget ran out — a bigger budget might help |
214
+ | `plateau` | `stagnated` | scores stopped moving — a bigger budget will not help |
215
+ | `regression` | `blocked` | a baseline-green check broke; the loop must not proceed |
216
+ | `reject` | `blocked` | the judge refused the work |
217
+
218
+ The value set is `RunTerminalState`, whose members are `success`,
219
+ `clean-no-op`, `blocked`, `approval-required`, `exhausted`, `stagnated` and
220
+ `premise-invalidated`. It is declared once, at
221
+ `src/scripts/_lib/outcome_vocabularies.ts` (`RUN_TERMINAL_STATES`), and
222
+ described in [`terminal-states`](../../agent-src/contexts/execution/terminal-states.md).
223
+ Never emit a value outside that set: a sixth stop reason maps onto an
224
+ existing member or it is not a terminal state.
225
+
226
+ `exhausted` and `stagnated` are deliberately distinct. Both mean "stopped
227
+ without a green", and they call for opposite responses — raise the budget
228
+ against the first, change approach against the second. Collapsing them loses
229
+ the only part of the stop a reader can act on.
230
+ 5. **Judge** — the dispatched judge skill and its `apply` / `revise` /
197
231
  `reject` verdict (omit only when the loop stopped before escalation).
198
- 5. **Evidence** — final `green/total` and any regressed checks by name.
232
+ 6. **Evidence** — final `green/total` and any regressed checks by name.
199
233
 
200
234
  ## Examples
201
235
 
@@ -654,7 +654,7 @@ the canonical narrative lives in
654
654
  | `commands.create_pr.api_paths` | glob list | `[]` | Optional globs pinning API-endpoint detection; empty = light heuristic, fail-open. |
655
655
  | `verbosity.preview_artifacts` | `true`, `false` | `false` | Show generated commit messages, PR titles/bodies, branch names before acting. `false` = use generated content directly. See the token-frugality plate under `agents/roadmaps/` (Phase 2/3). |
656
656
  | `verbosity.routine_confirmations` | `true`, `false` | `false` | Confirmation prompts for routine workflow steps when there is one obvious answer ("looks good — commit?"). Iron-Law gates (`commit-policy`, `scope-control` git-ops, `non-destructive-by-default`) ALWAYS ask regardless. |
657
- | `verbosity.offer_council_in_delivery` | `true`, `false` | `false` | Offer "run AI Council on this?" inside delivery commands (`/feature-plan`, `/review-changes`, `/roadmap-create`). Council commands themselves are unaffected. |
657
+ | `verbosity.offer_council_in_delivery` | `true`, `false` | `false` | Offer "run AI Council on this?" inside delivery commands (`/feature-plan`, `/review-changes`). Council commands themselves are unaffected. `/roadmap:create` no longer reads it — under a mission the council is a step, resolved from `agent-config council:status`, never an offer. |
658
658
  | `verbosity.post_action_reports` | `off`, `minimal`, `full` | `minimal` | Multi-line status / summary blocks after a successful action. `off` = no report; `minimal` = one-line confirmation; `full` = bullet list. |
659
659
  | `verbosity.intent_announcements` | `true`, `false` | `false` | Intent announcements ("Let me check…", "Now I will…", "Found it") in skill bodies. `false` = act and emit the result. |
660
660
  | `telegraph.speak` | `true`, `false` | `false` | Whether the telegraph-speak rule ships at all. `false` (default) = dormant: the projector omits the rule from `dist/router.json`, so its body never reaches a host. The rule body states its own grammar scope and carve-outs (numbered options, Iron-Law literals, code, paths), so this is the only lever. |
@@ -39,7 +39,7 @@ schema_version: 1
39
39
  # CI guard: a release bump of `package.json` must update this value
40
40
  # in lockstep — see scripts/check_template_pin_drift.ts (road-to-
41
41
  # portable-runtime-and-update-check P3.3).
42
- agent_config_version: "15.0.0"
42
+ agent_config_version: "16.1.0"
43
43
 
44
44
  # --- Project identity ---
45
45
  project: