@event4u/agent-config 14.22.0 → 15.0.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 (557) 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 +333 -356
  5. package/README.md +1 -1
  6. package/dist/agent-src/commands/agent-handoff.md +8 -7
  7. package/dist/agent-src/commands/agents/init.md +1 -1
  8. package/dist/agent-src/commands/agents/user/accept.md +4 -4
  9. package/dist/agent-src/commands/agents/user/delete.md +2 -2
  10. package/dist/agent-src/commands/agents/user/init.md +3 -3
  11. package/dist/agent-src/commands/agents/user/review.md +3 -3
  12. package/dist/agent-src/commands/agents/user/show.md +3 -3
  13. package/dist/agent-src/commands/agents/user/update.md +2 -2
  14. package/dist/agent-src/commands/agents/user.md +6 -6
  15. package/dist/agent-src/commands/analytics/prune.md +1 -1
  16. package/dist/agent-src/commands/analytics/show.md +2 -2
  17. package/dist/agent-src/commands/analyze/decision.md +2 -2
  18. package/dist/agent-src/commands/analyze/inbox.md +5 -5
  19. package/dist/agent-src/commands/analyze/incident.md +3 -3
  20. package/dist/agent-src/commands/analyze/near-miss.md +3 -3
  21. package/dist/agent-src/commands/analyze/postmortem.md +4 -4
  22. package/dist/agent-src/commands/analyze/premortem.md +2 -2
  23. package/dist/agent-src/commands/analyze.md +2 -2
  24. package/dist/agent-src/commands/bug/fix.md +1 -1
  25. package/dist/agent-src/commands/bug/investigate.md +2 -2
  26. package/dist/agent-src/commands/cost/profile.md +3 -3
  27. package/dist/agent-src/commands/design.md +1 -1
  28. package/dist/agent-src/commands/feature/explore.md +1 -1
  29. package/dist/agent-src/commands/feature/plan.md +2 -2
  30. package/dist/agent-src/commands/feature/roadmap.md +2 -2
  31. package/dist/agent-src/commands/ghostwriter/fetch.md +4 -4
  32. package/dist/agent-src/commands/ghostwriter/list.md +1 -1
  33. package/dist/agent-src/commands/ghostwriter/show.md +1 -1
  34. package/dist/agent-src/commands/ghostwriter/write.md +9 -9
  35. package/dist/agent-src/commands/humanize.md +6 -6
  36. package/dist/agent-src/commands/jira-ticket.md +1 -1
  37. package/dist/agent-src/commands/judge/solo.md +1 -1
  38. package/dist/agent-src/commands/judge.md +1 -1
  39. package/dist/agent-src/commands/knowledge/cross-repo.md +1 -1
  40. package/dist/agent-src/commands/knowledge/forget.md +1 -1
  41. package/dist/agent-src/commands/knowledge/ingest.md +2 -2
  42. package/dist/agent-src/commands/knowledge/list.md +1 -1
  43. package/dist/agent-src/commands/memory/add.md +3 -3
  44. package/dist/agent-src/commands/memory/load.md +4 -4
  45. package/dist/agent-src/commands/memory/mine-session.md +1 -1
  46. package/dist/agent-src/commands/memory/promote.md +4 -4
  47. package/dist/agent-src/commands/memory/propose.md +2 -2
  48. package/dist/agent-src/commands/mode.md +5 -5
  49. package/dist/agent-src/commands/post-as/ghostwriter.md +3 -3
  50. package/dist/agent-src/commands/post-as/me.md +7 -7
  51. package/dist/agent-src/commands/pr/create.md +1 -1
  52. package/dist/agent-src/commands/pr/merge.md +48 -39
  53. package/dist/agent-src/commands/profile/activate.md +1 -1
  54. package/dist/agent-src/commands/profile/show.md +1 -1
  55. package/dist/agent-src/commands/research/deep.md +2 -2
  56. package/dist/agent-src/commands/research/report.md +2 -2
  57. package/dist/agent-src/commands/review/changes.md +1 -1
  58. package/dist/agent-src/commands/review/routing.md +1 -1
  59. package/dist/agent-src/commands/roadmap/create.md +1 -1
  60. package/dist/agent-src/commands/roadmap/materialize.md +2 -2
  61. package/dist/agent-src/commands/roadmap/next.md +9 -1
  62. package/dist/agent-src/commands/roadmap/process-full.md +2 -2
  63. package/dist/agent-src/commands/security-audit-config.md +3 -3
  64. package/dist/agent-src/commands/skill/preview.md +1 -1
  65. package/dist/agent-src/commands/skills/discover.md +1 -1
  66. package/dist/agent-src/commands/sync/agent-settings.md +2 -2
  67. package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
  68. package/dist/agent-src/commands/tests/create.md +1 -1
  69. package/dist/agent-src/commands/tests/e2e-heal.md +1 -1
  70. package/dist/agent-src/commands/tests/e2e-plan.md +1 -1
  71. package/dist/agent-src/contexts/authority/kernel-rule-edits.md +6 -6
  72. package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -2
  73. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
  74. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +88 -1
  75. package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +1 -1
  76. package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -1
  77. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
  78. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
  79. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +13 -1
  80. package/dist/agent-src/contexts/execution/cheap-question-mechanics.md +1 -1
  81. package/dist/agent-src/contexts/execution/contract-decision-sheet.md +3 -3
  82. package/dist/agent-src/contexts/execution/mandated-lines.md +1 -1
  83. package/dist/agent-src/contexts/execution/non-interactive-contract.md +1 -1
  84. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -1
  85. package/dist/agent-src/contexts/execution/plan-confidence-gate.md +5 -5
  86. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -1
  87. package/dist/agent-src/contexts/execution/subagent-modes-detail.md +1 -1
  88. package/dist/agent-src/contexts/execution/subagent-routing.md +2 -2
  89. package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +1 -1
  90. package/dist/agent-src/contexts/execution/user-memory-channels.md +3 -3
  91. package/dist/agent-src/contexts/execution/verification-mechanics.md +1 -1
  92. package/dist/agent-src/contexts/judges/persona-voice-rubric.md +2 -2
  93. package/dist/agent-src/guidelines/abstraction-thresholds.md +88 -0
  94. package/dist/agent-src/guidelines/agent-infra/5w2h-analysis.md +260 -0
  95. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +99 -0
  96. package/dist/agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +325 -0
  97. package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +177 -0
  98. package/dist/agent-src/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +222 -0
  99. package/dist/agent-src/guidelines/agent-infra/ask-when-uncertain-demos.md +134 -0
  100. package/dist/agent-src/guidelines/agent-infra/asking-and-brevity-examples.md +198 -0
  101. package/dist/agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
  102. package/dist/agent-src/guidelines/agent-infra/carve-out-predicates.md +17 -0
  103. package/dist/agent-src/guidelines/agent-infra/comparison-matrix.md +179 -0
  104. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +165 -0
  105. package/dist/agent-src/guidelines/agent-infra/corpus-grounding-authoring.md +91 -0
  106. package/dist/agent-src/guidelines/agent-infra/critical-thinking.md +156 -0
  107. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +109 -0
  108. package/dist/agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
  109. package/dist/agent-src/guidelines/agent-infra/direct-answers-demos.md +142 -0
  110. package/dist/agent-src/guidelines/agent-infra/domain-adoption-gates.md +112 -0
  111. package/dist/agent-src/guidelines/agent-infra/domain-eval-anti-pattern.md +53 -0
  112. package/dist/agent-src/guidelines/agent-infra/domain-pack-architecture.md +56 -0
  113. package/dist/agent-src/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
  114. package/dist/agent-src/guidelines/agent-infra/emphasis-budget.md +45 -0
  115. package/dist/agent-src/guidelines/agent-infra/engineering-memory-data-format.md +210 -0
  116. package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
  117. package/dist/agent-src/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  118. package/dist/agent-src/guidelines/agent-infra/failure-signatures.md +70 -0
  119. package/dist/agent-src/guidelines/agent-infra/false-green.md +233 -0
  120. package/dist/agent-src/guidelines/agent-infra/first-principles.md +192 -0
  121. package/dist/agent-src/guidelines/agent-infra/framework-neutrality-patterns.md +66 -0
  122. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +169 -0
  123. package/dist/agent-src/guidelines/agent-infra/gate-authoring.md +177 -0
  124. package/dist/agent-src/guidelines/agent-infra/guarded-baseline.md +39 -0
  125. package/dist/agent-src/guidelines/agent-infra/installed-tools-manifest.md +142 -0
  126. package/dist/agent-src/guidelines/agent-infra/inversion-thinking.md +388 -0
  127. package/dist/agent-src/guidelines/agent-infra/ios-simulator-guide.md +378 -0
  128. package/dist/agent-src/guidelines/agent-infra/language-and-tone-examples.md +141 -0
  129. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +317 -0
  130. package/dist/agent-src/guidelines/agent-infra/linked-projects-onboarding-gate.md +80 -0
  131. package/dist/agent-src/guidelines/agent-infra/mcp-request-signing.md +197 -0
  132. package/dist/agent-src/guidelines/agent-infra/memory-access.md +149 -0
  133. package/dist/agent-src/guidelines/agent-infra/mental-models.md +314 -0
  134. package/dist/agent-src/guidelines/agent-infra/minimal-safe-diff-mechanics.md +241 -0
  135. package/dist/agent-src/guidelines/agent-infra/missing-tool-handling.md +66 -0
  136. package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +101 -0
  137. package/dist/agent-src/guidelines/agent-infra/naming.md +69 -0
  138. package/dist/agent-src/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
  139. package/dist/agent-src/guidelines/agent-infra/output-patterns.md +117 -0
  140. package/dist/agent-src/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
  141. package/dist/agent-src/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  142. package/dist/agent-src/guidelines/agent-infra/review-routing-data-format.md +143 -0
  143. package/dist/agent-src/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
  144. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +274 -0
  145. package/dist/agent-src/guidelines/agent-infra/role-contracts.md +209 -0
  146. package/dist/agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
  147. package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +241 -0
  148. package/dist/agent-src/guidelines/agent-infra/rule-type-governance.md +73 -0
  149. package/dist/agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
  150. package/dist/agent-src/guidelines/agent-infra/scqa-framework.md +526 -0
  151. package/dist/agent-src/guidelines/agent-infra/security-lint-containment.md +121 -0
  152. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +134 -0
  153. package/dist/agent-src/guidelines/agent-infra/simplicity-and-goal-demos.md +211 -0
  154. package/dist/agent-src/guidelines/agent-infra/six-hats.md +353 -0
  155. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +229 -0
  156. package/dist/agent-src/guidelines/agent-infra/skill-quality-checklist.md +157 -0
  157. package/dist/agent-src/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  158. package/dist/agent-src/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
  159. package/dist/agent-src/guidelines/agent-infra/systems-thinking.md +220 -0
  160. package/dist/agent-src/guidelines/agent-infra/tool-description-as-policy.md +35 -0
  161. package/dist/agent-src/guidelines/agent-infra/tool-integration.md +73 -0
  162. package/dist/agent-src/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
  163. package/dist/agent-src/guidelines/agent-infra/untrusted-input-spotlighting.md +166 -0
  164. package/dist/agent-src/guidelines/agent-infra/verify-before-complete-demos.md +128 -0
  165. package/dist/agent-src/guidelines/augment-portability-patterns.md +70 -0
  166. package/dist/agent-src/guidelines/code-clarity.md +350 -0
  167. package/dist/agent-src/guidelines/component-oriented-and-oop-development.md +189 -0
  168. package/dist/agent-src/guidelines/cross-role-handoff.md +127 -0
  169. package/dist/agent-src/guidelines/design-antipatterns-triggers.json +18 -0
  170. package/dist/agent-src/guidelines/design-antipatterns.md +327 -0
  171. package/dist/agent-src/guidelines/design-asset-discipline.md +38 -0
  172. package/dist/agent-src/guidelines/design-canon.md +63 -0
  173. package/dist/agent-src/guidelines/design-fidelity-mechanics.md +293 -0
  174. package/dist/agent-src/guidelines/design-fidelity-routing.md +78 -0
  175. package/dist/agent-src/guidelines/design-handover-extraction.md +117 -0
  176. package/dist/agent-src/guidelines/design-modes.md +143 -0
  177. package/dist/agent-src/guidelines/design-reconciliation.md +172 -0
  178. package/dist/agent-src/guidelines/docs/readme-size-and-splitting.md +209 -0
  179. package/dist/agent-src/guidelines/e2e/playwright.md +363 -0
  180. package/dist/agent-src/guidelines/gtm-handoff.md +114 -0
  181. package/dist/agent-src/guidelines/monorepo-antipatterns.md +141 -0
  182. package/dist/agent-src/guidelines/php/api-design.md +115 -0
  183. package/dist/agent-src/guidelines/php/artisan-commands.md +81 -0
  184. package/dist/agent-src/guidelines/php/blade-ui.md +78 -0
  185. package/dist/agent-src/guidelines/php/controllers.md +90 -0
  186. package/dist/agent-src/guidelines/php/database.md +194 -0
  187. package/dist/agent-src/guidelines/php/eloquent.md +208 -0
  188. package/dist/agent-src/guidelines/php/flux.md +80 -0
  189. package/dist/agent-src/guidelines/php/general.md +207 -0
  190. package/dist/agent-src/guidelines/php/git.md +164 -0
  191. package/dist/agent-src/guidelines/php/jobs.md +111 -0
  192. package/dist/agent-src/guidelines/php/livewire.md +71 -0
  193. package/dist/agent-src/guidelines/php/logging.md +79 -0
  194. package/dist/agent-src/guidelines/php/naming.md +89 -0
  195. package/dist/agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
  196. package/dist/agent-src/guidelines/php/patterns/dtos.md +199 -0
  197. package/dist/agent-src/guidelines/php/patterns/events.md +67 -0
  198. package/dist/agent-src/guidelines/php/patterns/factory.md +53 -0
  199. package/dist/agent-src/guidelines/php/patterns/pipelines.md +66 -0
  200. package/dist/agent-src/guidelines/php/patterns/policies.md +66 -0
  201. package/dist/agent-src/guidelines/php/patterns/repositories.md +122 -0
  202. package/dist/agent-src/guidelines/php/patterns/service-layer.md +64 -0
  203. package/dist/agent-src/guidelines/php/patterns/strategy.md +247 -0
  204. package/dist/agent-src/guidelines/php/patterns.md +28 -0
  205. package/dist/agent-src/guidelines/php/performance.md +92 -0
  206. package/dist/agent-src/guidelines/php/php-coding-patterns.md +80 -0
  207. package/dist/agent-src/guidelines/php/resources.md +100 -0
  208. package/dist/agent-src/guidelines/php/security.md +110 -0
  209. package/dist/agent-src/guidelines/php/sql.md +97 -0
  210. package/dist/agent-src/guidelines/php/validations.md +119 -0
  211. package/dist/agent-src/guidelines/php/websocket.md +100 -0
  212. package/dist/agent-src/guidelines/prompt-templates.md +189 -0
  213. package/dist/agent-src/guidelines/redundancy-taxonomy.md +208 -0
  214. package/dist/agent-src/guidelines/wing4-handoff.md +127 -0
  215. package/dist/agent-src/personas/README.md +1 -1
  216. package/dist/agent-src/personas/_template-specialist/persona.md +1 -1
  217. package/dist/agent-src/personas/product-owner.md +1 -1
  218. package/dist/agent-src/rules/active-remediation.md +1 -1
  219. package/dist/agent-src/rules/architecture.md +2 -2
  220. package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
  221. package/dist/agent-src/rules/ask-when-uncertain.md +2 -2
  222. package/dist/agent-src/rules/brand-source-of-truth.md +9 -7
  223. package/dist/agent-src/rules/code-comment-discipline.md +2 -2
  224. package/dist/agent-src/rules/code-provenance.md +1 -1
  225. package/dist/agent-src/rules/content-quoting-floor.md +1 -1
  226. package/dist/agent-src/rules/context-hygiene.md +5 -5
  227. package/dist/agent-src/rules/cross-source-consistency.md +1 -1
  228. package/dist/agent-src/rules/design-fidelity.md +36 -46
  229. package/dist/agent-src/rules/direct-answers.md +2 -2
  230. package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
  231. package/dist/agent-src/rules/evaluator-independence.md +1 -1
  232. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
  233. package/dist/agent-src/rules/icon-consistency.md +5 -1
  234. package/dist/agent-src/rules/improve-before-implement.md +1 -1
  235. package/dist/agent-src/rules/language-and-tone.md +3 -3
  236. package/dist/agent-src/rules/minimal-safe-diff.md +1 -1
  237. package/dist/agent-src/rules/notes-first-reasoning.md +36 -25
  238. package/dist/agent-src/rules/recurring-criticism.md +1 -1
  239. package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
  240. package/dist/agent-src/rules/role-mode-adherence.md +2 -2
  241. package/dist/agent-src/rules/security-sensitive-stop.md +1 -1
  242. package/dist/agent-src/rules/size-enforcement.md +1 -1
  243. package/dist/agent-src/rules/source-confidentiality.md +2 -2
  244. package/dist/agent-src/rules/think-before-action.md +1 -1
  245. package/dist/agent-src/rules/token-efficiency.md +7 -5
  246. package/dist/agent-src/rules/ui-audit-gate.md +3 -2
  247. package/dist/agent-src/rules/untrusted-input-defense.md +3 -3
  248. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +106 -4
  249. package/dist/agent-src/skills/activation-design/SKILL.md +2 -2
  250. package/dist/agent-src/skills/adr-create/SKILL.md +5 -5
  251. package/dist/agent-src/skills/ai-council/SKILL.md +1 -1
  252. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +1 -1
  253. package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
  254. package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
  255. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +24 -3
  256. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  257. package/dist/agent-src/skills/build-buy-partner/SKILL.md +1 -1
  258. package/dist/agent-src/skills/churn-prevention/SKILL.md +2 -2
  259. package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -1
  260. package/dist/agent-src/skills/code-refactoring/SKILL.md +3 -3
  261. package/dist/agent-src/skills/code-review/SKILL.md +3 -3
  262. package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
  263. package/dist/agent-src/skills/comp-banding/SKILL.md +1 -1
  264. package/dist/agent-src/skills/competitive-moat-analysis/SKILL.md +1 -1
  265. package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
  266. package/dist/agent-src/skills/complexity-first-planning/SKILL.md +1 -1
  267. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  268. package/dist/agent-src/skills/content-funnel-design/SKILL.md +2 -2
  269. package/dist/agent-src/skills/contracts-cognition/SKILL.md +1 -1
  270. package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +2 -2
  271. package/dist/agent-src/skills/corpus-grounding/SKILL.md +2 -2
  272. package/dist/agent-src/skills/customer-research/SKILL.md +2 -2
  273. package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
  274. package/dist/agent-src/skills/data-handling-judgment/SKILL.md +1 -1
  275. package/dist/agent-src/skills/deal-qualification-meddic/SKILL.md +2 -2
  276. package/dist/agent-src/skills/decision-record/SKILL.md +3 -3
  277. package/dist/agent-src/skills/decision-review/SKILL.md +8 -8
  278. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +22 -22
  279. package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
  280. package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +2 -2
  281. package/dist/agent-src/skills/design-review/SKILL.md +4 -4
  282. package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -1
  283. package/dist/agent-src/skills/design-tokens/SKILL.md +17 -2
  284. package/dist/agent-src/skills/design-variations/SKILL.md +2 -2
  285. package/dist/agent-src/skills/developer-like-execution/SKILL.md +2 -2
  286. package/dist/agent-src/skills/discovery-interview/SKILL.md +2 -2
  287. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +3 -3
  288. package/dist/agent-src/skills/editorial-calendar/SKILL.md +2 -2
  289. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +44 -1
  290. package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +2 -2
  291. package/dist/agent-src/skills/expansion-playbook/SKILL.md +2 -2
  292. package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
  293. package/dist/agent-src/skills/experiment-loop/references/protocol.md +1 -1
  294. package/dist/agent-src/skills/fe-design/SKILL.md +3 -3
  295. package/dist/agent-src/skills/fe-design/references/design-patterns.md +1 -1
  296. package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +3 -3
  297. package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
  298. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  299. package/dist/agent-src/skills/flux/SKILL.md +1 -1
  300. package/dist/agent-src/skills/forecast-accuracy/SKILL.md +2 -2
  301. package/dist/agent-src/skills/forecasting/SKILL.md +2 -2
  302. package/dist/agent-src/skills/fundraising-narrative/SKILL.md +2 -2
  303. package/dist/agent-src/skills/funnel-analysis/SKILL.md +2 -2
  304. package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +9 -0
  305. package/dist/agent-src/skills/gtm-launch/SKILL.md +2 -2
  306. package/dist/agent-src/skills/hiring-loop-design/SKILL.md +1 -1
  307. package/dist/agent-src/skills/html-deck/SKILL.md +5 -5
  308. package/dist/agent-src/skills/humanizer/SKILL.md +1 -1
  309. package/dist/agent-src/skills/humanizer/data/patterns.md +1 -1
  310. package/dist/agent-src/skills/iconography/SKILL.md +3 -3
  311. package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
  312. package/dist/agent-src/skills/laravel-api-endpoint/SKILL.md +2 -2
  313. package/dist/agent-src/skills/launch-readiness/SKILL.md +3 -3
  314. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +6 -6
  315. package/dist/agent-src/skills/livewire/SKILL.md +1 -1
  316. package/dist/agent-src/skills/market-entry-analysis/SKILL.md +1 -1
  317. package/dist/agent-src/skills/mcp-builder/SKILL.md +1 -1
  318. package/dist/agent-src/skills/memory-consolidation/SKILL.md +3 -3
  319. package/dist/agent-src/skills/messaging-architecture/SKILL.md +2 -2
  320. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  321. package/dist/agent-src/skills/onboarding-design/SKILL.md +2 -2
  322. package/dist/agent-src/skills/onboarding-program/SKILL.md +1 -1
  323. package/dist/agent-src/skills/one-on-one-cadence/SKILL.md +1 -1
  324. package/dist/agent-src/skills/org-design/SKILL.md +1 -1
  325. package/dist/agent-src/skills/overbuild-review-lens/SKILL.md +3 -3
  326. package/dist/agent-src/skills/override-management/SKILL.md +1 -1
  327. package/dist/agent-src/skills/perf-feedback-craft/SKILL.md +1 -1
  328. package/dist/agent-src/skills/persona-writing/SKILL.md +1 -1
  329. package/dist/agent-src/skills/php-coder/SKILL.md +1 -1
  330. package/dist/agent-src/skills/pipeline-strategy/SKILL.md +2 -2
  331. package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -3
  332. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  333. package/dist/agent-src/skills/positioning-strategy/SKILL.md +2 -2
  334. package/dist/agent-src/skills/privacy-review/SKILL.md +1 -1
  335. package/dist/agent-src/skills/prompt-optimizer/SKILL.md +3 -3
  336. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  337. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -2
  338. package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
  339. package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
  340. package/dist/agent-src/skills/release-comms/SKILL.md +2 -2
  341. package/dist/agent-src/skills/retention-loops/SKILL.md +2 -2
  342. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  343. package/dist/agent-src/skills/roadmap-management/SKILL.md +1 -1
  344. package/dist/agent-src/skills/roadmap-management/references/archival.md +1 -1
  345. package/dist/agent-src/skills/roadmap-writing/SKILL.md +5 -5
  346. package/dist/agent-src/skills/rule-writing/SKILL.md +6 -6
  347. package/dist/agent-src/skills/runway-cognition/SKILL.md +2 -2
  348. package/dist/agent-src/skills/scenario-modeling/SKILL.md +2 -2
  349. package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
  350. package/dist/agent-src/skills/skill-writing/references/procedure.md +1 -1
  351. package/dist/agent-src/skills/skill-writing/references/section-patterns.md +3 -3
  352. package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +1 -1
  353. package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +3 -3
  354. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
  355. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +1 -1
  356. package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
  357. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +60 -4
  358. package/dist/agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -1
  359. package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
  360. package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
  361. package/dist/agent-src/skills/ui-component-architect/SKILL.md +28 -8
  362. package/dist/agent-src/skills/unit-economics-modeling/SKILL.md +2 -2
  363. package/dist/agent-src/skills/upstream-contribute/SKILL.md +1 -1
  364. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +2 -2
  365. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  366. package/dist/agent-src/skills/vision-articulation/SKILL.md +1 -1
  367. package/dist/agent-src/skills/voc-extract/SKILL.md +2 -2
  368. package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +2 -2
  369. package/dist/agent-src/skills/wireframe/SKILL.md +1 -1
  370. package/dist/agent-src/skills/workspace-link/SKILL.md +1 -1
  371. package/dist/agent-src/templates/agent-settings.md +6 -6
  372. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  373. package/dist/agent-src/templates/contexts/knowledge-pages.md +2 -3
  374. package/dist/agent-src/templates/copilot-instructions.md +1 -1
  375. package/dist/agent-src/templates/roadmaps.md +1 -1
  376. package/dist/agent-src/templates/scripts/README.md +2 -2
  377. package/dist/agent-src/user-types/_template/user-type.md +1 -1
  378. package/dist/cli/registry.js +1 -1
  379. package/dist/cli-delegate/archive_completed_roadmaps.js +52 -4
  380. package/dist/cli-delegate/check_update_banner.js +12 -1
  381. package/dist/cli-delegate/{chunk-TGIPZBCW.js → chunk-2KKXJW25.js} +22 -8
  382. package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
  383. package/dist/cli-delegate/{chunk-4FS4WRXP.js → chunk-3FKR64R5.js} +34 -6
  384. package/dist/cli-delegate/{chunk-J3RFNKG4.js → chunk-55ACLDUE.js} +2 -2
  385. package/dist/cli-delegate/{chunk-PKOBQADP.js → chunk-57PN4GYJ.js} +1 -1
  386. package/dist/cli-delegate/{chunk-BIXEDQPZ.js → chunk-AK6HODNQ.js} +4 -4
  387. package/dist/cli-delegate/{chunk-2FTMENJL.js → chunk-GYC3VRYN.js} +1 -1
  388. package/dist/cli-delegate/{chunk-LWTYTX6F.js → chunk-HZ52BRGG.js} +24 -18
  389. package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.js} +1 -1
  390. package/dist/cli-delegate/{chunk-I6RHFQEG.js → chunk-YUM5KURG.js} +17 -1
  391. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  392. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  393. package/dist/cli-delegate/cmd_conformance.js +3 -3
  394. package/dist/cli-delegate/cmd_doctor.js +3 -3
  395. package/dist/cli-delegate/cmd_explain.js +2 -2
  396. package/dist/cli-delegate/cmd_export.js +4 -4
  397. package/dist/cli-delegate/cmd_handoff.js +24 -16
  398. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  399. package/dist/cli-delegate/cmd_memory_get.js +1 -1
  400. package/dist/cli-delegate/cmd_migrate.js +2 -2
  401. package/dist/cli-delegate/cmd_packs_active.js +2 -2
  402. package/dist/cli-delegate/cmd_prune.js +4 -4
  403. package/dist/cli-delegate/cmd_route_audit.js +3 -3
  404. package/dist/cli-delegate/cmd_route_explain.js +1 -1
  405. package/dist/cli-delegate/cmd_session_recycle.js +4 -14
  406. package/dist/cli-delegate/cmd_settings_get.js +15 -9
  407. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  408. package/dist/cli-delegate/cmd_settings_set.js +41 -11
  409. package/dist/cli-delegate/cmd_sync.js +4 -4
  410. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  411. package/dist/cli-delegate/cmd_update.js +1 -1
  412. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  413. package/dist/cli-delegate/cmd_validate.js +4 -4
  414. package/dist/cli-delegate/cmd_versions.js +1 -1
  415. package/dist/discovery/deprecation-report.md +1 -1
  416. package/dist/discovery/discovery-manifest.json +27 -80
  417. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  418. package/dist/discovery/discovery-manifest.summary.md +3 -3
  419. package/dist/discovery/dormancy-report.md +1 -1
  420. package/dist/discovery/orphan-report.md +1 -1
  421. package/dist/discovery/packs.json +5 -7
  422. package/dist/discovery/trust-report.md +2 -2
  423. package/dist/discovery/workspaces.json +4 -6
  424. package/dist/hooks/dispatch.js +9249 -8981
  425. package/dist/install/install.mjs +47 -8
  426. package/dist/mcp/registry-manifest.json +3 -3
  427. package/dist/mcp/server.json +2 -2
  428. package/dist/mcp/server.mjs +5496 -2400
  429. package/dist/router.json +1 -1
  430. package/dist/scripts/_lib/agent_settings.js +73 -0
  431. package/dist/scripts/_lib/agent_src.js +20 -0
  432. package/dist/scripts/_lib/guidelines_lane.js +158 -0
  433. package/dist/scripts/_lib/lean_projection_mode.js +108 -0
  434. package/dist/scripts/_lib/router_match.js +243 -0
  435. package/dist/scripts/_lib/rule_injection.js +216 -0
  436. package/dist/scripts/condense.js +22 -25
  437. package/dist/scripts/project_thin_rules.js +139 -19
  438. package/dist/server/io/yamlIO.js +125 -17
  439. package/dist/server/schemas/settings.js +32 -5
  440. package/dist/shared/settingsSurface.js +6 -1
  441. package/docs/MIGRATION.md +56 -0
  442. package/docs/contracts/settings-classes.md +48 -7
  443. package/docs/guidelines/abstraction-thresholds.md +35 -0
  444. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +3 -3
  445. package/docs/guidelines/agent-infra/false-green.md +2 -2
  446. package/docs/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
  447. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  448. package/docs/guidelines/agent-infra/skill-quality-checklist.md +1 -1
  449. package/docs/guidelines/design-fidelity-mechanics.md +4 -0
  450. package/docs/guidelines/design-fidelity-routing.md +78 -0
  451. package/docs/guidelines/design-reconciliation.md +172 -0
  452. package/docs/guidelines/gtm-handoff.md +2 -2
  453. package/docs/guidelines/wing4-handoff.md +2 -2
  454. package/llms.txt +1 -1
  455. package/package.json +7 -3
  456. package/src/agent-src/scripts/archive_completed_roadmaps.ts +106 -4
  457. package/src/config/agent-settings.template.yml +94 -1
  458. package/src/config/ci-local-parity.yml +34 -0
  459. package/src/config/continuity-surface.json +8 -29
  460. package/src/config/evaluator-budgets.json +4 -4
  461. package/src/config/gate-coverage.yml +31 -8
  462. package/src/config/gate-reachability-exemptions.json +1 -0
  463. package/src/config/gate-violation-baselines.json +3 -3
  464. package/src/config/hook-token-budget.json +8 -7
  465. package/src/config/host-injection-effect.json +2 -2
  466. package/src/config/pack-size-budget.json +55 -4
  467. package/src/config/packed-binary-manifest.json +1 -1
  468. package/src/config/platform-anchor.json +47 -0
  469. package/src/config/preamble-payload-budget.json +2 -3
  470. package/src/config/publish-surface.json +4 -2
  471. package/src/config/ratification-policy.json +7 -0
  472. package/src/config/routing-coverage-seed.json +9 -2
  473. package/src/config/rule-stub-ceilings.json +16 -9
  474. package/src/scripts/_cli/cmd_session_recycle.ts +2 -25
  475. package/src/scripts/_cli/cmd_settings_get.ts +22 -7
  476. package/src/scripts/_cli/handoff_sessions.ts +14 -44
  477. package/src/scripts/_lib/agent_settings.ts +85 -0
  478. package/src/scripts/_lib/agent_src.ts +21 -0
  479. package/src/scripts/_lib/artifact_maturity.ts +242 -0
  480. package/src/scripts/_lib/conformance_report.ts +403 -0
  481. package/src/scripts/_lib/continuity_slot.ts +295 -0
  482. package/src/scripts/_lib/continuity_writer.ts +312 -0
  483. package/src/scripts/_lib/design_system_import.ts +20 -0
  484. package/src/scripts/_lib/design_tolerance.ts +281 -0
  485. package/src/scripts/_lib/guidelines_lane.ts +164 -0
  486. package/src/scripts/_lib/hook_settings.ts +85 -0
  487. package/src/scripts/_lib/lean_projection_mode.ts +127 -0
  488. package/src/scripts/_lib/obligation_frequency.ts +2 -3
  489. package/src/scripts/_lib/packed_binary_predicate.ts +37 -0
  490. package/src/scripts/_lib/platform_anchor.ts +1053 -0
  491. package/src/scripts/_lib/ratification_artifact.ts +278 -0
  492. package/src/scripts/_lib/recycle_envelope_paths.ts +109 -21
  493. package/src/scripts/_lib/regression_neighbourhood.ts +159 -22
  494. package/src/scripts/_lib/security_lint.ts +23 -2
  495. package/src/scripts/_lib/self_repair.ts +21 -0
  496. package/src/scripts/_lib/session_eol.ts +44 -0
  497. package/src/scripts/_lib/session_index_trust.ts +387 -0
  498. package/src/scripts/_lib/standing_bound_ratchet.ts +220 -0
  499. package/src/scripts/_lib/tolerance_shadow.ts +177 -0
  500. package/src/scripts/_lib/vendored_grammar_upstream.ts +280 -0
  501. package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
  502. package/src/scripts/audit_mcp_tools.ts +69 -25
  503. package/src/scripts/autonomy_friction_traffic.ts +379 -0
  504. package/src/scripts/build_mcp_catalog.ts +24 -1
  505. package/src/scripts/check_host_tree_parity.ts +291 -0
  506. package/src/scripts/check_kernel_edit_ratified.ts +462 -0
  507. package/src/scripts/check_loss_class_declared.ts +793 -46
  508. package/src/scripts/check_platform_anchor.ts +390 -0
  509. package/src/scripts/check_preamble_payload_budget.ts +424 -7
  510. package/src/scripts/check_projected_rule_routes.ts +395 -0
  511. package/src/scripts/check_rule_projection_integrity.ts +102 -2
  512. package/src/scripts/ci_settle.ts +205 -5
  513. package/src/scripts/code_graph/build.ts +79 -0
  514. package/src/scripts/code_graph/cli.ts +264 -7
  515. package/src/scripts/code_graph/detect.ts +38 -0
  516. package/src/scripts/code_graph/query.ts +25 -2
  517. package/src/scripts/code_graph/sqlite_store.ts +16 -1
  518. package/src/scripts/code_graph/types.ts +52 -3
  519. package/src/scripts/code_graph/validate.ts +3 -1
  520. package/src/scripts/code_graph/verbs.ts +590 -0
  521. package/src/scripts/condense.ts +22 -26
  522. package/src/scripts/generate_host_cost_table.ts +354 -0
  523. package/src/scripts/handoff_context_hook.ts +39 -1
  524. package/src/scripts/hook_manifest.json +1 -1
  525. package/src/scripts/hook_manifest.yaml +59 -28
  526. package/src/scripts/hooks/block_speaking_inbox_dir.ts +182 -16
  527. package/src/scripts/hooks/category_a.ts +1 -1
  528. package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
  529. package/src/scripts/hooks/code_graph_context_hook.ts +7 -18
  530. package/src/scripts/hooks/push_settle_hook.ts +3 -2
  531. package/src/scripts/hooks/rule_inject_hook.ts +107 -20
  532. package/src/scripts/hooks/session_eol_hook.ts +177 -145
  533. package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
  534. package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
  535. package/src/scripts/hot_context_hook.ts +103 -408
  536. package/src/scripts/lint_evidence_artifacts.ts +1 -0
  537. package/src/scripts/lint_knowledge_scale.ts +0 -26
  538. package/src/scripts/lint_roadmap_blockers.ts +164 -1
  539. package/src/scripts/mcp_server/consumer_tool_catalog.json +152 -2
  540. package/src/scripts/mcp_server/graph_tools.ts +294 -0
  541. package/src/scripts/mcp_server/path_util.ts +31 -0
  542. package/src/scripts/mcp_server/tool_catalog_source.ts +7 -1
  543. package/src/scripts/mcp_server/tools.ts +3 -13
  544. package/src/scripts/memory_lookup.ts +9 -9
  545. package/src/scripts/model_rule_injection.ts +61 -4
  546. package/src/scripts/project_thin_rules.ts +149 -16
  547. package/src/scripts/report_standing_payload_by_host.ts +650 -0
  548. package/src/scripts/schemas/agent-settings.schema.json +7 -1
  549. package/src/scripts/session_memory_index.ts +86 -8
  550. package/src/scripts/sync_agent_settings.ts +270 -10
  551. package/src/server/io/yamlIO.ts +127 -17
  552. package/src/server/schemas/settings.ts +45 -6
  553. package/src/shared/settingsSurface.ts +13 -2
  554. package/src/templates/compact-instructions.md +8 -3
  555. package/src/vendor/grammars/README.md +27 -2
  556. package/dist/agent-src/commands/chat-history/import.md +0 -170
  557. package/dist/agent-src/commands/chat-history.md +0 -63
@@ -0,0 +1,395 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * A projected rule may not route somewhere the projection does not contain.
4
+ *
5
+ * Two halves, deliberately graded differently because the evidence differs.
6
+ *
7
+ * **A — `routes_to: guideline:<slug>` (HARD).** A rule that declares a routed
8
+ * body owes a body a consumer can open. Until the `docs/guidelines/` lane
9
+ * shipped (`_lib/guidelines_lane.ts`) every one of these was declared and dead;
10
+ * the measurement on the tree that shipped the lane is **22 distinct targets,
11
+ * 0 unresolved**, so the honest grade is a hard fail — there is no debt to
12
+ * ratchet down and a violation is a new one.
13
+ *
14
+ * **B — relative `.md` links (RATCHET, shrink-only).** A projected rule also
15
+ * carries ordinary body links, and 36 of them resolve to nothing inside
16
+ * `dist/agent-src/`. They are NOT a defect this gate can close: every one
17
+ * points at `docs/contracts/` or `agents/settings/policies/`, and neither is
18
+ * projected — `docs/contracts/` deliberately so (three files ship, at their
19
+ * own path), `agents/` because it is this repository's own workspace and does
20
+ * not exist in a consumer at all. Closing them means deciding to project a
21
+ * second tree, which is a different change with a different owner. So the
22
+ * count is pinned and may only fall.
23
+ *
24
+ * What the ratchet actually buys, stated because a floor of 36 looks like a
25
+ * shrug: the guideline half of this population is **zero**, and the gate is
26
+ * what keeps it zero. A regression that re-broke the lane would push 36 → 60+
27
+ * and red immediately.
28
+ *
29
+ * Exit codes: 0 clean · 1 an unresolved `routes_to:` target, or the relative
30
+ * ratchet rose · 2 misuse / unreadable input.
31
+ *
32
+ * Usage:
33
+ * ./scripts-run src/scripts/check_projected_rule_routes [--root <path>] [--quiet]
34
+ * ./scripts-run src/scripts/check_projected_rule_routes --self-test
35
+ */
36
+ import * as fs from 'node:fs';
37
+ import * as os from 'node:os';
38
+ import * as path from 'node:path';
39
+
40
+ import { GateLedger } from './_lib/gate_ledger.js';
41
+ import { runGateCli, runSelfTest, type SelfTestCase } from './_lib/gate_self_test.js';
42
+ import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
43
+
44
+ const HERE = path.dirname(new URL(import.meta.url).pathname);
45
+ const REPO_ROOT = path.resolve(HERE, '..', '..');
46
+
47
+ /** Where the projection puts rules and the guideline bodies they route to. */
48
+ const RULES_SUBDIR = path.join('dist', 'agent-src', 'rules');
49
+ const GUIDELINES_SUBDIR = path.join('dist', 'agent-src', 'guidelines');
50
+
51
+ /**
52
+ * Shrink-only floor for half B. Measured 2026-09-09 on the tree that shipped
53
+ * the guidelines lane, by this module's own `REL_LINK_RE` over its own corpus:
54
+ * **262** relative links across the projected rules, **36** of them unresolved,
55
+ * every one under `docs/contracts/` or `agents/`. Lower it when a link is
56
+ * genuinely fixed; never raise it. (The denominator read 256 in a first draft —
57
+ * a hand count, not the gate's. A blind review caught it. The floor was right
58
+ * either way, which is exactly why the wrong denominator could sit there
59
+ * unnoticed: quote the number the code prints.)
60
+ */
61
+ export const UNRESOLVED_RELATIVE_FLOOR = 36;
62
+
63
+ /**
64
+ * Shrink-only floor for the same half, over the GUIDELINE bodies the lane
65
+ * projects. A blind review of the branch that shipped the lane found this
66
+ * population unmeasured and 253 of 268 links dead — the projection carried 120
67
+ * bodies whose own cross-references resolved to nothing, including five in the
68
+ * one file Phase 2 existed for. Repairing the `src/` class in the rewriter took
69
+ * it to 60; the residue is `docs/contracts`, `docs/decisions`, `agents/` and
70
+ * two template placeholders, none of which is a projected tree. The floor is the
71
+ * gate's OWN reading, 44 — an earlier draft said 60 from a hand-written glob
72
+ * that counted the top-level files twice, and a floor above the measurement is
73
+ * a floor that cannot bite.
74
+ *
75
+ * It is a SEPARATE floor from the rules one on purpose: pooling them would let
76
+ * a regression in one population hide behind an improvement in the other, and
77
+ * the two are repaired by different changes.
78
+ */
79
+ export const UNRESOLVED_GUIDELINE_FLOOR = 44;
80
+
81
+ // No `.` in the slug class: with it, a prose mention of the shape
82
+ // `guideline:foo.md` was captured as slug `foo.md` and checked against
83
+ // `foo.md.md`. No live instance exists, but this half is graded HARD, so the
84
+ // first body that spells a reference that way would red CI for a non-defect.
85
+ // Blind-review finding.
86
+ const ROUTES_TO_RE = /guideline:([A-Za-z0-9][A-Za-z0-9/_-]*)/g;
87
+ const REL_LINK_RE = /\]\((\.\.?\/[^)\s#]+\.md)(?:#[^)]*)?\)/g;
88
+
89
+ export interface RouteFinding {
90
+ file: string;
91
+ message: string;
92
+ }
93
+
94
+ export interface RouteVerdict {
95
+ scanned: number;
96
+ /** Distinct `guideline:` targets seen, resolved or not. */
97
+ targets: number;
98
+ /** Relative `.md` links seen in projected rules. */
99
+ relativeLinks: number;
100
+ unresolvedRelative: number;
101
+ /** The unresolved rule links themselves, so a failure can name them. */
102
+ unresolvedRuleLinks: Array<{ file: string; link: string }>;
103
+ /** The same two counts over the projected guideline bodies. */
104
+ guidelineLinks: number;
105
+ unresolvedGuideline: number;
106
+ findings: RouteFinding[];
107
+ }
108
+
109
+ /** Every `.md` under `dir`, recursively, name-sorted at each level. */
110
+ function walkMarkdown(dir: string): string[] {
111
+ if (!fs.existsSync(dir)) return [];
112
+ const out: string[] = [];
113
+ for (const name of fs.readdirSync(dir).sort()) {
114
+ const full = path.join(dir, name);
115
+ if (fs.statSync(full).isDirectory()) out.push(...walkMarkdown(full));
116
+ else if (name.endsWith('.md')) out.push(full);
117
+ }
118
+ return out;
119
+ }
120
+
121
+ /**
122
+ * Rule files, RECURSIVELY, as paths relative to `dir`.
123
+ *
124
+ * Non-recursive in a first draft, which would have silently unscanned a rule in
125
+ * a subdirectory — a gate that reads less than its corpus and reports green is
126
+ * the failure `gate-coverage.yml` exists for. Blind-review finding.
127
+ */
128
+ function listRules(dir: string): string[] {
129
+ return walkMarkdown(dir).map((p) => path.relative(dir, p));
130
+ }
131
+
132
+ export function evaluate(root: string = REPO_ROOT, ledger?: GateLedger): RouteVerdict {
133
+ const rulesDir = path.join(root, RULES_SUBDIR);
134
+ const guidelinesDir = path.join(root, GUIDELINES_SUBDIR);
135
+ const findings: RouteFinding[] = [];
136
+ const seenTargets = new Set<string>();
137
+ let scanned = 0;
138
+ let relativeLinks = 0;
139
+ let unresolvedRelative = 0;
140
+ const unresolvedRuleLinks: Array<{ file: string; link: string }> = [];
141
+
142
+ const names = listRules(rulesDir);
143
+ ledger?.plan(names);
144
+
145
+ for (const name of names) {
146
+ const file = path.join(rulesDir, name);
147
+ const text = fs.readFileSync(file, 'utf-8');
148
+ scanned += 1;
149
+ let failed = 0;
150
+
151
+ for (const m of text.matchAll(ROUTES_TO_RE)) {
152
+ const slug = m[1] as string;
153
+ seenTargets.add(slug);
154
+ if (!fs.existsSync(path.join(guidelinesDir, `${slug}.md`))) {
155
+ failed += 1;
156
+ findings.push({
157
+ file: path.join(RULES_SUBDIR, name),
158
+ message:
159
+ `routes to \`guideline:${slug}\`, and ` +
160
+ `${path.join(GUIDELINES_SUBDIR, `${slug}.md`)} does not exist. ` +
161
+ `A consumer install cannot open it.`,
162
+ });
163
+ }
164
+ }
165
+
166
+ for (const m of text.matchAll(REL_LINK_RE)) {
167
+ relativeLinks += 1;
168
+ const link = m[1] as string;
169
+ if (!fs.existsSync(path.resolve(path.dirname(file), link))) {
170
+ unresolvedRelative += 1;
171
+ unresolvedRuleLinks.push({ file: path.join(RULES_SUBDIR, name), link });
172
+ }
173
+ }
174
+
175
+ if (failed > 0) ledger?.fail(name, `${String(failed)} unresolved guideline route(s)`);
176
+ else ledger?.complete(name);
177
+ }
178
+
179
+ // The guideline bodies themselves. Walked recursively — the lane preserves
180
+ // `docs/guidelines/`'s own subdirectories, so a flat readdir would miss
181
+ // `agent-infra/` and `php/`, which is most of the corpus.
182
+ let guidelineLinks = 0;
183
+ let unresolvedGuideline = 0;
184
+ for (const file of walkMarkdown(guidelinesDir)) {
185
+ for (const m of fs.readFileSync(file, 'utf-8').matchAll(REL_LINK_RE)) {
186
+ guidelineLinks += 1;
187
+ if (!fs.existsSync(path.resolve(path.dirname(file), m[1] as string))) {
188
+ unresolvedGuideline += 1;
189
+ }
190
+ }
191
+ }
192
+
193
+ return {
194
+ scanned,
195
+ targets: seenTargets.size,
196
+ relativeLinks,
197
+ unresolvedRelative,
198
+ unresolvedRuleLinks,
199
+ guidelineLinks,
200
+ unresolvedGuideline,
201
+ findings,
202
+ };
203
+ }
204
+
205
+ // ---------------------------------------------------------------- self-test
206
+
207
+ /**
208
+ * Plant a minimal projection under a tmp root. `guidelineSlug` is the body that
209
+ * actually exists; `routesTo` is what the rule claims. Passing them equal is the
210
+ * accept case, differing is the reject case.
211
+ */
212
+ function plant(
213
+ root: string,
214
+ opts: { routesTo?: string; guidelineSlug?: string; relLink?: string },
215
+ ): void {
216
+ const rulesDir = path.join(root, RULES_SUBDIR);
217
+ const guidelinesDir = path.join(root, GUIDELINES_SUBDIR);
218
+ fs.mkdirSync(rulesDir, { recursive: true });
219
+ fs.mkdirSync(guidelinesDir, { recursive: true });
220
+ if (opts.guidelineSlug !== undefined) {
221
+ const target = path.join(guidelinesDir, `${opts.guidelineSlug}.md`);
222
+ fs.mkdirSync(path.dirname(target), { recursive: true });
223
+ fs.writeFileSync(target, '# body\n');
224
+ }
225
+ const lines = ['---', 'name: probe'];
226
+ if (opts.routesTo !== undefined) lines.push(`routes_to: guideline:${opts.routesTo}`);
227
+ lines.push('---', '', '# probe', '');
228
+ if (opts.relLink !== undefined) lines.push(`See [body](${opts.relLink}).`);
229
+ fs.writeFileSync(path.join(rulesDir, 'probe.md'), `${lines.join('\n')}\n`);
230
+ }
231
+
232
+ function selfTestCases(): SelfTestCase[] {
233
+ const mk = (
234
+ name: string,
235
+ expect: 'reject' | 'accept',
236
+ opts: { routesTo?: string; guidelineSlug?: string; relLink?: string },
237
+ ): SelfTestCase => ({
238
+ name,
239
+ expect,
240
+ run: () => {
241
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'prr-'));
242
+ try {
243
+ plant(root, opts);
244
+ return runGateCli(
245
+ REPO_ROOT,
246
+ 'src/scripts/check_projected_rule_routes.ts',
247
+ ['--root', root, '--quiet'],
248
+ REPO_ROOT,
249
+ );
250
+ } finally {
251
+ fs.rmSync(root, { recursive: true, force: true });
252
+ }
253
+ },
254
+ });
255
+ return [
256
+ mk('routes_to target exists → accept', 'accept', { routesTo: 'x', guidelineSlug: 'x' }),
257
+ mk('routes_to target missing → reject', 'reject', { routesTo: 'x' }),
258
+ mk('routes_to a nested target that exists → accept', 'accept', {
259
+ routesTo: 'agent-infra/x',
260
+ guidelineSlug: 'agent-infra/x',
261
+ }),
262
+ mk('routes_to a nested target that does not → reject', 'reject', {
263
+ routesTo: 'agent-infra/x',
264
+ }),
265
+ // The exact regression the lane exists to prevent: the slug resolves as
266
+ // a bare filename but not under the projected guidelines directory.
267
+ mk('routes_to a slug that only exists outside the projection → reject', 'reject', {
268
+ routesTo: 'design-fidelity-mechanics',
269
+ }),
270
+ mk('no routes_to at all → accept', 'accept', {}),
271
+ // Half B is a ratchet, so a single broken relative link on a tmp root
272
+ // (floor 36, observed 1) must NOT fail — the gate reds on a RISE only.
273
+ mk('one unresolved relative link, far below the floor → accept', 'accept', {
274
+ relLink: '../guidelines/nope.md',
275
+ }),
276
+ mk('a resolving relative link → accept', 'accept', {
277
+ guidelineSlug: 'y',
278
+ relLink: '../guidelines/y.md',
279
+ }),
280
+ mk('both halves clean → accept', 'accept', {
281
+ routesTo: 'y',
282
+ guidelineSlug: 'y',
283
+ relLink: '../guidelines/y.md',
284
+ }),
285
+ mk('a good route plus a bad one in the same rule → reject', 'reject', {
286
+ routesTo: 'missing',
287
+ guidelineSlug: 'present',
288
+ }),
289
+ ];
290
+ }
291
+
292
+ // ---------------------------------------------------------------------- CLI
293
+
294
+ export function main(argv: string[] = process.argv.slice(2)): number {
295
+ if (argv.includes('--self-test')) {
296
+ return runSelfTest({
297
+ gate: 'check_projected_rule_routes',
298
+ cases: selfTestCases(),
299
+ minCases: 8,
300
+ minRejectCases: 4,
301
+ });
302
+ }
303
+ const quiet = argv.includes('--quiet');
304
+ const ri = argv.indexOf('--root');
305
+ const rootArg = ri !== -1 ? argv[ri + 1] : undefined;
306
+ const root = rootArg !== undefined ? path.resolve(rootArg) : REPO_ROOT;
307
+ // A tmp fixture root has its own tiny corpus, so the shrink-only floor is
308
+ // meaningless there and only the hard half is judged.
309
+ const isFixtureRoot = root !== REPO_ROOT;
310
+
311
+ const ledger = new GateLedger('check_projected_rule_routes');
312
+ let v: RouteVerdict;
313
+ try {
314
+ v = evaluate(root, ledger);
315
+ } catch (err) {
316
+ process.stderr.write(`❌ check_projected_rule_routes: ${(err as Error).message}\n`);
317
+ return 2;
318
+ }
319
+
320
+ try {
321
+ reportScanned({
322
+ gate: 'check_projected_rule_routes',
323
+ scanned: v.scanned,
324
+ units: 'projected rule(s)',
325
+ roots: [RULES_SUBDIR],
326
+ allowEmpty:
327
+ 'EMPTY_VALID: a checkout with no projection yet (pre-`task sync`) has no projected rule to judge',
328
+ });
329
+ } catch (err) {
330
+ if (err instanceof DeadScopeError) {
331
+ process.stderr.write(`❌ check_projected_rule_routes: ${err.message}\n`);
332
+ return 2;
333
+ }
334
+ throw err;
335
+ }
336
+
337
+ ledger.report();
338
+
339
+ if (v.findings.length > 0) {
340
+ for (const f of v.findings) process.stderr.write(`❌ ${f.file}: ${f.message}\n`);
341
+ process.stderr.write(
342
+ `\n A projected rule routes to a body the projection does not contain.\n` +
343
+ ` Either the guideline lane dropped it (see src/scripts/_lib/guidelines_lane.ts)\n` +
344
+ ` or the slug is wrong. Run 'task sync' first — the lane writes on sync.\n`,
345
+ );
346
+ return 1;
347
+ }
348
+
349
+ if (!isFixtureRoot && v.unresolvedGuideline > UNRESOLVED_GUIDELINE_FLOOR) {
350
+ process.stderr.write(
351
+ `❌ check_projected_rule_routes: unresolved links inside the projected ` +
352
+ `guidelines rose to ${String(v.unresolvedGuideline)}, floor is ` +
353
+ `${String(UNRESOLVED_GUIDELINE_FLOOR)}.\n` +
354
+ ` A guideline body whose own cross-references are dead is a body a\n` +
355
+ ` consumer cannot follow. Most of this class is repaired in\n` +
356
+ ` condense.ts::_rewrite_body_links; the residue points at trees the\n` +
357
+ ` projection does not carry.\n`,
358
+ );
359
+ return 1;
360
+ }
361
+
362
+ if (!isFixtureRoot && v.unresolvedRelative > UNRESOLVED_RELATIVE_FLOOR) {
363
+ process.stderr.write(
364
+ `❌ check_projected_rule_routes: unresolved relative links rose to ` +
365
+ `${String(v.unresolvedRelative)}, floor is ${String(UNRESOLVED_RELATIVE_FLOOR)}.\n` +
366
+ ` This ratchet is shrink-only. Fix the link, or — if a whole tree became\n` +
367
+ ` projectable — lower UNRESOLVED_RELATIVE_FLOOR in the same commit.\n`,
368
+ );
369
+ // Name them. An aggregate the operator cannot act on is half a finding,
370
+ // and `evaluate` already holds every path — it used to count and throw
371
+ // them away. Blind-review finding.
372
+ for (const u of v.unresolvedRuleLinks) {
373
+ process.stderr.write(` ${u.file} → ${u.link}\n`);
374
+ }
375
+ return 1;
376
+ }
377
+
378
+ if (!quiet) {
379
+ process.stdout.write(
380
+ `✅ every projected rule's guideline route resolves ` +
381
+ `(${String(v.scanned)} rule(s), ${String(v.targets)} distinct target(s); ` +
382
+ `${String(v.unresolvedRelative)}/${String(v.relativeLinks)} rule links unresolved, ` +
383
+ `floor ${String(UNRESOLVED_RELATIVE_FLOOR)}; ` +
384
+ `${String(v.unresolvedGuideline)}/${String(v.guidelineLinks)} guideline links unresolved, ` +
385
+ `floor ${String(UNRESOLVED_GUIDELINE_FLOOR)}).\n`,
386
+ );
387
+ }
388
+ return 0;
389
+ }
390
+
391
+ if (process.env['GATE_SELF_TEST_CHILD'] !== '1' || process.argv.includes('--root')) {
392
+ if (process.argv[1] !== undefined && import.meta.url === `file://${process.argv[1]}`) {
393
+ process.exit(main());
394
+ }
395
+ }
@@ -98,6 +98,13 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
98
98
  import { GateLedger, UnaccountedTargetsError } from './_lib/gate_ledger.js';
99
99
  import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
100
100
  import { _resetStateForTest as _pointCondenseAt, projected_rule_trees } from './condense.js';
101
+ import { leanProjectionHostsRaw, leanProjectionModeRaw } from './_lib/hook_settings.js';
102
+ import {
103
+ normalizeLeanProjectionMode,
104
+ resolveLeanProjectionHosts,
105
+ writesThinFiles,
106
+ } from './_lib/lean_projection_mode.js';
107
+ import { is_thin_entry } from './project_thin_rules.js';
101
108
 
102
109
  const _HERE = path.resolve(fileURLToPath(import.meta.url));
103
110
  const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
@@ -105,7 +112,24 @@ const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
105
112
  /** Where the projected rules are condensed to — the freshness comparison's left side. */
106
113
  const DIST_RULES = path.join('dist', 'agent-src', 'rules');
107
114
 
108
- export type ProjectionFindingKind = 'missing' | 'stale' | 'dangling';
115
+ export type ProjectionFindingKind = 'missing' | 'stale' | 'dangling' | 'thinned';
116
+
117
+ /**
118
+ * Tool dir → the host id whose tree it is.
119
+ *
120
+ * Mirrors `condense._DIR_TOOL_ID` for the three dirs this gate covers. It is a
121
+ * second spelling of a mapping `condense` already owns, which is a real cost —
122
+ * accepted because `_DIR_TOOL_ID` is module-private and exporting it would widen
123
+ * `condense`'s surface for one consumer, in a file already ~1,200 lines past the
124
+ * source-size ceiling where every added line is one unit of ratchet debt.
125
+ * `thinnedTreeFindings` fails CLOSED on an unmapped dir (see there), so a dir
126
+ * added upstream and missed here is reported rather than silently exempted.
127
+ */
128
+ export const TREE_HOST_ID: Readonly<Record<string, string>> = {
129
+ '.claude/rules': 'claude-code',
130
+ '.cursor/rules': 'cursor',
131
+ '.clinerules': 'cline',
132
+ };
109
133
 
110
134
  export interface ProjectionFinding {
111
135
  /** Repo-relative tool dir, e.g. `.claude/rules`. */
@@ -138,9 +162,59 @@ function _lstatOrNull(p: string): fs.Stats | null {
138
162
  * computed here so the caller controls which root the generator's emit plan was
139
163
  * derived from, and so a test can pin an expectation without a settings file.
140
164
  */
165
+ /**
166
+ * The host axis (road-to-delivery-for-every-host 1.3).
167
+ *
168
+ * A stub is a COMPLETE projection for a host inside `lean_projection.hosts` —
169
+ * that is what delivery mode means, and failing it there would make the mode
170
+ * unusable. For every other host a stub is the D1 defect: the body left the
171
+ * tree and no concern is bound to bring it back, so the rule reaches that host
172
+ * at no scope at all while every file-count check still passes.
173
+ *
174
+ * Fails CLOSED in two directions, both deliberate:
175
+ * · a tool dir absent from `TREE_HOST_ID` maps to `''`, which is in no host
176
+ * list, so an unmapped dir is treated as NOT a delivery host and its stubs
177
+ * are reported. A new dir is then a loud finding rather than a silent
178
+ * exemption.
179
+ * · an unreadable entry is skipped rather than guessed at — `missing` and
180
+ * `dangling` already own that case, and inventing a third verdict from a
181
+ * failed read would double-report one defect.
182
+ */
183
+ export function thinnedTreeFindings(
184
+ repoRoot: string,
185
+ expected: Readonly<Record<string, readonly string[]>>,
186
+ deliveryHosts: readonly string[],
187
+ ): ProjectionFinding[] {
188
+ const out: ProjectionFinding[] = [];
189
+ for (const [tree, rules] of Object.entries(expected)) {
190
+ const hostId = TREE_HOST_ID[tree] ?? '';
191
+ if (deliveryHosts.includes(hostId)) continue;
192
+ for (const rule of rules) {
193
+ let text: string;
194
+ try {
195
+ text = fs.readFileSync(path.join(repoRoot, tree, rule), 'utf-8');
196
+ } catch {
197
+ continue;
198
+ }
199
+ if (!is_thin_entry(text)) continue;
200
+ out.push({
201
+ tree,
202
+ rule,
203
+ kind: 'thinned',
204
+ message:
205
+ `pointer stub in a tree whose host (${hostId === '' ? 'unmapped' : hostId}) is not in ` +
206
+ `lean_projection.hosts — the body reaches this host at no scope, and no concern ` +
207
+ `is bound to deliver it back`,
208
+ });
209
+ }
210
+ }
211
+ return out;
212
+ }
213
+
141
214
  export function auditRuleProjection(
142
215
  repoRoot: string,
143
216
  expected: Readonly<Record<string, readonly string[]>>,
217
+ deliveryHosts: readonly string[] = [],
144
218
  ): ProjectionAudit {
145
219
  const ledger = new GateLedger('check_rule_projection_integrity');
146
220
  const findings: ProjectionFinding[] = [];
@@ -248,9 +322,34 @@ export function auditRuleProjection(
248
322
  }
249
323
  }
250
324
 
325
+ // Appended after the completeness/freshness pass rather than folded into it:
326
+ // a stub entry EXISTS and is FRESH, so it is legitimately `complete` on the
327
+ // ledger. The host axis is a separate question about the entry's CONTENT,
328
+ // and conflating the two would make a delivery host's stub a ledger failure.
329
+ findings.push(...thinnedTreeFindings(repoRoot, expected, deliveryHosts));
330
+
251
331
  return { findings, treePresent, ledger };
252
332
  }
253
333
 
334
+ /**
335
+ * The `lean_projection` block as it stands under `root`.
336
+ *
337
+ * Read with the HOOK-side indentation reader rather than a YAML parse, on
338
+ * purpose: this gate runs first in the pre-push chain and on a fresh CI
339
+ * checkout, and a parser failure there must not fail a rule audit for a reason
340
+ * unrelated to rules. `_lib/lean_projection_mode.ts` owns what the values MEAN,
341
+ * so this gate and the projector cannot disagree.
342
+ *
343
+ * `mode` is checked before `hosts`: with the mode off no host is a delivery
344
+ * host, so a `hosts:` list left behind after a rollback exempts nothing and
345
+ * every stub in every tree is reported.
346
+ */
347
+ function _lean_projection_settings_for(root: string): { hosts: readonly string[] } {
348
+ const mode = normalizeLeanProjectionMode(leanProjectionModeRaw(root));
349
+ if (!writesThinFiles(mode)) return { hosts: [] };
350
+ return { hosts: resolveLeanProjectionHosts(leanProjectionHostsRaw(root)).hosts };
351
+ }
352
+
254
353
  /** Group findings by tree, preserving rule order, for a report a reader can act on. */
255
354
  export function renderFindings(audit: ProjectionAudit): string[] {
256
355
  const lines: string[] = [];
@@ -297,7 +396,8 @@ export function main(argv?: readonly string[]): number {
297
396
 
298
397
  let audit: ProjectionAudit;
299
398
  try {
300
- audit = auditRuleProjection(root, projected_rule_trees());
399
+ const lean = _lean_projection_settings_for(root);
400
+ audit = auditRuleProjection(root, projected_rule_trees(), lean.hosts);
301
401
  } catch (exc) {
302
402
  if (exc instanceof DeadScopeError) {
303
403
  process.stderr.write(`❌ ${exc.message}\n`);