@event4u/agent-config 16.1.0 → 16.3.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 (467) 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 +98 -257
  5. package/README.md +14 -12
  6. package/dist/agent-src/commands/analyze/inbox.md +1 -1
  7. package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
  8. package/dist/agent-src/commands/bug/fix.md +17 -2
  9. package/dist/agent-src/commands/feature/plan.md +1 -1
  10. package/dist/agent-src/commands/feature/roadmap.md +1 -1
  11. package/dist/agent-src/commands/fix/ci.md +1 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/jira-ticket.md +1 -1
  14. package/dist/agent-src/commands/roadmap/create.md +1 -1
  15. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  16. package/dist/agent-src/commands/roadmap/process-full.md +5 -5
  17. package/dist/agent-src/commands/roadmap/resolve-blockers.md +361 -0
  18. package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
  19. package/dist/agent-src/commands/roadmap.md +18 -4
  20. package/dist/agent-src/commands/tests/create.md +17 -3
  21. package/dist/agent-src/commands/tests/execute.md +22 -5
  22. package/dist/agent-src/commands/work.md +4 -0
  23. package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
  24. package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
  25. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +6 -6
  26. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +4 -8
  27. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +32 -2
  28. package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
  29. package/dist/agent-src/contexts/execution/toolchain-resolver.md +101 -7
  30. package/dist/agent-src/rules/active-remediation.md +1 -1
  31. package/dist/agent-src/rules/autonomous-execution.md +1 -0
  32. package/dist/agent-src/rules/broken-access-control.md +1 -0
  33. package/dist/agent-src/rules/command-suggestion-policy.md +1 -0
  34. package/dist/agent-src/rules/context-hygiene.md +1 -1
  35. package/dist/agent-src/rules/decision-revisit-gate.md +16 -33
  36. package/dist/agent-src/rules/design-fidelity.md +13 -16
  37. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -0
  38. package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -0
  39. package/dist/agent-src/rules/domain-safety-pii.md +1 -0
  40. package/dist/agent-src/rules/domain-safety-retention.md +1 -0
  41. package/dist/agent-src/rules/engineering-safety-floor.md +1 -0
  42. package/dist/agent-src/rules/evaluator-independence.md +3 -2
  43. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
  44. package/dist/agent-src/rules/finance-safety-floor.md +1 -0
  45. package/dist/agent-src/rules/git-history-discipline.md +1 -0
  46. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
  47. package/dist/agent-src/rules/legal-safety-floor.md +3 -2
  48. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
  49. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
  50. package/dist/agent-src/rules/media-governance-routing.md +14 -17
  51. package/dist/agent-src/rules/persona-governance.md +2 -2
  52. package/dist/agent-src/rules/provider-lifecycle-discipline.md +1 -1
  53. package/dist/agent-src/rules/question-not-instruction.md +1 -0
  54. package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
  55. package/dist/agent-src/rules/runtime-safety.md +1 -0
  56. package/dist/agent-src/rules/secret-vcs-guard.md +1 -0
  57. package/dist/agent-src/rules/security-sensitive-stop.md +3 -2
  58. package/dist/agent-src/rules/session-canary.md +8 -62
  59. package/dist/agent-src/rules/settings-ask-protocol.md +1 -0
  60. package/dist/agent-src/rules/source-confidentiality.md +1 -0
  61. package/dist/agent-src/rules/strategy-safety-floor.md +1 -0
  62. package/dist/agent-src/rules/tool-safety.md +1 -0
  63. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  64. package/dist/agent-src/rules/untrusted-input-defense.md +1 -0
  65. package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
  66. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  67. package/dist/agent-src/scripts/deferral_carry.ts +339 -0
  68. package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
  69. package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +1 -1
  70. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +2 -2
  71. package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
  72. package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
  73. package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
  74. package/dist/agent-src/skills/design-review/SKILL.md +30 -4
  75. package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
  76. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
  77. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +18 -3
  78. package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
  79. package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
  80. package/dist/agent-src/skills/iconography/SKILL.md +1 -1
  81. package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
  82. package/dist/agent-src/skills/markitdown/SKILL.md +4 -0
  83. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  84. package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
  85. package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
  86. package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
  87. package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
  88. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  89. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
  90. package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
  91. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
  92. package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
  93. package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
  94. package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
  95. package/dist/agent-src/skills/ui-component-architect/SKILL.md +25 -2
  96. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  97. package/dist/agent-src/templates/roadmaps.md +30 -0
  98. package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  99. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  100. package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  101. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  102. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  103. package/dist/agent-src/templates/scripts/work_engine/state.ts +57 -7
  104. package/dist/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  105. package/dist/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  106. package/dist/cli/python/knowledge_ingest.js +1 -1
  107. package/dist/cli/python/workspace_drive.js +1 -1
  108. package/dist/cli/registry.js +1 -1
  109. package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
  110. package/dist/cli-delegate/check_update_banner.js +12 -1
  111. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  112. package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
  113. package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
  114. package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-CQWX336L.js} +1 -1
  115. package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
  116. package/dist/cli-delegate/chunk-EEHDXSYD.js +2040 -0
  117. package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-GKE7ZVFA.js} +4 -4
  118. package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
  119. package/dist/cli-delegate/{chunk-UNCRJBT3.js → chunk-JQVYKIZA.js} +41 -0
  120. package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-JY2I2DXV.js} +12 -1
  121. package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
  122. package/dist/cli-delegate/{chunk-YUM5KURG.js → chunk-KR6EM23A.js} +235 -1455
  123. package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
  124. package/dist/cli-delegate/chunk-NQ7WT43P.js +2729 -0
  125. package/dist/cli-delegate/chunk-NXEILF2K.js +2160 -0
  126. package/dist/cli-delegate/{chunk-5R7HOLAF.js → chunk-NYX3L2PZ.js} +1 -1
  127. package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
  128. package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
  129. package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-QLDHIPWR.js} +1 -1
  130. package/dist/cli-delegate/{chunk-HDVVGPQW.js → chunk-RQNNW7IF.js} +1405 -567
  131. package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-S4UMZNES.js} +1 -1
  132. package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
  133. package/dist/cli-delegate/{chunk-GJCBB2UG.js → chunk-TRI6DQZ6.js} +3054 -325
  134. package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
  135. package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
  136. package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
  137. package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
  138. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  139. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  140. package/dist/cli-delegate/cmd_conformance.js +1862 -809
  141. package/dist/cli-delegate/cmd_doctor.js +13 -6
  142. package/dist/cli-delegate/cmd_doctor_neighbours.js +23 -0
  143. package/dist/cli-delegate/cmd_explain.js +5 -5
  144. package/dist/cli-delegate/cmd_export.js +11 -8
  145. package/dist/cli-delegate/cmd_fleet.js +3 -3
  146. package/dist/cli-delegate/cmd_handoff.js +10 -7
  147. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  148. package/dist/cli-delegate/cmd_memory_get.js +3 -1
  149. package/dist/cli-delegate/cmd_migrate.js +2 -2
  150. package/dist/cli-delegate/cmd_packs_active.js +3 -3
  151. package/dist/cli-delegate/cmd_preflight.js +6 -6
  152. package/dist/cli-delegate/cmd_prune.js +11 -8
  153. package/dist/cli-delegate/cmd_refresh.js +2 -1
  154. package/dist/cli-delegate/cmd_route_audit.js +8 -6
  155. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  156. package/dist/cli-delegate/cmd_session_recycle.js +4 -3
  157. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  158. package/dist/cli-delegate/cmd_settings_migrate.js +11 -8
  159. package/dist/cli-delegate/cmd_settings_set.js +4 -4
  160. package/dist/cli-delegate/cmd_sync.js +11 -8
  161. package/dist/cli-delegate/cmd_uninstall.js +11 -8
  162. package/dist/cli-delegate/cmd_update.js +1 -1
  163. package/dist/cli-delegate/cmd_upgrade.js +3 -2
  164. package/dist/cli-delegate/cmd_validate.js +11 -8
  165. package/dist/cli-delegate/cmd_versions.js +1 -1
  166. package/dist/cli-delegate/deferral_carry.js +16 -0
  167. package/dist/cli-delegate/gate_execute.js +2 -2
  168. package/dist/cli-delegate/roadmap_gates.js +5 -5
  169. package/dist/cli-delegate/update_roadmap_progress.js +1 -1
  170. package/dist/discovery/deprecation-report.md +1 -1
  171. package/dist/discovery/discovery-manifest.json +132 -80
  172. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  173. package/dist/discovery/discovery-manifest.summary.md +3 -3
  174. package/dist/discovery/dormancy-report.md +1 -1
  175. package/dist/discovery/orphan-report.md +1 -1
  176. package/dist/discovery/packs.json +7 -5
  177. package/dist/discovery/trust-report.md +2 -2
  178. package/dist/discovery/workspaces.json +6 -4
  179. package/dist/hooks/dispatch.js +7972 -5186
  180. package/dist/hooks/dispatch.sha256 +1 -0
  181. package/dist/install/claudePathsPlan.js +47 -6
  182. package/dist/install/claudeRuleRewrite.js +7 -0
  183. package/dist/install/emit_host_rules_cli.js +39 -36
  184. package/dist/install/globalRuleScope.js +87 -0
  185. package/dist/install/host_rule_ownership.js +160 -0
  186. package/dist/install/install.mjs +2226 -1055
  187. package/dist/install/installThinLayer.js +261 -0
  188. package/dist/install/installedRuleLinks.js +176 -0
  189. package/dist/install/wizard-plan.js +24 -0
  190. package/dist/mcp/registry-manifest.json +3 -3
  191. package/dist/mcp/server.json +2 -2
  192. package/dist/mcp/server.mjs +40913 -34865
  193. package/dist/scripts/_lib/agent_settings.js +11 -0
  194. package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
  195. package/dist/scripts/_lib/installed_layer.js +378 -0
  196. package/dist/scripts/_lib/lean_projection_mode.js +218 -15
  197. package/dist/scripts/_lib/rule_consequence_class.js +45 -0
  198. package/dist/scripts/_lib/rule_injection.js +67 -10
  199. package/dist/scripts/_lib/rule_law_section.js +122 -0
  200. package/dist/scripts/_lib/thin_rules.js +458 -0
  201. package/dist/scripts/_lib/windsurf_render.js +60 -0
  202. package/dist/scripts/condense.js +14 -26
  203. package/dist/scripts/project_thin_rules.js +14 -294
  204. package/dist/server/schemas/settings.js +29 -0
  205. package/dist/shared/skillRanking.js +74 -13
  206. package/dist/ui/assets/index-Cwq4d0hX.js +23 -0
  207. package/dist/ui/assets/index-Cyjy8bWO.css +1 -0
  208. package/dist/ui/index.html +2 -2
  209. package/docs/contracts/settings-classes.md +10 -6
  210. package/package.json +4 -4
  211. package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  212. package/src/agent-src/scripts/deferral_carry.ts +339 -0
  213. package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
  214. package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  215. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  216. package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  217. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  218. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  219. package/src/agent-src/templates/scripts/work_engine/state.ts +57 -7
  220. package/src/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  221. package/src/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  222. package/src/config/agent-settings.template.yml +91 -22
  223. package/src/config/ci-local-parity.yml +18 -0
  224. package/src/config/continuity-surface.json +9 -2
  225. package/src/config/evaluator-budgets.json +4 -4
  226. package/src/config/gate-coverage.yml +327 -3
  227. package/src/config/gate-violation-baselines.json +21 -9
  228. package/src/config/hook-bundle-budget.json +25 -0
  229. package/src/config/hook-latency-budget.json +21 -0
  230. package/src/config/hook-token-budget.json +8 -3
  231. package/src/config/host-instruction-limits.json +33 -0
  232. package/src/config/metric-registry.yml +114 -0
  233. package/src/config/placeholder-drift-budget.json +10 -0
  234. package/src/config/routing-coverage-seed.json +38 -3
  235. package/src/config/rule-activation-census.json +7 -3
  236. package/src/config/rule-consequence-class.json +161 -0
  237. package/src/config/rule-law-ceilings.json +99 -0
  238. package/src/install/claudePathsPlan.ts +46 -4
  239. package/src/install/claudeRuleRewrite.ts +10 -1
  240. package/src/install/emit_host_rules_cli.ts +43 -34
  241. package/src/install/globalRuleScope.ts +109 -0
  242. package/src/install/host_rule_ownership.ts +170 -0
  243. package/src/install/installThinLayer.ts +312 -0
  244. package/src/install/installedRuleLinks.ts +220 -0
  245. package/src/install/wizard-plan.ts +24 -0
  246. package/src/scripts/_cli/cmd_doctor.ts +28 -90
  247. package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
  248. package/src/scripts/_cli/doctor_execution.ts +100 -17
  249. package/src/scripts/_cli/doctor_network_posture.ts +226 -0
  250. package/src/scripts/_dispatch.bash +16 -2
  251. package/src/scripts/_lib/agent_settings.ts +11 -0
  252. package/src/scripts/_lib/body_portable.ts +102 -0
  253. package/src/scripts/_lib/cc_transcript.ts +132 -1
  254. package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
  255. package/src/scripts/_lib/concern_sla_window.ts +200 -0
  256. package/src/scripts/_lib/estate_offsets.ts +241 -0
  257. package/src/scripts/_lib/exemption_shape.ts +143 -0
  258. package/src/scripts/_lib/fnv.ts +23 -0
  259. package/src/scripts/_lib/foreign_scan.ts +106 -0
  260. package/src/scripts/_lib/forge_protection.ts +114 -0
  261. package/src/scripts/_lib/forge_reader.ts +558 -0
  262. package/src/scripts/_lib/gitignore_block.ts +314 -0
  263. package/src/scripts/_lib/global_deploy_inventory.ts +32 -0
  264. package/src/scripts/_lib/graph_feeder_record.ts +214 -0
  265. package/src/scripts/_lib/hook_settings.ts +73 -0
  266. package/src/scripts/_lib/host_capability.ts +40 -19
  267. package/src/scripts/_lib/host_env_write.ts +111 -0
  268. package/src/scripts/_lib/host_hook_merge.ts +165 -0
  269. package/src/scripts/_lib/installed_layer.ts +538 -0
  270. package/src/scripts/_lib/json_merge.ts +82 -0
  271. package/src/scripts/_lib/json_pointers.ts +93 -11
  272. package/src/scripts/_lib/lean_projection_mode.ts +275 -15
  273. package/src/scripts/_lib/llm_proposer_transport.ts +14 -4
  274. package/src/scripts/_lib/machine_wake.ts +16 -3
  275. package/src/scripts/_lib/neighbour_census.ts +760 -0
  276. package/src/scripts/_lib/neighbour_scan.ts +122 -0
  277. package/src/scripts/_lib/neighbour_tool_use.ts +189 -0
  278. package/src/scripts/_lib/obligations.ts +119 -8
  279. package/src/scripts/_lib/probe_inputs.ts +271 -0
  280. package/src/scripts/_lib/prompt_shape.ts +46 -0
  281. package/src/scripts/_lib/read_surface_scan.ts +322 -0
  282. package/src/scripts/_lib/release_highlights.ts +2 -1
  283. package/src/scripts/_lib/release_migration_gate.ts +19 -3
  284. package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
  285. package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
  286. package/src/scripts/_lib/review_coverage.ts +134 -0
  287. package/src/scripts/_lib/rule_consequence_class.ts +71 -0
  288. package/src/scripts/_lib/rule_injection.ts +130 -10
  289. package/src/scripts/_lib/rule_law_section.ts +147 -0
  290. package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
  291. package/src/scripts/_lib/shell_write_shapes.ts +108 -0
  292. package/src/scripts/_lib/skill_origin.ts +254 -0
  293. package/src/scripts/_lib/structural_hiding.ts +622 -0
  294. package/src/scripts/_lib/structured_ask.ts +64 -21
  295. package/src/scripts/_lib/thin_rules.ts +540 -0
  296. package/src/scripts/_lib/touched_file_quality.ts +434 -0
  297. package/src/scripts/_lib/turn_end_refusals.ts +600 -4
  298. package/src/scripts/_lib/turn_end_transcript.ts +216 -0
  299. package/src/scripts/_lib/verification_command.ts +324 -0
  300. package/src/scripts/_lib/verification_evidence.ts +647 -0
  301. package/src/scripts/_lib/verify_clause.ts +280 -0
  302. package/src/scripts/_lib/windsurf_render.ts +63 -0
  303. package/src/scripts/ai_council/cli_call_budget.ts +13 -5
  304. package/src/scripts/ai_council/clients.ts +26 -57
  305. package/src/scripts/ai_council/config.ts +1 -1
  306. package/src/scripts/ai_council/vendor_defaults.ts +45 -0
  307. package/src/scripts/ai_team/team_dispatch.ts +4 -0
  308. package/src/scripts/audit_skill_overlap.ts +261 -0
  309. package/src/scripts/before_complete_hook.ts +573 -25
  310. package/src/scripts/bench_hook_latency.ts +412 -5
  311. package/src/scripts/bench_touched_file_quality.ts +238 -0
  312. package/src/scripts/cache_realization_report.ts +61 -1
  313. package/src/scripts/check_argument_hint.ts +287 -0
  314. package/src/scripts/check_claims.ts +125 -1
  315. package/src/scripts/check_enforcement_coverage.ts +38 -9
  316. package/src/scripts/check_enforcement_matrix.ts +621 -22
  317. package/src/scripts/check_estate_count.ts +130 -153
  318. package/src/scripts/check_finding_dispositions.ts +138 -7
  319. package/src/scripts/check_generator_sync.ts +71 -0
  320. package/src/scripts/check_hook_bundle_composition.ts +370 -0
  321. package/src/scripts/check_host_docs_digest.ts +786 -0
  322. package/src/scripts/check_host_format_column.ts +559 -0
  323. package/src/scripts/check_input_references.ts +228 -0
  324. package/src/scripts/check_inputs_parity.ts +235 -0
  325. package/src/scripts/check_kernel_edit_ratified.ts +89 -9
  326. package/src/scripts/check_kill_switch_table.ts +294 -0
  327. package/src/scripts/check_memory.ts +7 -1
  328. package/src/scripts/check_placeholder_drift.ts +221 -0
  329. package/src/scripts/check_read_surface_coverage.ts +515 -0
  330. package/src/scripts/check_release_highlights.ts +10 -0
  331. package/src/scripts/check_release_holds.ts +2 -1
  332. package/src/scripts/check_release_pr_shape.ts +38 -15
  333. package/src/scripts/check_routing_coverage.ts +378 -11
  334. package/src/scripts/check_standing_rule_delivery.ts +33 -13
  335. package/src/scripts/check_static_parity.ts +17 -0
  336. package/src/scripts/check_verify_expectation_delta.ts +521 -0
  337. package/src/scripts/ci_settle.ts +145 -19
  338. package/src/scripts/closure_scan.ts +115 -1
  339. package/src/scripts/code_graph/detect.ts +127 -7
  340. package/src/scripts/code_graph/foreign.ts +194 -0
  341. package/src/scripts/code_graph/query.ts +217 -4
  342. package/src/scripts/code_graph/types.ts +26 -2
  343. package/src/scripts/code_graph/validate.ts +3 -1
  344. package/src/scripts/code_graph/verbs.ts +103 -0
  345. package/src/scripts/compile_hook_manifest.ts +90 -14
  346. package/src/scripts/condense.ts +14 -27
  347. package/src/scripts/estate_exemption_shape.ts +202 -0
  348. package/src/scripts/external_sources_denylist.json +29 -4
  349. package/src/scripts/generate_host_cost_table.ts +1 -1
  350. package/src/scripts/hook_manifest.json +1 -1
  351. package/src/scripts/hook_manifest.yaml +192 -14
  352. package/src/scripts/hooks/block_config_weakening.ts +294 -4
  353. package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
  354. package/src/scripts/hooks/block_plumbing_writes.ts +342 -0
  355. package/src/scripts/hooks/bundle_integrity.ts +291 -0
  356. package/src/scripts/hooks/chain_nudge_hook.ts +1 -2
  357. package/src/scripts/hooks/code_graph_context_hook.ts +253 -25
  358. package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
  359. package/src/scripts/hooks/concern_failure_policy.ts +280 -0
  360. package/src/scripts/hooks/concern_registry.ts +2 -0
  361. package/src/scripts/hooks/concern_timings.ts +94 -0
  362. package/src/scripts/hooks/delegation_nudge_hook.ts +1 -2
  363. package/src/scripts/hooks/design_pass_hook.ts +100 -9
  364. package/src/scripts/hooks/design_slop_hook.ts +1 -2
  365. package/src/scripts/hooks/dispatch_hook.ts +77 -71
  366. package/src/scripts/hooks/edit_shape_hook.ts +1 -2
  367. package/src/scripts/hooks/end_review_nudge_hook.ts +1 -1
  368. package/src/scripts/hooks/evidence_independence.ts +1 -2
  369. package/src/scripts/hooks/exit_codes.ts +129 -0
  370. package/src/scripts/hooks/host_lowering.json +1 -0
  371. package/src/scripts/hooks/host_lowering.ts +146 -3
  372. package/src/scripts/hooks/host_lowering.yaml +262 -46
  373. package/src/scripts/hooks/host_semantics.ts +30 -2
  374. package/src/scripts/hooks/injection_budget.ts +9 -2
  375. package/src/scripts/hooks/interruption_ledger_hook.ts +1 -2
  376. package/src/scripts/hooks/journal_record_hook.ts +1 -2
  377. package/src/scripts/hooks/memory_recall_hook.ts +1 -2
  378. package/src/scripts/hooks/obligation_settle_hook.ts +151 -5
  379. package/src/scripts/hooks/one_question_per_ask_hook.ts +43 -6
  380. package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
  381. package/src/scripts/hooks/payload_stub.ts +10 -1
  382. package/src/scripts/hooks/permission_gate.ts +1 -2
  383. package/src/scripts/hooks/push_settle_hook.ts +1 -3
  384. package/src/scripts/hooks/replay_hook.ts +2 -1
  385. package/src/scripts/hooks/reread_guard_hook.ts +1 -2
  386. package/src/scripts/hooks/review_baseline_hook.ts +1 -2
  387. package/src/scripts/hooks/rtk_wrap_hook.ts +1 -2
  388. package/src/scripts/hooks/rule_inject_hook.ts +765 -68
  389. package/src/scripts/hooks/run_continuation_hook.ts +13 -15
  390. package/src/scripts/hooks/skill_route_hook.ts +1 -2
  391. package/src/scripts/hooks/source_first_gate_hook.ts +1 -2
  392. package/src/scripts/hooks/spawn_guard_shadow_hook.ts +1 -2
  393. package/src/scripts/hooks/subagent_ledger_hook.ts +1 -2
  394. package/src/scripts/hooks/suggestion_capture_hook.ts +1 -1
  395. package/src/scripts/hooks/table_fingerprint.ts +70 -0
  396. package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
  397. package/src/scripts/hooks/telemetry_usage_hook.ts +65 -10
  398. package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
  399. package/src/scripts/hooks/turn_end_gate_hook.ts +421 -324
  400. package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
  401. package/src/scripts/hooks_status.ts +112 -0
  402. package/src/scripts/injection_scan_hook.ts +7 -0
  403. package/src/scripts/install.ts +75 -189
  404. package/src/scripts/installed_layer_report.ts +103 -0
  405. package/src/scripts/language_mirror_hook.ts +15 -6
  406. package/src/scripts/learning_sidecar.ts +119 -8
  407. package/src/scripts/lint_deny_text.ts +419 -0
  408. package/src/scripts/lint_exit_codes.ts +262 -0
  409. package/src/scripts/lint_hook_manifest.ts +108 -0
  410. package/src/scripts/lint_major_migration_sections.ts +156 -26
  411. package/src/scripts/lint_pack_boundaries.ts +63 -5
  412. package/src/scripts/lint_roadmap_blockers.ts +78 -12
  413. package/src/scripts/lint_rule_law_section.ts +517 -0
  414. package/src/scripts/lint_skill_descriptions.ts +1 -1
  415. package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
  416. package/src/scripts/lint_workflow_security.ts +161 -5
  417. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
  418. package/src/scripts/mcp_server/graph_tools.ts +72 -3
  419. package/src/scripts/mcp_server/prompts.ts +142 -1
  420. package/src/scripts/measure_routing_signal.ts +54 -16
  421. package/src/scripts/measure_skill_ranker_baseline.ts +515 -53
  422. package/src/scripts/measure_turn_end_gate.ts +193 -0
  423. package/src/scripts/memory_learn_hook.ts +91 -6
  424. package/src/scripts/memory_lookup.ts +1 -1
  425. package/src/scripts/model_rule_injection.ts +52 -5
  426. package/src/scripts/prepack-check.mjs +53 -0
  427. package/src/scripts/project_thin_rules.ts +34 -327
  428. package/src/scripts/release_publication.ts +13 -1
  429. package/src/scripts/report_evidence_temperature.ts +657 -0
  430. package/src/scripts/report_installed_rule_links.ts +157 -0
  431. package/src/scripts/report_invocation_surface.ts +383 -0
  432. package/src/scripts/report_label_agreement.ts +233 -0
  433. package/src/scripts/report_obligation_carriers.ts +699 -0
  434. package/src/scripts/report_obligation_mechanism.ts +230 -0
  435. package/src/scripts/report_obligation_writer_split.ts +236 -0
  436. package/src/scripts/report_single_token_triggers.ts +277 -0
  437. package/src/scripts/report_skill_menu_census.ts +208 -0
  438. package/src/scripts/report_skill_ranker_confusion.ts +442 -0
  439. package/src/scripts/report_standing_payload_by_host.ts +188 -15
  440. package/src/scripts/report_verification_record_coverage.ts +306 -0
  441. package/src/scripts/roadmap_verify_share.ts +213 -0
  442. package/src/scripts/rule_activation_census.ts +5 -2
  443. package/src/scripts/rule_trigger_eval.ts +9 -9
  444. package/src/scripts/schemas/command.schema.json +44 -0
  445. package/src/scripts/schemas/review-findings.schema.json +7 -2
  446. package/src/scripts/schemas/rule.schema.json +5 -0
  447. package/src/scripts/schemas/skill.schema.json +44 -0
  448. package/src/scripts/self_review_gate.ts +421 -17
  449. package/src/scripts/semantic_parity_census.ts +314 -0
  450. package/src/scripts/session_eol_report.ts +54 -1
  451. package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
  452. package/src/scripts/sweep_dead_scan_roots.ts +1 -1
  453. package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
  454. package/src/scripts/sync_gitignore.ts +29 -235
  455. package/src/scripts/trigger_eval_grandfather.json +0 -7
  456. package/src/scripts/trigger_eval_rotation.ts +122 -27
  457. package/src/scripts/ui_conformance_probe.ts +156 -4
  458. package/src/scripts/update_prices.ts +85 -3
  459. package/src/scripts/write_bundle_digest.mjs +74 -0
  460. package/src/server/schemas/settings.ts +41 -0
  461. package/src/shared/skillRanking.ts +117 -11
  462. package/src/templates/consumer-settings/ONBOARDING.md +1 -0
  463. package/dist/cli-delegate/chunk-FXYUYU4N.js +0 -4416
  464. package/dist/cli-delegate/chunk-QJWAUMJW.js +0 -1072
  465. package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
  466. package/dist/ui/assets/index-DH1xc62v.js +0 -29
  467. package/dist/ui/assets/index-jSfMW8_t.css +0 -1
@@ -0,0 +1,56 @@
1
+ # existing-ui-audit — component-taxonomy detection
2
+
3
+ > Section-level entry point of the `existing-ui-audit` skill (progressive
4
+ > disclosure). Load this file when § 1b of SKILL.md routes here — it carries
5
+ > the detection rules and the boundary the step must not cross.
6
+
7
+ ## What the detector answers
8
+
9
+ The question is *"has this project already chosen a way to organize its
10
+ components by granularity, and if so what does it call the tiers?"* — never
11
+ *"which taxonomy should this project use?"*. The recorded value is the
12
+ project's **own** tier directory names, in the project's own order, joined
13
+ with `/`, or `none`. Nothing canonical is ever written: a project with three
14
+ tiers records three, and a project whose tiers are called
15
+ `primitives / patterns / features` records exactly that.
16
+
17
+ ## Three properties, each pinned by a test
18
+
19
+ - **Declared outranks inferred.** A `## Component taxonomy` section in the
20
+ consumer project's own `DESIGN.md`, at its root or under `docs/`, listing
21
+ backticked directory names as list items wins, provided at least two of
22
+ those directories exist
23
+ under the component root. The name may be bolded — `- **\`atoms\`** — ...`
24
+ is read exactly like `` - `atoms` — ... ``. Grounding the declaration against
25
+ the tree keeps a stale doc from declaring a taxonomy the tree does not have,
26
+ and a backticked name in prose rather than in a list item is a mention, not a
27
+ declaration. This is how a project whose tiers appear in no vocabulary the
28
+ detector knows still gets conformance. The first doc that *qualifies* wins:
29
+ one with no section, or one naming fewer than two tiers that exist on disk,
30
+ falls through to the next.
31
+
32
+ - **A folder that merely sounds like a tier is a collision, not a convention.**
33
+ `components/{checkout,billing,molecules}` records `none`, and so does the
34
+ ordinary kind split `components/{layout,pages,forms}` — `layout`, `page`,
35
+ `block`, `element`, `part` and `cell` are all everyday folder names as well
36
+ as granularity words. Inference needs at least two tier-shaped buckets **and**
37
+ more than two thirds of the weighed ones; support folders (`hooks`, `utils`,
38
+ `types`, `lib`, `styles`, …) are left out of the denominator, so three
39
+ ordinary siblings cannot hide a taxonomy that is really there. Each floor has
40
+ its own fixture, because at one hit in three buckets either floor alone would
41
+ still refuse and neither would be tested.
42
+
43
+ - **`none` is a real answer, not a failure.** A flat tree, an unreadable tree,
44
+ a missing component folder, a permission error: all record `none`, and every
45
+ downstream step then behaves exactly as it did before this detection
46
+ existed. Detection never throws — degrading to `none` is the safe direction,
47
+ because `none` is precisely the value that leaves the project's own
48
+ structures untouched.
49
+
50
+ ## The boundary
51
+
52
+ Never write a taxonomy the project does not evidence, and never "tidy" an
53
+ existing layout into one. Holding to the project's own structures is the
54
+ standing rule; this step exists to *find* that structure, not to supply one.
55
+ The single place a taxonomy is ever *offered* is the greenfield halt in § 7,
56
+ and a decline there is terminal.
@@ -29,7 +29,7 @@ machinery that already exists: `search_stack` in
29
29
  [`corpus-grounding`](../corpus-grounding/SKILL.md)
30
30
  (`scripts/decision_engine.ts`), whose stack corpus carries `threejs.csv` among
31
31
  its stacks, read beside the register in
32
- [`design-intelligence`](../design-intelligence/references/context-and-registers.md)
32
+ `design-intelligence`
33
33
  § Register. No second frontend executor is declared, and none is needed: a
34
34
  renderer changes what you ground against, never who writes the UI.
35
35
 
@@ -42,7 +42,7 @@ execution:
42
42
  is the anti-pattern [`icon-consistency`](../../rules/icon-consistency.md)
43
43
  § What this gates names by name. Stop at the first rung that answers.
44
44
  1. **A brand token or brand guide that names an icon set** — authoritative,
45
- stop here ([`brand-source-of-truth`](../../rules/brand-source-of-truth.md)).
45
+ stop here (`brand-source-of-truth`).
46
46
  2. **The set already in use in this project** — detected at the Inspect step
47
47
  of the Iconography floor below. One icon system per project; a second
48
48
  visual language is the defect, not a preference.
@@ -17,7 +17,7 @@ packs:
17
17
  > A React or TypeScript consumer receives this skill through `engineering-base`, which both
18
18
  > of those packs require.
19
19
 
20
- The JavaScript twin of [`composer-packages`](../composer-packages/SKILL.md). A component is
20
+ The JavaScript twin of `composer-packages`. A component is
21
21
  a file; a **library** is a package with a public surface, and that surface is declared in
22
22
  `package.json` rather than inferred. Most of the failures below are silent at author time
23
23
  and loud at the consumer's — which is why the surface is read, not assumed.
@@ -167,7 +167,7 @@ declared cost — never here.
167
167
 
168
168
  ## See also
169
169
 
170
- - [`composer-packages`](../composer-packages/SKILL.md) — the PHP twin; same surface discipline, different manifest.
170
+ - `composer-packages` — the PHP twin; same surface discipline, different manifest.
171
171
  - [`standards-from-config`](../standards-from-config/SKILL.md) — the Class-A rule the § Release branch follows.
172
172
  - [`conventional-commits-writing`](../conventional-commits-writing/SKILL.md) — the `!` marker a release tool reads.
173
173
  - [`ui-component-architect`](../ui-component-architect/SKILL.md) — the component inside the library; this skill is the package around it.
@@ -1,6 +1,10 @@
1
1
  ---
2
2
  model_tier: medium
3
3
  name: markitdown
4
+ inputs:
5
+ - name: source
6
+ type: string
7
+ description: "URI of the document to convert — file:, https: or data: (http: is refused). Absent means the skill is being read for its scheme discipline rather than invoked."
4
8
  description: "Convert PDF, DOCX, XLSX, PPTX, EPUB, images, or audio to Markdown via the markitdown-mcp server — 'extract this PDF', 'OCR this image', 'transcribe this audio'."
5
9
  status: active
6
10
  tier: senior
@@ -104,7 +104,7 @@ for `workspace:`-linked packages.
104
104
 
105
105
  State plainly that the listing came from manifests rather than the runner — an
106
106
  inferred target list can miss runner-inferred targets. This is the posture
107
- [`react-shadcn-ui`](../react-shadcn-ui/SKILL.md) already takes for the shadcn
107
+ `react-shadcn-ui` already takes for the shadcn
108
108
  CLI; the stop condition is `missing-tool-handling` (never install it silently,
109
109
  never fake the output).
110
110
 
@@ -144,22 +144,46 @@ test('homepage visual regression', async ({ page }) => {
144
144
 
145
145
  ## Viewport testing
146
146
 
147
+ A viewport loop whose only assertion is an image proves that the page rendered,
148
+ not that the breakpoint did anything: the same picture comes back whether the
149
+ media query fired or silently did not. Assert the layout property the breakpoint
150
+ is supposed to change, then keep the capture and name it for the one thing it
151
+ proves.
152
+
147
153
  ```ts
148
154
  test.describe('Responsive design', () => {
149
155
  for (const viewport of [
150
- { width: 1440, height: 900, name: 'desktop' },
151
- { width: 768, height: 1024, name: 'tablet' },
152
- { width: 375, height: 812, name: 'mobile' },
156
+ { width: 1440, height: 900, name: 'desktop', columns: '1fr 1fr 1fr' },
157
+ { width: 768, height: 1024, name: 'tablet', columns: '1fr 1fr' },
158
+ { width: 375, height: 812, name: 'mobile', columns: '1fr' },
153
159
  ]) {
154
- test(`renders correctly on ${viewport.name}`, async ({ page }) => {
155
- await page.setViewportSize(viewport)
160
+ test(`lays out correctly on ${viewport.name}`, async ({ page }) => {
161
+ await page.setViewportSize({ width: viewport.width, height: viewport.height })
156
162
  await page.goto('/')
157
- await expect(page).toHaveScreenshot(`home-${viewport.name}.png`)
163
+ // Behaviour: the declared breakpoint actually changed the layout.
164
+ await expect(page.locator('#grid')).toHaveCSS('grid-template-columns', viewport.columns)
165
+ // Appearance only: presence + sanity that nothing renders broken.
166
+ await expect(page).toHaveScreenshot(`appearance-${viewport.name}.png`)
158
167
  })
159
168
  }
160
169
  })
161
170
  ```
162
171
 
172
+ **Read the probe artifact rather than re-deriving the matrix by hand.**
173
+ `agents/runtime/state/ui-conformance.json` — produced by
174
+ `ui_conformance_probe --target <file> --reference <file>` — carries a
175
+ `viewport_matrix` row per declared width, plus a not-applicable row with its
176
+ reason wherever the host could not cross the breakpoint. A width with no row is
177
+ missing evidence, not a pass, and no dimension reads zero findings because it did
178
+ not run.
179
+
180
+ **The capture above is appearance-only, and it stays mandatory.** It proves
181
+ presence and sanity — the surface rendered and nothing renders obviously broken —
182
+ and proves nothing about hover, focus, keyboard or a media-preference branch.
183
+ Demoting it from behavioral evidence does not narrow when it runs: it still runs
184
+ at every width in the matrix. Floor and division of labour:
185
+ [`design-review`](../design-review/SKILL.md) § Appearance verification.
186
+
163
187
  ## Debugging
164
188
 
165
189
  ```bash
@@ -27,6 +27,8 @@ Use this skill whenever running or configuring code quality tools:
27
27
 
28
28
  - **PHP**: PHPStan (static analysis), Rector (automated refactoring), ECS (coding standards)
29
29
  - **JS/TS**: Biome (linting + formatting), TypeScript compiler (type checking), Jest/Vitest (tests)
30
+ - **Python**: Ruff (linting + formatting), mypy (type checking), pytest (tests)
31
+ - **Go**: `gofmt`, `go vet`, optionally golangci-lint, `go test`
30
32
 
31
33
  ## Modes
32
34
 
@@ -39,8 +41,16 @@ stack calls for.
39
41
  |---|---|---|
40
42
  | PHP (`.php` changed) | [`references/php-tools.md`](references/php-tools.md) | Tool detection, PHPStan / ECS / Rector commands and flags, combined pipeline, config files, baseline policy, PHPStan error handling, testing framework, git-aware execution |
41
43
  | JS/TS (`.js` / `.ts` / `.tsx` changed) | [`references/js-ts-tools.md`](references/js-ts-tools.md) | Detection, Biome, TypeScript type checking, Jest / Vitest, the JS/TS workflow sequence |
44
+ | Python (`.py` changed, or `pyproject.toml`) | [`references/python-tools.md`](references/python-tools.md) | Detection from `pyproject.toml`, Ruff, mypy, pytest, the workflow sequence, virtualenv and `setup.cfg` gotchas |
45
+ | Go (`.go` changed, or `go.mod`) | [`references/go-tools.md`](references/go-tools.md) | `gofmt`, `go vet`, golangci-lint where present, `go test`, the workflow sequence, vendor and build-tag gotchas |
42
46
 
43
- Both stacks changed → load both mode bodies and run both pipelines.
47
+ More than one stack changed → load each mode body and run each pipeline.
48
+
49
+ **The resolver decides which row applies, not the file extension alone.**
50
+ `resolve_toolchain` returns the ecosystems it found and the quality commands
51
+ per ecosystem; the rows above name what those commands are. A TypeScript
52
+ repository resolves the ecosystem `js`, never `typescript` — the pack name and
53
+ the ecosystem label are different vocabularies.
44
54
 
45
55
  ## Execution policy — on demand only, never proactive
46
56
 
@@ -0,0 +1,76 @@
1
+ # quality-tools — Go quality tools
2
+
3
+ > Mode body of the [`quality-tools`](../SKILL.md) skill. Load this file when
4
+ > the mode table in SKILL.md routes here. The cross-mode material — execution
5
+ > policy, environment, output discipline — stays in SKILL.md and is NOT
6
+ > repeated here.
7
+
8
+ # Go Quality Tools
9
+
10
+ ## Detection
11
+
12
+ `resolve_toolchain` (`work_engine/stack/runner.ts`) keys the Go ecosystem on
13
+ `go.mod` and resolves exactly one quality command, `go vet ./...`, plus the
14
+ test command `go test ./...`. It does **not** detect `golangci-lint`, so a
15
+ repository that uses one will show a `quality` list shorter than what its CI
16
+ runs. Read the repository's CI workflow before concluding the resolver's list
17
+ is the whole gate.
18
+
19
+ | Signal | Tool | What it does |
20
+ |---|---|---|
21
+ | `go.mod` present | **`go vet`** | The toolchain's own correctness checks — printf verbs, struct tags, unreachable code, lost cancel |
22
+ | `go.mod` present | **`gofmt`** | Canonical formatting; not resolved as a command because it is not optional in Go |
23
+ | `.golangci.yml` / `.golangci.yaml` | **golangci-lint** | Meta-linter; the resolver does not detect it |
24
+
25
+ ## The toolchain's own commands
26
+
27
+ ```bash
28
+ gofmt -l . # list files whose formatting differs — empty is the pass
29
+ gofmt -w . # rewrite them
30
+ go vet ./... # the resolver's quality command
31
+ go build ./... # compiles; the cheapest proof the tree is coherent
32
+ go test ./... # the resolver's test command
33
+ go test -run '<regexp>' ./pkg/... # the targeted probe
34
+ go test -race ./... # the race detector — slow, and the only thing that finds a data race
35
+ ```
36
+
37
+ **`gofmt -l .` with empty output is the pass.** It exits 0 whether or not it
38
+ listed files, so a pipeline that checks only the exit code never fails on
39
+ formatting. Check the output, not the status.
40
+
41
+ ## golangci-lint, where a project has it
42
+
43
+ ```bash
44
+ golangci-lint run # the whole configured set
45
+ golangci-lint run ./pkg/... # scoped to a package
46
+ ```
47
+
48
+ It wraps `go vet` among others, so a project with `.golangci.yml` does not
49
+ need `go vet` run separately — and running both doubles the report rather than
50
+ widening it.
51
+
52
+ ## Workflow sequence
53
+
54
+ 1. `gofmt -l .` — read the output, not the exit code.
55
+ 2. `go build ./...` — a compile error makes every later step meaningless.
56
+ 3. `go vet ./...`, or `golangci-lint run` where the project has it.
57
+ 4. `go test -run '<the thing you changed>' ./pkg/...` — targeted.
58
+ 5. `go test ./...`, once, at the end; `-race` where concurrency changed.
59
+
60
+ ## Gotchas
61
+
62
+ - **`./...` from the wrong directory.** The pattern is relative to the working
63
+ directory, not to the module root. Run it from the directory holding
64
+ `go.mod`, or name the module path.
65
+ - **A vendored tree.** With `vendor/` present the toolchain defaults to
66
+ `-mod=vendor`; a dependency added to `go.mod` but not vendored fails to build
67
+ with an error that names the package, not the mode. `go mod vendor` after any
68
+ dependency change.
69
+ - **Build tags hide packages.** `go vet ./...` and `go test ./...` skip files
70
+ excluded by build constraints, so a green run says nothing about a
71
+ `//go:build integration` file. Name the tag (`-tags integration`) to reach it.
72
+ - **No `go` pack exists in this suite yet.** Go artifacts route through
73
+ `engineering-base` and this reference; `src/packs/go/pack.yaml` <!-- ref-ignore --> is created by
74
+ `road-to-stacks-beyond-php` step 2.3, which is blocked on the programme's
75
+ skill-growth question. Until then this file is the whole of the Go quality
76
+ surface, by design rather than by omission.
@@ -0,0 +1,104 @@
1
+ # quality-tools — Python quality tools
2
+
3
+ > Mode body of the [`quality-tools`](../SKILL.md) skill. Load this file when
4
+ > the mode table in SKILL.md routes here. The cross-mode material — execution
5
+ > policy, environment, output discipline — stays in SKILL.md and is NOT
6
+ > repeated here.
7
+
8
+ # Python Quality Tools
9
+
10
+ ## Detection
11
+
12
+ The resolver is the authority, not this table. `resolve_toolchain`
13
+ (`work_engine/stack/runner.ts`) reads `pyproject.toml` and returns the quality
14
+ commands it found; run those. The table says what each one is, so a reader can
15
+ tell a missing tool from an unknown one.
16
+
17
+ | Indicator in `pyproject.toml` | Tool | What it does |
18
+ |---|---|---|
19
+ | `[tool.ruff]` | **Ruff** | Linting and formatting in one binary; replaces flake8, isort, pyupgrade and (with `ruff format`) black |
20
+ | `[tool.mypy]` | **mypy** | Static type checking |
21
+ | `[tool.pytest.ini_options]` | **pytest** | Test runner — the resolver binds it as the test command, not as a quality command |
22
+
23
+ A repository with none of the three resolves an empty `quality` list. That
24
+ means **none was resolved**, never that none is needed — the same distinction
25
+ SKILL.md draws for ruby, jvm and dotnet.
26
+
27
+ ## Ruff — linting and formatting
28
+
29
+ ```bash
30
+ ruff check . # lint, read-only
31
+ ruff check --fix . # lint and apply the safe fixes
32
+ ruff format . # format
33
+ ruff format --check . # format check, read-only — what CI runs
34
+ ```
35
+
36
+ Config lives in `[tool.ruff]` in `pyproject.toml` (or `ruff.toml`). The two
37
+ settings that change what the other commands mean:
38
+
39
+ - `line-length` — the formatter's wrap column; `ruff check` reports `E501`
40
+ against the same number.
41
+ - `[tool.ruff.lint] select` / `ignore` — the rule set. An empty `select` is
42
+ Ruff's default set, not "no rules".
43
+
44
+ **`--fix` is not a formatter.** `ruff check --fix` rewrites code to satisfy
45
+ lint rules; `ruff format` rewrites layout. A pipeline that runs only the first
46
+ leaves formatting drift that CI's `ruff format --check` then fails on.
47
+
48
+ ## mypy — type checking
49
+
50
+ ```bash
51
+ mypy . # check the package
52
+ mypy --strict . # every optional strictness flag on
53
+ ```
54
+
55
+ Config lives in `[tool.mypy]`. `strict = true` there is the same as `--strict`
56
+ on the command line, so passing the flag to a project that already sets it
57
+ changes nothing — and passing it to one that does not is a different check
58
+ from the one CI runs. Read the config before adding flags.
59
+
60
+ An error mypy reports on a file the current change did not touch is
61
+ pre-existing debt. Treat it the way SKILL.md's baseline policy treats a
62
+ PHPStan baseline entry: it is not this change's to clear silently.
63
+
64
+ ## pytest — the test runner
65
+
66
+ Not a quality tool, listed here because the resolver finds it in the same
67
+ file and a reader looking for "the Python commands" expects it.
68
+
69
+ ```bash
70
+ pytest # the resolver's bound command
71
+ pytest -q # quiet, what `addopts = "-q"` already sets
72
+ pytest -k '<expr>' # filter by name — the targeted probe
73
+ pytest path/to/test.py # filter by file
74
+ ```
75
+
76
+ Run the filtered form when verifying one fix. The whole suite is the final
77
+ gate, never the per-iteration probe.
78
+
79
+ ## Workflow sequence
80
+
81
+ 1. `ruff format --check .` — fails fast and costs nothing.
82
+ 2. `ruff check .` — lint.
83
+ 3. `mypy .` — types.
84
+ 4. `pytest -k '<the thing you changed>'` — targeted.
85
+ 5. The full suite, once, at the end.
86
+
87
+ Each step is cheaper and narrower than the next, so running them out of order
88
+ spends the expensive verdict on a failure the cheap one would have named.
89
+
90
+ ## Gotchas
91
+
92
+ - **A virtualenv the agent did not activate.** `ruff` and `mypy` installed in
93
+ a project venv are not on `PATH` outside it. `python -m ruff` / `python -m
94
+ mypy` run the installed copy; a bare `ruff` may run a different version or
95
+ none.
96
+ - **`requirements.txt` only.** The resolver still binds pytest (at MEDIUM
97
+ confidence) but finds no quality commands, because it reads them from
98
+ `pyproject.toml`. An empty `quality` list on such a repository is correct
99
+ output, not a detection bug.
100
+ - **`setup.cfg` and `tox.ini` carry config too.** Older projects keep flake8
101
+ and mypy settings there. The resolver does not read them; if a project has
102
+ no `[tool.*]` block and a populated `setup.cfg`, the tools are configured and
103
+ the resolver's empty list is a gap in the resolver, worth reporting rather
104
+ than working around.
@@ -31,7 +31,7 @@ Do NOT use when:
31
31
  - The diff is low-risk and no ownership map exists — fall back to the
32
32
  common role vocabulary below.
33
33
  - A full PR description is requested — route to
34
- [`/pr:create:description-only`](../../domains/git/pr/create/description-only/command.md) and let
34
+ `/pr:create:description-only` and let
35
35
  it call this skill for the routing block.
36
36
  - A threat model is wanted — route to
37
37
  [`threat-modeling`](../threat-modeling/SKILL.md).
@@ -210,6 +210,6 @@ Data source: <"ownership-map.yml + historical-bug-patterns.yml"
210
210
 
211
211
  - [`reviewer-awareness`](../../rules/reviewer-awareness.md) — the rule that routes here: anchor reviewer choice in paths and risk, never seniority
212
212
  - [`review-routing-data-format`](../../guidelines/agent-infra/review-routing-data-format.md)
213
- - [`/pr:create:description-only`](../../domains/git/pr/create/description-only/command.md)
213
+ - `/pr:create:description-only`
214
214
  - [`judge-test-coverage`](../judge-test-coverage/SKILL.md) — consumes
215
215
  the `required_test` entries from matched patterns.
@@ -213,7 +213,7 @@ is the wrong question asked well.
213
213
  **The escalation threshold applies here too.** A third recurrence of the same
214
214
  violation class converts an observation into a deterministic gate — and a review
215
215
  finding never silently becomes a hard gate. Both halves, specified in
216
- [`decision-review` § Removal is a disposition](../decision-review/SKILL.md).
216
+ `decision-review` § Removal is a disposition.
217
217
 
218
218
  ## Output format
219
219
 
@@ -16,7 +16,7 @@ agent reads to learn what the component accepts, and the harness that catches a
16
16
  focus defect while the component is still in isolation. Stack-agnostic — the tool is
17
17
  Storybook, the discipline is not.
18
18
 
19
- Lifted out of [`react-shadcn-ui`](../react-shadcn-ui/SKILL.md) § Component workshop, which
19
+ Lifted out of `react-shadcn-ui` § Component workshop, which
20
20
  keeps a pointer here rather than a copy.
21
21
 
22
22
  ## The Iron Law
@@ -135,7 +135,7 @@ Run the project's story test command (the Vitest addon's `storybook test`, or wh
135
135
  `package.json` declares — read it, do not assume a name), then read the a11y result.
136
136
 
137
137
  Write findings into `state.ui_review.a11y` in the shape
138
- [`react-shadcn-ui`](../react-shadcn-ui/SKILL.md) § Review pass already defines:
138
+ `react-shadcn-ui` § Review pass already defines:
139
139
 
140
140
  ```
141
141
  {violations: [{rule, selector, severity}, …], severity_floor?, accepted_violations?}
@@ -235,7 +235,7 @@ copied verbatim:
235
235
 
236
236
  ## See also
237
237
 
238
- - [`react-shadcn-ui`](../react-shadcn-ui/SKILL.md) — the React stack lane, and the `(rule, selector, severity)` shape § Validate writes into.
238
+ - `react-shadcn-ui` — the React stack lane, and the `(rule, selector, severity)` shape § Validate writes into.
239
239
  - [`existing-ui-audit`](../existing-ui-audit/SKILL.md) — the inventory the MCP path accelerates.
240
240
  - [`js-library-packaging`](../js-library-packaging/SKILL.md) — the package around the workshop.
241
241
  - [`accessibility-auditor`](../accessibility-auditor/SKILL.md) — the WCAG depth behind the a11y half.
@@ -87,7 +87,7 @@ Structure, controls, grid and breakpoints are never this skill's to adjust;
87
87
  those stay 1:1 with the artifact and belong to the rule, not to a
88
88
  utility-class decision. **Icons are out of scope here as well, and this skill
89
89
  asserts no obligation about them** — the icon system belongs to
90
- [`icon-consistency`](../../rules/icon-consistency.md). An earlier revision of
90
+ `icon-consistency`. An earlier revision of
91
91
  this paragraph claimed icons "stay 1:1 with the artifact" with no citation of
92
92
  any kind, while putting them outside its own scope in the same sentence; the
93
93
  claim is withdrawn rather than defended, because a clause that reached the tree
@@ -39,6 +39,13 @@ CAP PER BEHAVIOR: 5–8 CASES — EACH MUST FAIL FOR A DISTINCT REASON.
39
39
 
40
40
  ## Does this change owe an executable behavior contract?
41
41
 
42
+ This section is the decision *Gherkin*, *BDD*, *Cucumber*, *Behat* and
43
+ *given-when-then* are meant to reach — each pinned as a should-trigger case in
44
+ `evals/triggers.json`, with German exemplars for *Cucumber* and *Behat*. That
45
+ corpus specifies
46
+ the intent; it does not route, and this skill's `description` carries none of
47
+ the terms. A decision, not a guide to writing one.
48
+
42
49
  Cases and contracts are not the same artifact. A **case** is something you assert
43
50
  in the project's unit runner. An **executable behavior contract** — a
44
51
  specification written in the language of whoever asked for the change, and run
@@ -313,6 +313,23 @@ export async function retry<T>(op: () => Promise<T>): Promise<T> {
313
313
  Run again → passes. Configurable attempt count, backoff, and jitter all
314
314
  wait for their own failing tests.
315
315
 
316
+ ## The filtered probe, per ecosystem
317
+
318
+ The discipline above is stack-independent; the **command** is not, and every
319
+ runner invocation elsewhere in this file is a PHP one. Resolve the runner with
320
+ `resolve_toolchain` (`work_engine/stack/runner.ts`) and read its `ecosystems`,
321
+ then filter with that ecosystem's own form — never the whole suite:
322
+
323
+ | `ecosystems` | Filtered probe |
324
+ |---|---|
325
+ | `php` | `vendor/bin/pest --filter '<name>'` · `php artisan test --filter '<name>'` |
326
+ | `js` | `npx vitest run -t '<name>'` · `npx jest -t '<name>'` |
327
+ | `python` | `pytest -k '<expr>'` · `pytest path/to/test.py::test_name` |
328
+ | `go` | `go test -run '<regexp>' ./pkg/...` |
329
+
330
+ A TypeScript repository resolves the ecosystem `js`, never `typescript`. The
331
+ whole suite is the final gate and never the per-iteration probe, in every row.
332
+
316
333
  ## Gotchas
317
334
 
318
335
  * Running the full suite instead of a filtered test hides the RED→GREEN
@@ -174,4 +174,22 @@ Replace dynamic `getPdo()` probing with explicit config:
174
174
  - Do NOT use RefreshDatabase when DatabaseTransactions works — 10x slower.
175
175
  - Do NOT run full test suite on every code change — use `--filter`.
176
176
  - Do NOT add test-only indexes — fix test design instead.
177
- - Do NOT disable parallel testing to "fix" flaky tests — fix the root cause.
177
+ - Do NOT disable parallel testing to "fix" flaky tests — fix the root cause.
178
+
179
+ ## Where the time goes, per ecosystem
180
+
181
+ The diagnosis above is PHPUnit-shaped. The method — measure before optimising,
182
+ find the slowest tests first, separate setup cost from assertion cost —
183
+ transfers; the instrument does not. Resolve the runner with
184
+ `resolve_toolchain` and read its `ecosystems`:
185
+
186
+ | `ecosystems` | Slowest-test instrument | The usual first cause |
187
+ |---|---|---|
188
+ | `php` | `--profile` / Pest's duration column | database refresh per test |
189
+ | `js` | `vitest --reporter=verbose`, `jest --detectOpenHandles` | module transform and a leaked handle |
190
+ | `python` | `pytest --durations=20` | session-scoped fixtures rebuilt per test |
191
+ | `go` | `go test -v`, `-cpuprofile`, `-race` for the slow-and-flaky pair | a `TestMain` that starts real I/O |
192
+
193
+ `go test` caches a package's result until its inputs change, so a suite that
194
+ looks fast on the second run may not have run at all — `-count=1` defeats the
195
+ cache when you are measuring.
@@ -61,7 +61,7 @@ than under-splitting. Meet BOTH conditions before you extract.
61
61
  **Read `DESIGN.md` § Owned components first** — it is the project's own inventory of what
62
62
  it already owns (component, status, story file, registry item), filled from the story files
63
63
  rather than from memory by
64
- [`design-system-capture`](../design-system-capture/SKILL.md). It is the cheapest possible
64
+ `design-system-capture`. It is the cheapest possible
65
65
  prior-art check: one table, and a `deprecated` row tells you not to reach for something that
66
66
  still exists in the tree. Absent or empty → fall through to
67
67
  [`existing-ui-audit`](../existing-ui-audit/SKILL.md), which reads the codebase itself.
@@ -69,6 +69,29 @@ still exists in the tree. Absent or empty → fall through to
69
69
  Then review existing components in the codebase for the same
70
70
  responsibility — extend rather than rebuild when a match is found.
71
71
 
72
+ **Read `state.ui_audit.component_taxonomy` before you decide where the
73
+ component goes.** The audit (§ 1b of
74
+ [`existing-ui-audit`](../existing-ui-audit/SKILL.md)) records the project's
75
+ **own** granularity tiers, joined with `/`, or `none`:
76
+
77
+ - **It names tiers** → record the chosen tier on the component's
78
+ `state.ui_design.components[]` entry as `tier` (the apply step reads that
79
+ field and nothing else writes it), then place the component inside it and say
80
+ which:
81
+ *"conforming to the project's `primitives/patterns/features` taxonomy —
82
+ `Checkout` goes under `src/components/features/`"*. Match the tier by name;
83
+ there is no rule here that computes a tier, and there must not be one.
84
+ - **A component fits no tier** → report it as a named conformance gap with the
85
+ reason, and leave it unplaced. Do not put it somewhere else quietly, and do
86
+ not invent a tier for it — picking one would need exactly the per-tier rule
87
+ the measurement below shows is not derivable.
88
+ - **`none`** → behave exactly as you would without this paragraph. A project
89
+ that organizes its components some other way must not be able to tell that
90
+ this step exists. Never propose a taxonomy to a project that has one you did
91
+ not recognise, and never propose one mid-task to a project that has none —
92
+ the single offer is made once, at the greenfield halt, and a decline there is
93
+ terminal.
94
+
72
95
  **A new component's workshop is part of its design where the project has one —
73
96
  size-conditional, never a generic mandate.** The boundary is
74
97
  [`component-oriented-and-oop-development`](../../guidelines/component-oriented-and-oop-development.md)
@@ -81,7 +104,7 @@ checkable before it reaches a page. That skill is stack-agnostic and ships in
81
104
  `engineering-base`, so a plain-`react` project receives it exactly as a
82
105
  `react-shadcn` one does. The state-coverage matrix the story set is derived
83
106
  from is React-specific and lives in
84
- [`react-shadcn-ui`](../react-shadcn-ui/SKILL.md) § Step 3, deliberately not
107
+ `react-shadcn-ui` § Step 3, deliberately not
85
108
  duplicated here; a Blade, Vue or Livewire lane derives its story set from that
86
109
  lane's own state list instead.
87
110
 
@@ -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: "16.1.0"
42
+ agent_config_version: "16.3.0"
43
43
 
44
44
  # --- Project identity ---
45
45
  project:
@@ -575,6 +575,36 @@ that was never a judgement call.
575
575
  full CI pipeline — per `roadmap-ci-steps-policy` a `verify:` must not
576
576
  be a full-suite gate.
577
577
 
578
+ **The expectation half — say what the command must produce.** A command
579
+ alone names no oracle. `` verify: `cat notes.md` `` is a conforming step
580
+ field that cannot say no, so the box gets flipped on a command that was
581
+ never able to fail. In practice the great majority of clauses in a
582
+ roadmap tree state no oracle at all — run the share command below on
583
+ your own tree rather than trusting a number written here. A clause
584
+ MAY therefore state what the command must produce, using the arrow
585
+ `exec:` evidence already carries — not a new symbol:
586
+
587
+ - `` verify: `<cmd>` -> 0 `` — the command must exit with that code.
588
+ - `` verify: `<cmd>` -> /regex/ `` — its output must match.
589
+
590
+ Prose after `verify:` stays legal and reads as MANUAL. Forbidding it
591
+ would invalidate most clauses already in the tree at a stroke, and a
592
+ grammar that reds every producer gets weakened until it finds nothing.
593
+ One parser reads the arrow (`src/scripts/_lib/verify_clause.ts`) and
594
+ nothing parses it a second time. `closure_scan`'s `unfalsifiable-verify`
595
+ family reports the clauses whose oracle cannot say no, and exits 0
596
+ unconditionally — it is a listing, never a gate. The share per roadmap
597
+ is `./scripts-run src/scripts/roadmap_verify_share`.
598
+
599
+ **An absence check names its positive control.** A `verify:` asserting
600
+ that something is *absent* — no match, no occurrence, an empty diff —
601
+ passes identically when the property holds, when the check itself is
602
+ broken, when the path moved, and when the corpus is empty. Such a clause
603
+ MUST name the input on which it does fire: the positive control. A
604
+ fixture that plants the thing, a prior commit that carried it, or a
605
+ sabotage the step records. Without one it is a check nobody has seen
606
+ working, and its green means only that nothing ran.
607
+
578
608
  24. **Ready roadmaps carry a `## Risk Register` (Gate R1).** Every
579
609
  ready (non-draft) roadmap ends with a schema-valid Risk Register —
580
610
  marker line (`<!-- risk-review: v1 | reviewed: YYYY-MM-DD |
@@ -11,8 +11,9 @@
11
11
  *
12
12
  * The gate is **scoped to the greenfield-scaffold path only**. It acts only
13
13
  * when `state.ui_audit` records `greenfield == True` and
14
- * `greenfield_decision == "scaffold"`. Every other UI flow sees this slot as a
15
- * clean `SUCCESS` no-op, so those flows stay byte-identical.
14
+ * `greenfield_decision` ∈ `{scaffold, granularity_convention}`. Every other
15
+ * UI flow sees this slot as a clean `SUCCESS` no-op, so those flows stay
16
+ * byte-identical.
16
17
  */
17
18
  import {
18
19
  type Any,
@@ -21,6 +22,7 @@ import {
21
22
  StepResult,
22
23
  agent_directive,
23
24
  } from '../../delivery_state.js';
25
+ import { GRANULARITY_CONVENTION } from '../../state.js';
24
26
 
25
27
  /** Declared ambiguity surfaces for this step. */
26
28
  export const AMBIGUITIES: ReadonlyArray<Record<string, string>> = [
@@ -112,14 +114,18 @@ export function run(state: DeliveryState): StepResult {
112
114
  * The gate is inert for every other flow: improve-existing, the `bare` /
113
115
  * `external_reference` greenfield picks, and the `diff` / `file` envelopes all
114
116
  * leave `ui_audit` without the `greenfield == True` +
115
- * `greenfield_decision == "scaffold"` pair.
117
+ * `greenfield_decision` ∈ `{scaffold, granularity_convention}` pair.
116
118
  */
117
119
  function _is_greenfield_scaffold(state: DeliveryState): boolean {
118
120
  const audit = state.ui_audit;
119
121
  if (!_isDict(audit)) return false;
122
+ // `granularity_convention` is option 4 — a scaffold that additionally
123
+ // organises what it creates under a named convention, so it takes the same
124
+ // grounding pass. Kept in step with the identical guard in `scaffold`.
120
125
  return (
121
126
  audit['greenfield'] === true &&
122
- audit['greenfield_decision'] === 'scaffold'
127
+ (audit['greenfield_decision'] === 'scaffold' ||
128
+ audit['greenfield_decision'] === GRANULARITY_CONVENTION)
123
129
  );
124
130
  }
125
131