@event4u/agent-config 14.12.0 → 14.13.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 (466) 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 +234 -0
  5. package/CONTRIBUTING.md +38 -0
  6. package/CREDITS.md +135 -0
  7. package/NOTICE +13 -0
  8. package/README.md +8 -6
  9. package/dist/agent-src/commands/analyze/inbox.md +109 -2
  10. package/dist/agent-src/commands/feature/dev.md +7 -2
  11. package/dist/agent-src/commands/ghostwriter/write.md +5 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/mission/upgrade.md +1 -1
  14. package/dist/agent-src/commands/orchestrate.md +2 -2
  15. package/dist/agent-src/commands/post-as/me.md +5 -1
  16. package/dist/agent-src/commands/pr/merge.md +19 -6
  17. package/dist/agent-src/commands/roadmap/process-full.md +19 -5
  18. package/dist/agent-src/commands/tdd/red.md +12 -2
  19. package/dist/agent-src/commands/work.md +1 -1
  20. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
  21. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
  22. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
  23. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
  24. package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
  25. package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
  26. package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
  27. package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
  28. package/dist/agent-src/rules/broken-access-control.md +4 -0
  29. package/dist/agent-src/rules/code-provenance.md +4 -0
  30. package/dist/agent-src/rules/design-fidelity.md +1 -1
  31. package/dist/agent-src/rules/domain-safety-pii.md +4 -0
  32. package/dist/agent-src/rules/domain-safety-retention.md +4 -0
  33. package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
  34. package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
  35. package/dist/agent-src/rules/improve-before-implement.md +6 -8
  36. package/dist/agent-src/rules/laravel-routing.md +1 -1
  37. package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
  38. package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
  39. package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
  40. package/dist/agent-src/rules/source-confidentiality.md +12 -34
  41. package/dist/agent-src/rules/symfony-routing.md +1 -1
  42. package/dist/agent-src/rules/token-efficiency.md +14 -0
  43. package/dist/agent-src/rules/tool-safety.md +4 -0
  44. package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
  45. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
  46. package/dist/agent-src/scripts/guarded_baseline.ts +328 -0
  47. package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
  48. package/dist/agent-src/scripts/stub_queue.ts +82 -0
  49. package/dist/agent-src/scripts/stubs_due.ts +400 -0
  50. package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
  51. package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
  52. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
  53. package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
  54. package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
  55. package/dist/agent-src/skills/database/SKILL.md +8 -0
  56. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
  57. package/dist/agent-src/skills/design-review/SKILL.md +1 -1
  58. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
  59. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +17 -1
  60. package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
  61. package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
  62. package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
  63. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
  64. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
  65. package/dist/agent-src/skills/laravel/SKILL.md +35 -0
  66. package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
  67. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
  68. package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
  69. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  70. package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
  71. package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
  72. package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
  73. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
  74. package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
  75. package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
  76. package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
  77. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  78. package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
  79. package/dist/agent-src/skills/ui-component-architect/SKILL.md +45 -2
  80. package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
  81. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
  82. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  83. package/dist/agent-src/templates/roadmaps.md +97 -3
  84. package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
  85. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  86. package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
  87. package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
  88. package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  89. package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  90. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  91. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  92. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  93. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  94. package/dist/cli/commands/uiAudit.js +124 -5
  95. package/dist/cli/registry.js +2 -0
  96. package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
  97. package/dist/cli-delegate/{chunk-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
  98. package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
  99. package/dist/cli-delegate/{chunk-JJA2QEWA.js → chunk-AKJGUQNO.js} +466 -285
  100. package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
  101. package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
  102. package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
  103. package/dist/cli-delegate/cmd_adr_effective.js +102 -0
  104. package/dist/cli-delegate/cmd_conformance.js +42 -10
  105. package/dist/cli-delegate/cmd_doctor.js +3 -3
  106. package/dist/cli-delegate/cmd_export.js +3 -2
  107. package/dist/cli-delegate/cmd_fleet.js +2 -2
  108. package/dist/cli-delegate/cmd_handoff.js +1 -1
  109. package/dist/cli-delegate/cmd_preflight.js +2 -2
  110. package/dist/cli-delegate/cmd_prune.js +3 -2
  111. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  112. package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
  113. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  114. package/dist/cli-delegate/cmd_sync.js +3 -2
  115. package/dist/cli-delegate/cmd_uninstall.js +3 -2
  116. package/dist/cli-delegate/cmd_validate.js +3 -2
  117. package/dist/discovery/deprecation-report.md +1 -1
  118. package/dist/discovery/discovery-manifest.json +57 -57
  119. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  120. package/dist/discovery/discovery-manifest.summary.md +1 -1
  121. package/dist/discovery/dormancy-report.md +1 -1
  122. package/dist/discovery/orphan-report.md +1 -1
  123. package/dist/discovery/packs.json +2 -2
  124. package/dist/discovery/trust-report.md +1 -1
  125. package/dist/discovery/workspaces.json +2 -2
  126. package/dist/hooks/dispatch.js +1836 -712
  127. package/dist/install/claudeRuleRewrite.js +254 -0
  128. package/dist/install/detect.js +29 -16
  129. package/dist/install/detect_php_shape.js +159 -0
  130. package/dist/install/install.mjs +634 -428
  131. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  132. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  133. package/dist/mcp/registry-manifest.json +3 -3
  134. package/dist/mcp/server.json +3 -3
  135. package/dist/mcp/server.mjs +4818 -2645
  136. package/dist/server/schemas/settings.js +3 -0
  137. package/dist/ui/assets/index-D0jaCRPM.js +29 -0
  138. package/dist/ui/index.html +1 -1
  139. package/docs/MIGRATION.md +1 -1
  140. package/docs/THIRD-PARTY-NOTICES.md +25 -0
  141. package/docs/contracts/provider-lifecycle.md +1 -1
  142. package/docs/contracts/settings-classes.md +10 -4
  143. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  144. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
  145. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
  146. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
  147. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  148. package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
  149. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  150. package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
  151. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  152. package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
  153. package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
  154. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
  155. package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  156. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  157. package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
  158. package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
  159. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  160. package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
  161. package/docs/guidelines/agent-infra/layered-settings.md +10 -10
  162. package/docs/guidelines/agent-infra/memory-access.md +1 -1
  163. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  164. package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  165. package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
  166. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
  167. package/docs/guidelines/agent-infra/role-contracts.md +2 -2
  168. package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
  169. package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
  170. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  171. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
  172. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
  173. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  174. package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
  175. package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  176. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  177. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  178. package/docs/guidelines/augment-portability-patterns.md +6 -4
  179. package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
  180. package/docs/guidelines/cross-role-handoff.md +2 -2
  181. package/docs/guidelines/design-fidelity-mechanics.md +1 -1
  182. package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
  183. package/docs/guidelines/php/database.md +90 -7
  184. package/docs/guidelines/prompt-templates.md +7 -7
  185. package/llms.txt +2 -2
  186. package/package.json +5 -2
  187. package/src/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
  188. package/src/agent-src/scripts/guarded_baseline.ts +328 -0
  189. package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
  190. package/src/agent-src/scripts/stub_queue.ts +82 -0
  191. package/src/agent-src/scripts/stubs_due.ts +400 -0
  192. package/src/agent-src/scripts/ticket_bundles.ts +84 -0
  193. package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
  194. package/src/agent-src/templates/scripts/check_memory.ts +258 -17
  195. package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  196. package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
  197. package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
  198. package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  199. package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  200. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  201. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  202. package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  203. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  204. package/src/config/agent-settings.template.yml +32 -3
  205. package/src/config/assurance-capability-registry.json +21 -9
  206. package/src/config/canonical-terms.yml +119 -0
  207. package/src/config/capability-native-outcome-bars.json +81 -0
  208. package/src/config/ci-local-parity.yml +80 -0
  209. package/src/config/drafting-channels.yml +43 -0
  210. package/src/config/estate-count-budget.json +38 -36
  211. package/src/config/evaluator-budgets.json +14 -14
  212. package/src/config/gate-coverage.yml +579 -63
  213. package/src/config/gate-reachability-exemptions.json +21 -0
  214. package/src/config/gate-violation-baselines.json +37 -19
  215. package/src/config/harness-evolution-budget.json +25 -0
  216. package/src/config/lapsed-beta-baseline.json +96 -0
  217. package/src/config/memory-twin-verdicts.yml +129 -0
  218. package/src/config/metric-registry.yml +124 -0
  219. package/src/config/pack-size-budget.json +16 -15
  220. package/src/config/preamble-payload-budget.json +8 -8
  221. package/src/config/profiles/balanced.ini +27 -0
  222. package/src/config/profiles/full.ini +27 -0
  223. package/src/config/profiles/minimal.ini +27 -0
  224. package/src/config/publish-surface.json +9 -2
  225. package/src/config/routing-coverage-seed.json +16 -2
  226. package/src/config/rule-stub-ceilings.json +126 -112
  227. package/src/config/turnaround-budget.json +66 -0
  228. package/src/install/claudeRuleRewrite.ts +288 -0
  229. package/src/install/detect.ts +60 -17
  230. package/src/install/detect_php_shape.ts +191 -0
  231. package/src/scripts/_cli/cmd_doctor.ts +27 -112
  232. package/src/scripts/_dispatch.bash +27 -0
  233. package/src/scripts/_lib/activation_ladder.ts +211 -0
  234. package/src/scripts/_lib/activation_states.ts +88 -0
  235. package/src/scripts/_lib/adherence_detectors.ts +143 -0
  236. package/src/scripts/_lib/arith_claims.ts +181 -0
  237. package/src/scripts/_lib/arm_ranking.ts +62 -0
  238. package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
  239. package/src/scripts/_lib/audit_field_provenance.ts +54 -0
  240. package/src/scripts/_lib/auto_dispatch.ts +32 -3
  241. package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
  242. package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
  243. package/src/scripts/_lib/candidate_proposer.ts +402 -0
  244. package/src/scripts/_lib/candidate_record.ts +601 -0
  245. package/src/scripts/_lib/capture_rate.ts +319 -0
  246. package/src/scripts/_lib/collector_denominator.ts +771 -0
  247. package/src/scripts/_lib/collector_record.ts +340 -0
  248. package/src/scripts/_lib/collector_store.ts +664 -0
  249. package/src/scripts/_lib/collector_supervision.ts +827 -0
  250. package/src/scripts/_lib/concern_estate.ts +77 -0
  251. package/src/scripts/_lib/config_chain.ts +477 -0
  252. package/src/scripts/_lib/config_cost.ts +209 -0
  253. package/src/scripts/_lib/council_settings_block.ts +6 -0
  254. package/src/scripts/_lib/curator_ops.ts +172 -0
  255. package/src/scripts/_lib/delivery_arm_experiment.ts +266 -0
  256. package/src/scripts/_lib/delivery_criticality.ts +126 -0
  257. package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
  258. package/src/scripts/_lib/empty_cycles.ts +88 -0
  259. package/src/scripts/_lib/eval_publication.ts +354 -0
  260. package/src/scripts/_lib/evaluation_vector.ts +283 -0
  261. package/src/scripts/_lib/evaluator_promotion.ts +225 -0
  262. package/src/scripts/_lib/evidence_basis.ts +118 -0
  263. package/src/scripts/_lib/exec_evidence.ts +8 -0
  264. package/src/scripts/_lib/experience_card.ts +272 -0
  265. package/src/scripts/_lib/experience_report.ts +151 -0
  266. package/src/scripts/_lib/experiment_freeze.ts +112 -0
  267. package/src/scripts/_lib/generated_by.ts +66 -0
  268. package/src/scripts/_lib/harness_evolution_guards.ts +229 -0
  269. package/src/scripts/_lib/hook_effect_probe.ts +141 -0
  270. package/src/scripts/_lib/host_denominator.ts +687 -0
  271. package/src/scripts/_lib/host_projection_reach.ts +157 -0
  272. package/src/scripts/_lib/ignored_blocker.ts +148 -0
  273. package/src/scripts/_lib/install_reach_checks.ts +495 -0
  274. package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
  275. package/src/scripts/_lib/judge_hygiene.ts +228 -0
  276. package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
  277. package/src/scripts/_lib/loop_guards.ts +299 -0
  278. package/src/scripts/_lib/loss_class.ts +129 -0
  279. package/src/scripts/_lib/machine_wake.ts +51 -0
  280. package/src/scripts/_lib/md_prose_lines.ts +177 -0
  281. package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
  282. package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
  283. package/src/scripts/_lib/orchestration_record.ts +253 -5
  284. package/src/scripts/_lib/outcome_envelope.ts +227 -0
  285. package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
  286. package/src/scripts/_lib/paired_stats.ts +245 -0
  287. package/src/scripts/_lib/paired_verdict.ts +226 -0
  288. package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
  289. package/src/scripts/_lib/privacy_class.ts +47 -0
  290. package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
  291. package/src/scripts/_lib/repeated_failure.ts +105 -0
  292. package/src/scripts/_lib/repo_root.ts +111 -0
  293. package/src/scripts/_lib/review_skipped_record.ts +37 -0
  294. package/src/scripts/_lib/role_split.ts +338 -0
  295. package/src/scripts/_lib/runtime_journal.ts +1499 -0
  296. package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
  297. package/src/scripts/_lib/skill_catalogue.ts +11 -1
  298. package/src/scripts/_lib/source_digest.ts +200 -0
  299. package/src/scripts/_lib/source_redact.ts +260 -0
  300. package/src/scripts/_lib/source_shape.ts +502 -0
  301. package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
  302. package/src/scripts/_lib/strip_comments.d.mts +8 -0
  303. package/src/scripts/_lib/strip_comments.mjs +65 -0
  304. package/src/scripts/_lib/test_red_state.ts +154 -0
  305. package/src/scripts/_lib/trigger_shift.ts +144 -0
  306. package/src/scripts/_lib/untrusted_content.ts +82 -7
  307. package/src/scripts/adoption_report.ts +1 -1
  308. package/src/scripts/adr/evidence_census.ts +1 -1
  309. package/src/scripts/adr/regenerate_index.ts +26 -2
  310. package/src/scripts/adr_cite_check.ts +164 -1
  311. package/src/scripts/ai_council/blind_review.ts +11 -1
  312. package/src/scripts/ai_council/clients.ts +4 -0
  313. package/src/scripts/ai_council/config.ts +3 -0
  314. package/src/scripts/ai_council/consensus.ts +28 -8
  315. package/src/scripts/ai_council/consensus_round.ts +226 -0
  316. package/src/scripts/ai_council/disagreement_signal.ts +338 -0
  317. package/src/scripts/ai_council/inline_findings.ts +340 -0
  318. package/src/scripts/ai_council/judge_position_bias.ts +197 -0
  319. package/src/scripts/ai_council/orchestrator.ts +16 -203
  320. package/src/scripts/ai_council/orchestrator_results.ts +23 -3
  321. package/src/scripts/ai_council/pricing.ts +106 -0
  322. package/src/scripts/ai_council/prompts.ts +74 -7
  323. package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
  324. package/src/scripts/ai_council/py_format.ts +14 -3
  325. package/src/scripts/ai_council/recouncil_guard.ts +293 -0
  326. package/src/scripts/ai_council/response_record.ts +50 -0
  327. package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
  328. package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
  329. package/src/scripts/asset_delivery_ledger.ts +157 -0
  330. package/src/scripts/attest_artifact.ts +193 -0
  331. package/src/scripts/audit_auto_rules.ts +2 -1
  332. package/src/scripts/audit_command_surface.ts +1 -1
  333. package/src/scripts/audit_mcp_tools.ts +2 -2
  334. package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
  335. package/src/scripts/audit_user_type_axis.ts +2 -1
  336. package/src/scripts/bench_ab_clone.ts +215 -10
  337. package/src/scripts/bench_ab_integrity.ts +119 -5
  338. package/src/scripts/bench_ab_v2_stats.ts +40 -213
  339. package/src/scripts/build_archive_index.ts +1 -1
  340. package/src/scripts/build_linear_digest.ts +1 -1
  341. package/src/scripts/build_proof.ts +11 -4
  342. package/src/scripts/build_rule_trigger_matrix.ts +1 -1
  343. package/src/scripts/build_source_digests.ts +157 -0
  344. package/src/scripts/cache_realization_report.ts +103 -0
  345. package/src/scripts/check_adr_frontmatter.ts +126 -0
  346. package/src/scripts/check_benchmark_report_fields.ts +207 -0
  347. package/src/scripts/check_beta_review_markers.ts +235 -6
  348. package/src/scripts/check_bundle_path_leakage.ts +34 -1
  349. package/src/scripts/check_claims.ts +576 -6
  350. package/src/scripts/check_composite_arming.ts +35 -0
  351. package/src/scripts/check_concern_admissions.ts +365 -0
  352. package/src/scripts/check_enforcement_coverage.ts +28 -0
  353. package/src/scripts/check_estate_count.ts +142 -1
  354. package/src/scripts/check_gate_reachability.ts +383 -0
  355. package/src/scripts/check_host_loadability.ts +104 -0
  356. package/src/scripts/check_loss_class_declared.ts +308 -0
  357. package/src/scripts/check_md_language.ts +15 -98
  358. package/src/scripts/check_memory_proposal.ts +18 -11
  359. package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
  360. package/src/scripts/check_no_external_sources.ts +281 -6
  361. package/src/scripts/check_pack_conformance_fixture.ts +11 -1
  362. package/src/scripts/check_pack_size.ts +59 -2
  363. package/src/scripts/check_preamble_payload_budget.ts +114 -3
  364. package/src/scripts/check_prefix_stable_mutation.ts +372 -0
  365. package/src/scripts/check_publish_surface.ts +10 -1
  366. package/src/scripts/check_references.ts +24 -1
  367. package/src/scripts/check_rule_evidence_declaration.ts +316 -0
  368. package/src/scripts/check_rule_projection_integrity.ts +14 -4
  369. package/src/scripts/check_score_contract.ts +26 -3
  370. package/src/scripts/check_static_parity.ts +285 -0
  371. package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
  372. package/src/scripts/check_suppression_hygiene.ts +15 -0
  373. package/src/scripts/ci_settle.ts +39 -2
  374. package/src/scripts/code_graph/build.ts +60 -3
  375. package/src/scripts/code_graph/extract.ts +44 -0
  376. package/src/scripts/code_graph/types.ts +24 -0
  377. package/src/scripts/collector_daemon.ts +714 -0
  378. package/src/scripts/config_cost_report.ts +302 -0
  379. package/src/scripts/consumer_matrix.ts +74 -1
  380. package/src/scripts/cost/budget.mjs +10 -3
  381. package/src/scripts/cost/track.mjs +10 -3
  382. package/src/scripts/council_cli.ts +37 -54
  383. package/src/scripts/dispatch_r2_reviewer.ts +46 -5
  384. package/src/scripts/evolution_lab.ts +980 -0
  385. package/src/scripts/external_sources_denylist.json +5 -18
  386. package/src/scripts/extract_audit_patterns.ts +21 -0
  387. package/src/scripts/fold_intake.ts +12 -1
  388. package/src/scripts/gen_discovery_baseline.ts +1 -1
  389. package/src/scripts/generate_capabilities_index.ts +12 -5
  390. package/src/scripts/generate_capability_matrix.ts +3 -3
  391. package/src/scripts/generate_command_flows.ts +2 -2
  392. package/src/scripts/generate_cookbook.ts +2 -2
  393. package/src/scripts/generate_index.ts +8 -1
  394. package/src/scripts/generate_knowledge_index.ts +2 -1
  395. package/src/scripts/generate_ownership_matrix.ts +2 -1
  396. package/src/scripts/generate_pack_manifests.ts +10 -2
  397. package/src/scripts/generate_role_experiences_catalog.ts +2 -2
  398. package/src/scripts/generate_settings_reference.ts +1 -1
  399. package/src/scripts/git_authorization_hook.ts +22 -1
  400. package/src/scripts/grade_target_readiness.ts +48 -5
  401. package/src/scripts/hook_effect_doctor.ts +261 -0
  402. package/src/scripts/hook_manifest.json +1 -1
  403. package/src/scripts/hook_manifest.yaml +98 -11
  404. package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
  405. package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
  406. package/src/scripts/hooks/concern_registry.ts +4 -0
  407. package/src/scripts/hooks/dispatch_hook.ts +32 -0
  408. package/src/scripts/hooks/journal_record_hook.ts +345 -0
  409. package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
  410. package/src/scripts/hooks/run_continuation_hook.ts +44 -9
  411. package/src/scripts/hooks/shims/install.sh +61 -0
  412. package/src/scripts/hooks/shims/php +101 -0
  413. package/src/scripts/hooks/suggestion_capture_hook.ts +10 -0
  414. package/src/scripts/hot_context_hook.ts +16 -0
  415. package/src/scripts/install-hooks.sh +20 -5
  416. package/src/scripts/install.ts +17 -35
  417. package/src/scripts/inventory_frontmatter.ts +2 -1
  418. package/src/scripts/lint_adr_sweep_routing.ts +12 -0
  419. package/src/scripts/lint_canonical_terms.ts +604 -0
  420. package/src/scripts/lint_composition_review.ts +619 -0
  421. package/src/scripts/lint_consolidation_lineage.ts +666 -0
  422. package/src/scripts/lint_eval_specs.ts +593 -0
  423. package/src/scripts/lint_hook_manifest.ts +19 -0
  424. package/src/scripts/lint_host_portability.ts +373 -0
  425. package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
  426. package/src/scripts/lint_memory_twin_parity.ts +335 -0
  427. package/src/scripts/lint_metric_consumers.ts +355 -0
  428. package/src/scripts/lint_skill_descriptions.ts +18 -1
  429. package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
  430. package/src/scripts/lint_skill_link_reach.ts +252 -0
  431. package/src/scripts/lint_skill_trigger_corpus.ts +426 -23
  432. package/src/scripts/lint_ticket_buildable.ts +17 -1
  433. package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
  434. package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
  435. package/src/scripts/measure_docs_dead_links.ts +348 -0
  436. package/src/scripts/measure_host_capture.ts +461 -0
  437. package/src/scripts/migration_status.ts +3 -3
  438. package/src/scripts/model_rule_injection.ts +60 -0
  439. package/src/scripts/orchestration_record.ts +14 -0
  440. package/src/scripts/preamble_byte_census.ts +139 -10
  441. package/src/scripts/prepack-check.mjs +4 -1
  442. package/src/scripts/probe_turnaround.ts +384 -0
  443. package/src/scripts/probe_unblocked_ask.ts +279 -0
  444. package/src/scripts/render_benchmark_md.ts +1 -1
  445. package/src/scripts/rule_activation_census.ts +70 -9
  446. package/src/scripts/rule_backlinks.ts +1 -1
  447. package/src/scripts/run_lifecycle_suite.ts +208 -0
  448. package/src/scripts/run_skill_evals.ts +40 -0
  449. package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
  450. package/src/scripts/schemas/drafting-channels.schema.json +43 -0
  451. package/src/scripts/schemas/evals.schema.json +24 -1
  452. package/src/scripts/schemas/rule.schema.json +52 -1
  453. package/src/scripts/schemas/skill.schema.json +17 -2
  454. package/src/scripts/skill_overlap.ts +7 -1
  455. package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
  456. package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
  457. package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
  458. package/src/scripts/skill_usage_report.ts +2 -1
  459. package/src/scripts/stubs_due.ts +211 -0
  460. package/src/scripts/sweep_source_surfaces.ts +678 -0
  461. package/src/scripts/sync_pr_branch.ts +3 -3
  462. package/src/scripts/trigger_eval_grandfather.json +202 -222
  463. package/src/scripts/utilization_report.ts +22 -2
  464. package/src/server/schemas/settings.ts +5 -0
  465. package/src/templates/marketing-copy.yml +1 -1
  466. package/dist/ui/assets/index-Cxgy63kz.js +0 -26
@@ -113,6 +113,14 @@ SQLite; ORM-agnostic):
113
113
 
114
114
  ## Gotcha
115
115
 
116
+ **MySQL and MariaDB share a query-syntax world. They never share a migration
117
+ one.** Treat them as one engine for writing a `SELECT`, and as two engines for
118
+ everything that changes a schema or reports on a plan: online-DDL semantics,
119
+ lock behavior under `ALTER`, feature availability, and `EXPLAIN` output all
120
+ diverge. Read the engine and its version from the project before making any
121
+ claim in that second group; where the project does not declare one, say the
122
+ engine is unknown rather than assuming.
123
+
116
124
  - Check existing indexes before adding — duplicates waste write performance.
117
125
  - Consider multi-tenant implications — queries may need customer DB scoping.
118
126
  - `EXPLAIN` output varies between MariaDB and MySQL.
@@ -31,6 +31,33 @@ Before upgrading:
31
31
  - **Review upgrade guides** — many packages provide migration docs.
32
32
  - **Check runtime version requirements** — does the new version need a newer PHP / Node / Python / Go / Rust toolchain?
33
33
 
34
+ ### 1b. Find where the version is DECLARED, before naming a file to edit
35
+
36
+ ```
37
+ NEVER NAME AN EDIT SITE BEFORE ASKING WHERE THE VERSION IS DECLARED.
38
+ IN A CATALOG WORKSPACE THE MEMBER MANIFEST IS THE WRONG FILE:
39
+ THE VERSION IS ONE ROOT LINE WITH N REFERENTS.
40
+ ```
41
+
42
+ A member `package.json` is the declaration site in an ordinary repository and
43
+ **not** in a workspace using a catalog. There, the member reads `catalog:` and
44
+ the range lives once in the workspace definition — editing the member either
45
+ does nothing or silently diverges from the catalog.
46
+
47
+ Ask in this order, and stop at the first that answers:
48
+
49
+ 1. **A catalog entry for this dependency** — `pnpm-workspace.yaml` `catalogs:` /
50
+ `catalog:`, or the equivalent in another manager's workspace definition. If
51
+ the member's range starts with `catalog:`, this is the edit site. Name the
52
+ catalog (`default` included) in the guidance, not the member.
53
+ 2. **A root-level pin** — `overrides` / `resolutions` / `pnpm.overrides`. A
54
+ member edit under one of these is overridden at install time.
55
+ 3. **The member manifest** — the ordinary case, and only after 1 and 2 are
56
+ silent.
57
+
58
+ A repository with no catalog and no root pin behaves exactly as before; this
59
+ step adds a lookup, not a change of default.
60
+
34
61
  ### 2. Plan
35
62
 
36
63
  Categorize changes needed:
@@ -221,7 +221,7 @@ fields change what a finding *means*:
221
221
  all. Under `preserve` a palette or type-family delta is a **defect**; under
222
222
  `redesign` it is the point.
223
223
  - **`reference_maturity`** decides whether a difference from the reference is a
224
- defect. A `wireframe` declares structure, so reproducing its grey boxes is
224
+ defect. A `wireframe` declares structure, so reproducing its gray boxes is
225
225
  over-fidelity, not fidelity.
226
226
 
227
227
  ```
@@ -132,7 +132,7 @@ Verify the doc works for someone without your context.
132
132
  * **One question per turn** (Iron Law from `ask-when-uncertain`) — never bundle clarifying + brainstorm + curate prompts in one message.
133
133
  * **Never reprint the full doc** during iteration — always use `str-replace-editor`. Reprinting wastes tokens and creates merge drift.
134
134
  * **Reader test is not optional** — without it, you ship the version that makes sense to you, not to readers. Skip only on explicit user override.
135
- * **Sub-agent absence** — `ai-council` may not be configured. Have the manual fresh-Claude fallback ready (Stage 3 step 2).
135
+ * **Subagent absence** — `ai-council` may not be configured. Have the manual fresh-Claude fallback ready (Stage 3 step 2).
136
136
  * **Image alt-text** — if the doc embeds images, add alt-text inline; without it, fresh-reader tools can't see them.
137
137
  * **Language discipline** — keep the doc body in English (per `language-and-tone`). For verbatim German user phrases or interview quotes, use `DE: … · EN: …` anchor blocks.
138
138
 
@@ -79,7 +79,23 @@ Design starts from project truth, not generic aesthetic memory.
79
79
  | `vue` | `resources/js/components/`, `src/components/`, `pages/` |
80
80
  | `plain` | `resources/views/`, plus any `*.html` under `public/` |
81
81
 
82
- Capture each component/template as: `{path, name, kind: page|partial|component|layout, exports?: [props]}`.
82
+ Capture each component/template as:
83
+ `{path, name, kind: component|view|style|page, exports?: [props]}`.
84
+
85
+ The `kind` set is the one `agent-config ui:audit` actually emits — its single
86
+ definition is `AUDIT_KINDS` in `src/cli/commands/uiAudit.ts`, and a test asserts
87
+ this line against that constant rather than restating it. It read
88
+ `page|partial|component|layout` until 2026-08-26; only two of those four values
89
+ existed in the code, so an artefact written by the command was being read here
90
+ against a contract it did not satisfy.
91
+
92
+ `partial` and `layout` are not in the set. Neither has an operational definition
93
+ that survives contact with a real tree, and adding a branch for a category
94
+ nobody can test is how the previous mismatch happened.
95
+
96
+ `view` is the **Blade** classification — `*.blade.php` and `resources/views/`.
97
+ It reads zero in a JavaScript tree by construction, which is not the same as
98
+ unused.
83
99
 
84
100
  ### 2. Identify the design system
85
101
 
@@ -121,6 +121,12 @@ Discovery → Exploration → Questions → Architecture → Implementation →
121
121
  - Follow chosen architecture from Phase 4.
122
122
  - Follow codebase conventions strictly.
123
123
  - Track progress via task list or roadmap.
124
+ - **One behavior at a time**: the failing test for that behavior, observed
125
+ failing, then the minimum code that makes it pass, then the next behavior.
126
+ Tests are a step of this phase, never a follow-up suggested in Phase 7 —
127
+ a plan that reaches the summary owing its tests planned test-after.
128
+ Exceptions are the Do-NOT list in the `test-driven-development` skill,
129
+ and a skipped cycle is recorded in the decision log rather than passed over.
124
130
 
125
131
  #### Phase 6: Quality Review
126
132
  - Review the implementation for:
@@ -132,7 +138,8 @@ Discovery → Exploration → Questions → Architecture → Implementation →
132
138
 
133
139
  #### Phase 7: Summary
134
140
  - Summarize what was built, key decisions, files modified.
135
- - Suggest next steps (tests, documentation, follow-up features).
141
+ - Suggest next steps (documentation, follow-up features) — never tests, which
142
+ Phase 5 already closed per behavior.
136
143
  - Update roadmap if applicable.
137
144
 
138
145
  ## Decision log
@@ -147,7 +154,7 @@ This ensures future developers (and agents) understand the reasoning, not just t
147
154
 
148
155
  ## Bite-sized task granularity (structural roadmaps only)
149
156
 
150
- When a feature plan's generated roadmap declares `complexity: structural` in its frontmatter, every task bullet must be self-contained and 2–5 minutes of work. Lightweight roadmaps (the default) skip this section — coarse-grained tasks ("Add login endpoint", "Update tests") are correct when the work is well-scoped and low-risk.
157
+ When a feature plan's generated roadmap declares `complexity: structural` in its frontmatter, every task bullet must be self-contained and 2–5 minutes of work. Lightweight roadmaps (the default) skip this section — coarse-grained tasks are correct when the work is well-scoped and low-risk — but coarse means *one behavior*, not one layer: ("Reject login with an unknown email — test, then handler", "Reject login with a wrong password — test, then handler"), never an implementation step followed by an "Update tests" step.
151
158
 
152
159
  Structural roadmap tasks must include:
153
160
 
@@ -52,6 +52,48 @@ NO SECRET, PRIVILEGED KEY, OR SESSION TOKEN LIVES IN CLIENT CODE OR localStorage
52
52
  | `target="_blank"` without `rel="noopener"` | Reverse tabnabbing (CWE-1022) | add `rel="noopener noreferrer"` |
53
53
  | Missing CSP; missing alt/label/contrast | No XSS second line of defense; a11y failures | strict CSP (no `unsafe-inline`); alt text, labels, AA contrast |
54
54
 
55
+ ## The server-composed bootstrap payload
56
+
57
+ A payload assembled **server-side and serialised into the page** for a client
58
+ island is a data-exposure surface: whatever is put in it is readable by anyone
59
+ who can load the page — no API call, no auth check, view-source. Several
60
+ mainstream frameworks ship their own named channel for exactly this, so the
61
+ pattern is a documented mechanism rather than one project's arrangement.
62
+
63
+ **Inspect the existing payload before judging any field.** Read what the channel
64
+ already carries and check current call sites for what the client actually
65
+ consumes — a field is only defensible against what the page needs, and a review
66
+ that never opened the payload is a guess. The grep below finds it.
67
+
68
+ **The per-field question, which is what this section is:**
69
+
70
+ > Would I return this field from a **public, unauthenticated** endpoint?
71
+ > If not, it does not belong in the payload.
72
+
73
+ Field classes that recur and are almost always wrong there: internal ids that
74
+ enumerate other users' rows · permission and role structures the client only
75
+ needs a boolean of · feature-flag payloads carrying unreleased product names ·
76
+ anything from an admin-scoped query that was convenient to reuse · a whole
77
+ serialised model where the page needs three of its fields.
78
+
79
+ **Nothing enforces this, and the split is deliberate.**
80
+
81
+ | Half | What it does | What it cannot do |
82
+ |---|---|---|
83
+ | the grep below | **locates** a payload a field was added to | tell a privileged field from a public one |
84
+ | this checklist entry | carries the **judgement** | run |
85
+
86
+ The question is not decidable by any check: a grep over the framework-named
87
+ payload channels cannot read intent. So the deterministic half is discovery,
88
+ advisory and non-blocking, and its whole value is putting the question in front
89
+ of a reader who would otherwise never see it. `enforced_by: none` is the honest
90
+ field here — this section refuses nothing.
91
+
92
+ **What may NOT be encoded.** The particular channel any one repository uses.
93
+ What is encoded is the question and the framework-named channels; a concrete
94
+ in-house payload shape would be one repository's implementation shipped as
95
+ guidance.
96
+
55
97
  ## Backstop greps
56
98
 
57
99
  Run before committing frontend changes; each should return zero (or every hit is read and justified):
@@ -66,6 +108,8 @@ rg -n "origin:\s*['\"]\*['\"]|Access-Control-Allow-Origin.*\*"
66
108
  rg -n "addEventListener\(\s*['\"]message['\"]" # then confirm each checks event.origin
67
109
  # Unhardened external links
68
110
  rg -n 'target=["'\'']_blank["'\'']' # then confirm rel="noopener" present
111
+ # Server-composed bootstrap payload — LOCATES it; the per-field judgement is yours
112
+ rg -n '__NEXT_DATA__|__NUXT__|window\.__INITIAL_STATE__|@json\(|json_encode\([^)]*\)\s*\)?\s*</script>|dehydratedState'
69
113
  ```
70
114
 
71
115
  ## Output format
@@ -9,7 +9,7 @@ scope:
9
9
  execution:
10
10
  type: assisted
11
11
  handler: internal
12
- allowed_tools: ["github"]
12
+ allowed_tools: ["Bash(git:*)", "Bash(gh:*)"]
13
13
  workspaces:
14
14
  - engineering
15
15
  packs:
@@ -143,20 +143,54 @@ export const checkPackage = (root: string): SurfaceReport => {
143
143
  };
144
144
  if (exportsField !== undefined) walkConditions(exportsField, 'exports.');
145
145
 
146
- // (d) — a `workspace:` range only resolves inside the workspace. Published with no
146
+ // (d) — a range that only resolves INSIDE the workspace. Published with no
147
147
  // `private: true` and no publishConfig, the consumer's install fails on a protocol
148
148
  // their registry has never heard of.
149
- const allDeps = { ...deps, ...asRecord(manifest['devDependencies']), ...peers };
150
- const workspaceRanges = Object.entries(allDeps).filter(([, v]) => typeof v === 'string' && v.startsWith('workspace:'));
149
+ //
150
+ // `catalog:` was added 2026-08-26 (road-to-internal-estate-fit 4.1) and it is the
151
+ // same defect, not an adjacent one: pnpm's catalog protocol resolves against the
152
+ // workspace's catalog definition and means nothing to a registry. It had been
153
+ // passing as an ordinary registry range, so the finding did not fire where it
154
+ // should. One predicate, two prefixes — the finding code and its reason carry over
155
+ // unchanged, which is why this is not a second finding type.
156
+ const UNPUBLISHABLE_RANGE_PREFIXES = ['workspace:', 'catalog:'] as const;
157
+ // Each dependency map is scanned SEPARATELY rather than spread into one
158
+ // object. The previous `{ ...deps, ...devDeps, ...peers }` merge let a later
159
+ // map SHADOW an earlier one for the same package name: a `workspace:` range
160
+ // in `dependencies` for a package that also appears in `peerDependencies`
161
+ // with a registry range was invisible, because the peer value won the spread.
162
+ // Found 2026-08-26 by a `catalog:` fixture for a name the test manifest also
163
+ // lists as a peer; fixed with 4.1 rather than noted, because it is the same
164
+ // predicate and the same few lines.
165
+ const workspaceRanges: [string, unknown][] = [
166
+ deps,
167
+ asRecord(manifest['devDependencies']),
168
+ peers,
169
+ ].flatMap((m) =>
170
+ Object.entries(m).filter(
171
+ ([, v]) =>
172
+ typeof v === 'string' &&
173
+ UNPUBLISHABLE_RANGE_PREFIXES.some((pre) => v.startsWith(pre)),
174
+ ),
175
+ );
151
176
  if (
152
177
  workspaceRanges.length > 0 &&
153
178
  manifest['private'] !== true &&
154
179
  manifest['publishConfig'] === undefined
155
180
  ) {
181
+ const prefixes = [
182
+ ...new Set(
183
+ workspaceRanges.map(
184
+ ([, v]) =>
185
+ UNPUBLISHABLE_RANGE_PREFIXES.find((pre) => (v as string).startsWith(pre)) ??
186
+ '',
187
+ ),
188
+ ),
189
+ ].sort();
156
190
  findings.push({
157
191
  code: 'workspace-range-publishable',
158
192
  severity: 'warn',
159
- message: `${String(workspaceRanges.length)} \`workspace:\` range(s) in a package that is neither private nor carrying publishConfig — the protocol does not resolve outside the workspace`,
193
+ message: `${String(workspaceRanges.length)} workspace-local range(s) (${prefixes.join(', ')}) in a package that is neither private nor carrying publishConfig — the protocol does not resolve outside the workspace`,
160
194
  });
161
195
  }
162
196
 
@@ -18,8 +18,8 @@
18
18
  "name": "Acceptance criteria",
19
19
  "cross_cutting": false,
20
20
  "weight": 3,
21
- "criterion": "Acceptance criteria are written as verifiable Given-When-Then or numbered checklist items, not as task descriptions. Each criterion is independently testable. An implementer can write a test before touching code.",
22
- "gap_signal": "AC section missing; or AC items are task descriptions ('implement the API') rather than verifiable outcomes ('returns 200 with a body matching the schema')."
21
+ "criterion": "Acceptance criteria are independently testable outcomes, not task descriptions — an implementer can write a test before touching code. Whether they are owed in Given-When-Then form is decided by the observable-behavior test in `src/skills/test-case-discovery/SKILL.md` § Does this change owe an executable behavior contract?, not asserted here: most tickets owe verifiable checklist items, and only a change with an audience outside the code owes a behavior contract. Where one is owed, that section's anti-script rule applies — a criterion naming a selector, a timeout or a keystroke scores as a gap, however well-formed its Given-When-Then.",
22
+ "gap_signal": "AC section missing; or AC items are task descriptions ('implement the API') rather than verifiable outcomes ('returns 200 with a body matching the schema'); or a Given-When-Then criterion scripts the interface ('When I click #submit') instead of stating the rule."
23
23
  },
24
24
  {
25
25
  "id": "dor_readiness",
@@ -33,6 +33,41 @@ Use this skill for all Laravel-specific code generation and editing tasks, espec
33
33
 
34
34
  This skill extends the base `php-coder` skill and applies Laravel conventions on top of the project's general PHP rules.
35
35
 
36
+ ## When NOT to use — components without the framework
37
+
38
+ ```
39
+ A DEPENDENCY PROVES A LIBRARY IS AVAILABLE. ONLY THE ENTRY POINT AND THE
40
+ ROUTER PROVE WHICH APPLICATION SHAPE IS RUNNING.
41
+ `illuminate/*` PACKAGES WITH NO SKELETON MARKER IS A THIRD STATE, AND THIS SKILL
42
+ DOES NOT APPLY TO IT.
43
+ ```
44
+
45
+ Laravel ships its ORM, container, collections and HTTP layer as
46
+ independently installable packages, usable with no framework present — a
47
+ published distribution model, not one consumer's arrangement. An application
48
+ built that way has a **custom entry point and a custom router**. Routing it here
49
+ offers a CLI that does not exist, a request-validation primitive that is not
50
+ wired, and a routes file that was never there: every suggestion confidently
51
+ wrong, and the reason visible only from the entry point.
52
+
53
+ **The probe set, and its cost.** A fixed set of filesystem existence checks plus
54
+ one manifest read — no directory walk, no content scan, and never re-derived per
55
+ session. Any ONE marker present means the framework is real:
56
+
57
+ | Probe | Meaning |
58
+ |---|---|
59
+ | `artisan` | the console entry point the skeleton writes |
60
+ | `config/app.php` | the skeleton's bootstrap config |
61
+ | `bootstrap/app.php` | the application bootstrap |
62
+
63
+ `illuminate/*` in `composer.json` with **none** of those markers is
64
+ *components-without-the-framework*. Say so and route away from this skill rather
65
+ than answering as though the framework were there.
66
+
67
+ Implemented deterministically in `src/install/detect_php_shape.ts`
68
+ (`detectPhpShape`), whose `PROBE_PATHS` is this table and whose verdict names
69
+ what a wrong route would have offered.
70
+
36
71
  ## Procedure: Write Laravel code
37
72
 
38
73
  → **First apply the `php-coder` skill** — it handles project docs, module docs, patterns, and quality tools.
@@ -36,7 +36,8 @@ Use this skill when the user asks to create a database migration, add a column,
36
36
  - Use `decimal` for money — never `float`.
37
37
  - Add indexes for columns used in WHERE clauses and JOINs.
38
38
  - Match existing column naming patterns in the same table or domain.
39
- - Always include a reversible `down()` method.
39
+ - Declare recovery: a reversible `down()`, or a roll-forward plan in the file
40
+ (see § The recovery contract below). Silence is the violation.
40
41
 
41
42
  ## Laravel projects
42
43
 
@@ -73,7 +74,10 @@ return new class extends Migration {
73
74
  $table->foreign('customer_id')
74
75
  ->references('id')
75
76
  ->on('customers')
76
- ->onDelete('cascade');
77
+ // Choose the referential action; never inherit it from a
78
+ // template. See "Referential action is a decision" below.
79
+ ->onDelete('cascade'); // cascade: rows here are expendable
80
+ // WITHOUT their customer
77
81
 
78
82
  $table->index('is_active');
79
83
  });
@@ -143,6 +147,54 @@ php artisan migrate --env=testing # testing
143
147
  1. Migration file with up() and down() methods
144
148
  2. Model updates if columns or relationships changed
145
149
 
150
+ ### The recovery contract — one obligation, two branches
151
+
152
+ Every migration declares **one** of these, and silence is the violation:
153
+
154
+ 1. a `down()` that restores the prior state; **or**
155
+ 2. a **roll-forward recovery plan, written in the migration file itself**, for
156
+ the cases where restoration is genuinely impossible — a completed
157
+ destructive backfill, a dropped column whose data is gone.
158
+
159
+ The second branch is not a lighter obligation. A migration taking it records, in
160
+ its own file comments, all three of:
161
+
162
+ 1. **why restoration is impossible**, with the evidence — the data was checked
163
+ and is unrecoverable, not assumed to be;
164
+ 2. **the ordered recovery procedure** — the steps, the inputs each needs, and
165
+ the criteria that say recovery succeeded;
166
+ 3. **the responsible recovery owner**.
167
+
168
+ Vague intent or missing detail is the violation. The plan lives in the migration
169
+ file and lands in the same diff, because a plan documented "later" somewhere else
170
+ is a plan nobody can review at the moment it matters.
171
+
172
+ ## Referential action is a decision
173
+
174
+ The template above labels its `onDelete('cascade')` as **one branch**, not a
175
+ default. Copying it unchanged is how a delete of one customer silently removes
176
+ records that had independent value.
177
+
178
+ | The child row, without its parent, is | Action | What happens |
179
+ |---|---|---|
180
+ | **expendable** — it only means something as part of the parent | `cascade` | deleted with the parent |
181
+ | **self-valued** — it is a record in its own right (an invoice, an audit row, a payment) | `restrict` (or `no action`) | the parent delete FAILS until the child is dealt with |
182
+ | **survivable** — it outlives the parent with the link removed | `set null` | the column is nulled; requires a nullable column |
183
+
184
+ Two consequences worth stating because they are the ones missed:
185
+
186
+ - `restrict` is the safe default for anything a finance, audit, or legal reader
187
+ would expect to still exist. A failed delete is a conversation; a cascaded
188
+ delete is a recovery.
189
+ - `set null` needs the foreign-key column to be nullable, and it needs the
190
+ application to handle the orphan state. Choosing it without both is choosing a
191
+ constraint error later.
192
+
193
+ Soft deletes do **not** interact with this: `onDelete` fires on a real `DELETE`,
194
+ so a soft-deleting parent never triggers it. If the model soft-deletes, the
195
+ referential action describes what happens on a force-delete or a purge, and that
196
+ is the case to decide against.
197
+
146
198
  ## Gotcha
147
199
 
148
200
  - Always check if the table/column already exists before creating the migration — the model doesn't always check.
@@ -155,7 +207,9 @@ php artisan migrate --env=testing # testing
155
207
  - Do NOT create migrations without specifying the correct connection when multiple databases exist.
156
208
  - Do NOT create tables without checking the project's naming conventions (prefixes, casing).
157
209
  - Do NOT use raw SQL in migrations when Schema builder works.
158
- - Do NOT forget to make migrations reversible (down method).
210
+ - Do NOT leave recovery undeclared — ship a `down()` that restores the prior
211
+ state, or the three-part roll-forward plan in the migration file. Neither is
212
+ optional; choosing between them is.
159
213
  - Do NOT use `float` for money — use `decimal`.
160
214
  - Do NOT forget indexes on foreign keys and frequently filtered columns.
161
215
 
@@ -57,6 +57,24 @@ In precedence order, and report which one answered:
57
57
  Globs are globs: `packages/*` means every direct child carrying a manifest, not
58
58
  every directory.
59
59
 
60
+ ### 2b. Catalogs — the version is declared once, not per member
61
+
62
+ When the workspace defines a **catalog**, a member's `catalog:` range is a
63
+ REFERENCE, not a declaration. Report the catalog as the version's home:
64
+
65
+ - A member range starting `catalog:` (bare, or `catalog:<name>`) resolves
66
+ against the workspace catalog definition. It does not resolve outside the
67
+ workspace at all — treat it exactly as `workspace:` for publishability.
68
+ - **An upgrade edits the catalog, not the member.** Editing a member that reads
69
+ `catalog:` is either a no-op or a silent divergence from the catalog, and the
70
+ catalog exists precisely so the version has one home.
71
+ - **A member carrying a version LITERAL for a dependency the catalog also
72
+ declares is reported, not gated** — see § Do NOT. Name the member, the
73
+ dependency, the literal range, the catalog name and the catalog range. Where
74
+ several catalogs declare the same dependency, list every candidate rather than
75
+ inventing an applicable one; nothing in the workspace definition says which
76
+ the literal intended to follow.
77
+
60
78
  ### 3. Task runner — ask the runner, do not read its config
61
79
 
62
80
  When a runner is present, its own listing is the source of truth, because a
@@ -133,6 +151,14 @@ When the runner was absent, the last line reads
133
151
 
134
152
  ## Do NOT
135
153
 
154
+ - **Do NOT gate on a member version literal.** Whether a catalog repository
155
+ permits selective literals is that repository's convention, not this suite's
156
+ to impose. Report it as a structural observation — *"member literal overlaps
157
+ catalog entry"*, never *"invalid"* — and let the reader decide. An exact
158
+ mismatch between the literal and the catalog range is reported at higher
159
+ severity, and still does not gate.
160
+
161
+
136
162
  - Read `project.json` by hand to enumerate Nx projects — `nx show projects` is
137
163
  the source of truth and includes inferred targets.
138
164
  - Install `turbo` or `nx` to answer a question. They are the consumer's
@@ -112,6 +112,33 @@ The derivation therefore unwraps a thin wrapper and records what it points at, a
112
112
  confirm, and the file says which id failed. Downgrading is the honest outcome; writing
113
113
  the stronger claim and hoping is the failure this skill exists to prevent.
114
114
 
115
+ ## A confirmed canonical answer is a playbook — including the awkward one
116
+
117
+ A repository's answer to *"where does new code of this kind go"* is a playbook
118
+ once it has been **confirmed**, graded like any other: `configured` when every
119
+ cited id resolved, `observed` when one did not.
120
+
121
+ **The awkward case is the one worth writing down.** A public surface version and
122
+ an **implementation generation** are independent axes — a `v1` controller can
123
+ carry the current internal architecture while a `v2` one is half-migrated and
124
+ abandoned. So the canonical answer for a scope is frequently *"the
125
+ older-looking lane"*, and that is exactly the answer nobody records because it
126
+ reads as a mistake. **ADR-248** holds the evidence order that produces it: a live
127
+ decision record, then an executable architecture test, then a shared abstraction
128
+ in maintained code, then current tests and contracts, then several recent
129
+ analogous implementations, then migration docs, then git history, and **names and
130
+ paths last**.
131
+
132
+ Two bounds, both deliberate:
133
+
134
+ - **Per scope, never per artifact type.** A repository may legitimately have two
135
+ right answers in two modules. There is no single global exemplar, and a
136
+ playbook claiming one is over-reaching its own `scope`.
137
+ - **No second contract.** This is the ADR-244 playbook class unchanged — not a
138
+ conventions map, not a canonicality registry. A confirmed answer is a
139
+ playbook; an unconfirmed one is a hypothesis and belongs in the analysis that
140
+ produced it.
141
+
115
142
  ## Output format
116
143
 
117
144
  1. One playbook per file in the playbook home, frontmatter first: `task`, `scope`, `grade`,
@@ -156,7 +183,7 @@ The derivation therefore unwraps a thin wrapper and records what it points at, a
156
183
 
157
184
  ## See also
158
185
 
159
- - [ADR-244](../../../docs/decisions/ADR-244-playbook-is-a-sixth-context-type.md) — the artefact class, its grades, its home, and the two deferred kinds.
186
+ - [ADR-244](../../../docs/decisions/ADR-244-playbook-is-a-sixth-context-type.md) — the artifact class, its grades, its home, and the two deferred kinds.
160
187
  - [`standards-from-config`](../standards-from-config/SKILL.md) — the Class-A rule this applies to procedure rather than to style.
161
188
  - [`context-document`](../context-document/SKILL.md) — the contexts machinery a playbook reuses as its sixth type.
162
189
  - [`command-writing`](../command-writing/SKILL.md) — the numbered-step shape the body follows.
@@ -24,7 +24,7 @@ execution:
24
24
  handler: shell
25
25
  safety_mode: strict
26
26
  allowed_tools:
27
- - npx
27
+ - Bash(npx:*)
28
28
  ---
29
29
 
30
30
  # react-shadcn-ui
@@ -258,7 +258,7 @@ rubric:
258
258
  ```
259
259
 
260
260
  `contains` / `file_exists` grade deterministically. `rubric` items grade
261
- via a fresh sub-agent reading the output against the criterion — keep
261
+ via a fresh subagent reading the output against the criterion — keep
262
262
  each criterion to one falsifiable sentence.
263
263
 
264
264
  **Loop** (orchestrated by `scripts/run_skill_evals.ts`):
@@ -266,14 +266,14 @@ each criterion to one falsifiable sentence.
266
266
  1. **Scaffold** — `./scripts-run src/scripts/run_skill_evals scaffold {skill}`
267
267
  creates `runs/{timestamp}-{baseline,with-skill}/` and seeds each
268
268
  scenario's `meta.json`.
269
- 2. **Baseline run** — spawn one sub-agent per scenario **without** the
269
+ 2. **Baseline run** — spawn one subagent per scenario **without** the
270
270
  skill loaded. Capture stdout + any artifacts into
271
271
  `runs/{timestamp}-baseline/{scenario-id}/`.
272
- 3. **With-skill run** — same scenarios, same sub-agent harness, **with**
272
+ 3. **With-skill run** — same scenarios, same subagent harness, **with**
273
273
  the skill loaded. Capture into `runs/{timestamp}-with-skill/{scenario-id}/`.
274
274
  4. **Grade** — for each scenario, write a `grade.json` file with
275
275
  per-assertion pass/fail. Deterministic assertions auto-grade;
276
- rubric assertions need a grader sub-agent.
276
+ rubric assertions need a grader subagent.
277
277
  5. **Aggregate** — `./scripts-run src/scripts/run_skill_evals aggregate {skill}
278
278
  --run {timestamp}` produces `runs/{timestamp}-benchmark.json` with
279
279
  pass-rate, timing, token deltas baseline-vs-with-skill.
@@ -281,7 +281,7 @@ each criterion to one falsifiable sentence.
281
281
  --run {timestamp}` prints the diff. Iterate on the skill body
282
282
  until `with-skill` outperforms `baseline` on every scenario.
283
283
 
284
- The script ships with sub-agent spawning **stubbed** — the orchestration
284
+ The script ships with subagent spawning **stubbed** — the orchestration
285
285
  layer is per-environment (Claude Code, Augment, council). Implement
286
286
  the spawn function once for your environment, the rest of the loop
287
287
  (aggregate / report / scaffold) works out of the box.
@@ -30,7 +30,7 @@ Do NOT use when:
30
30
 
31
31
  1. **Inspect call site & choose approach** — identify every dynamic value flowing into the query, then pick: query builder when possible. Raw SQL only when query builder can't express the query.
32
32
  2. **Parameterize** — Every variable must use `?` binding or named `:param`. Never interpolate PHP variables into SQL strings.
33
- 3. **Use MariaDB syntax** — Not PostgreSQL or MSSQL. Check `php/sql.md` for MariaDB-specific patterns.
33
+ 3. **Read the engine, then choose the syntax** — check, in order: the project's DB config (`config/database.php` default connection, `DB_CONNECTION`), a `docker-compose.yml` service image, a migration using engine-specific syntax. MySQL and MariaDB share the query-syntax world this skill writes in; PostgreSQL and MSSQL do not. **If none of those declare an engine, say so and ask — do not assume one.** A query written for the wrong engine passes review and fails in production.
34
34
  4. **Verify** — Run EXPLAIN on complex queries. Check that no PHP interpolation (`"$var"`, `'{$var}'`) appears in SQL.
35
35
 
36
36
  ```
@@ -66,6 +66,12 @@ DB::select("SELECT * FROM users WHERE email = '{$email}'");
66
66
 
67
67
  ## Gotcha
68
68
 
69
+ **MySQL and MariaDB share a query-syntax world. They never share a migration
70
+ one.** Same principle as `database`: one engine for writing a `SELECT`, two for
71
+ online-DDL semantics, lock behavior under `ALTER`, feature availability and
72
+ `EXPLAIN` output. Never carry a claim from the second group across the two
73
+ without naming the engine and version it was measured on.
74
+
69
75
  - MariaDB and MySQL have subtle syntax differences.
70
76
  - The model writes `$variable` in SQL strings instead of `?` placeholders.
71
77
  - `GROUP BY` with `ONLY_FULL_GROUP_BY` requires all non-aggregated columns.
@@ -50,20 +50,43 @@ found", do not fabricate one).
50
50
  - Python: `pyproject.toml` / `ruff.toml` (`[tool.ruff]`, `[tool.black]`),
51
51
  `setup.cfg`.
52
52
  - Ruby: `.rubocop.yml`. Go: `gofmt`/`golangci.yml`.
53
- 2. **Derive as pointer + digest, never a flattened claim.** Each standard is one
53
+ 2. **Follow the chain before you digest, and pick the config NEAREST the edit.**
54
+ Read literally — one file, one parse — this procedure returns a null on a
55
+ repository whose root config is a single `extends`. A fourteen-line linter
56
+ config whose only load-bearing line points into a package in the same
57
+ workspace is not a project without standards; it is a project whose standards
58
+ are one hop away, and "no enforced standard found" there is a false negative
59
+ that reads exactly like a true one. `extends` is specified in TypeScript,
60
+ ESLint, Biome and Stylelint; `includes` plays the same role in PHPStan and
61
+ Rector; `workspace:` is documented in npm, yarn, pnpm and bun.
62
+ - **Precedence is nearest-first, and it is not a preference.** The config in
63
+ the edited path's own directory governs, then its parent, up to the
64
+ repository root. A per-package `tsconfig.json`, `.eslintrc`, `.env` or
65
+ deployment manifest is the one that package's build reads; a root file it
66
+ does not extend has no effect on it. Reading the root config for an edit
67
+ inside a package that carries its own is a **wrong** answer, not a coarse
68
+ one. Report the outranked root candidate too, so the precedence is visible.
69
+ - **An unresolvable hop is a named gap with a PARTIAL digest, never an
70
+ absence.** Say which hop failed and why. A partial digest naming its gap is
71
+ usable; a null that reads as "no standards" is a lie.
72
+ - **A hop that leaves the repository is labelled `external` and excluded from
73
+ the digest.** Presenting a third-party preset as the project's own standard
74
+ is worse than reporting nothing — the reader cannot tell which rules the
75
+ project chose. Report it with its path; do not merge it.
76
+ 3. **Derive as pointer + digest, never a flattened claim.** Each standard is one
54
77
  line: the **value**, the **config file it came from**, and the **scope** it
55
78
  applies to. Write `ruff.toml → line-length = 88 (scope: src/**/*.py)`, NOT
56
79
  "the project uses line length 88". The pointer makes the claim re-checkable
57
80
  and the next agent can open the config to confirm.
58
- 3. **Preserve scope; surface conflicts, never flatten them.** If two configs (or
81
+ 4. **Preserve scope; surface conflicts, never flatten them.** If two configs (or
59
82
  an inline / per-directory override) give two values, emit **two pointers with
60
83
  two values + their scopes** — never one ambiguous merged claim. A visible
61
84
  conflict is correct; a hidden flattened guess is the failure mode.
62
- 4. **Stamp staleness.** Record each source's `config_mtime` (or content hash).
85
+ 5. **Stamp staleness.** Record each source's `config_mtime` (or content hash).
63
86
  The digest is stale when the config file's mtime/hash changes → re-derive. No
64
87
  human gate is needed (Class A is deterministic) — the digest is **regenerated
65
88
  from the config, never hand-edited**.
66
- 5. **Persist** as a Class-A context card under `agents/settings/contexts/` (see
89
+ 6. **Persist** as a Class-A context card under `agents/settings/contexts/` (see
67
90
  Output format). Class A is high-trust *because* config-derived — it is read
68
91
  for heuristics only and never bypasses a fresh structural read (the v1↔v2
69
92
  isolation contract in `evidence-discipline`).
@@ -51,18 +51,25 @@ PIN IT, LOCK IT, CVE-SCAN IT. NEVER PIPE A REMOTE SCRIPT STRAIGHT TO A SHELL.
51
51
  ```
52
52
  Non-existent, brand-new (published days ago), or near-zero-download → **stop**, treat as hallucination/slopsquat.
53
53
  2. **Typo-adjacency** — is the name within 1–2 chars of a far-more-popular package (`python-dateutil` vs `dateutil`, `lodahs` vs `lodash`)? If so, you probably want the popular one — confirm before installing.
54
- 3. **Version safety** — the model's version pin may predate a CVE fix (training-cutoff reintroduction). Take the current patched release, then scan:
54
+ 3. **Version source — look it up BEFORE you write a version, and report which outcome you got.** This is a precondition of step 4, not a note on it. Two outcomes, with opposite handling, and only the first is forbidden:
55
+ - **Invention** — writing a version string that **no source in the repository produced**. Always forbidden. A version that appeared from nowhere is unverifiable by anyone downstream, including you an hour later.
56
+ - **Lookup failure** — having searched the **declared version sources** and found none. Those sources are per ecosystem: a catalogue or a `workspace:` protocol entry, an existing manifest in the tree (`package.json`, `composer.json`, `pyproject.toml`, `go.mod`, `Cargo.toml`), and the lockfile. This is **not** a violation. Resolving it from the registry or from the user is the correct move; report it as *unresolved-then-resolved* with the source named.
57
+
58
+ **Silence is the failure, never the fallback.** Producing a version with no source and no report is the thing the rule forbids; reporting an unresolved lookup is the thing it asks for.
59
+
60
+ A manifest that already expresses a version through a protocol — `workspace:*`, a catalogue reference — is **left as it is**. Rewriting it to a literal discards the mechanism the repository chose and pins a value the workspace was resolving for you. `workspace:` is documented in npm, yarn, pnpm and bun; catalogued versions are a documented feature of pnpm and bun.
61
+ 4. **Version safety** — the model's version pin may predate a CVE fix (training-cutoff reintroduction). Take the current patched release, then scan:
55
62
  ```bash
56
63
  npm audit # block on high/critical
57
64
  pip-audit
58
65
  osv-scanner -r .
59
66
  ```
60
- 4. **Pin + lock** — install exact + commit the lockfile; reject floating ranges (`^`, `latest`, no lockfile) on production deps.
67
+ 5. **Pin + lock** — install exact + commit the lockfile; reject floating ranges (`^`, `latest`, no lockfile) on production deps.
61
68
  ```bash
62
69
  npm install --save-exact <pkg> && git add package-lock.json
63
70
  ```
64
- 5. **License** — confirm the license is compatible with the project's declared license before it lands.
65
- 6. **No pipe-to-shell** — never `curl … | bash` an install; download → inspect → execute over pinned HTTPS, or surface it to the user for confirmation.
71
+ 6. **License** — confirm the license is compatible with the project's declared license before it lands.
72
+ 7. **No pipe-to-shell** — never `curl … | bash` an install; download → inspect → execute over pinned HTTPS, or surface it to the user for confirmation.
66
73
 
67
74
  ## MCP-server intake — the dependency gate plus two extra checks
68
75