@event4u/agent-config 14.10.0 → 14.12.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 (667) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +161 -208
  5. package/README.md +1 -1
  6. package/dist/agent-src/commands/design.md +88 -0
  7. package/dist/agent-src/commands/project/analyze.md +47 -0
  8. package/dist/agent-src/commands/review/changes.md +67 -6
  9. package/dist/agent-src/commands/roadmap/create.md +49 -0
  10. package/dist/agent-src/commands/roadmap/next.md +27 -11
  11. package/dist/agent-src/commands/roadmap/process-full.md +14 -0
  12. package/dist/agent-src/commands/video/from-script.md +60 -3
  13. package/dist/agent-src/commands/video/stitch.md +14 -0
  14. package/dist/agent-src/contexts/communication/rules-auto/guidelines-mechanics.md +1 -0
  15. package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
  16. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +154 -2
  17. package/dist/agent-src/rules/active-remediation.md +3 -3
  18. package/dist/agent-src/rules/code-provenance.md +2 -2
  19. package/dist/agent-src/rules/context-hygiene.md +13 -33
  20. package/dist/agent-src/rules/council-availability.md +2 -2
  21. package/dist/agent-src/rules/decision-revisit-gate.md +3 -1
  22. package/dist/agent-src/rules/design-fidelity.md +18 -0
  23. package/dist/agent-src/rules/design-review-after-ui-write.md +2 -2
  24. package/dist/agent-src/rules/evaluator-independence.md +56 -44
  25. package/dist/agent-src/rules/fix-what-you-see.md +9 -1
  26. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
  27. package/dist/agent-src/rules/minimal-safe-diff.md +14 -20
  28. package/dist/agent-src/rules/missing-skill-recovery.md +13 -1
  29. package/dist/agent-src/rules/playbook-precedence.md +105 -0
  30. package/dist/agent-src/rules/recurring-criticism.md +3 -1
  31. package/dist/agent-src/rules/roadmap-progress-sync.md +14 -13
  32. package/dist/agent-src/rules/scale-discipline.md +24 -0
  33. package/dist/agent-src/rules/security-sensitive-stop.md +2 -2
  34. package/dist/agent-src/rules/settings-ask-protocol.md +2 -2
  35. package/dist/agent-src/rules/ui-audit-gate.md +27 -15
  36. package/dist/agent-src/rules/untrusted-input-defense.md +2 -2
  37. package/dist/agent-src/skills/accessibility-auditor/SKILL.md +19 -0
  38. package/dist/agent-src/skills/adr-create/SKILL.md +7 -0
  39. package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +33 -0
  40. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +17 -3
  41. package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +31 -0
  42. package/dist/agent-src/skills/ai-council/references/procedure.md +19 -0
  43. package/dist/agent-src/skills/alerting-doctrine/SKILL.md +225 -0
  44. package/dist/agent-src/skills/authz-review/SKILL.md +0 -1
  45. package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +32 -0
  46. package/dist/agent-src/skills/brand/SKILL.md +3 -0
  47. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +3 -0
  48. package/dist/agent-src/skills/brand-audit/SKILL.md +3 -0
  49. package/dist/agent-src/skills/brand-identity/SKILL.md +3 -0
  50. package/dist/agent-src/skills/brand-strategy/SKILL.md +3 -0
  51. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +3 -0
  52. package/dist/agent-src/skills/check-refs/SKILL.md +3 -0
  53. package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
  54. package/dist/agent-src/skills/code-review/SKILL.md +75 -5
  55. package/dist/agent-src/skills/command-routing/SKILL.md +6 -0
  56. package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
  57. package/dist/agent-src/skills/condense-memory/SKILL.md +3 -0
  58. package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
  59. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +3 -0
  60. package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +10 -0
  61. package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -0
  62. package/dist/agent-src/skills/design-intelligence/SKILL.md +3 -0
  63. package/dist/agent-src/skills/design-intelligence/data/landing.csv +36 -35
  64. package/dist/agent-src/skills/design-intelligence/data/stacks/threejs.csv +1 -0
  65. package/dist/agent-src/skills/design-review/SKILL.md +79 -1
  66. package/dist/agent-src/skills/design-review/references/verification-automation.md +41 -0
  67. package/dist/agent-src/skills/design-system-capture/SKILL.md +35 -40
  68. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +50 -0
  69. package/dist/agent-src/skills/design-tokens/SKILL.md +3 -0
  70. package/dist/agent-src/skills/design-variations/SKILL.md +3 -0
  71. package/dist/agent-src/skills/developer-like-execution/SKILL.md +3 -0
  72. package/dist/agent-src/skills/estimate-ticket/SKILL.md +3 -0
  73. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +28 -4
  74. package/dist/agent-src/skills/fe-design/SKILL.md +74 -41
  75. package/dist/agent-src/skills/fe-design/references/craft-floor.md +52 -0
  76. package/dist/agent-src/skills/fe-design/references/source-led-port.md +36 -0
  77. package/dist/agent-src/skills/file-editor/SKILL.md +5 -0
  78. package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
  79. package/dist/agent-src/skills/git-workflow/SKILL.md +3 -0
  80. package/dist/agent-src/skills/html-deck/SKILL.md +3 -0
  81. package/dist/agent-src/skills/iconography/SKILL.md +3 -0
  82. package/dist/agent-src/skills/image-editing/SKILL.md +3 -0
  83. package/dist/agent-src/skills/image-generation/SKILL.md +3 -0
  84. package/dist/agent-src/skills/image-provider-routing/SKILL.md +3 -0
  85. package/dist/agent-src/skills/incident-commander/SKILL.md +10 -0
  86. package/dist/agent-src/skills/js-library-packaging/SKILL.md +173 -0
  87. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +270 -0
  88. package/dist/agent-src/skills/laravel-migration/SKILL.md +3 -0
  89. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +3 -0
  90. package/dist/agent-src/skills/lint-skills/SKILL.md +3 -0
  91. package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +3 -0
  92. package/dist/agent-src/skills/logging-monitoring/SKILL.md +234 -51
  93. package/dist/agent-src/skills/logo-generation/SKILL.md +3 -0
  94. package/dist/agent-src/skills/md-language-check/SKILL.md +3 -0
  95. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +149 -0
  96. package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -0
  97. package/dist/agent-src/skills/multi-tenancy/SKILL.md +4 -0
  98. package/dist/agent-src/skills/operational-readiness/SKILL.md +184 -0
  99. package/dist/agent-src/skills/override-management/SKILL.md +3 -0
  100. package/dist/agent-src/skills/persona-improvement/SKILL.md +3 -0
  101. package/dist/agent-src/skills/pest-testing/SKILL.md +3 -0
  102. package/dist/agent-src/skills/playbook-authoring/SKILL.md +162 -0
  103. package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -0
  104. package/dist/agent-src/skills/privacy-review/SKILL.md +3 -0
  105. package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
  106. package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +3 -0
  107. package/dist/agent-src/skills/quality-tools/SKILL.md +5 -0
  108. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +81 -33
  109. package/dist/agent-src/skills/readme-reviewer/SKILL.md +3 -0
  110. package/dist/agent-src/skills/readme-writing/SKILL.md +3 -0
  111. package/dist/agent-src/skills/readme-writing-package/SKILL.md +3 -0
  112. package/dist/agent-src/skills/receiving-code-review/SKILL.md +2 -2
  113. package/dist/agent-src/skills/refine-prompt/SKILL.md +3 -0
  114. package/dist/agent-src/skills/refine-ticket/SKILL.md +3 -0
  115. package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
  116. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  117. package/dist/agent-src/skills/roadmap-writing/SKILL.md +23 -41
  118. package/dist/agent-src/skills/roadmap-writing/references/follow-up-roadmap-shape.md +47 -0
  119. package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +22 -6
  120. package/dist/agent-src/skills/runway-cognition/SKILL.md +3 -0
  121. package/dist/agent-src/skills/scene-expander/scene-blueprint.schema.yaml +26 -0
  122. package/dist/agent-src/skills/secrets-management/SKILL.md +4 -0
  123. package/dist/agent-src/skills/server-hardening/SKILL.md +159 -0
  124. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +3 -0
  125. package/dist/agent-src/skills/skill-management/SKILL.md +3 -0
  126. package/dist/agent-src/skills/skill-reviewer/SKILL.md +3 -0
  127. package/dist/agent-src/skills/skill-writing/SKILL.md +6 -0
  128. package/dist/agent-src/skills/skill-writing/references/procedure.md +24 -2
  129. package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +3 -0
  130. package/dist/agent-src/skills/storybook-workshop/SKILL.md +203 -0
  131. package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.ts +134 -0
  132. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
  133. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +25 -0
  134. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +12 -0
  135. package/dist/agent-src/skills/systematic-debugging/SKILL.md +1 -1
  136. package/dist/agent-src/skills/terraform/SKILL.md +3 -0
  137. package/dist/agent-src/skills/test-driven-development/SKILL.md +1 -1
  138. package/dist/agent-src/skills/threat-modeling/SKILL.md +0 -3
  139. package/dist/agent-src/skills/token-optimizer/SKILL.md +3 -0
  140. package/dist/agent-src/skills/typography-system/SKILL.md +3 -0
  141. package/dist/agent-src/skills/ui-component-architect/SKILL.md +17 -1
  142. package/dist/agent-src/skills/upstream-contribute/SKILL.md +3 -0
  143. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -0
  144. package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -2
  145. package/dist/agent-src/skills/wireframe/SKILL.md +3 -0
  146. package/dist/agent-src/skills/wireframe/references/story-beat-ledger.schema.json +115 -0
  147. package/dist/agent-src/skills/workspace-link/SKILL.md +131 -0
  148. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  149. package/dist/agent-src/templates/playbook.md +75 -0
  150. package/dist/agent-src/templates/roadmaps.md +37 -0
  151. package/dist/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
  152. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
  153. package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
  154. package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
  155. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
  156. package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
  157. package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
  158. package/dist/cli/commands/uiAudit.js +221 -0
  159. package/dist/cli/commands/uiRender.js +206 -0
  160. package/dist/cli/main.js +22 -1
  161. package/dist/cli/mcp/content.js +64 -1
  162. package/dist/cli/mcp/dispatch.js +175 -10
  163. package/dist/cli/registry.js +3 -0
  164. package/dist/cli-delegate/{chunk-G23AT6GD.js → chunk-DMSZHXZS.js} +57 -1
  165. package/dist/cli-delegate/{chunk-77GR3VD4.js → chunk-FF7WAFMR.js} +58 -3
  166. package/dist/cli-delegate/{chunk-YM4GZDJG.js → chunk-JCW7ZLHK.js} +10 -0
  167. package/dist/cli-delegate/{chunk-H4VIVD4C.js → chunk-JJA2QEWA.js} +413 -391
  168. package/dist/cli-delegate/{chunk-PLSG6UL5.js → chunk-K4FFODTS.js} +341 -204
  169. package/dist/cli-delegate/{chunk-B2ERU2VA.js → chunk-WOKWX5PL.js} +1 -1
  170. package/dist/cli-delegate/cmd_brand_status.js +8 -6
  171. package/dist/cli-delegate/cmd_conformance.js +3 -3
  172. package/dist/cli-delegate/cmd_doctor.js +3 -3
  173. package/dist/cli-delegate/cmd_export.js +4 -4
  174. package/dist/cli-delegate/cmd_handoff.js +1 -1
  175. package/dist/cli-delegate/cmd_preflight.js +2 -2
  176. package/dist/cli-delegate/cmd_prune.js +4 -4
  177. package/dist/cli-delegate/cmd_session_recycle.js +70 -9
  178. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  179. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  180. package/dist/cli-delegate/cmd_sync.js +4 -4
  181. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  182. package/dist/cli-delegate/cmd_validate.js +4 -4
  183. package/dist/discovery/deprecation-report.md +1 -1
  184. package/dist/discovery/discovery-manifest.json +362 -127
  185. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  186. package/dist/discovery/discovery-manifest.summary.md +4 -4
  187. package/dist/discovery/dormancy-report.md +1 -1
  188. package/dist/discovery/orphan-report.md +1 -1
  189. package/dist/discovery/packs.json +18 -8
  190. package/dist/discovery/trust-report.md +3 -3
  191. package/dist/discovery/workspaces.json +16 -6
  192. package/dist/hooks/dispatch.js +2575 -1472
  193. package/dist/install/install.mjs +800 -708
  194. package/dist/mcp/registry-manifest.json +3 -3
  195. package/dist/mcp/server.json +2 -2
  196. package/dist/mcp/server.mjs +1685 -1250
  197. package/dist/router.json +1 -1
  198. package/dist/scripts/_lib/lean_projection_mode.js +40 -0
  199. package/dist/scripts/_lib/scoped_projection.js +84 -0
  200. package/dist/scripts/_lib/ui_surface.js +89 -0
  201. package/dist/scripts/condense.js +6 -10
  202. package/dist/scripts/project_thin_rules.js +40 -2
  203. package/dist/server/schemas/settings.js +6 -0
  204. package/dist/shared/skillRanking.js +159 -0
  205. package/docs/contracts/provider-lifecycle.md +47 -18
  206. package/docs/contracts/settings-classes.md +35 -5
  207. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +49 -0
  208. package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
  209. package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
  210. package/docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md +45 -1
  211. package/docs/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
  212. package/docs/guidelines/code-clarity.md +21 -0
  213. package/docs/guidelines/design-antipatterns.md +4 -2
  214. package/docs/guidelines/design-asset-discipline.md +38 -0
  215. package/docs/guidelines/design-fidelity-mechanics.md +45 -29
  216. package/docs/guidelines/design-handover-extraction.md +35 -5
  217. package/docs/guidelines/design-modes.md +41 -1
  218. package/docs/guidelines/monorepo-antipatterns.md +141 -0
  219. package/docs/guidelines/redundancy-taxonomy.md +180 -0
  220. package/llms.txt +50 -39
  221. package/package.json +6 -2
  222. package/src/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
  223. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
  224. package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
  225. package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
  226. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
  227. package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
  228. package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
  229. package/src/config/agent-settings.template.yml +44 -0
  230. package/src/config/assurance-capability-registry.json +223 -0
  231. package/src/config/assurance-threshold-budget.json +65 -0
  232. package/src/config/budgets.yml +19 -0
  233. package/src/config/ci-local-parity.yml +29 -0
  234. package/src/config/discovery/prompt-patterns.yml +56 -0
  235. package/src/config/discovery/unassigned-artefacts.yml +2 -0
  236. package/src/config/dispatch-economy-metrics.json +4 -2
  237. package/src/config/estate-count-budget.json +8 -3
  238. package/src/config/evaluator-budgets.json +14 -14
  239. package/src/config/gate-coverage.yml +392 -8
  240. package/src/config/gate-violation-baselines.json +76 -72
  241. package/src/config/hook-latency-budget.json +1 -0
  242. package/src/config/hook-token-budget.json +137 -125
  243. package/src/config/pack-size-budget.json +39 -10
  244. package/src/config/preamble-payload-budget.json +97 -71
  245. package/src/config/quorum-attendance-budget.json +12 -4
  246. package/src/config/routing-coverage-seed.json +29 -0
  247. package/src/config/rule-activation-census.json +7 -3
  248. package/src/config/rule-enforcement-baseline.json +0 -1
  249. package/src/config/rule-stub-ceilings.json +112 -91
  250. package/src/config/suggestion-capture.json +28 -0
  251. package/src/config/surface-matrix.yml +21 -2
  252. package/src/config/web-launch-readiness.json +188 -0
  253. package/src/scripts/_cli/cmd_doctor.ts +15 -16
  254. package/src/scripts/_cli/doctor_install_mode.ts +49 -0
  255. package/src/scripts/_cli/doctor_overrides.ts +154 -0
  256. package/src/scripts/_dispatch.bash +17 -0
  257. package/src/scripts/_lib/as_of.ts +412 -0
  258. package/src/scripts/_lib/exec_evidence.ts +7 -0
  259. package/src/scripts/_lib/gate_baseline.ts +150 -1
  260. package/src/scripts/_lib/hook_settings.ts +33 -0
  261. package/src/scripts/_lib/host_listing_model.ts +192 -0
  262. package/src/scripts/_lib/lean_projection_mode.ts +44 -0
  263. package/src/scripts/_lib/mcp_bridge.ts +199 -0
  264. package/src/scripts/_lib/review_independence.ts +62 -10
  265. package/src/scripts/_lib/rule_injection.ts +239 -0
  266. package/src/scripts/_lib/run_checkpoint.ts +54 -1
  267. package/src/scripts/_lib/scoped_projection.ts +96 -0
  268. package/src/scripts/_lib/session_register.ts +44 -2
  269. package/src/scripts/_lib/skill_catalogue.ts +38 -2
  270. package/src/scripts/_lib/skill_estate.ts +115 -0
  271. package/src/scripts/_lib/transcript_reads.ts +207 -0
  272. package/src/scripts/_lib/ui_authority.ts +343 -0
  273. package/src/scripts/ai-video/adapters/fal.sh +8 -3
  274. package/src/scripts/ai-video/adapters/gemini-veo.sh +10 -0
  275. package/src/scripts/ai-video/adapters/higgsfield.sh +10 -2
  276. package/src/scripts/ai-video/adapters/kling.sh +10 -0
  277. package/src/scripts/ai-video/adapters/sora.sh +10 -0
  278. package/src/scripts/ai-video/lib/calibrate-cost.sh +145 -0
  279. package/src/scripts/ai-video/lib/model-capabilities/README.md +53 -7
  280. package/src/scripts/ai-video/lib/model-capabilities/comfyui.json +15 -3
  281. package/src/scripts/ai-video/lib/model-capabilities/fal.json +36 -6
  282. package/src/scripts/ai-video/lib/model-capabilities/gemini-veo.json +23 -0
  283. package/src/scripts/ai-video/lib/model-capabilities/higgsfield.json +23 -0
  284. package/src/scripts/ai-video/lib/model-capabilities/kling.json +23 -0
  285. package/src/scripts/ai-video/lib/model-capabilities/musetalk.json +8 -2
  286. package/src/scripts/ai-video/lib/model-capabilities/replicate.json +36 -6
  287. package/src/scripts/ai-video/lib/model-capabilities/sora.json +45 -0
  288. package/src/scripts/ai-video/lib/model-capabilities/syncso.json +8 -2
  289. package/src/scripts/ai-video/lib/parse-blueprint.sh +52 -5
  290. package/src/scripts/ai-video/lib/resume-scan.sh +92 -3
  291. package/src/scripts/ai-video/lib/seam-plan.sh +212 -0
  292. package/src/scripts/ai-video/smoke-trace.sh +450 -2
  293. package/src/scripts/ai-video/stitch.sh +191 -10
  294. package/src/scripts/ai-video/test-pipeline.sh +84 -6
  295. package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
  296. package/src/scripts/ai_council/cli_agency_bounds.ts +139 -0
  297. package/src/scripts/ai_council/cli_least_agency_canary.ts +347 -0
  298. package/src/scripts/ai_council/clients.ts +3 -2
  299. package/src/scripts/ai_council/consensus.ts +63 -6
  300. package/src/scripts/ai_council/events_log.ts +46 -1
  301. package/src/scripts/ai_council/orchestrator.ts +103 -108
  302. package/src/scripts/ai_council/orchestrator_results.ts +166 -0
  303. package/src/scripts/ai_council/prompts.ts +12 -5
  304. package/src/scripts/ai_council/quorum.ts +82 -1
  305. package/src/scripts/ai_council/quorum_wiring.ts +82 -5
  306. package/src/scripts/ai_council/stance_tally.ts +22 -0
  307. package/src/scripts/bench_hook_latency.ts +62 -0
  308. package/src/scripts/build_proof.ts +12 -1
  309. package/src/scripts/capture_skill_catalogue.ts +21 -0
  310. package/src/scripts/check_always_budget.ts +2 -1
  311. package/src/scripts/check_augmentignore.ts +2 -1
  312. package/src/scripts/check_beta_review_markers.ts +2 -1
  313. package/src/scripts/check_bundle_path_leakage.ts +162 -7
  314. package/src/scripts/check_command_examples.ts +557 -0
  315. package/src/scripts/check_composite_arming.ts +364 -0
  316. package/src/scripts/check_corpus_staleness.ts +2 -1
  317. package/src/scripts/check_council_pin_staleness.ts +3 -1
  318. package/src/scripts/check_enforcement_coverage.ts +116 -3
  319. package/src/scripts/check_enforcement_denominator.ts +365 -0
  320. package/src/scripts/check_estate_count.ts +122 -3
  321. package/src/scripts/check_gate_coverage.ts +2 -1
  322. package/src/scripts/check_hook_bundle_freshness.ts +13 -1
  323. package/src/scripts/check_knowledge_cards.ts +2 -1
  324. package/src/scripts/check_knowledge_pages.ts +3 -2
  325. package/src/scripts/check_memory.ts +2 -1
  326. package/src/scripts/check_no_automerge_key.ts +287 -0
  327. package/src/scripts/check_pack_conformance_fixture.ts +565 -0
  328. package/src/scripts/check_preamble_payload_budget.ts +30 -3
  329. package/src/scripts/check_proposal.ts +2 -1
  330. package/src/scripts/check_reach_staleness.ts +2 -1
  331. package/src/scripts/check_release_adjacent_health.ts +2 -1
  332. package/src/scripts/check_release_pr_shape.ts +5 -0
  333. package/src/scripts/check_review_schema.ts +34 -1
  334. package/src/scripts/check_roadmap_trackable.ts +48 -3
  335. package/src/scripts/check_routing_coverage.ts +352 -0
  336. package/src/scripts/check_score_contract.ts +505 -0
  337. package/src/scripts/check_skill_admissions.ts +514 -0
  338. package/src/scripts/check_source_size_budget.ts +2 -1
  339. package/src/scripts/check_standing_payload_delta.ts +505 -0
  340. package/src/scripts/check_trigger_evals.ts +2 -1
  341. package/src/scripts/check_web_launch_readiness.ts +705 -0
  342. package/src/scripts/classify_change_risk.ts +281 -0
  343. package/src/scripts/compute_skill_tiers.ts +186 -0
  344. package/src/scripts/condense.ts +8 -13
  345. package/src/scripts/council_attendance_metrics.ts +183 -0
  346. package/src/scripts/council_cli.ts +10 -8
  347. package/src/scripts/council_parse_rate.ts +116 -0
  348. package/src/scripts/derive_playbooks.ts +406 -0
  349. package/src/scripts/description_route_check.ts +494 -0
  350. package/src/scripts/design_slop_rules.ts +56 -2
  351. package/src/scripts/dispatch_r2_reviewer.ts +16 -0
  352. package/src/scripts/frontend_corpus_hash.ts +116 -0
  353. package/src/scripts/grade_target_readiness.ts +478 -0
  354. package/src/scripts/hook_manifest.json +1 -1
  355. package/src/scripts/hook_manifest.yaml +124 -16
  356. package/src/scripts/hooks/concern_registry.ts +6 -0
  357. package/src/scripts/hooks/design_pass_hook.ts +356 -0
  358. package/src/scripts/hooks/rtk_wrap_hook.ts +30 -7
  359. package/src/scripts/hooks/rule_inject_hook.ts +318 -0
  360. package/src/scripts/hooks/suggestion_capture_hook.ts +368 -0
  361. package/src/scripts/hot_context_hook.ts +74 -7
  362. package/src/scripts/install.ts +40 -89
  363. package/src/scripts/lint_adapter_tier.ts +663 -0
  364. package/src/scripts/lint_archived_skills.ts +93 -0
  365. package/src/scripts/lint_budget_ownership.ts +56 -5
  366. package/src/scripts/lint_deterministic_time.ts +470 -0
  367. package/src/scripts/lint_framework_leakage.ts +5 -0
  368. package/src/scripts/lint_handoffs.ts +525 -1
  369. package/src/scripts/lint_judge_prompt_expectation.ts +155 -0
  370. package/src/scripts/lint_marketplace.ts +88 -0
  371. package/src/scripts/lint_media_policy_linkage.ts +140 -1
  372. package/src/scripts/lint_one_off_age.ts +6 -1
  373. package/src/scripts/lint_override_kernel_guard.ts +87 -5
  374. package/src/scripts/lint_roadmap_complexity.ts +56 -0
  375. package/src/scripts/lint_rule_enforcement_declaration.ts +24 -7
  376. package/src/scripts/lint_rule_norm_pin.ts +321 -0
  377. package/src/scripts/lint_skill_trigger_corpus.ts +349 -0
  378. package/src/scripts/lint_spawn_payload.ts +42 -5
  379. package/src/scripts/lint_symptom_intake.ts +2 -1
  380. package/src/scripts/mcp_parity_smoke.ts +30 -4
  381. package/src/scripts/mcp_render.ts +66 -1
  382. package/src/scripts/mcp_tool_fingerprint.ts +241 -0
  383. package/src/scripts/measure_risk_class_drift.ts +140 -0
  384. package/src/scripts/measure_skill_ranker_baseline.ts +212 -0
  385. package/src/scripts/media/lib/adapter-common.sh +211 -1
  386. package/src/scripts/media/lib/adapter-contract.md +74 -6
  387. package/src/scripts/model_rule_injection.ts +907 -0
  388. package/src/scripts/pack_install_smoke.ts +363 -0
  389. package/src/scripts/pr_conflict_census.ts +187 -0
  390. package/src/scripts/project_thin_rules.ts +45 -2
  391. package/src/scripts/release.ts +66 -860
  392. package/src/scripts/release_drill.ts +59 -3
  393. package/src/scripts/release_env.ts +298 -0
  394. package/src/scripts/release_publication.ts +720 -0
  395. package/src/scripts/report_pack_delta.ts +204 -0
  396. package/src/scripts/roadmap_context.ts +778 -0
  397. package/src/scripts/schemas/fidelity-measurement-sheet.schema.json +169 -0
  398. package/src/scripts/schemas/rule.schema.json +24 -2
  399. package/src/scripts/schemas/skill.schema.json +39 -0
  400. package/src/scripts/schemas/ui-authority.schema.json +114 -0
  401. package/src/scripts/select_analysis_mode.ts +112 -0
  402. package/src/scripts/session_register_hook.ts +29 -3
  403. package/src/scripts/sessions_cli.ts +67 -3
  404. package/src/scripts/skill_tools/score_skill_relevance.ts +36 -53
  405. package/src/scripts/sync_pr_branch.ts +40 -1
  406. package/src/scripts/token_sink_report.ts +239 -0
  407. package/src/scripts/trigger_coverage.ts +122 -3
  408. package/src/scripts/update_counts.ts +7 -3
  409. package/src/scripts/validate_frontmatter.ts +66 -0
  410. package/src/server/schemas/settings.ts +10 -0
  411. package/src/shared/skillRanking.ts +183 -0
  412. package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +0 -15
  413. package/dist/agent-src/skills/agent-security-review/evals/triggers.json +0 -52
  414. package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +0 -52
  415. package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +0 -13
  416. package/dist/agent-src/skills/brand/evals/triggers.json +0 -17
  417. package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +0 -17
  418. package/dist/agent-src/skills/brand-audit/evals/triggers.json +0 -17
  419. package/dist/agent-src/skills/brand-identity/evals/triggers.json +0 -17
  420. package/dist/agent-src/skills/brand-strategy/evals/triggers.json +0 -17
  421. package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +0 -17
  422. package/dist/agent-src/skills/bug-analyzer/evals/evals.json +0 -13
  423. package/dist/agent-src/skills/canvas-design/evals/triggers.json +0 -17
  424. package/dist/agent-src/skills/character-consistency/evals/evals.json +0 -16
  425. package/dist/agent-src/skills/code-intelligence/evals/triggers.json +0 -52
  426. package/dist/agent-src/skills/code-review/evals/evals.json +0 -100
  427. package/dist/agent-src/skills/command-routing/evals/evals.json +0 -14
  428. package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +0 -17
  429. package/dist/agent-src/skills/contract-review/evals/triggers.json +0 -17
  430. package/dist/agent-src/skills/conventional-commits-writing/evals/evals.json +0 -15
  431. package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +0 -17
  432. package/dist/agent-src/skills/dashboard-design/evals/evals.json +0 -16
  433. package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +0 -29
  434. package/dist/agent-src/skills/dcf-modeling/evals/evals.json +0 -20
  435. package/dist/agent-src/skills/decision-record/evals/evals.json +0 -20
  436. package/dist/agent-src/skills/decision-record/evals/triggers.json +0 -87
  437. package/dist/agent-src/skills/design-intelligence/evals/evals.json +0 -14
  438. package/dist/agent-src/skills/design-intelligence/evals/triggers.json +0 -17
  439. package/dist/agent-src/skills/design-system-capture/evals/evals.json +0 -15
  440. package/dist/agent-src/skills/design-tokens/evals/triggers.json +0 -17
  441. package/dist/agent-src/skills/design-variations/evals/triggers.json +0 -17
  442. package/dist/agent-src/skills/developer-like-execution/evals/evals.json +0 -16
  443. package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +0 -16
  444. package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +0 -17
  445. package/dist/agent-src/skills/docx-authoring/evals/triggers.json +0 -52
  446. package/dist/agent-src/skills/dpa-review/evals/triggers.json +0 -17
  447. package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +0 -16
  448. package/dist/agent-src/skills/editorial-calendar/evals/evals.json +0 -16
  449. package/dist/agent-src/skills/eloquent/evals/triggers.json +0 -17
  450. package/dist/agent-src/skills/estimate-ticket/evals/evals.json +0 -16
  451. package/dist/agent-src/skills/estimate-ticket/evals/output-schema.yml +0 -20
  452. package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +0 -19
  453. package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +0 -52
  454. package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +0 -47
  455. package/dist/agent-src/skills/experiment-loop/evals/output-schema.yml +0 -27
  456. package/dist/agent-src/skills/experiment-loop/evals/triggers.json +0 -17
  457. package/dist/agent-src/skills/fe-design/evals/triggers.json +0 -55
  458. package/dist/agent-src/skills/forecasting/evals/domain-truth.json +0 -29
  459. package/dist/agent-src/skills/forecasting/evals/evals.json +0 -20
  460. package/dist/agent-src/skills/forensics-report/evals/triggers.json +0 -17
  461. package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +0 -52
  462. package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +0 -16
  463. package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +0 -16
  464. package/dist/agent-src/skills/gated-reach/evals/triggers.json +0 -72
  465. package/dist/agent-src/skills/github-ci/evals/evals.json +0 -25
  466. package/dist/agent-src/skills/history-design/evals/triggers.json +0 -17
  467. package/dist/agent-src/skills/html-deck/evals/triggers.json +0 -17
  468. package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +0 -57
  469. package/dist/agent-src/skills/humanizer/evals/triggers.json +0 -17
  470. package/dist/agent-src/skills/iconography/evals/triggers.json +0 -17
  471. package/dist/agent-src/skills/image-analyser/evals/triggers.json +0 -17
  472. package/dist/agent-src/skills/image-creator/evals/triggers.json +0 -17
  473. package/dist/agent-src/skills/image-editing/evals/triggers.json +0 -17
  474. package/dist/agent-src/skills/image-generation/evals/triggers.json +0 -17
  475. package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +0 -17
  476. package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +0 -16
  477. package/dist/agent-src/skills/incident-commander/evals/evals.json +0 -20
  478. package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +0 -17
  479. package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +0 -17
  480. package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +0 -17
  481. package/dist/agent-src/skills/launch-readiness/evals/evals.json +0 -21
  482. package/dist/agent-src/skills/learning-tutor/evals/triggers.json +0 -52
  483. package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +0 -17
  484. package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +0 -17
  485. package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +0 -52
  486. package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +0 -52
  487. package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +0 -52
  488. package/dist/agent-src/skills/llm-provider-knowledge/evals/triggers.json +0 -20
  489. package/dist/agent-src/skills/logging-monitoring/evals/evals.json +0 -16
  490. package/dist/agent-src/skills/logo-generation/evals/triggers.json +0 -17
  491. package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +0 -16
  492. package/dist/agent-src/skills/messaging-architecture/evals/evals.json +0 -16
  493. package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
  494. package/dist/agent-src/skills/pdf-tools/evals/triggers.json +0 -52
  495. package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +0 -16
  496. package/dist/agent-src/skills/persona-improvement/evals/triggers.json +0 -52
  497. package/dist/agent-src/skills/php-coder/evals/triggers.json +0 -17
  498. package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +0 -21
  499. package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +0 -17
  500. package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +0 -16
  501. package/dist/agent-src/skills/prompt-validator/evals/triggers.json +0 -17
  502. package/dist/agent-src/skills/quality-tools/evals/evals.json +0 -15
  503. package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +0 -17
  504. package/dist/agent-src/skills/refine-prompt/evals/evals.json +0 -16
  505. package/dist/agent-src/skills/refine-ticket/evals/evals.json +0 -16
  506. package/dist/agent-src/skills/refine-ticket/evals/output-schema.yml +0 -16
  507. package/dist/agent-src/skills/refine-ticket/evals/triggers.json +0 -17
  508. package/dist/agent-src/skills/release-comms/evals/evals.json +0 -16
  509. package/dist/agent-src/skills/rice-prioritization/evals/evals.json +0 -20
  510. package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +0 -29
  511. package/dist/agent-src/skills/runway-cognition/evals/evals.json +0 -20
  512. package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +0 -29
  513. package/dist/agent-src/skills/scenario-modeling/evals/evals.json +0 -20
  514. package/dist/agent-src/skills/schema-review/evals/triggers.json +0 -17
  515. package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +0 -52
  516. package/dist/agent-src/skills/security-maturity-assessment/evals/triggers.json +0 -52
  517. package/dist/agent-src/skills/skill-writing/evals/triggers.json +0 -17
  518. package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
  519. package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +0 -60
  520. package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +0 -52
  521. package/dist/agent-src/skills/systematic-debugging/evals/evals.json +0 -20
  522. package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +0 -52
  523. package/dist/agent-src/skills/test-driven-development/evals/evals.json +0 -16
  524. package/dist/agent-src/skills/threat-modeling/evals/evals.json +0 -21
  525. package/dist/agent-src/skills/typography-system/evals/evals.json +0 -14
  526. package/dist/agent-src/skills/typography-system/evals/triggers.json +0 -17
  527. package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +0 -40
  528. package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +0 -24
  529. package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +0 -16
  530. package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +0 -20
  531. package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +0 -17
  532. package/dist/agent-src/skills/vision-articulation/evals/evals.json +0 -16
  533. package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +0 -16
  534. package/dist/agent-src/skills/wireframe/evals/triggers.json +0 -17
  535. package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +0 -38
  536. package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +0 -52
  537. package/dist/cli/agent-config.js.map +0 -1
  538. package/dist/cli/bash/runBash.js.map +0 -1
  539. package/dist/cli/commands/commands.js.map +0 -1
  540. package/dist/cli/commands/config.js.map +0 -1
  541. package/dist/cli/commands/doctorShell.js.map +0 -1
  542. package/dist/cli/commands/mcpServer.js.map +0 -1
  543. package/dist/cli/commands/packs.js.map +0 -1
  544. package/dist/cli/commands/profiles.js.map +0 -1
  545. package/dist/cli/commands/recordTriggerEval.js.map +0 -1
  546. package/dist/cli/commands/rtkDetect.js.map +0 -1
  547. package/dist/cli/commands/settings.js.map +0 -1
  548. package/dist/cli/commands/uiServe.js.map +0 -1
  549. package/dist/cli/commands/versions.js.map +0 -1
  550. package/dist/cli/commands/workspaces.js.map +0 -1
  551. package/dist/cli/configRoot.js.map +0 -1
  552. package/dist/cli/discovery/loadManifest.js.map +0 -1
  553. package/dist/cli/firstRunNotice.js.map +0 -1
  554. package/dist/cli/help.js.map +0 -1
  555. package/dist/cli/initRouting.js.map +0 -1
  556. package/dist/cli/log/logger.js.map +0 -1
  557. package/dist/cli/main.js.map +0 -1
  558. package/dist/cli/mcp/content.js.map +0 -1
  559. package/dist/cli/mcp/dispatch.js.map +0 -1
  560. package/dist/cli/mcp/stdio.js.map +0 -1
  561. package/dist/cli/paths.js.map +0 -1
  562. package/dist/cli/python/knowledge_ingest.js.map +0 -1
  563. package/dist/cli/python/workspace_analytics.js.map +0 -1
  564. package/dist/cli/python/workspace_crypto.js.map +0 -1
  565. package/dist/cli/python/workspace_documents.js.map +0 -1
  566. package/dist/cli/python/workspace_drive.js.map +0 -1
  567. package/dist/cli/python/workspace_drive_health.js.map +0 -1
  568. package/dist/cli/python/workspace_explain.js.map +0 -1
  569. package/dist/cli/python/workspace_hosts.js.map +0 -1
  570. package/dist/cli/python/workspace_inbox.js.map +0 -1
  571. package/dist/cli/python/workspace_render.js.map +0 -1
  572. package/dist/cli/python/workspace_roles.js.map +0 -1
  573. package/dist/cli/python/workspace_secrets.js.map +0 -1
  574. package/dist/cli/python/workspace_sessions.js.map +0 -1
  575. package/dist/cli/python/workspace_skills.js.map +0 -1
  576. package/dist/cli/registry.js.map +0 -1
  577. package/dist/install/agentSwitchDetection.js.map +0 -1
  578. package/dist/install/agentSwitchProfile.js.map +0 -1
  579. package/dist/install/atomic.js.map +0 -1
  580. package/dist/install/claudePathsPlan.js.map +0 -1
  581. package/dist/install/conflict.js.map +0 -1
  582. package/dist/install/detect.js.map +0 -1
  583. package/dist/install/emit_host_rules_cli.js.map +0 -1
  584. package/dist/install/globalRuleLayers.js.map +0 -1
  585. package/dist/install/hostLayerFingerprint.js.map +0 -1
  586. package/dist/install/partitionEligibility.js.map +0 -1
  587. package/dist/install/paths.js.map +0 -1
  588. package/dist/install/plan.js.map +0 -1
  589. package/dist/install/preflight.js.map +0 -1
  590. package/dist/install/rtkDetection.js.map +0 -1
  591. package/dist/install/ruleInScope.js.map +0 -1
  592. package/dist/install/ruleLayerPartition.js.map +0 -1
  593. package/dist/install/rule_scope.js.map +0 -1
  594. package/dist/install/rule_scope_cli.js.map +0 -1
  595. package/dist/install/selectedTools.js.map +0 -1
  596. package/dist/install/toolDetection.js.map +0 -1
  597. package/dist/install/txlog.js.map +0 -1
  598. package/dist/install/types.js.map +0 -1
  599. package/dist/install/wizard-plan.js.map +0 -1
  600. package/dist/install/wizardDismissals.js.map +0 -1
  601. package/dist/scripts/_lib/agent_settings.js.map +0 -1
  602. package/dist/scripts/_lib/agent_src.js.map +0 -1
  603. package/dist/scripts/_lib/claude_builtin_names.js.map +0 -1
  604. package/dist/scripts/_lib/claude_plugin.js.map +0 -1
  605. package/dist/scripts/_lib/claude_settings_hooks.js.map +0 -1
  606. package/dist/scripts/_lib/compile_time_toggles.js.map +0 -1
  607. package/dist/scripts/_lib/environment_detector.js.map +0 -1
  608. package/dist/scripts/_lib/host_launch.js.map +0 -1
  609. package/dist/scripts/_lib/install_layout.js.map +0 -1
  610. package/dist/scripts/_lib/installed_lock.js.map +0 -1
  611. package/dist/scripts/_lib/model_tier.js.map +0 -1
  612. package/dist/scripts/_lib/prune_empty_dirs.js.map +0 -1
  613. package/dist/scripts/_lib/scoped_projection.js.map +0 -1
  614. package/dist/scripts/_lib/script_output.js.map +0 -1
  615. package/dist/scripts/_lib/spawn_env.js.map +0 -1
  616. package/dist/scripts/_lib/surface_tiers.js.map +0 -1
  617. package/dist/scripts/_lib/token_count.js.map +0 -1
  618. package/dist/scripts/_lib/trigger_eval_floors.js.map +0 -1
  619. package/dist/scripts/_lib/user_global_paths.js.map +0 -1
  620. package/dist/scripts/ai_council/modes.js.map +0 -1
  621. package/dist/scripts/ai_council/transport_resolver.js.map +0 -1
  622. package/dist/scripts/condense.js.map +0 -1
  623. package/dist/scripts/project_thin_rules.js.map +0 -1
  624. package/dist/server/app.js.map +0 -1
  625. package/dist/server/io/atomicMultiWrite.js.map +0 -1
  626. package/dist/server/io/atomicWrite.js.map +0 -1
  627. package/dist/server/io/sharedWriteCheck.js.map +0 -1
  628. package/dist/server/io/substituteTemplate.js.map +0 -1
  629. package/dist/server/io/yamlIO.js.map +0 -1
  630. package/dist/server/nicknameResolver.js.map +0 -1
  631. package/dist/server/port.js.map +0 -1
  632. package/dist/server/routes/discovery.js.map +0 -1
  633. package/dist/server/routes/install.js.map +0 -1
  634. package/dist/server/routes/ping.js.map +0 -1
  635. package/dist/server/routes/schema.js.map +0 -1
  636. package/dist/server/routes/settings.js.map +0 -1
  637. package/dist/server/routes/settingsChanges.js.map +0 -1
  638. package/dist/server/routes/userMd.js.map +0 -1
  639. package/dist/server/routes/wizard.js.map +0 -1
  640. package/dist/server/routes/workspace.js.map +0 -1
  641. package/dist/server/schemas/settings.js.map +0 -1
  642. package/dist/server/serverInfo.js.map +0 -1
  643. package/dist/server/token.js.map +0 -1
  644. package/dist/server/writeRoot.js.map +0 -1
  645. package/dist/shared/capabilities.js.map +0 -1
  646. package/dist/shared/interactiveContext.js.map +0 -1
  647. package/dist/shared/nicknamePrefill.js.map +0 -1
  648. package/dist/shared/settingsAsks.js.map +0 -1
  649. package/dist/shared/settingsCarveOut.js.map +0 -1
  650. package/dist/shared/settingsClasses.js.map +0 -1
  651. package/dist/shared/settingsConsent.js.map +0 -1
  652. package/dist/shared/settingsSurface.js.map +0 -1
  653. package/dist/shared/userMd/formAdapter.js.map +0 -1
  654. package/dist/shared/userMd/schema.js.map +0 -1
  655. package/dist/shared/userMd/utils.js.map +0 -1
  656. package/dist/ui/assets/index-Cxgy63kz.js.map +0 -1
  657. package/src/scripts/_lib/adr_frontmatter.test.ts +0 -365
  658. package/src/scripts/_lib/adversarial_council_gate.test.ts +0 -112
  659. package/src/scripts/_lib/adversarial_reconcile.test.ts +0 -197
  660. package/src/scripts/_lib/auto_dispatch.corpus.test.ts +0 -150
  661. package/src/scripts/_lib/secret_detector.test.ts +0 -108
  662. package/src/scripts/_lib/secret_detector_adversarial.test.ts +0 -116
  663. package/src/scripts/_lib/untrusted_content.test.ts +0 -175
  664. package/src/scripts/check_secret_leak.test.ts +0 -90
  665. package/src/scripts/design_slop_rules.test.ts +0 -239
  666. package/src/scripts/self_review_gate.test.ts +0 -296
  667. package/src/shared/capabilities.test.ts +0 -43
@@ -8,12 +8,53 @@
8
8
  #
9
9
  # Usage:
10
10
  # stitch.sh <manifest.json> <output.mp4>
11
+ # [--mode cut|handoff]
12
+ # [--xfade <seconds>]
11
13
  # [--skip-scene <id> ...]
12
14
  # [--abort-on-missing | --continue]
13
15
  #
14
- # NOT a flag: --crossfade. It is parsed and REFUSED (exit 2). See
15
- # "Refused flags" below — it is listed so a caller who read the old
16
- # usage line gets an error instead of a hard cut.
16
+ # Modes:
17
+ # --mode cut (DEFAULT) `ffmpeg -f concat -c copy`. Stream copy, no
18
+ # generation loss, no filtergraph. Byte-for-byte the
19
+ # behaviour this script has always had; passing the flag
20
+ # explicitly changes nothing.
21
+ # --mode handoff Re-encode path (`libx264 -crf 20 -g 8 +faststart -an`)
22
+ # for continuity chains, where clip i+1 was conditioned on
23
+ # the rendered last frame of clip i. Video only: `-an`
24
+ # DROPS every audio track, which is stated on stderr on
25
+ # every run rather than discovered in the output.
26
+ #
27
+ # --xfade <s> Only valid with `--mode handoff`; ceiling 0.25 s. A short
28
+ # fade applied ONLY at seams whose manifest row says
29
+ # `continuity: handoff|connector` — insurance against a
30
+ # visible pop, never a transition effect. Cut seams in the
31
+ # same run stay hard cuts. Offsets are computed from
32
+ # ffprobe'd durations, not from the manifest's declared
33
+ # ones: the accumulated-length-minus-fade arithmetic is the
34
+ # classic trap here and a declared duration that is 40 ms
35
+ # off silently shifts every later seam.
36
+ #
37
+ # NOT a flag: --crossfade. It is parsed and REFUSED (exit 2) in EVERY mode.
38
+ # See "Refused flags" below — it is listed so a caller who read the old usage
39
+ # line gets an error instead of a hard cut. `--mode handoff --xfade <s>` is
40
+ # the supported way to ask for a fade.
41
+ #
42
+ # port_invariants — what must survive a re-implementation:
43
+ # 1. hard-cut default — `--mode cut` is the default and stream-copies
44
+ # (`-c copy`); a port that re-encodes by default has changed the output
45
+ # of every existing caller without telling anyone.
46
+ # 2. refusal over silent downgrade — an unimplemented or out-of-bounds
47
+ # request exits non-zero BEFORE any work, and never falls through to a
48
+ # near-miss (`--crossfade`, `--xfade` above 0.25 s, `--xfade` in cut
49
+ # mode, an unknown flag, a missing clip). Reporting success for output
50
+ # the caller did not ask for is the one failure this script exists to
51
+ # not have.
52
+ # 3. handoff frame = rendered frame — a handoff seam joins clips where the
53
+ # later one was conditioned on the earlier one's RENDERED last frame,
54
+ # never on its own still. A port that re-conditions from the source
55
+ # still produces a plausible-looking chain that does not actually
56
+ # continue the shot.
57
+ # Contract: docs/contracts/skill-bundled-assets.md § Port invariants.
17
58
  #
18
59
  # Failure semantics:
19
60
  # - Missing clip → fail loud with scene_id and re-render hint
@@ -40,6 +81,10 @@
40
81
  # only --skip-scene and --continue and rejects anything else. So the
41
82
  # honest state is a refusal, not a silent downgrade and not a
42
83
  # filtergraph shipped into a script with no test harness.
84
+ # The re-encode path this refusal used to ask for now exists as
85
+ # `--mode handoff` (+ optional `--xfade <s>`), with a test harness
86
+ # under tests/scripts/. The refusal stays: `--crossfade` named a
87
+ # transition on the stream-copy path, which is still impossible.
43
88
 
44
89
  set -euo pipefail
45
90
 
@@ -58,27 +103,59 @@ esac
58
103
  MANIFEST="${1:-}"
59
104
  OUTPUT="${2:-}"
60
105
  [ -n "${MANIFEST}" ] && [ -n "${OUTPUT}" ] \
61
- || aiv_die 2 "usage: stitch.sh <manifest.json> <output.mp4> [--skip-scene <id>] [--abort-on-missing|--continue]"
106
+ || aiv_die 2 "usage: stitch.sh <manifest.json> <output.mp4> [--mode cut|handoff] [--xfade <seconds>] [--skip-scene <id>] [--abort-on-missing|--continue]"
62
107
  [ -r "${MANIFEST}" ] || aiv_die 2 "manifest not readable: ${MANIFEST}"
63
108
  shift 2 || true
64
109
 
65
110
  SKIP_IDS=""
66
111
  MISSING_POLICY="abort"
112
+ MODE="cut"
113
+ XFADE=""
114
+ XFADE_MAX="0.25"
67
115
  while [ "$#" -gt 0 ]; do
68
116
  case "$1" in
69
117
  --skip-scene) SKIP_IDS="${SKIP_IDS} ${2:-}"; shift 2 ;;
70
118
  --abort-on-missing) MISSING_POLICY="abort"; shift ;;
71
119
  --continue) MISSING_POLICY="continue"; shift ;;
120
+ --mode) MODE="${2:-}"; shift 2 ;;
121
+ --xfade) XFADE="${2:-}"; shift 2 ;;
72
122
  --crossfade)
73
123
  # Refused HERE — before the dry-run branch, before ffmpeg, before any
74
124
  # output. The old code warned after the dry-run exit and then concatenated
75
125
  # anyway, so a caller asking for a crossfade got a hard cut and exit 0.
76
- aiv_die 2 "stitch.sh: --crossfade is not implemented and will not be silently downgraded. The output path is 'ffmpeg -f concat -c copy', and stream copy precludes any filtergraph, so xfade/acrossfade require a re-encode path this script does not have. Re-run without --crossfade for a hard-cut concat, or open a roadmap item for the re-encode path."
126
+ aiv_die 2 "stitch.sh: --crossfade is not implemented and will not be silently downgraded. The output path of --mode cut is 'ffmpeg -f concat -c copy', and stream copy precludes any filtergraph, so xfade/acrossfade cannot exist there. Re-run without --crossfade for a hard-cut concat, or use '--mode handoff --xfade <seconds>' (ceiling ${XFADE_MAX}s) for the re-encode path, which applies the fade only at seams whose manifest row says continuity: handoff|connector."
77
127
  ;;
78
128
  *) aiv_die 2 "stitch.sh: unknown flag '$1'" ;;
79
129
  esac
80
130
  done
81
131
 
132
+ case "${MODE}" in
133
+ cut|handoff) ;;
134
+ *) aiv_die 2 "stitch.sh: unknown --mode '${MODE}' (expected cut|handoff)" ;;
135
+ esac
136
+
137
+ if [ -n "${XFADE}" ]; then
138
+ # Refused, never ignored: an --xfade the run cannot honour would otherwise
139
+ # deliver a hard cut and report success — the exact shape of the --crossfade
140
+ # defect above.
141
+ [ "${MODE}" = "handoff" ] \
142
+ || aiv_die 2 "stitch.sh: --xfade requires '--mode handoff' — the cut path is 'ffmpeg -f concat -c copy' and stream copy precludes a filtergraph. Re-run with --mode handoff, or drop --xfade for a hard-cut concat."
143
+ printf '%s' "${XFADE}" | grep -Eq '^[0-9]+(\.[0-9]+)?$' \
144
+ || aiv_die 2 "stitch.sh: --xfade must be a non-negative number of seconds, got '${XFADE}'"
145
+ awk -v x="${XFADE}" -v m="${XFADE_MAX}" 'BEGIN { exit !(x > 0 && x <= m) }' \
146
+ || aiv_die 2 "stitch.sh: --xfade ${XFADE}s is outside the allowed range (0 < s <= ${XFADE_MAX}) — a longer fade is a transition effect, not seam insurance"
147
+ fi
148
+
149
+ # The plan/success JSON gains a `mode` key ONLY in handoff mode. Even an
150
+ # additive key changes the stdout every existing caller reads, and "cut behaves
151
+ # as it does today" is the invariant that path is held to. Absent means cut.
152
+ MODE_JSON=""
153
+ if [ "${MODE}" = "handoff" ]; then
154
+ MODE_JSON=',"mode":"handoff"'
155
+ printf 'stitch: --mode handoff RE-ENCODES (libx264 -crf 20 -g 8 +faststart -an) — the cut path stream-copies. Audio is dropped by -an; mux a bed afterwards if the chain needs one.\n' >&2
156
+ [ "${DRYRUN_FLAG}" -eq 0 ] && aiv_require_cmd ffprobe
157
+ fi
158
+
82
159
  skip_match() {
83
160
  local id="$1" s
84
161
  for s in ${SKIP_IDS}; do
@@ -92,6 +169,11 @@ WORK_DIR="$(mktemp -d -t aiv-stitch-XXXXXX)"
92
169
  trap 'rm -rf "${WORK_DIR}"' EXIT
93
170
  CONCAT_LIST="${WORK_DIR}/concat.txt"
94
171
  : > "${CONCAT_LIST}"
172
+ # Ordered `<continuity>\t<validated path>` rows — the handoff filtergraph needs
173
+ # to know WHICH seams may fade, and the concat demuxer list cannot carry that.
174
+ # Written only in handoff mode, so the cut path is untouched.
175
+ SEQ_LIST="${WORK_DIR}/seq.tsv"
176
+ : > "${SEQ_LIST}"
95
177
 
96
178
  # Accept both bare-array manifests and the documented object shape
97
179
  # (`{ "scenes": [...] }`). Field names tolerate the legacy
@@ -107,6 +189,14 @@ while IFS= read -r row; do
107
189
  clip_path="$(printf '%s' "${row}" | jq -r '.clip_path // .expected_clip')"
108
190
  audio_embedded="$(printf '%s' "${row}" | jq -r '.audio_embedded // false')"
109
191
  audio_path="$(printf '%s' "${row}" | jq -r '.audio_path // empty')"
192
+ continuity="cut"
193
+ if [ "${MODE}" = "handoff" ]; then
194
+ continuity="$(printf '%s' "${row}" | jq -r '.continuity // "cut"')"
195
+ case "${continuity}" in
196
+ cut|handoff|connector) ;;
197
+ *) aiv_die 2 "stitch.sh: scene=${scene_id} unknown continuity '${continuity}' (expected cut|handoff|connector)" ;;
198
+ esac
199
+ fi
110
200
 
111
201
  case "${clip_path}" in
112
202
  /*) ;;
@@ -155,8 +245,14 @@ while IFS= read -r row; do
155
245
  -c:v copy -c:a aac -shortest "${muxed}" >/dev/null \
156
246
  || aiv_die 8 "ffmpeg mux failed for scene=${scene_id}"
157
247
  printf "file '%s'\n" "${muxed}" >> "${CONCAT_LIST}"
248
+ if [ "${MODE}" = "handoff" ]; then
249
+ printf '%s\t%s\n' "${continuity}" "${muxed}" >> "${SEQ_LIST}"
250
+ fi
158
251
  else
159
252
  printf "file '%s'\n" "${clip_path}" >> "${CONCAT_LIST}"
253
+ if [ "${MODE}" = "handoff" ]; then
254
+ printf '%s\t%s\n' "${continuity}" "${clip_path}" >> "${SEQ_LIST}"
255
+ fi
160
256
  fi
161
257
  count=$((count + 1))
162
258
  done <<EOF
@@ -168,12 +264,97 @@ EOF
168
264
  if [ "${DRYRUN_FLAG}" -eq 1 ]; then
169
265
  printf 'stitch: dry-run plan (output=%s, scenes=%d):\n' "${OUTPUT}" "${count}" >&2
170
266
  printf '%b' "${plan}" >&2
171
- printf '{"output":"%s","scenes":%d,"missing":0,"dry_run":true}\n' "${OUTPUT}" "${count}"
267
+ printf '{"output":"%s","scenes":%d,"missing":0,"dry_run":true%s}\n' \
268
+ "${OUTPUT}" "${count}" "${MODE_JSON}"
172
269
  exit 0
173
270
  fi
174
271
 
175
- ffmpeg -loglevel error -y -f concat -safe 0 -i "${CONCAT_LIST}" \
176
- -c copy "${OUTPUT}" >/dev/null \
177
- || aiv_die 8 "ffmpeg concat failed (manifest=${MANIFEST}, output=${OUTPUT})"
272
+ # The re-encode settings are one constant, used by both handoff branches, so a
273
+ # port cannot drift them apart.
274
+ HANDOFF_VCODEC="libx264"
275
+ HANDOFF_ARGS="-crf 20 -g 8 -pix_fmt yuv420p -movflags +faststart -an"
276
+
277
+ _probe_duration() {
278
+ ffprobe -v error -show_entries format=duration -of csv=p=0 "$1" 2>/dev/null \
279
+ | head -1
280
+ }
281
+
282
+ if [ "${MODE}" = "handoff" ]; then
283
+ seq_count="$(wc -l < "${SEQ_LIST}" | tr -d ' ')"
284
+ [ "${seq_count}" -gt 0 ] || aiv_die 7 "stitch: handoff mode found no usable clips"
285
+
286
+ if [ -z "${XFADE}" ] || [ "${seq_count}" -eq 1 ]; then
287
+ # No fade requested (or nothing to fade across): the seams stay hard cuts,
288
+ # the only difference from --mode cut is the re-encode. Same concat demuxer,
289
+ # so clip order and skip handling are shared with the cut path.
290
+ # shellcheck disable=SC2086
291
+ ffmpeg -loglevel error -y -f concat -safe 0 -i "${CONCAT_LIST}" \
292
+ -c:v "${HANDOFF_VCODEC}" ${HANDOFF_ARGS} "${OUTPUT}" >/dev/null \
293
+ || aiv_die 8 "ffmpeg handoff re-encode failed (manifest=${MANIFEST}, output=${OUTPUT})"
294
+ else
295
+ # Filtergraph path. Every input is normalised to the FIRST clip's frame
296
+ # rate and to yuv420p/SAR 1 — xfade refuses mismatched inputs, and a
297
+ # mismatch here would surface as an opaque filter error rather than as the
298
+ # source-clip problem it is.
299
+ first_clip="$(sed -n '1p' "${SEQ_LIST}" | cut -f2)"
300
+ rate="$(ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate \
301
+ -of csv=p=0 "${first_clip}" 2>/dev/null | head -1)"
302
+ [ -n "${rate}" ] || aiv_die 8 "stitch: cannot read frame rate of ${first_clip}"
303
+
304
+ ff_inputs=""
305
+ filter=""
306
+ i=0
307
+ while [ "${i}" -lt "${seq_count}" ]; do
308
+ line_no=$((i + 1))
309
+ p="$(sed -n "${line_no}p" "${SEQ_LIST}" | cut -f2)"
310
+ ff_inputs="${ff_inputs} -i ${p}"
311
+ filter="${filter}[${i}:v]fps=${rate},format=yuv420p,setsar=1,settb=AVTB[n${i}];"
312
+ i=$((i + 1))
313
+ done
314
+
315
+ acc_label="[n0]"
316
+ acc_dur="$(_probe_duration "$(sed -n '1p' "${SEQ_LIST}" | cut -f2)")"
317
+ [ -n "${acc_dur}" ] || aiv_die 8 "stitch: cannot read duration of the first clip"
318
+ faded=0
319
+ i=1
320
+ while [ "${i}" -lt "${seq_count}" ]; do
321
+ line_no=$((i + 1))
322
+ cont="$(sed -n "${line_no}p" "${SEQ_LIST}" | cut -f1)"
323
+ p="$(sed -n "${line_no}p" "${SEQ_LIST}" | cut -f2)"
324
+ dur="$(_probe_duration "${p}")"
325
+ [ -n "${dur}" ] || aiv_die 8 "stitch: cannot read duration of ${p}"
326
+ if [ "${cont}" = "handoff" ] || [ "${cont}" = "connector" ]; then
327
+ # offset = accumulated length so far MINUS the fade; the fade eats the
328
+ # tail of the accumulated stream, so the total shortens by exactly one
329
+ # xfade per faded seam.
330
+ offset="$(awk -v a="${acc_dur}" -v x="${XFADE}" 'BEGIN { printf "%.6f", a - x }')"
331
+ awk -v o="${offset}" 'BEGIN { exit !(o > 0) }' \
332
+ || aiv_die 7 "stitch: --xfade ${XFADE}s does not fit before seam ${i} (accumulated length ${acc_dur}s)"
333
+ filter="${filter}${acc_label}[n${i}]xfade=transition=fade:duration=${XFADE}:offset=${offset}[x${i}];"
334
+ acc_dur="$(awk -v a="${acc_dur}" -v d="${dur}" -v x="${XFADE}" 'BEGIN { printf "%.6f", a + d - x }')"
335
+ faded=$((faded + 1))
336
+ else
337
+ filter="${filter}${acc_label}[n${i}]concat=n=2:v=1:a=0[x${i}];"
338
+ acc_dur="$(awk -v a="${acc_dur}" -v d="${dur}" 'BEGIN { printf "%.6f", a + d }')"
339
+ fi
340
+ acc_label="[x${i}]"
341
+ i=$((i + 1))
342
+ done
343
+ filter="${filter%;}"
344
+
345
+ printf 'stitch: handoff filtergraph — %d clip(s), %d faded seam(s) at %ss, %d hard cut(s)\n' \
346
+ "${seq_count}" "${faded}" "${XFADE}" "$((seq_count - 1 - faded))" >&2
347
+
348
+ # shellcheck disable=SC2086
349
+ ffmpeg -loglevel error -y ${ff_inputs} -filter_complex "${filter}" \
350
+ -map "${acc_label}" -c:v "${HANDOFF_VCODEC}" ${HANDOFF_ARGS} "${OUTPUT}" >/dev/null \
351
+ || aiv_die 8 "ffmpeg handoff xfade failed (manifest=${MANIFEST}, output=${OUTPUT})"
352
+ fi
353
+ else
354
+ ffmpeg -loglevel error -y -f concat -safe 0 -i "${CONCAT_LIST}" \
355
+ -c copy "${OUTPUT}" >/dev/null \
356
+ || aiv_die 8 "ffmpeg concat failed (manifest=${MANIFEST}, output=${OUTPUT})"
357
+ fi
178
358
 
179
- printf '{"output":"%s","scenes":%d,"missing":%d}\n' "${OUTPUT}" "${count}" "${missing}"
359
+ printf '{"output":"%s","scenes":%d,"missing":%d%s}\n' \
360
+ "${OUTPUT}" "${count}" "${missing}" "${MODE_JSON}"
@@ -19,6 +19,10 @@
19
19
  # PNG magic; pairwise NCC ≥ 0.95 when `compare` is available.
20
20
  # When unavailable, asserts byte-identity (the three frames are
21
21
  # committed identical for the offline path).
22
+ # 7. end_image refusal: an adapter handed `end_image` for a model whose
23
+ # model-capabilities entry answers `end_frame: null` exits non-zero
24
+ # and names the model — it never drops the image (adapter-contract.md
25
+ # § end_image, exit 12).
22
26
  #
23
27
  # Exit 0 = all assertions pass; 1 = at least one failure (counted +
24
28
  # summarized at the end).
@@ -47,7 +51,7 @@ require jq || exit 1
47
51
  printf '\n== test-pipeline.sh — banana-arc golden run (offline) ==\n\n'
48
52
 
49
53
  # ---------------------------------------------------------------- 1
50
- printf '[1/6] parse-blueprint vs. expected.json\n'
54
+ printf '[1/8] parse-blueprint vs. expected.json\n'
51
55
  SCENES="01-simple 02-dialogue-native-audio 03-edge-duration"
52
56
  for s in $SCENES; do
53
57
  actual="$(bash "$ROOT/src/scripts/ai-video/lib/parse-blueprint.sh" "$PROJECT/scenes/$s/blueprint.txt" 2>/dev/null \
@@ -63,7 +67,7 @@ for s in $SCENES; do
63
67
  done
64
68
 
65
69
  # ---------------------------------------------------------------- 2
66
- printf '\n[2/6] character.json descriptors verbatim in prompt.subject\n'
70
+ printf '\n[2/8] character.json descriptors verbatim in prompt.subject\n'
67
71
  SILHOUETTE="$(jq -r '.characters[0].silhouette' "$PROJECT/character.json")"
68
72
  PALETTE="$(jq -r '.characters[0].palette' "$PROJECT/character.json")"
69
73
  WARDROBE="$(jq -r '.characters[0].wardrobe' "$PROJECT/character.json")"
@@ -84,7 +88,7 @@ for s in $SCENES; do
84
88
  done
85
89
 
86
90
  # ---------------------------------------------------------------- 3
87
- printf '\n[3/6] audio.* branching matches manifest\n'
91
+ printf '\n[3/8] audio.* branching matches manifest\n'
88
92
  for entry in 01-simple:false 02-dialogue-native-audio:true 03-edge-duration:false; do
89
93
  s="${entry%%:*}"
90
94
  want="${entry##*:}"
@@ -98,7 +102,7 @@ for entry in 01-simple:false 02-dialogue-native-audio:true 03-edge-duration:fals
98
102
  done
99
103
 
100
104
  # ---------------------------------------------------------------- 4
101
- printf '\n[4/6] adapter capability declarations\n'
105
+ printf '\n[4/8] adapter capability declarations\n'
102
106
  declare_caps() {
103
107
  local adapter="$1"; local expected="$2"
104
108
  local out got
@@ -116,7 +120,7 @@ declare_caps sora "native"
116
120
  declare_caps kling "none"
117
121
 
118
122
  # ---------------------------------------------------------------- 5
119
- printf '\n[5/6] stitch.sh dry-run returns manifest output path\n'
123
+ printf '\n[5/8] stitch.sh dry-run returns manifest output path\n'
120
124
  STITCH_OUT="$(jq -r '.stitch_output' "$PROJECT/manifest.json")"
121
125
  stitch_log="$(AIV_DRYRUN=true bash "$ROOT/src/scripts/ai-video/stitch.sh" \
122
126
  "$PROJECT/manifest.json" "$PROJECT/$STITCH_OUT" 2>&1 || true)"
@@ -126,7 +130,7 @@ case "$stitch_log" in
126
130
  esac
127
131
 
128
132
  # ---------------------------------------------------------------- 6
129
- printf '\n[6/6] visual regression (locked.png pairwise)\n'
133
+ printf '\n[6/8] visual regression (locked.png pairwise)\n'
130
134
  PNG_MAGIC="$(printf '\x89PNG\r\n\x1a\n')"
131
135
  prev=""
132
136
  have_compare=0
@@ -160,6 +164,80 @@ for s in $SCENES; do
160
164
  prev="$f"
161
165
  done
162
166
 
167
+ # ---------------------------------------------------------------- 7
168
+ printf '\n[7/8] end_image is refused, never dropped\n'
169
+ END_ADAPTER="kling"
170
+ END_MODEL="kling-v2-master"
171
+ END_MANIFEST="$ROOT/src/scripts/ai-video/lib/model-capabilities/$END_ADAPTER.json"
172
+
173
+ # Precondition: the entry must actually answer end_frame:null, or this case
174
+ # proves nothing. A probed `true` here would make the refusal wrong, not this
175
+ # assertion stale — so it is checked, not assumed.
176
+ end_declared="$(jq -r --arg m "$END_MODEL" \
177
+ '.models[$m] // {} | .end_frame | if . == null then "null" else tostring end' \
178
+ "$END_MANIFEST" 2>/dev/null || echo missing)"
179
+ if [ "$end_declared" = "null" ]; then
180
+ ok "$END_ADAPTER/$END_MODEL declares end_frame=null (unknown)"
181
+ else
182
+ fail "$END_ADAPTER/$END_MODEL declares end_frame=$end_declared — expected null for this case"
183
+ fi
184
+
185
+ end_stdin='{"prompt":{"subject":"a lone figure","action":"turns toward the door"},"duration":5,"end_image":"/tmp/aiv-end-frame.png"}'
186
+ end_out="$(printf '%s' "$end_stdin" \
187
+ | AIV_DRYRUN=true AIV_MODEL="$END_MODEL" \
188
+ bash "$ROOT/src/scripts/ai-video/adapters/$END_ADAPTER.sh" submit 2>&1)"
189
+ end_rc=$?
190
+
191
+ if [ "$end_rc" -eq 0 ]; then
192
+ fail "$END_ADAPTER: end_image was accepted (exit 0) — the image was dropped silently"
193
+ else
194
+ case "$end_out" in
195
+ *"$END_MODEL"*end_frame*|*end_frame*"$END_MODEL"*)
196
+ ok "$END_ADAPTER: end_image refused with exit $end_rc, naming $END_MODEL and end_frame";;
197
+ *)
198
+ fail "$END_ADAPTER: exit $end_rc but the message names neither the model nor the field (got: $end_out)";;
199
+ esac
200
+ fi
201
+
202
+ # ---------------------------------------------------------------- 8
203
+ printf '\n[8/8] cost calibration prints modeled-vs-charged and does not re-confirm on null\n'
204
+ CAL_PROJECT="$(mktemp -d -t aiv-cal-XXXXXX)"
205
+ mkdir -p "$CAL_PROJECT/scenes/0001"
206
+ printf '{"duration":5}\n' > "$CAL_PROJECT/scenes/0001/prompt.json"
207
+ CAL_ADAPTER="fal"
208
+ CAL_MODEL="fal-ai/ltx-2/text-to-video"
209
+
210
+ # No cost.json: nothing has been charged. This is the dry-run shape, and it is
211
+ # the case that matters most — `charged: null` must extrapolate nothing and must
212
+ # NOT halt, because treating an absent charge as 0 would make every future
213
+ # estimate quietly cheaper.
214
+ cal_out="$(bash "$ROOT/src/scripts/ai-video/lib/calibrate-cost.sh" \
215
+ "$CAL_PROJECT" 0001 --adapter "$CAL_ADAPTER" --model "$CAL_MODEL" \
216
+ --scenes 4 --no-append 2>&1)" && cal_rc=0 || cal_rc=$?
217
+
218
+ case "$cal_out" in
219
+ *"modeled \$"*"charged null"*) ok "calibration line prints modeled vs charged with charged: null" ;;
220
+ *) fail "calibration line missing or malformed (got: $cal_out)" ;;
221
+ esac
222
+ if [ "$cal_rc" -eq 0 ]; then
223
+ ok "charged: null does not re-confirm (exit 0)"
224
+ else
225
+ fail "charged: null re-confirmed with exit $cal_rc — an absent charge is not an overrun"
226
+ fi
227
+
228
+ # Sensitivity: the halt must actually fire when a charge genuinely overruns, or
229
+ # the exit-0 assertion above would pass against a script that never halts.
230
+ printf '{"charged_usd":1.60}\n' > "$CAL_PROJECT/scenes/0001/cost.json"
231
+ cal_over="$(bash "$ROOT/src/scripts/ai-video/lib/calibrate-cost.sh" \
232
+ "$CAL_PROJECT" 0001 --adapter "$CAL_ADAPTER" --model "$CAL_MODEL" \
233
+ --scenes 4 --no-append 2>&1)" && cal_over_rc=0 || cal_over_rc=$?
234
+ if [ "$cal_over_rc" -eq 13 ]; then
235
+ ok "a charge over the tolerance halts with exit 13 for re-confirmation"
236
+ else
237
+ fail "an overrun exited $cal_over_rc, expected 13 (got: $cal_over)"
238
+ fi
239
+ rm -rf "$CAL_PROJECT"
240
+
163
241
  # ----------------------------------------------------------------
164
242
  printf '\n----------------\nresult: %d passed · %d failed\n' "$PASS" "$FAIL"
165
243
  if [ "$FAIL" -gt 0 ]; then
@@ -0,0 +1,130 @@
1
+ /**
2
+ * The argument-exhaustion stop predicate, with the ordering encoded.
3
+ *
4
+ * `road-to-inbox-harvest-2026-08-e-council-topology-evidence` Phase 6.2, and the
5
+ * resolution of its `early-stop-vs-dissent-ordering` blocker.
6
+ *
7
+ * ## The ordering IS the substance
8
+ *
9
+ * Anti-conformity repair must fire **before** the cost stop, because
10
+ * **convergence may be conformity collapse rather than solution stability**. A
11
+ * round where everyone agrees because nobody pushed back looks, to a cost meter,
12
+ * exactly like a round where the argument is genuinely finished — and stopping
13
+ * there reports the collapse as consensus. That is the failure Phase 6 exists to
14
+ * prevent, so `dissentRepairAttempted` is a **required conjunct of the
15
+ * predicate**, not a soft check somewhere upstream that the predicate hopes ran.
16
+ *
17
+ * Encoding it as a conjunct rather than as call-order discipline is deliberate:
18
+ * a caller that forgets the order produces a wrong answer silently, while a
19
+ * caller that forgets to set the field produces `false` — the safe direction,
20
+ * and a visible one.
21
+ *
22
+ * ## Why all four, and why none of them is majority size
23
+ *
24
+ * A stop fires only when **every** condition holds:
25
+ *
26
+ * 1. `roundsCompleted >= MIN_ROUNDS` — one round is an opening statement, not an
27
+ * argument. There is nothing to be exhausted yet.
28
+ * 2. `dissentRepairAttempted` — the conformity defence got its chance.
29
+ * 3. every present member is a self-near-duplicate of their own prior round —
30
+ * the members have stopped adding, judged by the novelty logic that already
31
+ * exists rather than by a new similarity measure.
32
+ * 4. no unresolved adversarial trigger — an open objection is unfinished
33
+ * argument whatever the novelty numbers say.
34
+ *
35
+ * **Majority size is absent on purpose** (6.3). Unanimity is the single most
36
+ * available signal and the single least trustworthy one here: it is exactly what
37
+ * conformity collapse produces. A predicate that read it would stop soonest in
38
+ * precisely the case it must not.
39
+ *
40
+ * Everything here is pure and reads already-paid outputs — no model call, which
41
+ * is 6.1's contract and the reason this can be evaluated after every round for
42
+ * free.
43
+ */
44
+
45
+ /** One round is an opening statement; exhaustion needs an exchange. */
46
+ export const MIN_ROUNDS = 2;
47
+
48
+ export interface StopInputs {
49
+ /** Rounds completed so far. */
50
+ roundsCompleted: number;
51
+ /**
52
+ * Whether anti-conformity repair ran for the round under judgement.
53
+ *
54
+ * The ordering conjunct. `false` when repair was skipped, deferred, or
55
+ * never reached — all three are the same thing to this predicate, because
56
+ * all three leave conformity collapse untested.
57
+ */
58
+ dissentRepairAttempted: boolean;
59
+ /**
60
+ * Per present member: did this round near-duplicate that member's own prior
61
+ * round? Absent members contribute no entry rather than a `false`.
62
+ */
63
+ selfNearDuplicate: readonly boolean[];
64
+ /** Adversarial triggers raised and not yet resolved. */
65
+ unresolvedAdversarialTriggers: number;
66
+ }
67
+
68
+ export type StopBlocker =
69
+ | 'too-few-rounds'
70
+ | 'dissent-repair-not-attempted'
71
+ | 'members-still-adding'
72
+ | 'unresolved-adversarial-trigger'
73
+ | 'no-members-present';
74
+
75
+ export interface StopVerdict {
76
+ stop: boolean;
77
+ /** Every condition that failed, not just the first — a caller acting on one
78
+ * reason at a time would re-evaluate N times to learn N blockers. */
79
+ blockers: StopBlocker[];
80
+ }
81
+
82
+ export function evaluateStop(x: StopInputs): StopVerdict {
83
+ const blockers: StopBlocker[] = [];
84
+
85
+ if (x.roundsCompleted < MIN_ROUNDS) blockers.push('too-few-rounds');
86
+
87
+ // The ordering conjunct. Deliberately evaluated as its own condition rather
88
+ // than folded into a caller-side guard: see the module docstring.
89
+ if (!x.dissentRepairAttempted) blockers.push('dissent-repair-not-attempted');
90
+
91
+ if (x.selfNearDuplicate.length === 0) {
92
+ // No present member is not "everyone is done" — it is no evidence at
93
+ // all. `every()` over an empty array is vacuously true, which would
94
+ // make an empty council the easiest one to stop.
95
+ blockers.push('no-members-present');
96
+ } else if (!x.selfNearDuplicate.every((d) => d)) {
97
+ blockers.push('members-still-adding');
98
+ }
99
+
100
+ if (x.unresolvedAdversarialTriggers > 0) blockers.push('unresolved-adversarial-trigger');
101
+
102
+ return { stop: blockers.length === 0, blockers };
103
+ }
104
+
105
+ /**
106
+ * The rendering contract for a stopped run (6.4).
107
+ *
108
+ * A stopped run must be **textually distinguishable** from a full one. The
109
+ * failure this prevents is quiet and expensive: an artifact that reads as though
110
+ * all configured rounds executed, when three of five did, is a claim about
111
+ * deliberation depth that nobody made on purpose.
112
+ */
113
+ export interface StopRender {
114
+ roundsCompleted: number;
115
+ roundsConfigured: number;
116
+ savedCalls: number;
117
+ savedCostUsd: number;
118
+ exhaustedMembers: readonly string[];
119
+ }
120
+
121
+ export function renderStop(r: StopRender): string {
122
+ return [
123
+ `council: STOPPED EARLY — round ${String(r.roundsCompleted)} of ${String(r.roundsConfigured)}.`,
124
+ ' reason: argument exhaustion — every present member near-duplicated their own',
125
+ ' prior round, after anti-conformity repair had already been attempted.',
126
+ ` exhausted: ${r.exhaustedMembers.length > 0 ? r.exhaustedMembers.join(', ') : '(none named)'}`,
127
+ ` saved: ${String(r.savedCalls)} call(s), $${r.savedCostUsd.toFixed(4)}`,
128
+ ' NOT a full run: the remaining configured rounds did not execute.',
129
+ ].join('\n');
130
+ }