@event4u/agent-config 16.4.0 → 17.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 (1052) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +2 -2
  4. package/.claude-plugin/skills/install-agent-config/SKILL.md +4 -4
  5. package/CHANGELOG.md +483 -669
  6. package/CONTRIBUTING.md +47 -0
  7. package/README.md +25 -25
  8. package/dist/agent-src/commands/{design.md → agent-design.md} +11 -7
  9. package/dist/agent-src/commands/agents/init.md +66 -3
  10. package/dist/agent-src/commands/agents/user/init.md +3 -0
  11. package/dist/agent-src/commands/{optimize/deep.md → analyze/and-optimize.md} +72 -33
  12. package/dist/agent-src/commands/analyze/inbox.md +168 -37
  13. package/dist/agent-src/commands/analyze/pr.md +144 -0
  14. package/dist/agent-src/commands/analyze/{repo.md → reference.md} +85 -14
  15. package/dist/agent-src/commands/analyze/roadmap-repos.md +19 -10
  16. package/dist/agent-src/commands/analyze.md +28 -12
  17. package/dist/agent-src/commands/audit.md +115 -0
  18. package/dist/agent-src/commands/brand/review.md +13 -2
  19. package/dist/agent-src/commands/brand/tokens.md +3 -3
  20. package/dist/agent-src/commands/brand/voice.md +8 -5
  21. package/dist/agent-src/commands/brand.md +2 -2
  22. package/dist/agent-src/commands/challenge-me/closure.md +25 -0
  23. package/dist/agent-src/commands/design-system/import.md +8 -3
  24. package/dist/agent-src/commands/design-system/sync.md +98 -0
  25. package/dist/agent-src/commands/design-system.md +6 -1
  26. package/dist/agent-src/commands/evals/analyze.json +44 -0
  27. package/dist/agent-src/commands/evals/audit.json +12 -0
  28. package/dist/agent-src/commands/evals/retro.json +12 -0
  29. package/dist/agent-src/commands/fix/ci.md +10 -8
  30. package/dist/agent-src/commands/ghostwriter/write.md +22 -0
  31. package/dist/agent-src/commands/memory/learn-low-impact.md +70 -83
  32. package/dist/agent-src/commands/memory/propose.md +12 -0
  33. package/dist/agent-src/commands/memory.md +1 -1
  34. package/dist/agent-src/commands/optimize.md +4 -3
  35. package/dist/agent-src/commands/post-as/me.md +18 -0
  36. package/dist/agent-src/commands/pr/create.md +17 -342
  37. package/dist/agent-src/commands/pr/merge.md +129 -368
  38. package/dist/agent-src/commands/retro.md +121 -0
  39. package/dist/agent-src/commands/review/routing.md +1 -1
  40. package/dist/agent-src/commands/roadmap/next.md +4 -1
  41. package/dist/agent-src/commands/roadmap/process-full.md +46 -333
  42. package/dist/agent-src/commands/roadmap/triage-parked.md +6 -2
  43. package/dist/agent-src/commands/team-knowledge/consolidate.md +2 -2
  44. package/dist/agent-src/commands/team-knowledge.md +1 -1
  45. package/dist/agent-src/commands/threat-model.md +1 -1
  46. package/dist/agent-src/commands/upstream-contribute.md +91 -101
  47. package/dist/agent-src/commands/worktree/cleanup.md +18 -11
  48. package/dist/agent-src/contexts/contracts/consumer-agents-md-guide.md +54 -0
  49. package/dist/agent-src/contexts/execution/analysis-loop.md +137 -0
  50. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +3 -3
  51. package/dist/agent-src/contexts/execution/decision-closure-execution.md +1 -1
  52. package/dist/agent-src/contexts/execution/host-capability-manifest.md +6 -0
  53. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +11 -4
  54. package/dist/agent-src/contexts/execution/pr-create-branches-content.md +250 -0
  55. package/dist/agent-src/contexts/execution/pr-create-branches-freshness.md +150 -0
  56. package/dist/agent-src/contexts/execution/pr-merge-queue.md +287 -0
  57. package/dist/agent-src/contexts/execution/pr-merge-sync.md +276 -0
  58. package/dist/agent-src/contexts/execution/pr-merge-trust-boundary.md +69 -0
  59. package/dist/agent-src/contexts/execution/process-full-all.md +233 -0
  60. package/dist/agent-src/contexts/execution/process-full-delivery.md +231 -0
  61. package/dist/agent-src/contexts/execution/roadmap-execution-contract-branches.md +42 -0
  62. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -35
  63. package/dist/agent-src/contexts/execution/roadmap-process-loop-close.md +235 -0
  64. package/dist/agent-src/contexts/execution/roadmap-process-loop-prescan.md +216 -0
  65. package/dist/agent-src/contexts/execution/roadmap-process-loop-run.md +253 -0
  66. package/dist/agent-src/contexts/execution/roadmap-process-loop-set.md +212 -0
  67. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +25 -864
  68. package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +14 -2
  69. package/dist/agent-src/contexts/execution/subagent-steering.md +65 -8
  70. package/dist/agent-src/contexts/model-recommendations.md +5 -5
  71. package/dist/agent-src/contexts/subagent-configuration.md +1 -1
  72. package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +4 -3
  73. package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +11 -5
  74. package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
  75. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
  76. package/dist/agent-src/guidelines/design-antipatterns.md +6 -1
  77. package/dist/agent-src/guidelines/design-asset-discipline.md +17 -0
  78. package/dist/agent-src/guidelines/design-fidelity-routing.md +1 -0
  79. package/dist/agent-src/guidelines/php/api-design.md +10 -1
  80. package/dist/agent-src/rules/brand-source-of-truth.md +7 -6
  81. package/dist/agent-src/rules/code-provenance.md +1 -1
  82. package/dist/agent-src/rules/context-hygiene.md +0 -1
  83. package/dist/agent-src/rules/design-fidelity.md +12 -13
  84. package/dist/agent-src/rules/external-reference-deep-dive.md +2 -2
  85. package/dist/agent-src/rules/fix-what-you-see.md +1 -1
  86. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +14 -15
  87. package/dist/agent-src/rules/missing-skill-recovery.md +12 -11
  88. package/dist/agent-src/rules/neighbour-precedence.md +1 -1
  89. package/dist/agent-src/rules/recurring-criticism.md +1 -1
  90. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -2
  91. package/dist/agent-src/rules/self-repair-loop.md +2 -2
  92. package/dist/agent-src/rules/token-budget-discipline.md +2 -2
  93. package/dist/agent-src/scripts/dashboard_mode.ts +4 -1
  94. package/dist/agent-src/scripts/roadmap_age.ts +175 -0
  95. package/dist/agent-src/scripts/update_roadmap_progress.ts +10 -2
  96. package/dist/agent-src/skills/accessibility-auditor/SKILL.md +3 -3
  97. package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +2 -0
  98. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
  99. package/dist/agent-src/skills/agent-security-review/SKILL.md +2 -2
  100. package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +12 -4
  101. package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +7 -0
  102. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +11 -1
  103. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +7 -0
  104. package/dist/agent-src/skills/ai-council/references/execution-modes.md +7 -0
  105. package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +19 -0
  106. package/dist/agent-src/skills/ai-council/references/procedure.md +7 -0
  107. package/dist/agent-src/skills/api-design/SKILL.md +2 -2
  108. package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
  109. package/dist/agent-src/skills/authz-review/SKILL.md +5 -3
  110. package/dist/agent-src/skills/blade-ui/SKILL.md +2 -2
  111. package/dist/agent-src/skills/brand/SKILL.md +7 -3
  112. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +13 -6
  113. package/dist/agent-src/skills/brand-audit/SKILL.md +2 -1
  114. package/dist/agent-src/skills/brand-identity/SKILL.md +5 -4
  115. package/dist/agent-src/skills/brand-strategy/SKILL.md +5 -4
  116. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +18 -39
  117. package/dist/agent-src/skills/brand-to-tokens/templates/marp-brand-deck.md.example +2 -2
  118. package/dist/agent-src/skills/brand-to-tokens/templates/reveal-brand-deck.yaml +2 -2
  119. package/dist/agent-src/skills/canvas-design/SKILL.md +16 -4
  120. package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
  121. package/dist/agent-src/skills/composer-packages/SKILL.md +18 -0
  122. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  123. package/dist/agent-src/skills/content-funnel-design/SKILL.md +8 -1
  124. package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
  125. package/dist/agent-src/skills/context-document/SKILL.md +2 -2
  126. package/dist/agent-src/skills/corpus-grounding/SKILL.md +6 -6
  127. package/dist/agent-src/skills/corpus-grounding/scripts/decision_engine.ts +13 -11
  128. package/dist/agent-src/skills/corpus-grounding/scripts/ground.mjs +1706 -0
  129. package/dist/agent-src/skills/corpus-grounding/scripts/schema_validator.ts +7 -1
  130. package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
  131. package/dist/agent-src/skills/data-flow-mapper/SKILL.md +5 -2
  132. package/dist/agent-src/skills/database/SKILL.md +5 -4
  133. package/dist/agent-src/skills/decision-record/references/weighted-matrix.md +12 -0
  134. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +1 -1
  135. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +61 -11
  136. package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
  137. package/dist/agent-src/skills/design-intelligence/SKILL.md +1 -1
  138. package/dist/agent-src/skills/design-intelligence/data/landing.csv +1 -1
  139. package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +10 -2
  140. package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
  141. package/dist/agent-src/skills/design-intelligence/references/design-rules-checklist.md +4 -3
  142. package/dist/agent-src/skills/design-intelligence/references/integration-mapping.md +25 -22
  143. package/dist/agent-src/skills/{wireframe → design-review}/references/story-beat-ledger.schema.json +1 -1
  144. package/dist/agent-src/skills/design-review/references/verification-automation.md +11 -3
  145. package/dist/agent-src/skills/design-system-capture/SKILL.md +15 -10
  146. package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -5
  147. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +2 -2
  148. package/dist/agent-src/skills/design-tokens/SKILL.md +23 -23
  149. package/dist/agent-src/skills/design-tokens/scripts/tokens.mjs +1037 -0
  150. package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +336 -13
  151. package/dist/agent-src/skills/design-tokens/templates/design-tokens-starter.json +52 -53
  152. package/dist/agent-src/skills/docker/SKILL.md +1 -1
  153. package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
  154. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -276
  155. package/dist/agent-src/skills/existing-ui-audit/procedure.yaml +44 -0
  156. package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +1 -1
  157. package/dist/agent-src/skills/existing-ui-audit/references/steps/00-inspect-stack-and-input.md +4 -0
  158. package/dist/agent-src/skills/existing-ui-audit/references/steps/01-enumerate-components.md +26 -0
  159. package/dist/agent-src/skills/existing-ui-audit/references/steps/01b-detect-component-taxonomy.md +7 -0
  160. package/dist/agent-src/skills/existing-ui-audit/references/steps/02-identify-design-system.md +12 -0
  161. package/dist/agent-src/skills/existing-ui-audit/references/steps/03-detect-design-tokens.md +35 -0
  162. package/dist/agent-src/skills/existing-ui-audit/references/steps/04-detect-shadcn-inventory.md +13 -0
  163. package/dist/agent-src/skills/existing-ui-audit/references/steps/04b-live-storybook-read.md +26 -0
  164. package/dist/agent-src/skills/existing-ui-audit/references/steps/05-list-reusable-patterns.md +14 -0
  165. package/dist/agent-src/skills/existing-ui-audit/references/steps/06-match-candidates.md +52 -0
  166. package/dist/agent-src/skills/existing-ui-audit/references/steps/07-greenfield-branch.md +29 -0
  167. package/dist/agent-src/skills/existing-ui-audit/references/steps/08-a11y-baseline.md +40 -0
  168. package/dist/agent-src/skills/existing-ui-audit/references/steps/09-validate-and-write.md +5 -0
  169. package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
  170. package/dist/agent-src/skills/fe-design/references/design-patterns.md +65 -4
  171. package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +1 -1
  172. package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
  173. package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +6 -6
  174. package/dist/agent-src/skills/flux/SKILL.md +1 -1
  175. package/dist/agent-src/skills/form-handler/SKILL.md +15 -2
  176. package/dist/agent-src/skills/frontend-render-security/SKILL.md +9 -0
  177. package/dist/agent-src/skills/git-workflow/SKILL.md +2 -2
  178. package/dist/agent-src/skills/git-workflow/references/branch-update.md +7 -0
  179. package/dist/agent-src/skills/git-workflow/references/commit-subject.md +12 -0
  180. package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +10 -0
  181. package/dist/agent-src/skills/gtm-launch/SKILL.md +8 -1
  182. package/dist/agent-src/skills/html-deck/SKILL.md +7 -2
  183. package/dist/agent-src/skills/humanizer/SKILL.md +16 -3
  184. package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +13 -1
  185. package/dist/agent-src/skills/humanizer/references/fixtures.md +8 -0
  186. package/dist/agent-src/skills/iconography/SKILL.md +4 -2
  187. package/dist/agent-src/skills/image-provider-routing/SKILL.md +16 -5
  188. package/dist/agent-src/skills/js-library-packaging/SKILL.md +5 -4
  189. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.mjs +197 -0
  190. package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +1 -1
  191. package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -2
  192. package/dist/agent-src/skills/launch-readiness/SKILL.md +18 -22
  193. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +5 -5
  194. package/dist/agent-src/skills/livewire/SKILL.md +1 -1
  195. package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +18 -0
  196. package/dist/agent-src/skills/logo-generation/SKILL.md +21 -11
  197. package/dist/agent-src/skills/market-entry-analysis/SKILL.md +6 -1
  198. package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
  199. package/dist/agent-src/skills/memory-consolidation/SKILL.md +2 -2
  200. package/dist/agent-src/skills/messaging-architecture/SKILL.md +8 -1
  201. package/dist/agent-src/skills/motion-choreographer/SKILL.md +2 -2
  202. package/dist/agent-src/skills/playwright-testing/SKILL.md +2 -0
  203. package/dist/agent-src/skills/positioning-strategy/SKILL.md +10 -2
  204. package/dist/agent-src/skills/prediction-pool-optimizer/references/ev-fixtures.md +13 -0
  205. package/dist/agent-src/skills/prediction-pool-optimizer/references/odds-and-bonus.md +7 -0
  206. package/dist/agent-src/skills/project-analysis-core/SKILL.md +1 -1
  207. package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +1 -1
  208. package/dist/agent-src/skills/project-analyzer/SKILL.md +14 -75
  209. package/dist/agent-src/skills/project-analyzer/procedure.yaml +39 -0
  210. package/dist/agent-src/skills/project-analyzer/references/steps/01-project-overview.md +9 -0
  211. package/dist/agent-src/skills/project-analyzer/references/steps/02-architecture.md +7 -0
  212. package/dist/agent-src/skills/project-analyzer/references/steps/03-data-layer.md +6 -0
  213. package/dist/agent-src/skills/project-analyzer/references/steps/04-business-domains.md +7 -0
  214. package/dist/agent-src/skills/project-analyzer/references/steps/05-api-surface.md +6 -0
  215. package/dist/agent-src/skills/project-analyzer/references/steps/06-service-map.md +6 -0
  216. package/dist/agent-src/skills/project-analyzer/references/steps/07-module-inventory.md +6 -0
  217. package/dist/agent-src/skills/project-analyzer/references/steps/08-infrastructure-and-testing.md +5 -0
  218. package/dist/agent-src/skills/project-analyzer/references/steps/09-agent-docs-audit.md +6 -0
  219. package/dist/agent-src/skills/project-analyzer/references/steps/10-gap-analysis.md +6 -0
  220. package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +10 -0
  221. package/dist/agent-src/skills/quality-tools/references/php-tools.md +13 -0
  222. package/dist/agent-src/skills/quality-tools/references/python-tools.md +11 -0
  223. package/dist/agent-src/skills/react-native-setup/SKILL.md +7 -2
  224. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +5 -1
  225. package/dist/agent-src/skills/react-shadcn-ui/references/registry.md +13 -0
  226. package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.mjs +315 -0
  227. package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.ts +6 -6
  228. package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
  229. package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
  230. package/dist/agent-src/skills/release-comms/SKILL.md +2 -1
  231. package/dist/agent-src/skills/repomix-packer/SKILL.md +2 -2
  232. package/dist/agent-src/skills/requesting-code-review/SKILL.md +3 -3
  233. package/dist/agent-src/skills/roadmap-management/references/archival.md +3 -3
  234. package/dist/agent-src/skills/roadmap-management/references/authoring.md +9 -2
  235. package/dist/agent-src/skills/roadmap-management/references/dashboard.md +3 -3
  236. package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +3 -3
  237. package/dist/agent-src/skills/roadmap-writing/SKILL.md +4 -4
  238. package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +1 -1
  239. package/dist/agent-src/skills/rule-writing/SKILL.md +1 -2
  240. package/dist/agent-src/skills/security/SKILL.md +41 -5
  241. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
  242. package/dist/agent-src/skills/skill-reviewer/SKILL.md +1 -1
  243. package/dist/agent-src/skills/skill-writing/SKILL.md +23 -8
  244. package/dist/agent-src/skills/skill-writing/references/section-patterns.md +19 -1
  245. package/dist/agent-src/skills/source-discovery/SKILL.md +3 -3
  246. package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
  247. package/dist/agent-src/skills/standards-from-config/SKILL.md +2 -2
  248. package/dist/agent-src/skills/storybook-workshop/SKILL.md +5 -0
  249. package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.mjs +99 -0
  250. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +13 -13
  251. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +4 -3
  252. package/dist/agent-src/skills/svg-authoring/SKILL.md +324 -0
  253. package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
  254. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +8 -3
  255. package/dist/agent-src/skills/tailwind-engineer/scripts/tailwind_config_gen.mjs +482 -0
  256. package/dist/agent-src/skills/test-case-discovery/SKILL.md +1 -1
  257. package/dist/agent-src/skills/threat-modeling/SKILL.md +8 -1
  258. package/dist/agent-src/skills/threat-modeling/data/manifest.json +5 -2
  259. package/dist/agent-src/skills/threat-modeling/data/reasoning.csv +10 -10
  260. package/dist/agent-src/skills/threat-modeling/data/surfaces.csv +11 -10
  261. package/dist/agent-src/skills/threat-modeling/data/threats.csv +34 -20
  262. package/dist/agent-src/skills/type-design/SKILL.md +196 -0
  263. package/dist/agent-src/skills/type-design/references/font-spec.md +90 -0
  264. package/dist/agent-src/skills/type-design/references/gates.md +113 -0
  265. package/dist/agent-src/skills/type-design/references/toolchain.md +66 -0
  266. package/dist/agent-src/skills/typography-system/SKILL.md +21 -11
  267. package/dist/agent-src/skills/typography-system/references/worked-scales.md +85 -0
  268. package/dist/agent-src/skills/ui-apply-generic/SKILL.md +1 -1
  269. package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
  270. package/dist/agent-src/skills/upstream-contribute/SKILL.md +120 -125
  271. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -0
  272. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +1 -1
  273. package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +71 -2
  274. package/dist/agent-src/skills/wireframe/SKILL.md +5 -2
  275. package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +16 -14
  276. package/dist/agent-src/templates/AGENTS.md +1 -1
  277. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  278. package/dist/agent-src/templates/agents/proposal.example.md +1 -1
  279. package/dist/agent-src/templates/github-workflows/advisories-daily.yml +85 -0
  280. package/dist/agent-src/templates/roadmaps.md +39 -1
  281. package/dist/agent-src/templates/scripts/check_memory.ts +2 -2
  282. package/dist/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
  283. package/dist/agent-src/templates/scripts/work_engine/cli.ts +17 -0
  284. package/dist/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
  285. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
  286. package/dist/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
  287. package/dist/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
  288. package/dist/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
  289. package/dist/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
  290. package/dist/agent-src/templates/scripts/work_engine/state.ts +3 -0
  291. package/dist/cli/commands/uiRender.js +265 -13
  292. package/dist/cli/commands/uiRenderAsset.js +1316 -0
  293. package/dist/cli/commands/uiRenderAssetCompare.js +752 -0
  294. package/dist/cli/commands/uiRenderAssetFonts.js +158 -0
  295. package/dist/cli/commands/uiRenderAssetGrid.js +265 -0
  296. package/dist/cli/commands/uiRenderAssetGrounds.js +323 -0
  297. package/dist/cli/commands/uiRenderAssetIsolation.js +85 -0
  298. package/dist/cli/commands/uiRenderAssetTypes.js +133 -0
  299. package/dist/cli/initRouting.js +1 -1
  300. package/dist/cli/main.js +47 -1
  301. package/dist/cli/mcp/dispatch.js +31 -9
  302. package/dist/cli/python/knowledge_ingest.js +7 -39
  303. package/dist/cli/python/workspace_secrets.js +4 -177
  304. package/dist/cli/registry.js +5 -2
  305. package/dist/cli-delegate/archive_completed_roadmaps.js +3 -2
  306. package/dist/cli-delegate/check_update_banner.js +635 -266
  307. package/dist/cli-delegate/{chunk-AED2VQGM.js → chunk-2CX7NWRB.js} +233 -437
  308. package/dist/cli-delegate/{chunk-F3QDG2GT.js → chunk-2SFOOFJJ.js} +259 -159
  309. package/dist/cli-delegate/chunk-2Y5AMLMY.js +136 -0
  310. package/dist/cli-delegate/{chunk-OKJUIAPS.js → chunk-4E2W63DA.js} +1 -62
  311. package/dist/cli-delegate/{chunk-6SRJTYJS.js → chunk-4SHNERBL.js} +37 -16
  312. package/dist/cli-delegate/chunk-5VO3RTMV.js +208 -0
  313. package/dist/cli-delegate/chunk-6E2LDY4F.js +27 -0
  314. package/dist/cli-delegate/{chunk-XQTPXKFA.js → chunk-6ZD2QZMN.js} +8 -17
  315. package/dist/cli-delegate/{chunk-6V5FMA3P.js → chunk-7CEI2YPS.js} +1 -1
  316. package/dist/cli-delegate/{chunk-DMSZHXZS.js → chunk-7DRWULEQ.js} +80 -7
  317. package/dist/cli-delegate/chunk-7NXCZSDL.js +54 -0
  318. package/dist/cli-delegate/chunk-AX3U3UWJ.js +328 -0
  319. package/dist/cli-delegate/{chunk-WOKWX5PL.js → chunk-BKALSTBZ.js} +18 -3
  320. package/dist/cli-delegate/chunk-BMGUGSY6.js +103 -0
  321. package/dist/cli-delegate/chunk-BYV46VRM.js +3309 -0
  322. package/dist/cli-delegate/{chunk-5GPULQBE.js → chunk-CAL76ADI.js} +4215 -682
  323. package/dist/cli-delegate/chunk-DSY6LLCQ.js +127 -0
  324. package/dist/cli-delegate/chunk-E6XNBVE4.js +581 -0
  325. package/dist/cli-delegate/{chunk-ZUZKZYCN.js → chunk-ESUNQ5XR.js} +46 -10
  326. package/dist/cli-delegate/{chunk-G5VVIZRC.js → chunk-F7HLSW6P.js} +1 -1
  327. package/dist/cli-delegate/chunk-FIEEOH5C.js +133 -0
  328. package/dist/cli-delegate/chunk-FKYZOWVD.js +719 -0
  329. package/dist/cli-delegate/chunk-GOMILC3O.js +918 -0
  330. package/dist/cli-delegate/chunk-I4KJYVPB.js +69 -0
  331. package/dist/cli-delegate/{chunk-JQOM7TTM.js → chunk-IDAOTDPE.js} +1 -100
  332. package/dist/cli-delegate/chunk-IROAQ77A.js +137 -0
  333. package/dist/cli-delegate/chunk-J2SJZICO.js +698 -0
  334. package/dist/cli-delegate/{chunk-6YQC2HLF.js → chunk-JHMMWNJ2.js} +54 -40
  335. package/dist/cli-delegate/{chunk-WQWXGIWB.js → chunk-M6CRG5O6.js} +165 -15
  336. package/dist/cli-delegate/{chunk-PHD7OOLE.js → chunk-MQ2UDEGV.js} +14 -3
  337. package/dist/cli-delegate/chunk-NTM7G2V4.js +220 -0
  338. package/dist/cli-delegate/chunk-PV7S5DPJ.js +175 -0
  339. package/dist/cli-delegate/{chunk-F7DQWYR5.js → chunk-RAXQOETZ.js} +6 -2
  340. package/dist/cli-delegate/{chunk-T7XSJSUQ.js → chunk-SIOMDAKL.js} +980 -784
  341. package/dist/cli-delegate/{chunk-KR6EM23A.js → chunk-TULVDQ4L.js} +3 -48
  342. package/dist/cli-delegate/chunk-UUYEKXKR.js +20 -0
  343. package/dist/cli-delegate/{chunk-7XGD2OEU.js → chunk-UXWHY6CQ.js} +2 -1
  344. package/dist/cli-delegate/{chunk-PWX7CKMD.js → chunk-VC3ECUEK.js} +1 -1
  345. package/dist/cli-delegate/{chunk-KXXWJTDO.js → chunk-WMNYVIYX.js} +1 -1
  346. package/dist/cli-delegate/chunk-XCY5KKUC.js +181 -0
  347. package/dist/cli-delegate/{chunk-H76PHZBI.js → chunk-XLY5G3CM.js} +14 -19
  348. package/dist/cli-delegate/cmd_adr_effective.js +41 -2
  349. package/dist/cli-delegate/cmd_analyze_session.js +7 -7
  350. package/dist/cli-delegate/cmd_brand_status.js +1287 -10
  351. package/dist/cli-delegate/cmd_ci_settle.js +330 -0
  352. package/dist/cli-delegate/cmd_conformance.js +669 -822
  353. package/dist/cli-delegate/cmd_doctor.js +26 -16
  354. package/dist/cli-delegate/cmd_doctor_neighbours.js +10 -7
  355. package/dist/cli-delegate/cmd_explain.js +9 -24
  356. package/dist/cli-delegate/cmd_export.js +14 -11
  357. package/dist/cli-delegate/cmd_fleet.js +5 -3
  358. package/dist/cli-delegate/cmd_git_convention.js +8 -4
  359. package/dist/cli-delegate/cmd_handoff.js +79 -242
  360. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  361. package/dist/cli-delegate/cmd_memory_get.js +4 -2
  362. package/dist/cli-delegate/cmd_migrate.js +2 -2
  363. package/dist/cli-delegate/cmd_packs_active.js +2 -2
  364. package/dist/cli-delegate/cmd_preflight.js +7 -5
  365. package/dist/cli-delegate/cmd_prune.js +16 -13
  366. package/dist/cli-delegate/cmd_route_audit.js +11 -8
  367. package/dist/cli-delegate/cmd_route_explain.js +649 -16
  368. package/dist/cli-delegate/cmd_session_recycle.js +15 -6
  369. package/dist/cli-delegate/cmd_settings_check.js +2 -2
  370. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  371. package/dist/cli-delegate/cmd_settings_migrate.js +14 -11
  372. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  373. package/dist/cli-delegate/cmd_sync.js +16 -13
  374. package/dist/cli-delegate/cmd_uninstall.js +185 -31
  375. package/dist/cli-delegate/cmd_update.js +67 -3
  376. package/dist/cli-delegate/cmd_upgrade.js +38 -7
  377. package/dist/cli-delegate/cmd_validate.js +16 -13
  378. package/dist/cli-delegate/cmd_versions.js +1 -1
  379. package/dist/cli-delegate/dashboard_mode.js +1 -1
  380. package/dist/cli-delegate/gate_execute.js +4 -3
  381. package/dist/cli-delegate/roadmap_age.js +22 -0
  382. package/dist/cli-delegate/roadmap_gates.js +4 -3
  383. package/dist/cli-delegate/update_roadmap_progress.js +3 -2
  384. package/dist/cli-delegate/upgrade_unattended-VVL6JLSX.js +541 -0
  385. package/dist/discovery/deprecation-report.md +1 -1
  386. package/dist/discovery/discovery-manifest.json +409 -201
  387. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  388. package/dist/discovery/discovery-manifest.summary.md +8 -8
  389. package/dist/discovery/dormancy-report.md +1 -1
  390. package/dist/discovery/orphan-report.md +1 -1
  391. package/dist/discovery/packs.json +36 -27
  392. package/dist/discovery/trust-report.md +3 -3
  393. package/dist/discovery/workspaces.json +25 -16
  394. package/dist/hooks/chat_history.chunk.cjs +6852 -0
  395. package/dist/hooks/chat_history.chunk.cjs.sha256 +1 -0
  396. package/dist/hooks/dispatch.js +17706 -18627
  397. package/dist/hooks/dispatch.sha256 +1 -1
  398. package/dist/hooks/egress_engine.chunk.cjs +915 -0
  399. package/dist/hooks/egress_engine.chunk.cjs.sha256 +1 -0
  400. package/dist/hooks/svg_rules.chunk.cjs +1858 -0
  401. package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -0
  402. package/dist/install/conflict.js +36 -6
  403. package/dist/install/conflictTracker.js +81 -7
  404. package/dist/install/detect.js +3 -3
  405. package/dist/install/hostPermissionsAdapter.js +106 -0
  406. package/dist/install/install.mjs +3117 -1949
  407. package/dist/install/installThinLayer.js +1 -1
  408. package/dist/install/manifestFiles.js +21 -0
  409. package/dist/install/noGoDenyRows.js +300 -0
  410. package/dist/install/noGoRules.js +368 -0
  411. package/dist/install/ownershipLedger.js +133 -0
  412. package/dist/install/plan.js +1 -1
  413. package/dist/install/preflight.js +39 -8
  414. package/dist/install/preserve.js +74 -12
  415. package/dist/install/recordedOwnership.js +88 -5
  416. package/dist/install/rule_scope.js +20 -3
  417. package/dist/install/stagedRuntime.js +455 -0
  418. package/dist/install/toolsArg.js +19 -0
  419. package/dist/install/userPin.js +47 -0
  420. package/dist/install/wizard-plan.js +26 -4
  421. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  422. package/dist/mcp/mcp-cloudflare-catalogue.json +3 -2
  423. package/dist/mcp/registry-manifest.json +6 -5
  424. package/dist/mcp/server.json +3 -3
  425. package/dist/mcp/server.mjs +9814 -5333
  426. package/dist/router.json +1 -1
  427. package/dist/scripts/_lib/agent_settings.js +7 -12
  428. package/dist/scripts/_lib/asset_render_record.js +219 -0
  429. package/dist/scripts/_lib/claude_builtin_names.js +9 -4
  430. package/dist/scripts/_lib/claude_settings_hooks.js +102 -34
  431. package/dist/scripts/_lib/egress_rules.js +766 -0
  432. package/dist/scripts/_lib/environment_detector.js +24 -33
  433. package/dist/scripts/_lib/global_deploy_inventory.js +146 -9
  434. package/dist/scripts/_lib/guidelines_lane.js +10 -1
  435. package/dist/scripts/_lib/identifier_redaction.js +24 -0
  436. package/dist/scripts/_lib/installed_layer.js +17 -0
  437. package/dist/scripts/_lib/installed_layer_normalise.js +72 -0
  438. package/dist/scripts/_lib/lean_projection_mode.js +34 -152
  439. package/dist/scripts/_lib/project_tree_form.js +118 -0
  440. package/dist/scripts/_lib/scan_scope.js +105 -0
  441. package/dist/scripts/_lib/scoped_projection.js +133 -3
  442. package/dist/scripts/_lib/settings_removed_keys.js +29 -0
  443. package/dist/scripts/_lib/settings_renamed_keys.js +17 -5
  444. package/dist/scripts/_lib/subagent_native_fields.js +35 -0
  445. package/dist/scripts/_lib/svg_dom.js +284 -0
  446. package/dist/scripts/_lib/svg_filled_counter.js +285 -0
  447. package/dist/scripts/_lib/svg_geometry.js +477 -0
  448. package/dist/scripts/_lib/svg_motion.js +179 -0
  449. package/dist/scripts/_lib/svg_rules.js +1339 -0
  450. package/dist/scripts/_lib/svg_urls.js +67 -0
  451. package/dist/scripts/_lib/ui_surface.js +19 -0
  452. package/dist/scripts/_lib/verification_command.js +364 -0
  453. package/dist/scripts/_lib/workspace_secrets.js +229 -0
  454. package/dist/scripts/ai_council/seat_policy.js +27 -0
  455. package/dist/scripts/ai_council/transport_resolver.js +9 -10
  456. package/dist/scripts/condense.js +25 -29
  457. package/dist/scripts/lint_svg_asset.js +324 -0
  458. package/dist/server/io/substituteTemplate.js +2 -2
  459. package/dist/server/io/yamlIO.js +2 -2
  460. package/dist/server/routes/install.js +5 -1
  461. package/dist/server/routes/settings.js +2 -2
  462. package/dist/server/routes/wizard.js +1 -1
  463. package/dist/server/schemas/settings.js +22 -16
  464. package/dist/server/serverInfo.js +1 -1
  465. package/dist/shared/brandTokenDocument.js +47 -0
  466. package/dist/shared/brandTokenPaths.js +43 -0
  467. package/dist/shared/settingsCarveOut.js +0 -7
  468. package/dist/shared/skillRanking.js +103 -5
  469. package/dist/shared/userMd/formAdapter.js +16 -0
  470. package/dist/shared/userMd/schema.js +17 -0
  471. package/dist/ui/assets/index-w70Ado09.js +23 -0
  472. package/dist/ui/index.html +1 -1
  473. package/docs/MIGRATION.md +89 -2
  474. package/docs/THIRD-PARTY-NOTICES.md +27 -0
  475. package/docs/contracts/settings-classes.md +27 -9
  476. package/docs/guidelines/agent-infra/api-cost-levers.md +4 -3
  477. package/docs/guidelines/agent-infra/model-recommendation.md +11 -5
  478. package/docs/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
  479. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
  480. package/docs/guidelines/design-antipatterns.md +6 -1
  481. package/docs/guidelines/design-asset-discipline.md +17 -0
  482. package/docs/guidelines/design-fidelity-routing.md +1 -0
  483. package/docs/guidelines/php/api-design.md +10 -1
  484. package/llms.txt +12 -10
  485. package/package.json +15 -5
  486. package/src/agent-src/scripts/dashboard_mode.ts +4 -1
  487. package/src/agent-src/scripts/roadmap_age.ts +175 -0
  488. package/src/agent-src/scripts/update_roadmap_progress.ts +10 -2
  489. package/src/agent-src/templates/AGENTS.md +1 -1
  490. package/src/agent-src/templates/scripts/check_memory.ts +2 -2
  491. package/src/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
  492. package/src/agent-src/templates/scripts/work_engine/cli.ts +17 -0
  493. package/src/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
  494. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
  495. package/src/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
  496. package/src/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
  497. package/src/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
  498. package/src/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
  499. package/src/agent-src/templates/scripts/work_engine/state.ts +3 -0
  500. package/src/config/agent-settings.template.yml +120 -57
  501. package/src/config/agents-paths.yml +13 -7
  502. package/src/config/ci-local-parity.yml +44 -0
  503. package/src/config/continuity-surface.json +51 -2
  504. package/src/config/depth-audit-samples.json +5 -0
  505. package/src/config/discovery/command-verbs.yml +1 -0
  506. package/src/config/dispatch-economy-metrics.json +1 -0
  507. package/src/config/egress-mutations/class-precedence-swapped.json +7 -0
  508. package/src/config/egress-mutations/credential-token-restores.json +7 -0
  509. package/src/config/egress-mutations/iban-checksum-disabled.json +7 -0
  510. package/src/config/egress-mutations/raw-value-in-the-count-record.json +7 -0
  511. package/src/config/evaluator-budgets.json +4 -4
  512. package/src/config/gate-coverage.yml +149 -3
  513. package/src/config/gate-reachability-exemptions.json +3 -5
  514. package/src/config/gate-violation-baselines.json +29 -25
  515. package/src/config/gitignore-block.txt +6 -3
  516. package/src/config/hook-bundle-budget.json +34 -3
  517. package/src/config/hook-carrier-probes.json +30 -0
  518. package/src/config/hook-latency-budget.json +4 -2
  519. package/src/config/host-injection-effect.json +8 -1
  520. package/src/config/host-skill-frontmatter-keys.json +56 -0
  521. package/src/config/layer-form-brakes.json +4 -0
  522. package/src/config/layer-form-comparison-corpus.json +42 -0
  523. package/src/config/loop-surfaces.yaml +28 -47
  524. package/src/config/memory-twin-verdicts.yml +9 -1
  525. package/src/config/metric-registry.yml +40 -3
  526. package/src/config/pack-size-budget.json +15 -0
  527. package/src/config/procedure-core-budget.json +21 -0
  528. package/src/config/profiles/minimal.ini +1 -1
  529. package/src/config/project-tree-form.json +24 -0
  530. package/src/config/reach-channels.yml +3 -3
  531. package/src/config/reach-prescriptions-intake.yml +1 -1
  532. package/src/config/roadmap-step-size-baseline.json +118 -0
  533. package/src/config/routing-coverage-seed.json +100 -2
  534. package/src/config/skill-body-budget.json +686 -0
  535. package/src/config/skill-fork-pilot.json +17 -0
  536. package/src/config/skill-lifecycle-probes-codex.json +57 -0
  537. package/src/config/skill-lifecycle-probes.json +57 -0
  538. package/src/config/skill-output-shape.json +316 -0
  539. package/src/config/step-depth-table.json +58 -0
  540. package/src/config/turnaround-budget.json +90 -0
  541. package/src/install/conflict.ts +38 -6
  542. package/src/install/conflictTracker.ts +126 -8
  543. package/src/install/detect.ts +3 -3
  544. package/src/install/hostPermissionsAdapter.ts +136 -0
  545. package/src/install/installThinLayer.ts +6 -1
  546. package/src/install/manifestFiles.ts +24 -0
  547. package/src/install/noGoDenyRows.ts +368 -0
  548. package/src/install/noGoRules.ts +438 -0
  549. package/src/install/ownershipLedger.ts +180 -0
  550. package/src/install/plan.ts +1 -1
  551. package/src/install/preflight.ts +42 -10
  552. package/src/install/preserve.ts +94 -12
  553. package/src/install/recordedOwnership.ts +121 -3
  554. package/src/install/rule_scope.ts +20 -3
  555. package/src/install/stagedRuntime.ts +528 -0
  556. package/src/install/toolsArg.ts +16 -0
  557. package/src/install/types.ts +23 -2
  558. package/src/install/userPin.ts +54 -0
  559. package/src/install/wizard-plan.ts +25 -4
  560. package/src/scripts/_cli/_doctor_emit.ts +24 -0
  561. package/src/scripts/_cli/cmd_brand_status.ts +223 -12
  562. package/src/scripts/_cli/cmd_ci_settle.ts +32 -0
  563. package/src/scripts/_cli/cmd_doctor.ts +23 -44
  564. package/src/scripts/_cli/cmd_route_explain.ts +176 -2
  565. package/src/scripts/_cli/cmd_uninstall.ts +270 -26
  566. package/src/scripts/_cli/cmd_update.ts +34 -1
  567. package/src/scripts/_cli/cmd_upgrade.ts +38 -2
  568. package/src/scripts/_cli/detection_report.ts +7 -0
  569. package/src/scripts/_cli/doctor_execution.ts +1 -2
  570. package/src/scripts/_cli/doctor_install_mode.ts +39 -0
  571. package/src/scripts/_cli/doctor_network_posture.ts +3 -3
  572. package/src/scripts/_cli/doctor_ownership_ledger.ts +126 -0
  573. package/src/scripts/_cli/doctor_update_verdict.ts +104 -0
  574. package/src/scripts/_cli/explain_last/scrubber.ts +9 -21
  575. package/src/scripts/_cli/upgrade_unattended.ts +548 -0
  576. package/src/scripts/_dispatch.bash +42 -9
  577. package/src/scripts/_lib/activation_ladder.ts +1 -1
  578. package/src/scripts/_lib/advisory_inventory.ts +405 -0
  579. package/src/scripts/_lib/advisory_notice.ts +270 -0
  580. package/src/scripts/_lib/advisory_sources.ts +752 -0
  581. package/src/scripts/_lib/advisory_verdicts.ts +363 -0
  582. package/src/scripts/_lib/agent_artifact_location.ts +177 -0
  583. package/src/scripts/_lib/agent_settings.ts +7 -12
  584. package/src/scripts/_lib/arrival_record.ts +217 -0
  585. package/src/scripts/_lib/asset_render_record.ts +247 -0
  586. package/src/scripts/_lib/billing_grant.ts +4 -2
  587. package/src/scripts/_lib/brand_voice_slot.ts +258 -0
  588. package/src/scripts/_lib/canary_status.ts +24 -0
  589. package/src/scripts/_lib/cc_transcript.ts +276 -0
  590. package/src/scripts/_lib/changelog_eras.ts +83 -0
  591. package/src/scripts/_lib/claim_phrases.ts +71 -0
  592. package/src/scripts/_lib/classify_update.ts +171 -0
  593. package/src/scripts/_lib/claude_builtin_names.ts +9 -4
  594. package/src/scripts/_lib/claude_hook_scope.ts +195 -0
  595. package/src/scripts/_lib/claude_settings_hooks.ts +118 -34
  596. package/src/scripts/_lib/codex_resident_set.ts +460 -0
  597. package/src/scripts/_lib/codex_skill_finder.ts +225 -0
  598. package/src/scripts/_lib/confusables.ts +19 -0
  599. package/src/scripts/_lib/consumer_impact.ts +199 -0
  600. package/src/scripts/_lib/content_class.ts +127 -0
  601. package/src/scripts/_lib/counted_probe.ts +68 -1
  602. package/src/scripts/_lib/credential_deny_rows.ts +151 -0
  603. package/src/scripts/_lib/credential_files.ts +367 -0
  604. package/src/scripts/_lib/delivery_arm_experiment.ts +2 -2
  605. package/src/scripts/_lib/depth_flip.ts +141 -0
  606. package/src/scripts/_lib/design_lock.ts +117 -0
  607. package/src/scripts/_lib/design_sync_ledger.ts +142 -0
  608. package/src/scripts/_lib/design_sync_plan.ts +177 -0
  609. package/src/scripts/_lib/design_sync_reconcile.ts +159 -0
  610. package/src/scripts/_lib/design_sync_verify.ts +99 -0
  611. package/src/scripts/_lib/design_system_claude_design.ts +323 -0
  612. package/src/scripts/_lib/design_system_import.ts +84 -6
  613. package/src/scripts/_lib/dispatch_import_closure.ts +42 -11
  614. package/src/scripts/_lib/egress_credential_env.ts +35 -0
  615. package/src/scripts/_lib/egress_engine.ts +22 -0
  616. package/src/scripts/_lib/egress_known_values.ts +223 -0
  617. package/src/scripts/_lib/egress_normalize.ts +67 -0
  618. package/src/scripts/_lib/egress_prefixes.ts +42 -0
  619. package/src/scripts/_lib/egress_rules.ts +896 -0
  620. package/src/scripts/_lib/egress_rules_linearity.ts +56 -0
  621. package/src/scripts/_lib/egress_sender_scan.ts +290 -0
  622. package/src/scripts/_lib/egress_session_table.ts +510 -0
  623. package/src/scripts/_lib/egress_text.ts +63 -0
  624. package/src/scripts/_lib/egress_token.ts +252 -0
  625. package/src/scripts/_lib/empty_cycles.ts +1 -1
  626. package/src/scripts/_lib/environment_detector.ts +45 -30
  627. package/src/scripts/_lib/exemption_shape.ts +75 -1
  628. package/src/scripts/_lib/floor_posture.ts +185 -0
  629. package/src/scripts/_lib/forge_protection.ts +140 -2
  630. package/src/scripts/_lib/global_deploy_inventory.ts +159 -6
  631. package/src/scripts/_lib/guidelines_lane.ts +12 -1
  632. package/src/scripts/_lib/hand_kinds.ts +65 -0
  633. package/src/scripts/_lib/headless_invocation.ts +3 -3
  634. package/src/scripts/_lib/host_capability.ts +34 -2
  635. package/src/scripts/_lib/host_env_write.ts +39 -18
  636. package/src/scripts/_lib/host_listing_model.ts +14 -7
  637. package/src/scripts/_lib/identifier_redaction.ts +26 -0
  638. package/src/scripts/_lib/impact_bump.ts +70 -0
  639. package/src/scripts/_lib/install_reach_checks.ts +53 -1
  640. package/src/scripts/_lib/installed_layer.ts +31 -0
  641. package/src/scripts/_lib/installed_layer_normalise.ts +75 -0
  642. package/src/scripts/_lib/instructions_loaded_classify.ts +75 -0
  643. package/src/scripts/_lib/instructions_loaded_event.ts +53 -0
  644. package/src/scripts/_lib/knowledge_global_redaction.ts +2 -2
  645. package/src/scripts/_lib/layer_form_corpus.ts +165 -0
  646. package/src/scripts/_lib/layer_form_decision.ts +248 -0
  647. package/src/scripts/_lib/layer_form_evidence.ts +112 -0
  648. package/src/scripts/_lib/lean_projection_mode.ts +32 -161
  649. package/src/scripts/_lib/llm_proposer_transport.ts +1 -0
  650. package/src/scripts/_lib/loop_guards.ts +8 -120
  651. package/src/scripts/_lib/major_surface.ts +207 -0
  652. package/src/scripts/_lib/mcp_bridge.ts +30 -69
  653. package/src/scripts/_lib/merge_clearance_record.ts +384 -0
  654. package/src/scripts/_lib/neighbour_census.ts +18 -1
  655. package/src/scripts/_lib/orchestration_record.ts +61 -0
  656. package/src/scripts/_lib/outcome_vocabularies.ts +15 -23
  657. package/src/scripts/_lib/pin_advice.ts +49 -0
  658. package/src/scripts/_lib/platform_anchor.ts +222 -0
  659. package/src/scripts/_lib/procedure_checks.ts +5 -0
  660. package/src/scripts/_lib/project_tree_form.ts +134 -0
  661. package/src/scripts/_lib/projection_key_migration.ts +122 -0
  662. package/src/scripts/_lib/prompt_shape.ts +13 -2
  663. package/src/scripts/_lib/provenance_verify.ts +272 -0
  664. package/src/scripts/_lib/quota_parked.ts +27 -1
  665. package/src/scripts/_lib/ratification_artifact.ts +64 -1
  666. package/src/scripts/_lib/ratification_subject.ts +508 -46
  667. package/src/scripts/_lib/release_findings_ingest.ts +52 -5
  668. package/src/scripts/_lib/release_highlights.ts +72 -2
  669. package/src/scripts/_lib/release_settings_surface.ts +392 -0
  670. package/src/scripts/_lib/review_round.ts +134 -0
  671. package/src/scripts/_lib/roadmap_checkboxes.ts +1 -1
  672. package/src/scripts/_lib/roadmap_slug_lock.ts +254 -0
  673. package/src/scripts/_lib/roadmap_step_size.ts +75 -0
  674. package/src/scripts/_lib/run_checkpoint.ts +60 -3
  675. package/src/scripts/_lib/runtime_wiring_checks.ts +15 -1
  676. package/src/scripts/_lib/scope_guard.sh +64 -5
  677. package/src/scripts/_lib/scoped_projection.ts +136 -3
  678. package/src/scripts/_lib/secret_detector.ts +24 -103
  679. package/src/scripts/_lib/security_fix.ts +429 -0
  680. package/src/scripts/_lib/security_fix_context.ts +133 -0
  681. package/src/scripts/_lib/self_repair.ts +69 -39
  682. package/src/scripts/_lib/self_repair_outgoing.ts +209 -0
  683. package/src/scripts/_lib/self_repair_payload.ts +86 -0
  684. package/src/scripts/_lib/session_eol.ts +3 -0
  685. package/src/scripts/_lib/session_pr_watch.ts +207 -0
  686. package/src/scripts/_lib/session_register.ts +51 -1
  687. package/src/scripts/_lib/session_tag.ts +51 -0
  688. package/src/scripts/_lib/settings_removed_keys.ts +30 -0
  689. package/src/scripts/_lib/settings_renamed_keys.ts +19 -5
  690. package/src/scripts/_lib/skill_catalogue.ts +66 -25
  691. package/src/scripts/_lib/skill_fork_pilot.ts +121 -0
  692. package/src/scripts/_lib/skill_leases.ts +203 -0
  693. package/src/scripts/_lib/skill_listing_overrides.ts +294 -0
  694. package/src/scripts/_lib/skill_materialisation.ts +388 -0
  695. package/src/scripts/_lib/skill_materialisation_gate.ts +210 -0
  696. package/src/scripts/_lib/skill_materialisation_lock.ts +149 -0
  697. package/src/scripts/_lib/skill_materialisation_triggers.ts +96 -0
  698. package/src/scripts/_lib/skill_origin.ts +21 -1
  699. package/src/scripts/_lib/skill_reach.ts +342 -0
  700. package/src/scripts/_lib/source_shape.ts +7 -2
  701. package/src/scripts/_lib/sqlite_guard.ts +1 -1
  702. package/src/scripts/_lib/step_anatomy.ts +330 -0
  703. package/src/scripts/_lib/subagent_capsule.ts +8 -2
  704. package/src/scripts/_lib/subagent_native_fields.ts +30 -0
  705. package/src/scripts/_lib/subagent_spawn.ts +36 -0
  706. package/src/scripts/_lib/subagent_steering.ts +367 -0
  707. package/src/scripts/_lib/svg_dom.ts +318 -0
  708. package/src/scripts/_lib/svg_filled_counter.ts +287 -0
  709. package/src/scripts/_lib/svg_geometry.ts +480 -0
  710. package/src/scripts/_lib/svg_motion.ts +208 -0
  711. package/src/scripts/_lib/svg_rules.ts +1455 -0
  712. package/src/scripts/_lib/svg_urls.ts +72 -0
  713. package/src/scripts/_lib/test_delta.ts +89 -6
  714. package/src/scripts/_lib/tier_downshift_verdict.ts +222 -0
  715. package/src/scripts/_lib/tool_result_census.ts +62 -0
  716. package/src/scripts/_lib/trigger_routers.ts +1 -0
  717. package/src/scripts/_lib/turnaround_throughput.ts +378 -0
  718. package/src/scripts/_lib/ui_surface.ts +22 -0
  719. package/src/scripts/_lib/unattended_gates.ts +100 -0
  720. package/src/scripts/_lib/undeployed_fixes.ts +34 -0
  721. package/src/scripts/_lib/update_check.ts +143 -12
  722. package/src/scripts/_lib/update_invite.ts +116 -0
  723. package/src/scripts/_lib/update_notice.ts +259 -0
  724. package/src/scripts/_lib/verification_command.ts +59 -0
  725. package/src/scripts/_lib/verify_clause.ts +31 -19
  726. package/src/scripts/_lib/version_order.ts +146 -0
  727. package/src/scripts/_lib/worker_reuse.ts +191 -0
  728. package/src/scripts/_lib/workspace_secrets.ts +273 -0
  729. package/src/scripts/_lib/worktree_git.ts +67 -0
  730. package/src/scripts/_lib/worktree_ignored.ts +116 -0
  731. package/src/scripts/adoption_status.ts +330 -3
  732. package/src/scripts/adr_cite_check.ts +93 -0
  733. package/src/scripts/advisories.ts +803 -0
  734. package/src/scripts/ai-image/adapters/flux.sh +1 -0
  735. package/src/scripts/ai-image/adapters/gemini-image.sh +1 -0
  736. package/src/scripts/ai-image/adapters/ideogram.sh +1 -0
  737. package/src/scripts/ai-image/adapters/recraft.sh +1 -0
  738. package/src/scripts/ai-video/adapters/comfyui.sh +1 -0
  739. package/src/scripts/ai-video/adapters/fal.sh +1 -0
  740. package/src/scripts/ai-video/adapters/gemini-veo.sh +1 -0
  741. package/src/scripts/ai-video/adapters/higgsfield.sh +1 -0
  742. package/src/scripts/ai-video/adapters/kling.sh +1 -0
  743. package/src/scripts/ai-video/adapters/musetalk.sh +1 -0
  744. package/src/scripts/ai-video/adapters/openai-images.sh +1 -0
  745. package/src/scripts/ai-video/adapters/replicate.sh +1 -0
  746. package/src/scripts/ai-video/adapters/sora.sh +1 -0
  747. package/src/scripts/ai-video/adapters/syncso.sh +1 -0
  748. package/src/scripts/ai-video/stitch.sh +115 -2
  749. package/src/scripts/ai_council/airgap.ts +1 -0
  750. package/src/scripts/ai_council/api_transport.ts +27 -4
  751. package/src/scripts/ai_council/budget_guard.ts +300 -11
  752. package/src/scripts/ai_council/bundler.ts +20 -29
  753. package/src/scripts/ai_council/chairman.ts +17 -2
  754. package/src/scripts/ai_council/cli_agency_bounds.ts +158 -0
  755. package/src/scripts/ai_council/cli_launch_env.ts +54 -0
  756. package/src/scripts/ai_council/cli_least_agency_canary.ts +18 -2
  757. package/src/scripts/ai_council/clients.ts +55 -73
  758. package/src/scripts/ai_council/config.ts +16 -22
  759. package/src/scripts/ai_council/council_egress.ts +167 -0
  760. package/src/scripts/ai_council/exposure_ledger.ts +117 -0
  761. package/src/scripts/ai_council/free_hand_shadow.ts +276 -0
  762. package/src/scripts/ai_council/free_route.ts +216 -0
  763. package/src/scripts/ai_council/free_route_catalog.ts +173 -0
  764. package/src/scripts/ai_council/free_route_client.ts +95 -0
  765. package/src/scripts/ai_council/free_rung.ts +61 -0
  766. package/src/scripts/ai_council/hand_payload.ts +230 -0
  767. package/src/scripts/ai_council/hand_schemas.ts +123 -0
  768. package/src/scripts/ai_council/jury_aggregate.ts +155 -1
  769. package/src/scripts/ai_council/kind_flip.ts +221 -0
  770. package/src/scripts/ai_council/kind_flip_state.ts +19 -0
  771. package/src/scripts/ai_council/learn_low_impact_preview.ts +50 -22
  772. package/src/scripts/ai_council/modification_review.ts +98 -5
  773. package/src/scripts/ai_council/necessity.ts +7 -0
  774. package/src/scripts/ai_council/orchestrator.ts +16 -16
  775. package/src/scripts/ai_council/pricing.ts +10 -0
  776. package/src/scripts/ai_council/redact_low_impact_entry.ts +5 -2
  777. package/src/scripts/ai_council/response_render.ts +27 -4
  778. package/src/scripts/ai_council/round_reservations.ts +119 -0
  779. package/src/scripts/ai_council/route_chooser.ts +161 -0
  780. package/src/scripts/ai_council/route_liveness.ts +152 -0
  781. package/src/scripts/ai_council/route_member.ts +52 -0
  782. package/src/scripts/ai_council/seat_policy.ts +40 -0
  783. package/src/scripts/ai_council/seat_resume.ts +40 -0
  784. package/src/scripts/ai_council/shadow_dispatch.ts +13 -3
  785. package/src/scripts/ai_council/spend_gate.ts +18 -2
  786. package/src/scripts/ai_council/status_surface.ts +37 -0
  787. package/src/scripts/ai_council/transport_resolver.ts +15 -18
  788. package/src/scripts/analysis_analysts.ts +226 -0
  789. package/src/scripts/analysis_anchors.ts +140 -0
  790. package/src/scripts/analysis_and_optimize.ts +44 -0
  791. package/src/scripts/analysis_emit.ts +150 -0
  792. package/src/scripts/analysis_exchange.ts +186 -0
  793. package/src/scripts/analysis_gate.ts +158 -0
  794. package/src/scripts/analysis_inbox_final.ts +173 -0
  795. package/src/scripts/analysis_ledger.ts +119 -0
  796. package/src/scripts/analysis_pr_optimize.ts +219 -0
  797. package/src/scripts/analysis_pr_review.ts +240 -0
  798. package/src/scripts/analysis_pr_target.ts +121 -0
  799. package/src/scripts/analysis_prompts.ts +130 -0
  800. package/src/scripts/analysis_publish.ts +358 -0
  801. package/src/scripts/analysis_questions.ts +78 -0
  802. package/src/scripts/analysis_run.ts +248 -0
  803. package/src/scripts/analysis_run_record.ts +210 -0
  804. package/src/scripts/analysis_target.ts +343 -0
  805. package/src/scripts/analysis_validate.ts +161 -0
  806. package/src/scripts/anchor_eval_falsify.ts +1 -1
  807. package/src/scripts/arrival_report.ts +115 -0
  808. package/src/scripts/ask_transport.ts +284 -35
  809. package/src/scripts/backfill_model_tier.ts +4 -5
  810. package/src/scripts/before_complete_hook.ts +48 -2
  811. package/src/scripts/bench_hook_latency.ts +3 -3
  812. package/src/scripts/bench_procedure_cursor.ts +440 -0
  813. package/src/scripts/bootstrap.sh +3 -3
  814. package/src/scripts/build_exit_code_register.ts +440 -0
  815. package/src/scripts/build_proof.ts +23 -1
  816. package/src/scripts/cache_realization_report.ts +155 -14
  817. package/src/scripts/canary_liveness.ts +117 -0
  818. package/src/scripts/chat_history.ts +12 -15
  819. package/src/scripts/check_account_surface.ts +318 -0
  820. package/src/scripts/check_agent_artifact_location.ts +17 -160
  821. package/src/scripts/check_bundle_path_leakage.ts +6 -0
  822. package/src/scripts/check_ci_local_parity.ts +21 -13
  823. package/src/scripts/check_claims.ts +77 -2
  824. package/src/scripts/check_completion_review.ts +34 -1
  825. package/src/scripts/check_concern_admissions.ts +41 -5
  826. package/src/scripts/check_consumer_scope_flip.ts +1 -1
  827. package/src/scripts/check_context_paths.ts +2 -0
  828. package/src/scripts/check_council_layout.ts +9 -0
  829. package/src/scripts/check_credential_spelling.ts +267 -0
  830. package/src/scripts/check_egress_mutations.ts +239 -0
  831. package/src/scripts/check_enforcement_coverage.ts +16 -3
  832. package/src/scripts/check_estate_count.ts +16 -1
  833. package/src/scripts/check_finding_dispositions.ts +147 -0
  834. package/src/scripts/check_gate_coverage.ts +123 -21
  835. package/src/scripts/check_gate_reachability.ts +16 -2
  836. package/src/scripts/check_generator_sync.ts +46 -0
  837. package/src/scripts/check_hook_bundle_composition.ts +139 -1
  838. package/src/scripts/check_host_docs_digest.ts +142 -5
  839. package/src/scripts/check_kernel_edit_ratified.ts +301 -76
  840. package/src/scripts/check_kernel_rule_bundle.ts +14 -10
  841. package/src/scripts/check_knowledge_cards.ts +83 -3
  842. package/src/scripts/check_memory.ts +13 -3
  843. package/src/scripts/check_pack_size.ts +1 -1
  844. package/src/scripts/check_permission_deny_syntax.ts +247 -0
  845. package/src/scripts/check_platform_anchor.ts +243 -0
  846. package/src/scripts/check_proposal.ts +183 -1
  847. package/src/scripts/check_reach_channels.ts +5 -3
  848. package/src/scripts/check_references.ts +5 -2
  849. package/src/scripts/check_release_manifest_content.ts +33 -0
  850. package/src/scripts/check_release_pr_shape.ts +5 -0
  851. package/src/scripts/check_rule_invariants.ts +9 -1
  852. package/src/scripts/check_skill_body_budget.ts +343 -0
  853. package/src/scripts/check_skill_requires.ts +137 -1
  854. package/src/scripts/check_step_receipts.ts +246 -0
  855. package/src/scripts/check_structural_breaking.ts +7 -1
  856. package/src/scripts/check_suppression_hygiene.ts +8 -0
  857. package/src/scripts/check_test_weakening.ts +14 -0
  858. package/src/scripts/check_token_quality_golden.ts +5 -1
  859. package/src/scripts/check_update_banner.ts +50 -3
  860. package/src/scripts/check_verify_expectation_delta.ts +2 -1
  861. package/src/scripts/check_voice_lexicon.ts +531 -0
  862. package/src/scripts/ci_os_attribution.ts +327 -0
  863. package/src/scripts/ci_platform_scope.ts +69 -0
  864. package/src/scripts/ci_settle.ts +4 -1
  865. package/src/scripts/ci_status.ts +0 -1
  866. package/src/scripts/ci_time_to_green.ts +748 -0
  867. package/src/scripts/classify_merge_risk.ts +407 -19
  868. package/src/scripts/code_graph/sqlite_store.ts +1 -1
  869. package/src/scripts/compile_trigger_evals.ts +353 -0
  870. package/src/scripts/condense.ts +25 -31
  871. package/src/scripts/consumer_matrix.ts +61 -3
  872. package/src/scripts/council_availability_hook.ts +12 -4
  873. package/src/scripts/council_cli.ts +48 -38
  874. package/src/scripts/cross_repo_retrieve.ts +9 -72
  875. package/src/scripts/design_lock.ts +106 -0
  876. package/src/scripts/design_slop_rules.ts +30 -0
  877. package/src/scripts/design_sync.ts +264 -0
  878. package/src/scripts/design_system_import.ts +30 -13
  879. package/src/scripts/dispatch_economy_report.ts +46 -1
  880. package/src/scripts/dispatch_r2_reviewer.ts +41 -5
  881. package/src/scripts/egress_canary.ts +166 -0
  882. package/src/scripts/egress_sender_census.ts +101 -0
  883. package/src/scripts/external_sources_denylist.json +94 -12
  884. package/src/scripts/generate_catalog.ts +6 -2
  885. package/src/scripts/generate_owned_digest.ts +163 -0
  886. package/src/scripts/generate_reference_toc.ts +143 -0
  887. package/src/scripts/generate_subagent_floor.ts +11 -1
  888. package/src/scripts/handoff_context_hook.ts +34 -0
  889. package/src/scripts/hook_carrier_census.ts +263 -0
  890. package/src/scripts/hook_chunks.d.mts +12 -0
  891. package/src/scripts/hook_chunks.mjs +114 -0
  892. package/src/scripts/hook_manifest.json +1 -1
  893. package/src/scripts/hook_manifest.yaml +65 -42
  894. package/src/scripts/hooks/block_config_weakening.ts +127 -3
  895. package/src/scripts/hooks/block_credential_reads.ts +165 -0
  896. package/src/scripts/hooks/block_no_verify.ts +47 -23
  897. package/src/scripts/hooks/block_speaking_inbox_dir.ts +54 -8
  898. package/src/scripts/hooks/category_a.ts +202 -25
  899. package/src/scripts/hooks/concern_failure_policy.ts +6 -6
  900. package/src/scripts/hooks/concern_registry.ts +31 -6
  901. package/src/scripts/hooks/concern_registry_types.ts +11 -0
  902. package/src/scripts/hooks/delegation_nudge_hook.ts +105 -15
  903. package/src/scripts/hooks/design_pass_hook.ts +199 -13
  904. package/src/scripts/hooks/dispatch_hook.ts +13 -12
  905. package/src/scripts/hooks/egress_engine_loader.ts +125 -0
  906. package/src/scripts/hooks/egress_stage.ts +440 -0
  907. package/src/scripts/hooks/hook_stdin.ts +29 -4
  908. package/src/scripts/hooks/host_docs_pages.ts +194 -0
  909. package/src/scripts/hooks/host_docs_pages.yaml +75 -0
  910. package/src/scripts/hooks/host_lowering.json +1 -1
  911. package/src/scripts/hooks/host_lowering.yaml +22 -21
  912. package/src/scripts/hooks/host_rate_marker_hook.ts +73 -0
  913. package/src/scripts/hooks/instructions_observer_hook.ts +170 -0
  914. package/src/scripts/hooks/interruption_ledger_hook.ts +1 -1
  915. package/src/scripts/hooks/lazy_concern.ts +148 -0
  916. package/src/scripts/hooks/orchestration_record_hook.ts +80 -2
  917. package/src/scripts/hooks/payload_stub.ts +16 -6
  918. package/src/scripts/hooks/permission_gate.ts +7 -7
  919. package/src/scripts/hooks/push_settle_hook.ts +32 -3
  920. package/src/scripts/hooks/replay_hook.ts +43 -0
  921. package/src/scripts/hooks/reread_guard_hook.ts +87 -10
  922. package/src/scripts/hooks/rtk_wrap_hook.ts +4 -3
  923. package/src/scripts/hooks/rule_inject_hook.ts +8 -1
  924. package/src/scripts/hooks/session_eol_hook.ts +48 -1
  925. package/src/scripts/hooks/source_first_gate_hook.ts +6 -8
  926. package/src/scripts/hooks/spawn_guard_shadow_hook.ts +203 -10
  927. package/src/scripts/hooks/state_io.ts +2 -2
  928. package/src/scripts/hooks/svg_obligation.ts +553 -0
  929. package/src/scripts/hooks/svg_rules_loader.ts +133 -0
  930. package/src/scripts/hooks/tool_result_bytes_hook.ts +14 -5
  931. package/src/scripts/hooks/turn_end_gate_hook.ts +5 -3
  932. package/src/scripts/hooks/ui_route_nudge_hook.ts +2 -12
  933. package/src/scripts/hooks_doctor.ts +31 -0
  934. package/src/scripts/hooks_status.ts +58 -3
  935. package/src/scripts/inbox_source_census.ts +74 -13
  936. package/src/scripts/install +25 -3
  937. package/src/scripts/install.ts +60 -91
  938. package/src/scripts/interruption_report.ts +11 -1
  939. package/src/scripts/layer_baseline_report.ts +267 -0
  940. package/src/scripts/learning_sidecar.ts +1 -1
  941. package/src/scripts/lint_agents_layout.ts +3 -0
  942. package/src/scripts/lint_blocker_citations.ts +104 -0
  943. package/src/scripts/lint_breaking_changes_index.ts +40 -7
  944. package/src/scripts/lint_consolidation_lineage.ts +150 -19
  945. package/src/scripts/lint_consumer_internal_refs.ts +90 -42
  946. package/src/scripts/lint_context_spine_usage.ts +21 -0
  947. package/src/scripts/lint_design_antipattern_parity.ts +39 -7
  948. package/src/scripts/lint_design_quality.ts +60 -12
  949. package/src/scripts/lint_evidence_artifacts.ts +31 -0
  950. package/src/scripts/lint_example_fences.ts +11 -2
  951. package/src/scripts/lint_ghostwriter_source.ts +42 -10
  952. package/src/scripts/lint_hook_manifest.ts +94 -0
  953. package/src/scripts/lint_marketplace_install_completeness.ts +4 -0
  954. package/src/scripts/lint_mcp_config_security.ts +9 -11
  955. package/src/scripts/lint_motion_authority_drift.ts +27 -0
  956. package/src/scripts/lint_plan_risk_register.ts +28 -1
  957. package/src/scripts/lint_positioning.ts +4 -4
  958. package/src/scripts/lint_provenance.ts +1 -0
  959. package/src/scripts/lint_roadmap_blockers.ts +65 -4
  960. package/src/scripts/lint_roadmap_complexity.ts +98 -0
  961. package/src/scripts/lint_skill_link_reach.ts +251 -9
  962. package/src/scripts/lint_skill_procedures.ts +252 -0
  963. package/src/scripts/lint_skill_scripts_readonly.ts +12 -1
  964. package/src/scripts/lint_subagent_determinism.ts +14 -1
  965. package/src/scripts/lint_svg_asset.ts +365 -0
  966. package/src/scripts/lint_ticked_unmet_criteria.ts +300 -21
  967. package/src/scripts/mcp_registry_submit.sh +2 -2
  968. package/src/scripts/mcp_server/consumer_tool_catalog.json +4 -4
  969. package/src/scripts/mcp_server/suggest_skill.ts +89 -4
  970. package/src/scripts/mcp_server/tools.ts +2 -33
  971. package/src/scripts/measure_skill_ranker_baseline.ts +203 -5
  972. package/src/scripts/measure_turn_end_gate.ts +61 -1
  973. package/src/scripts/merge_clearance.ts +225 -0
  974. package/src/scripts/migrate_command_suggestions.ts +1 -1
  975. package/src/scripts/network_sources.ts +236 -0
  976. package/src/scripts/no_go_deny_rows.ts +225 -0
  977. package/src/scripts/orchestration_record.ts +15 -2
  978. package/src/scripts/plan_test_shards.ts +103 -0
  979. package/src/scripts/pr_url_reminder_hook.ts +10 -0
  980. package/src/scripts/print_required_checks.ts +5 -5
  981. package/src/scripts/probe_depth_shadow.ts +406 -0
  982. package/src/scripts/probe_turnaround.ts +342 -10
  983. package/src/scripts/ratification_subject.ts +176 -0
  984. package/src/scripts/rdp_gate_classify.ts +1 -0
  985. package/src/scripts/rdp_quality_eval.ts +1 -0
  986. package/src/scripts/release.ts +26 -55
  987. package/src/scripts/release_drill.ts +52 -23
  988. package/src/scripts/release_env.ts +37 -0
  989. package/src/scripts/release_publication.ts +11 -1
  990. package/src/scripts/report_consumer_gate_reach.ts +233 -0
  991. package/src/scripts/report_merge_gate_load.ts +295 -0
  992. package/src/scripts/report_project_contract.ts +123 -0
  993. package/src/scripts/report_reducible_classes.ts +342 -0
  994. package/src/scripts/report_required_checks_drift.ts +5 -3
  995. package/src/scripts/report_skill_host_census.ts +199 -0
  996. package/src/scripts/report_standing_payload_by_host.ts +7 -7
  997. package/src/scripts/retro.ts +758 -0
  998. package/src/scripts/retro_facts.ts +575 -0
  999. package/src/scripts/retro_queue.ts +739 -0
  1000. package/src/scripts/retro_session_facts.ts +218 -0
  1001. package/src/scripts/retro_sweep.ts +493 -0
  1002. package/src/scripts/retro_triage.ts +126 -0
  1003. package/src/scripts/roadmap_context.ts +2 -2
  1004. package/src/scripts/roadmap_drain_queue.ts +601 -0
  1005. package/src/scripts/run_supervise.ts +24 -2
  1006. package/src/scripts/schemas/agent-settings.schema.json +0 -16
  1007. package/src/scripts/schemas/command.schema.json +3 -3
  1008. package/src/scripts/schemas/review-findings.schema.json +8 -0
  1009. package/src/scripts/schemas/skill.schema.json +7 -6
  1010. package/src/scripts/schemas/subagent.schema.json +33 -2
  1011. package/src/scripts/score_skill_selection.ts +5 -2
  1012. package/src/scripts/second_brain_retrieval.ts +1 -0
  1013. package/src/scripts/second_brain_run.ts +1 -0
  1014. package/src/scripts/self_repair_cli.ts +563 -87
  1015. package/src/scripts/self_review_gate.ts +59 -4
  1016. package/src/scripts/session_register_hook.ts +91 -4
  1017. package/src/scripts/sessions_cli.ts +100 -5
  1018. package/src/scripts/skill_collision_clusters.ts +1 -1
  1019. package/src/scripts/skill_tools/score_skill_relevance.ts +31 -2
  1020. package/src/scripts/skill_trigger_eval.ts +4 -2
  1021. package/src/scripts/source_adapters.ts +183 -0
  1022. package/src/scripts/step_receipt.ts +100 -0
  1023. package/src/scripts/sync_pr_branch.ts +4 -0
  1024. package/src/scripts/test_council_qualification.ts +1 -1
  1025. package/src/scripts/trigger_eval_grandfather.json +3 -49
  1026. package/src/scripts/trigger_eval_rotation.ts +31 -3
  1027. package/src/scripts/ui_conformance_probe.ts +405 -1
  1028. package/src/scripts/update_counts.ts +230 -11
  1029. package/src/scripts/update_invite_hook.ts +245 -0
  1030. package/src/scripts/update_notice_hook.ts +298 -0
  1031. package/src/scripts/validate_frontmatter.ts +85 -0
  1032. package/src/scripts/worker_reuse_shadow_report.ts +121 -0
  1033. package/src/scripts/worktree_cleanup_check.ts +915 -121
  1034. package/src/server/io/yamlIO.ts +2 -2
  1035. package/src/server/schemas/settings.ts +37 -23
  1036. package/src/shared/brandTokenDocument.ts +46 -0
  1037. package/src/shared/brandTokenPaths.ts +43 -0
  1038. package/src/shared/settingsCarveOut.ts +0 -8
  1039. package/src/shared/skillRanking.ts +106 -5
  1040. package/src/shared/userMd/formAdapter.ts +15 -1
  1041. package/src/shared/userMd/schema.ts +22 -0
  1042. package/src/templates/agent-user.md +4 -0
  1043. package/src/templates/agent-user.yml +4 -0
  1044. package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
  1045. package/dist/cli-delegate/chunk-AL3RZ22D.js +0 -74
  1046. package/dist/cli-delegate/chunk-KB5FZ655.js +0 -208
  1047. package/dist/cli-delegate/chunk-MDPPKQCQ.js +0 -875
  1048. package/dist/cli-delegate/chunk-MSUL5NYP.js +0 -1123
  1049. package/dist/cli-delegate/chunk-OAFSJBHH.js +0 -272
  1050. package/dist/ui/assets/index-C3djEJah.js +0 -23
  1051. package/src/scripts/_lib/continuation_ladder.ts +0 -335
  1052. package/src/scripts/hooks/run_continuation_hook.ts +0 -1524
@@ -3,9 +3,10 @@
3
3
  * Self-repair CLI — the queue reader and the single gated outward step.
4
4
  *
5
5
  * self-repair:status list open records
6
- * self-repair:release <fp> [--dry-run] [--repo <owner/name>]
6
+ * self-repair:release <fp> --dry-run [--repo <owner/name>]
7
+ * self-repair:release <fp> --approve <digest> [--repo <owner/name>]
7
8
  *
8
- * `release` is the ONE keystroke the loop is designed around: everything up to
9
+ * `release` is the ONE outward step the loop is designed around: everything up to
9
10
  * it — detection, dedup, analysis, the authored fix, the commit — happens
10
11
  * without the user. Publishing does not, because a push and a PR/issue are
11
12
  * both Hard-Floor actions under `non-destructive-by-default`, and no standing
@@ -18,15 +19,35 @@
18
19
  * authorized, failures degrade down the ladder WITHIN the same call (push/PR
19
20
  * failure or 30 s timeout → issue; issue failure → the record stays open with
20
21
  * the errors attached) — degrading never widens what leaves the machine, only
21
- * the vehicle. `--dry-run` prints the resolved route and the rendered body and
22
- * touches no network — that is the path the tests drive.
22
+ * the vehicle. `--dry-run` prints the resolved route, the GitHub account the
23
+ * send would carry, its destination and payload and their digest, and creates
24
+ * nothing: it reads the forge (auth status, push rights, the signed-in login)
25
+ * and the local repository, and writes to neither.
23
26
  *
24
27
  * Fail-closed on privacy: the record's own text goes through the audited
25
28
  * privacy floor before anything leaves the machine, and a refusal downgrades
26
29
  * the record to local-only rather than scrubbing it into publishable shape.
30
+ *
31
+ * The pull-request route never pushes the author's branch. It builds ONE commit
32
+ * on `origin/main` from the branch's net change, in a temporary index with no
33
+ * working tree, under a noreply identity and a neutral `retro/<fingerprint>`
34
+ * branch name, unsigned and dated in UTC. Nothing from the branch's history —
35
+ * its name, its commits, content added and later removed — is in that commit.
36
+ * The floor then walks every object the push adds to the base: the commit
37
+ * object, every tree and blob path, every blob's content, plus title and body.
38
+ * A finding skips every push rung.
39
+ *
40
+ * Nothing is sent without an approval of the exact bytes and their
41
+ * destination — repository, account, route, remote, base commit: the dry run
42
+ * prints them with their digest, and the release refuses unless
43
+ * `--approve <digest>` names what it is about to send and where. Only the
44
+ * commit date is outside the digest. A blob that is not UTF-8 text, or carries
45
+ * a NUL, is refused rather than scanned (`_lib/self_repair_outgoing.ts`).
27
46
  */
47
+ import { isUtf8 } from 'node:buffer';
28
48
  import { spawnSync } from 'node:child_process';
29
49
  import * as fs from 'node:fs';
50
+ import * as os from 'node:os';
30
51
  import * as path from 'node:path';
31
52
  import { fileURLToPath, pathToFileURL } from 'node:url';
32
53
 
@@ -53,6 +74,29 @@ import {
53
74
  readOverflow,
54
75
  readRecord,
55
76
  } from './_lib/self_repair_store.js';
77
+ import {
78
+ consumerDenyList,
79
+ describeFindings,
80
+ scanPayload,
81
+ } from './_lib/self_repair_payload.js';
82
+ import {
83
+ approvalRefusal,
84
+ type CommitIdentity,
85
+ commitMessage,
86
+ isNoreplyEmail,
87
+ noreplyIdentity,
88
+ type Destination,
89
+ type Outgoing,
90
+ type OutgoingPullRequest,
91
+ outgoingDigest,
92
+ renderOutgoing,
93
+ renderUpstreamBody,
94
+ retroBranch,
95
+ } from './_lib/self_repair_outgoing.js';
96
+ import { _detect_project_identifiers } from './check_portability.js';
97
+ import { gitEnv } from './_lib/git_env.js';
98
+
99
+ export { consumerDenyList };
56
100
 
57
101
  export const UPSTREAM_REPO = 'event4u-app/agent-config';
58
102
 
@@ -77,41 +121,96 @@ export interface RunResult {
77
121
  ok: boolean;
78
122
  out: string;
79
123
  timedOut: boolean;
124
+ /** stdout exactly as the process wrote it — set only when `binary` was asked for. */
125
+ bytes?: Buffer;
126
+ }
127
+
128
+ export interface RunOptions {
129
+ /**
130
+ * Keep stdout as bytes. A UTF-8 decode replaces every invalid sequence with
131
+ * U+FFFD, so text read that way is not the content that leaves.
132
+ */
133
+ binary?: boolean;
80
134
  }
81
135
 
82
- /** Injectable command runner — tests script it, production shells out. */
83
- export type Runner = (cmd: string, args: string[], cwd?: string) => RunResult;
136
+ /**
137
+ * Injectable command runner — tests script it, production shells out. `env` is
138
+ * merged over the process environment, never a replacement for it.
139
+ */
140
+ export type Runner = (
141
+ cmd: string,
142
+ args: string[],
143
+ cwd?: string,
144
+ env?: NodeJS.ProcessEnv,
145
+ opts?: RunOptions,
146
+ ) => RunResult;
84
147
 
85
- function run(cmd: string, args: string[], cwd?: string): RunResult {
86
- const r = spawnSync(cmd, args, { cwd, encoding: 'utf-8', timeout: EGRESS_STEP_TIMEOUT_MS });
148
+ export function runCommand(
149
+ cmd: string,
150
+ args: string[],
151
+ cwd?: string,
152
+ env?: NodeJS.ProcessEnv,
153
+ opts?: RunOptions,
154
+ ): RunResult {
155
+ const r = spawnSync(cmd, args, {
156
+ cwd,
157
+ encoding: 'buffer',
158
+ timeout: EGRESS_STEP_TIMEOUT_MS,
159
+ // An inherited GIT_DIR or GIT_INDEX_FILE (a release run from a hook)
160
+ // would point every git step at another repository or index.
161
+ env: { ...gitEnv(process.env), ...(env ?? {}) },
162
+ });
87
163
  // Only spawnSync's own ETIMEDOUT counts: a child killed externally by
88
164
  // SIGTERM is a failure, not a timeout, and recording it as "timed out"
89
165
  // points the next debugging session at the wrong cause (R2 finding #3).
90
166
  const timedOut = (r.error as NodeJS.ErrnoException | undefined)?.code === 'ETIMEDOUT';
167
+ const stdout = r.stdout ?? Buffer.alloc(0);
168
+ const stderr = r.stderr ?? Buffer.alloc(0);
91
169
  return {
92
170
  ok: r.status === 0 && !timedOut,
93
- out: `${r.stdout ?? ''}${r.stderr ?? ''}`,
171
+ out: `${stdout.toString('utf-8')}${stderr.toString('utf-8')}`,
94
172
  timedOut,
173
+ ...(opts?.binary === true ? { bytes: Buffer.from(stdout) } : {}),
95
174
  };
96
175
  }
97
176
 
177
+ function isPackageCheckout(dir: string): boolean {
178
+ return (
179
+ fs.existsSync(path.join(dir, 'src', 'rules')) &&
180
+ fs.existsSync(path.join(dir, 'src', 'scripts', 'hook_manifest.yaml'))
181
+ );
182
+ }
183
+
184
+ function realOrSelf(p: string): string {
185
+ try {
186
+ return fs.realpathSync(p);
187
+ } catch {
188
+ return path.resolve(p);
189
+ }
190
+ }
191
+
98
192
  /**
99
- * Where the fix can be authored. `AGENT_CONFIG_SOURCE` wins; otherwise the CWD
100
- * when it IS the package checkout. A consumer project has neither — that is the
101
- * normal case, and the reason the issue fallback exists.
193
+ * The checkout of this package the release runs FROM, or null. A pull request
194
+ * is opened only from such a checkout (D5): a release run from a consumer
195
+ * project reaches the issue step and stops there, whatever the environment
196
+ * says, because the record it releases was found in that project.
197
+ *
198
+ * `AGENT_CONFIG_SOURCE` points at the checkout when the release runs inside it
199
+ * by a path that is not its root — a subdirectory, or a symlinked path. It is
200
+ * honoured only when the working directory is inside the checkout it names; set
201
+ * in a consumer project it widens nothing. Otherwise the working directory
202
+ * itself must be the package checkout.
102
203
  */
103
204
  export function findAgentConfigCheckout(env: NodeJS.ProcessEnv, cwd: string): string | null {
104
205
  const explicit = env['AGENT_CONFIG_SOURCE'];
105
- if (explicit && fs.existsSync(path.join(explicit, 'src', 'rules'))) {
106
- return explicit;
107
- }
108
- if (
109
- fs.existsSync(path.join(cwd, 'src', 'rules')) &&
110
- fs.existsSync(path.join(cwd, 'src', 'scripts', 'hook_manifest.yaml'))
111
- ) {
112
- return cwd;
206
+ if (explicit && isPackageCheckout(explicit)) {
207
+ const root = realOrSelf(explicit);
208
+ const here = realOrSelf(cwd);
209
+ if (here === root || here.startsWith(`${root}${path.sep}`)) {
210
+ return explicit;
211
+ }
113
212
  }
114
- return null;
213
+ return isPackageCheckout(cwd) ? cwd : null;
115
214
  }
116
215
 
117
216
  /**
@@ -149,7 +248,7 @@ export function probeUpstreamRights(
149
248
  export function probeMachine(
150
249
  env: NodeJS.ProcessEnv,
151
250
  cwd: string,
152
- runner: Runner = run,
251
+ runner: Runner = runCommand,
153
252
  repo: string = UPSTREAM_REPO,
154
253
  ): Probe {
155
254
  const checkout = findAgentConfigCheckout(env, cwd);
@@ -239,7 +338,8 @@ export function planRelease(
239
338
  blocked,
240
339
  patch_denied,
241
340
  title: titleFor(record),
242
- body: renderReport(record, choice.route),
341
+ // Only a local-only plan keeps the free-text report: nothing leaves.
342
+ body: choice.route === 'local-only' ? renderReport(record, choice.route) : renderUpstreamBody(record, choice.route),
243
343
  };
244
344
  }
245
345
 
@@ -261,6 +361,191 @@ export interface ReleaseOutcome {
261
361
  export interface ReleaseDeps {
262
362
  runner: Runner;
263
363
  now: () => string;
364
+ /** The consumer project's identifiers; none means only the detector table applies. */
365
+ denyIdentifiers?: readonly string[];
366
+ /** The digest the person approved after reading the dry run; absent refuses. */
367
+ approvedDigest?: string | null;
368
+ }
369
+
370
+ /** The base the synthesised commit sits on, and what the pushed objects are compared against. */
371
+ export const PAYLOAD_BASE_REF = 'origin/main';
372
+
373
+ /** The account a send would carry: the login `gh` is authenticated as, or null. */
374
+ export function resolveAccount(runner: Runner): string | null {
375
+ const who = runner('gh', ['api', 'user', '--jq', '.login']);
376
+ const login = who.out.trim();
377
+ return who.ok && login.length > 0 ? login : null;
378
+ }
379
+
380
+ /** The noreply identity of the signed-in account, or null when it cannot be resolved. */
381
+ export function resolveIdentity(runner: Runner): CommitIdentity | null {
382
+ const who = runner('gh', ['api', 'user', '--jq', '"\\(.id) \\(.login)"']);
383
+ if (!who.ok) {
384
+ return null;
385
+ }
386
+ const [id, login] = who.out.trim().split(/\s+/);
387
+ return noreplyIdentity(login ?? '', id ?? '');
388
+ }
389
+
390
+ /** What a release would send, read without sending or building anything. */
391
+ export interface Collected {
392
+ outgoing: Outgoing;
393
+ /** A precondition failed: nothing leaves, not even the issue. */
394
+ precondition: EgressAttempt | null;
395
+ /** The pull request cannot be built; the ladder starts at the issue. */
396
+ prUnavailable: EgressAttempt | null;
397
+ /** The base commit the pull request is built on, when it can be built. */
398
+ baseSha: string | null;
399
+ }
400
+
401
+ /**
402
+ * Read what the plan may send and where. The dry run renders this; the release
403
+ * recomputes it and accepts only an approval of the same bytes.
404
+ */
405
+ export function collectOutgoing(
406
+ record: DefectRecord,
407
+ plan: ReleasePlan,
408
+ probe: Probe,
409
+ runner: Runner,
410
+ repo: string,
411
+ ): Collected {
412
+ const none: Collected = {
413
+ outgoing: { destination: null, pullRequest: null, issue: null },
414
+ precondition: null,
415
+ prUnavailable: null,
416
+ baseSha: null,
417
+ };
418
+ if (plan.route === 'local-only') {
419
+ return none;
420
+ }
421
+ // Re-rendered for the issue rung: a plan that degrades from pull-request
422
+ // must not file an issue whose body claims `Route: pull-request`.
423
+ const issue = { title: plan.title, body: plan.route === 'issue' ? plan.body : renderUpstreamBody(record, 'issue') };
424
+ // Where the bytes go is part of what is approved: the same text sent to
425
+ // another repository, from another account, is another act.
426
+ const account = resolveAccount(runner);
427
+ const issueOnly: Destination = {
428
+ repo,
429
+ account,
430
+ route: plan.route,
431
+ rungs: ['issue'],
432
+ remote: null,
433
+ baseSha: null,
434
+ };
435
+ const out: Collected = { ...none, outgoing: { destination: issueOnly, pullRequest: null, issue } };
436
+ if (plan.route !== 'pull-request') {
437
+ return out;
438
+ }
439
+ const checkout = probe.agentConfigCheckout!;
440
+ const author = runner('git', ['branch', '--show-current'], checkout).out.trim();
441
+ if (!author || author === 'main') {
442
+ // Precondition, not an egress failure: the authored fix exists and
443
+ // must ride its own branch — an issue instead would drop the fix.
444
+ return {
445
+ ...out,
446
+ precondition: {
447
+ step: 'branch-check',
448
+ ok: false,
449
+ detail:
450
+ 'the fix must sit on its own branch in the agent-config checkout ' +
451
+ `(currently: ${author || 'detached'})`,
452
+ },
453
+ };
454
+ }
455
+ const unavailable = (step: string, detail: string): Collected => ({
456
+ ...out,
457
+ outgoing: { ...out.outgoing, destination: { ...issueOnly, route: 'issue' } },
458
+ prUnavailable: { step, ok: false, detail },
459
+ });
460
+ const identity = resolveIdentity(runner);
461
+ if (identity === null) {
462
+ return unavailable('identity', 'identity: no noreply identity could be resolved for the signed-in account');
463
+ }
464
+ const base = runner('git', ['rev-parse', '--verify', `${PAYLOAD_BASE_REF}^{commit}`], checkout);
465
+ if (!base.ok) {
466
+ return unavailable('patch-build', `patch-build: ${PAYLOAD_BASE_REF} cannot be resolved`);
467
+ }
468
+ // The net change since the merge base, binary-safe, never summarised by a
469
+ // textconv or an external driver: this is the patch that is committed.
470
+ const diff = runner(
471
+ 'git',
472
+ ['diff', '--binary', '--no-color', '--no-ext-diff', '--no-textconv', `${PAYLOAD_BASE_REF}...${author}`],
473
+ checkout,
474
+ );
475
+ if (!diff.ok) {
476
+ return unavailable('patch-build', `patch-build: the change on ${PAYLOAD_BASE_REF}...<branch> could not be read`);
477
+ }
478
+ const rungs: Destination['rungs'] =
479
+ plan.pushVia === 'upstream' && probe.canFork ? ['upstream', 'fork', 'issue'] : [plan.pushVia ?? 'upstream', 'issue'];
480
+ let remote: string | null = null;
481
+ if (rungs[0] === 'upstream') {
482
+ const url = runner('git', ['remote', 'get-url', 'origin'], checkout);
483
+ if (!url.ok || url.out.trim() === '') {
484
+ return unavailable('destination', 'destination: the origin remote of the checkout could not be read');
485
+ }
486
+ remote = url.out.trim();
487
+ } else if (account !== null) {
488
+ remote = `https://github.com/${account}/${repo.split('/')[1] ?? repo}.git`;
489
+ }
490
+ if (account === null || remote === null) {
491
+ return unavailable('destination', 'destination: the account the pull request would carry could not be resolved');
492
+ }
493
+ if (diff.out.trim() === '') {
494
+ return {
495
+ ...out,
496
+ precondition: {
497
+ step: 'patch-build',
498
+ ok: false,
499
+ detail: `the branch carries no change against ${PAYLOAD_BASE_REF}; there is no fix to send`,
500
+ },
501
+ };
502
+ }
503
+ return {
504
+ ...out,
505
+ baseSha: base.out.trim(),
506
+ outgoing: {
507
+ destination: { repo, account, route: 'pull-request', rungs, remote, baseSha: base.out.trim() },
508
+ issue,
509
+ pullRequest: {
510
+ branch: retroBranch(record.fingerprint),
511
+ identity,
512
+ message: commitMessage(plan.title, record.fingerprint),
513
+ patch: diff.out,
514
+ title: plan.title,
515
+ body: plan.body,
516
+ },
517
+ },
518
+ };
519
+ }
520
+
521
+ /** The dry run: the account, the destination and payload, then their digest. */
522
+ export function renderDryRun(plan: ReleasePlan, account: string | null, collected?: Collected): string {
523
+ let out = '';
524
+ if (plan.route === 'pull-request' || plan.route === 'issue') {
525
+ out +=
526
+ account !== null
527
+ ? ` ACCOUNT the ${plan.route} will be opened as GitHub account '${account}'\n`
528
+ : ` ACCOUNT the ${plan.route} will carry the GitHub account gh is signed in as; ` +
529
+ 'that account could not be resolved here\n';
530
+ }
531
+ if (collected === undefined) {
532
+ return `${out}\n--- ${plan.title} ---\n${plan.body}\n`;
533
+ }
534
+ if (collected.precondition !== null) {
535
+ return `${out} STOP ${collected.precondition.detail}\n`;
536
+ }
537
+ if (collected.prUnavailable !== null) {
538
+ out += ` NOTE no pull request: ${collected.prUnavailable.detail}; the issue is what would be sent\n`;
539
+ }
540
+ if (collected.outgoing.pullRequest !== null) {
541
+ out += ' DATE the commit is dated at the moment of release, in UTC\n';
542
+ }
543
+ out += `\n${renderOutgoing(collected.outgoing)}`;
544
+ if (plan.route !== 'local-only') {
545
+ out += `\n DIGEST ${outgoingDigest(collected.outgoing)}\n`;
546
+ out += ' Send exactly these bytes: self-repair:release <fingerprint> --approve <digest>\n';
547
+ }
548
+ return out;
264
549
  }
265
550
 
266
551
  const FORK_REMOTE = 'self-repair-fork';
@@ -271,24 +556,131 @@ function failDetail(step: string, r: RunResult): string {
271
556
  : `${step}: ${r.out.trim() || 'failed'}`;
272
557
  }
273
558
 
559
+ /** A commit date in UTC, so the local timezone offset does not leave with it. */
560
+ function utcDate(nowIso: string): string {
561
+ const ms = Date.parse(nowIso);
562
+ return `${Math.floor((Number.isFinite(ms) ? ms : Date.now()) / 1000)} +0000`;
563
+ }
564
+
565
+ /**
566
+ * Build the one commit that is pushed: the approved patch on the base, in a
567
+ * temporary index with no working tree — so no hook, no checkout state and no
568
+ * file outside the patch can reach it. Unsigned, because a signature would
569
+ * carry the configured identity the noreply one replaces.
570
+ */
571
+ function buildCleanCommit(
572
+ pr: OutgoingPullRequest,
573
+ baseSha: string,
574
+ checkout: string,
575
+ deps: ReleaseDeps,
576
+ ): { sha: string } | EgressAttempt {
577
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'self-repair-'));
578
+ try {
579
+ const patchFile = path.join(tmp, 'change.patch');
580
+ const messageFile = path.join(tmp, 'message');
581
+ fs.writeFileSync(patchFile, pr.patch);
582
+ fs.writeFileSync(messageFile, pr.message);
583
+ const index = { GIT_INDEX_FILE: path.join(tmp, 'index') };
584
+ const step = (args: string[], env: NodeJS.ProcessEnv): RunResult => deps.runner('git', args, checkout, env);
585
+ const read = step(['read-tree', baseSha], index);
586
+ if (!read.ok) return { step: 'patch-build', ok: false, detail: failDetail('patch-build', read) };
587
+ const applied = step(['apply', '--cached', '--binary', patchFile], index);
588
+ if (!applied.ok) return { step: 'patch-build', ok: false, detail: failDetail('patch-build', applied) };
589
+ const tree = step(['write-tree'], index);
590
+ if (!tree.ok) return { step: 'patch-build', ok: false, detail: failDetail('patch-build', tree) };
591
+ const date = utcDate(deps.now());
592
+ const commit = step(['commit-tree', '--no-gpg-sign', tree.out.trim(), '-p', baseSha, '-F', messageFile], {
593
+ GIT_AUTHOR_NAME: pr.identity.name,
594
+ GIT_AUTHOR_EMAIL: pr.identity.email,
595
+ GIT_AUTHOR_DATE: date,
596
+ GIT_COMMITTER_NAME: pr.identity.name,
597
+ GIT_COMMITTER_EMAIL: pr.identity.email,
598
+ GIT_COMMITTER_DATE: date,
599
+ });
600
+ if (!commit.ok) return { step: 'patch-build', ok: false, detail: failDetail('patch-build', commit) };
601
+ return { sha: commit.out.trim() };
602
+ } finally {
603
+ fs.rmSync(tmp, { recursive: true, force: true });
604
+ }
605
+ }
606
+
607
+ /**
608
+ * Every object the push adds to the base, read from the object store: each
609
+ * commit raw, each tree and blob path, each blob whole. Null when any of it
610
+ * cannot be read — the caller refuses rather than send what nobody read.
611
+ */
612
+ function readPushedObjects(
613
+ runner: Runner,
614
+ checkout: string,
615
+ baseSha: string,
616
+ sha: string,
617
+ ): { commits: string; objects: string; unscannable: number } | null {
618
+ const list = runner('git', ['rev-list', '--objects', `${baseSha}..${sha}`], checkout);
619
+ if (!list.ok) {
620
+ return null;
621
+ }
622
+ let commits = '';
623
+ let objects = '';
624
+ let unscannable = 0;
625
+ for (const line of list.out.split('\n')) {
626
+ const [oid, ...rest] = line.trim().split(' ');
627
+ if (!oid) continue;
628
+ const type = runner('git', ['cat-file', '-t', oid], checkout);
629
+ if (!type.ok) return null;
630
+ const kind = type.out.trim();
631
+ if (kind === 'commit') {
632
+ const body = runner('git', ['cat-file', 'commit', oid], checkout);
633
+ if (!body.ok) return null;
634
+ commits += `${body.out}\n`;
635
+ continue;
636
+ }
637
+ objects += `${rest.join(' ')}\n`;
638
+ if (kind === 'blob') {
639
+ const blob = runner('git', ['cat-file', 'blob', oid], checkout, undefined, { binary: true });
640
+ if (!blob.ok) return null;
641
+ const bytes = blob.bytes ?? Buffer.from(blob.out, 'utf-8');
642
+ // A blob that is not UTF-8 text, or carries a NUL, is not a text
643
+ // the detector table can read: a token spelled in UTF-16, or split
644
+ // by an invalid sequence, survives no text view of it. The floor
645
+ // cannot clear it, so it refuses rather than guesses.
646
+ if (bytes.includes(0) || !isUtf8(bytes)) {
647
+ unscannable += 1;
648
+ }
649
+ // Scanned byte for byte as well: latin1 maps each byte to one
650
+ // character, so nothing is replaced before the rules read it.
651
+ objects += `${bytes.toString('latin1')}\n`;
652
+ }
653
+ }
654
+ return { commits, objects, unscannable };
655
+ }
656
+
657
+ const IDENTITY_LINE_RE = /^(?:author|committer) .* <([^>]*)> \d+ [+-]\d{4}$/gm;
658
+
659
+ /** Every e-mail a commit object records — what the push would show next to the change. */
660
+ function committedEmails(commits: string): string[] {
661
+ return [...commits.matchAll(IDENTITY_LINE_RE)].map((m) => m[1] ?? '');
662
+ }
663
+
274
664
  /**
275
- * Push the fix branch — directly, or via fork → cross-repo PR — then open the
276
- * PR. Returns null on success; on any step failure or timeout returns the
277
- * failed attempt so the caller degrades down the ladder.
665
+ * Push the synthesised commit — directly, or via fork → cross-repo PR — then
666
+ * open the PR. Returns null on success; on any step failure or timeout returns
667
+ * the failed attempt so the caller degrades down the ladder.
278
668
  */
279
669
  function tryPullRequest(
280
- plan: ReleasePlan,
670
+ pr: OutgoingPullRequest,
671
+ sha: string,
281
672
  probe: Probe,
282
673
  repo: string,
283
- branch: string,
284
674
  via: PushVia,
285
675
  deps: ReleaseDeps,
676
+ approvedAccount: string | null,
286
677
  ): EgressAttempt | null {
287
678
  const checkout = probe.agentConfigCheckout!;
288
- let prHead: string | null = null;
679
+ const refspec = `${sha}:refs/heads/${pr.branch}`;
680
+ let prHead = pr.branch;
289
681
 
290
682
  if (via === 'upstream') {
291
- const pushed = deps.runner('git', ['push', '-u', 'origin', branch], checkout);
683
+ const pushed = deps.runner('git', ['push', 'origin', refspec], checkout);
292
684
  if (!pushed.ok) {
293
685
  return { step: 'push-upstream', ok: false, detail: failDetail('push-upstream', pushed) };
294
686
  }
@@ -302,34 +694,53 @@ function tryPullRequest(
302
694
  return { step: 'whoami', ok: false, detail: failDetail('whoami', who) };
303
695
  }
304
696
  const login = who.out.trim();
697
+ if (login !== approvedAccount) {
698
+ return { step: 'whoami', ok: false, detail: 'whoami: the signed-in account changed after the approval — nothing was pushed' };
699
+ }
305
700
  const repoName = repo.split('/')[1] ?? repo;
701
+ const forkUrl = `https://github.com/${login}/${repoName}.git`;
702
+ // A remote of that name already in the checkout's config is reused only
703
+ // when it points at the approved fork; anything else is repointed first.
306
704
  const hasRemote = deps.runner('git', ['remote', 'get-url', FORK_REMOTE], checkout);
307
- if (!hasRemote.ok) {
308
- const added = deps.runner(
309
- 'git',
310
- ['remote', 'add', FORK_REMOTE, `https://github.com/${login}/${repoName}.git`],
311
- checkout,
312
- );
705
+ if (!hasRemote.ok || hasRemote.out.trim() !== forkUrl) {
706
+ const added = deps.runner('git', ['remote', hasRemote.ok ? 'set-url' : 'add', FORK_REMOTE, forkUrl], checkout);
313
707
  if (!added.ok) {
314
708
  return { step: 'fork-remote', ok: false, detail: failDetail('fork-remote', added) };
315
709
  }
316
710
  }
317
- const pushed = deps.runner('git', ['push', '-u', FORK_REMOTE, branch], checkout);
711
+ const pushed = deps.runner('git', ['push', FORK_REMOTE, refspec], checkout);
318
712
  if (!pushed.ok) {
319
713
  return { step: 'push-fork', ok: false, detail: failDetail('push-fork', pushed) };
320
714
  }
321
- prHead = `${login}:${branch}`;
715
+ prHead = `${login}:${pr.branch}`;
322
716
  }
323
717
 
324
- const prArgs = ['pr', 'create', '--repo', repo, '--title', plan.title, '--body', plan.body];
325
- if (prHead !== null) {
326
- prArgs.push('--head', prHead);
327
- }
328
- const pr = deps.runner('gh', prArgs, checkout);
329
- if (!pr.ok) {
330
- return { step: 'pr-create', ok: false, detail: failDetail('pr-create', pr) };
718
+ // `--draft` on every rung, never only on the fork one. A draft is the
719
+ // weaker of the two states a pull request can arrive in: it asks for no
720
+ // review, notifies no code owner, and runs no required check until someone
721
+ // marks it ready. An upstream finding is a proposal from a machine the
722
+ // maintainer has not met, so the maintainer decides when it becomes a
723
+ // request. Opening ready-for-review is the stronger act and nothing here
724
+ // has the standing to take it. `--head` is always named: the pushed
725
+ // branch is not the one checked out.
726
+ const prArgs = [
727
+ 'pr',
728
+ 'create',
729
+ '--repo',
730
+ repo,
731
+ '--draft',
732
+ '--title',
733
+ pr.title,
734
+ '--body',
735
+ pr.body,
736
+ '--head',
737
+ prHead,
738
+ ];
739
+ const created = deps.runner('gh', prArgs, checkout);
740
+ if (!created.ok) {
741
+ return { step: 'pr-create', ok: false, detail: failDetail('pr-create', created) };
331
742
  }
332
- process.stdout.write(`${pr.out}`);
743
+ process.stdout.write(`${created.out}`);
333
744
  return null;
334
745
  }
335
746
 
@@ -348,28 +759,45 @@ export function executeRelease(
348
759
  deps: ReleaseDeps,
349
760
  ): ReleaseOutcome {
350
761
  const attempts: EgressAttempt[] = [];
762
+ if (plan.route === 'local-only') {
763
+ return { published: null, attempts };
764
+ }
765
+ const collected = collectOutgoing(record, plan, probe, deps.runner, repo);
766
+ if (collected.precondition !== null) {
767
+ attempts.push(collected.precondition);
768
+ return { published: null, attempts };
769
+ }
770
+ const refusal = approvalRefusal(record, collected.outgoing, deps.approvedDigest);
771
+ if (refusal !== null) {
772
+ attempts.push({ step: 'approval', ok: false, detail: `approval: ${refusal} — nothing was sent` });
773
+ return { published: null, attempts };
774
+ }
775
+ const deny = deps.denyIdentifiers ?? [];
776
+ const pr = collected.outgoing.pullRequest;
351
777
 
352
778
  if (plan.route === 'pull-request') {
353
- const checkout = probe.agentConfigCheckout!;
354
- const branch = deps.runner('git', ['branch', '--show-current'], checkout).out.trim();
355
- if (!branch || branch === 'main') {
356
- // Precondition, not an egress failure: the authored fix exists and
357
- // must ride its own branch — an issue instead would drop the fix.
358
- attempts.push({
359
- step: 'branch-check',
360
- ok: false,
361
- detail:
362
- 'the fix must sit on its own branch in the agent-config checkout ' +
363
- `(currently: ${branch || 'detached'})`,
364
- });
779
+ // Title and body are scanned before and independently of anything
780
+ // built from the branch, so a build failure cannot skip them. A finding
781
+ // there would leave through the issue too — its title is the same and
782
+ // its body is rendered from the same record.
783
+ const headFindings = scanPayload(
784
+ { branch: pr?.branch ?? '', commits: '', objects: '', title: plan.title, body: plan.body },
785
+ deny,
786
+ );
787
+ if (headFindings.some((f) => f.part === 'title' || f.part === 'body')) {
788
+ attempts.push({ step: 'payload-scan', ok: false, detail: describeFindings(headFindings) });
365
789
  return { published: null, attempts };
366
790
  }
791
+ if (collected.prUnavailable !== null) {
792
+ attempts.push(collected.prUnavailable);
793
+ }
794
+ const sha = pr !== null && collected.baseSha !== null ? cleanCommit(pr, collected.baseSha, probe, deps, deny, attempts) : null;
795
+ // Any refusal skips every push rung and degrades to the issue, which
796
+ // carries none of the refused branch, commit or object bytes.
367
797
  const ladder: PushVia[] =
368
- plan.pushVia === 'upstream' && probe.canFork
369
- ? ['upstream', 'fork']
370
- : [plan.pushVia ?? 'upstream'];
798
+ sha === null ? [] : plan.pushVia === 'upstream' && probe.canFork ? ['upstream', 'fork'] : [plan.pushVia ?? 'upstream'];
371
799
  for (const via of ladder) {
372
- const failed = tryPullRequest(plan, probe, repo, branch, via, deps);
800
+ const failed = tryPullRequest(pr!, sha!, probe, repo, via, deps, collected.outgoing.destination?.account ?? null);
373
801
  if (failed === null) {
374
802
  return { published: 'pull-request', attempts };
375
803
  }
@@ -377,32 +805,71 @@ export function executeRelease(
377
805
  }
378
806
  }
379
807
 
380
- if (plan.route === 'pull-request' || plan.route === 'issue') {
381
- // Re-render for the rung actually taken: a plan that degraded from
382
- // pull-request must not file an issue whose body claims
383
- // `Route: pull-request` (R2 finding #4).
384
- const issueBody =
385
- plan.route === 'issue' ? plan.body : renderReport(record, 'issue');
386
- const issue = deps.runner('gh', [
387
- 'issue',
388
- 'create',
389
- '--repo',
390
- repo,
391
- '--title',
392
- plan.title,
393
- '--body',
394
- issueBody,
395
- ]);
396
- if (issue.ok) {
397
- process.stdout.write(`${issue.out}`);
398
- return { published: 'issue', attempts };
399
- }
400
- attempts.push({ step: 'issue-create', ok: false, detail: failDetail('issue-create', issue) });
808
+ const issue = collected.outgoing.issue!;
809
+ // Scanned on every route that reaches here: the degraded body is re-rendered,
810
+ // and an issue-only plan never passed the pull-request scan above.
811
+ const bodyFindings = scanPayload({ branch: '', commits: '', objects: '', title: issue.title, body: issue.body }, deny);
812
+ if (bodyFindings.length > 0) {
813
+ attempts.push({ step: 'payload-scan', ok: false, detail: describeFindings(bodyFindings) });
814
+ return { published: null, attempts };
401
815
  }
402
-
816
+ const created = deps.runner('gh', ['issue', 'create', '--repo', repo, '--title', issue.title, '--body', issue.body]);
817
+ if (created.ok) {
818
+ process.stdout.write(`${created.out}`);
819
+ return { published: 'issue', attempts };
820
+ }
821
+ attempts.push({ step: 'issue-create', ok: false, detail: failDetail('issue-create', created) });
403
822
  return { published: null, attempts };
404
823
  }
405
824
 
825
+ /**
826
+ * Build the commit and scan every object it adds. Returns the sha only when
827
+ * the floor found nothing and the commit carries the noreply identity alone;
828
+ * otherwise records why and returns null.
829
+ */
830
+ function cleanCommit(
831
+ pr: OutgoingPullRequest,
832
+ baseSha: string,
833
+ probe: Probe,
834
+ deps: ReleaseDeps,
835
+ deny: readonly string[],
836
+ attempts: EgressAttempt[],
837
+ ): string | null {
838
+ const checkout = probe.agentConfigCheckout!;
839
+ const built = buildCleanCommit(pr, baseSha, checkout, deps);
840
+ if (!('sha' in built)) {
841
+ attempts.push(built);
842
+ return null;
843
+ }
844
+ const pushed = readPushedObjects(deps.runner, checkout, baseSha, built.sha);
845
+ if (pushed === null) {
846
+ attempts.push({
847
+ step: 'payload-scan',
848
+ ok: false,
849
+ detail: 'payload floor refused the pull request: the objects the push adds could not be read',
850
+ });
851
+ return null;
852
+ }
853
+ const findings = scanPayload({ commits: pushed.commits, objects: pushed.objects, branch: pr.branch, title: '', body: '' }, deny);
854
+ if (pushed.unscannable > 0) {
855
+ findings.push({ part: 'object', rule: 'unscannable-binary' });
856
+ }
857
+ if (findings.length > 0) {
858
+ attempts.push({ step: 'payload-scan', ok: false, detail: describeFindings(findings) });
859
+ return null;
860
+ }
861
+ const emails = committedEmails(pushed.commits);
862
+ if (emails.length === 0 || emails.some((e) => e !== pr.identity.email || !isNoreplyEmail(e))) {
863
+ attempts.push({
864
+ step: 'identity',
865
+ ok: false,
866
+ detail: 'identity: the built commit records an identity other than the noreply one — nothing was pushed',
867
+ });
868
+ return null;
869
+ }
870
+ return built.sha;
871
+ }
872
+
406
873
  /**
407
874
  * The creation cap's drop tally, printed whenever it is non-zero. This is the
408
875
  * half that keeps the cap honest: a bounded store is only an improvement if
@@ -446,7 +913,9 @@ function statusCmd(root: string): number {
446
913
  }
447
914
 
448
915
  function releaseCmd(root: string, argv: string[]): number {
449
- const fp = argv.find((a) => !a.startsWith('-'));
916
+ // A flag's value is not the fingerprint: `--approve <digest>` and
917
+ // `--repo <owner/name>` both take one.
918
+ const fp = argv.find((a, i) => !a.startsWith('-') && argv[i - 1] !== '--approve' && argv[i - 1] !== '--repo');
450
919
  if (!fp) {
451
920
  process.stderr.write('self-repair:release needs a fingerprint (see self-repair:status).\n');
452
921
  return EXIT_FAIL;
@@ -473,7 +942,8 @@ function releaseCmd(root: string, argv: string[]): number {
473
942
  process.stdout.write(` DENY ${plan.patch_denied}\n`);
474
943
  }
475
944
  if (dryRun) {
476
- process.stdout.write(`\n--- ${plan.title} ---\n${plan.body}\n`);
945
+ const account = plan.route === 'local-only' ? null : resolveAccount(runCommand);
946
+ process.stdout.write(renderDryRun(plan, account, collectOutgoing(record, plan, probe, runCommand, repo)));
477
947
  return EXIT_OK;
478
948
  }
479
949
  if (plan.route === 'local-only') {
@@ -483,7 +953,13 @@ function releaseCmd(root: string, argv: string[]): number {
483
953
  return EXIT_OK;
484
954
  }
485
955
 
486
- const deps: ReleaseDeps = { runner: run, now: () => new Date().toISOString() };
956
+ const approveArg = argv.indexOf('--approve');
957
+ const deps: ReleaseDeps = {
958
+ runner: runCommand,
959
+ now: () => new Date().toISOString(),
960
+ denyIdentifiers: consumerDenyList(_detect_project_identifiers(root), repo),
961
+ approvedDigest: approveArg >= 0 ? (argv[approveArg + 1] ?? null) : null,
962
+ };
487
963
  const outcome = executeRelease(record, plan, probe, repo, deps);
488
964
 
489
965
  for (const a of outcome.attempts) {