@daniellins/power-claude 0.16.3

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.

Potentially problematic release.


This version of @daniellins/power-claude might be problematic. Click here for more details.

Files changed (467) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +121 -0
  3. package/bin/cli.js +124 -0
  4. package/installer/__tests__/doctor-ready-oracles.test.cjs +140 -0
  5. package/installer/__tests__/merge-settings.test.cjs +330 -0
  6. package/installer/adopt.js +161 -0
  7. package/installer/copy.js +203 -0
  8. package/installer/doctor.js +266 -0
  9. package/installer/install.js +155 -0
  10. package/installer/manifest.js +102 -0
  11. package/installer/motor-scripts.js +50 -0
  12. package/installer/motor-scripts.json +39 -0
  13. package/installer/uninstall.js +99 -0
  14. package/installer/update.js +376 -0
  15. package/installer/util.js +113 -0
  16. package/installer/wizard.js +64 -0
  17. package/package.json +26 -0
  18. package/scripts/__fixtures__/anti-path-demo/agents/ap-writer.md +13 -0
  19. package/scripts/__fixtures__/anti-path-demo/templates/write-tmpl.md +7 -0
  20. package/scripts/__fixtures__/anti-path-demo/workflows/wf-ap.smoke.json +10 -0
  21. package/scripts/__fixtures__/anti-path-demo/workflows/wf-ap.yaml +25 -0
  22. package/scripts/__fixtures__/assess-tier/retrofit-leve/pod/agents/content-chief.md +1 -0
  23. package/scripts/__fixtures__/assess-tier/retrofit-leve/pod/workflows/wf-criacao-redteam.yaml +3 -0
  24. package/scripts/__fixtures__/assess-tier/retrofit-leve/pod-spec.json +13 -0
  25. package/scripts/__fixtures__/fidelity/fake-green-average-in-band.yaml +21 -0
  26. package/scripts/__fixtures__/fidelity/fake-green-average.yaml +18 -0
  27. package/scripts/__fixtures__/fidelity/fake-green-denominator.yaml +19 -0
  28. package/scripts/__fixtures__/fidelity/fake-green-missing-evidence.yaml +18 -0
  29. package/scripts/__fixtures__/fidelity/fake-green-threshold.yaml +18 -0
  30. package/scripts/__fixtures__/fidelity/fake-green-weight.yaml +18 -0
  31. package/scripts/__fixtures__/fidelity/golden.yaml +31 -0
  32. package/scripts/__fixtures__/fidelity/trindade-incoherent.yaml +15 -0
  33. package/scripts/__fixtures__/forge-canonical/pod-spec-example.json +37 -0
  34. package/scripts/__fixtures__/migrate-squad/authored/agents/offer-engineer.md +17 -0
  35. package/scripts/__fixtures__/migrate-squad/authored/knowledge/no-source.md +7 -0
  36. package/scripts/__fixtures__/migrate-squad/authored/knowledge/value-stack-method.md +8 -0
  37. package/scripts/__fixtures__/migrate-squad/authored/specs/wf-sample.smoke.json +24 -0
  38. package/scripts/__fixtures__/migrate-squad/authored/specs/wf-sample.spec.json +45 -0
  39. package/scripts/__fixtures__/migrate-squad/legacy-squad/HEADLINE.md +3 -0
  40. package/scripts/__fixtures__/migrate-squad/legacy-squad/README.md +4 -0
  41. package/scripts/__fixtures__/migrate-squad/legacy-squad/agents/hormozi-offer.md +14 -0
  42. package/scripts/__fixtures__/migrate-squad/legacy-squad/checklists/dead-redundant.md +4 -0
  43. package/scripts/__fixtures__/migrate-squad/legacy-squad/checklists/method-guide.md +6 -0
  44. package/scripts/__fixtures__/migrate-squad/legacy-squad/checklists/veto-screen.md +4 -0
  45. package/scripts/__fixtures__/migrate-squad/legacy-squad/config/config.yaml +2 -0
  46. package/scripts/__fixtures__/migrate-squad/legacy-squad/data/case-library.md +3 -0
  47. package/scripts/__fixtures__/migrate-squad/legacy-squad/scripts/validate-mvn.py +16 -0
  48. package/scripts/__fixtures__/migrate-squad/legacy-squad/sops/sop-sample.md +3 -0
  49. package/scripts/__fixtures__/migrate-squad/legacy-squad/squad-io.yaml +14 -0
  50. package/scripts/__fixtures__/migrate-squad/legacy-squad/tasks/gather-context.md +7 -0
  51. package/scripts/__fixtures__/migrate-squad/legacy-squad/templates/output-tmpl.md +5 -0
  52. package/scripts/__fixtures__/migrate-squad/legacy-squad/workflows/wf-sample.yaml +24 -0
  53. package/scripts/__fixtures__/pipeline/pipelines/pipeline-checkpoint.yaml +21 -0
  54. package/scripts/__fixtures__/pipeline/pipelines/pipeline-demo.yaml +22 -0
  55. package/scripts/__fixtures__/pipeline/pods/pipe-a/agents/maker.md +13 -0
  56. package/scripts/__fixtures__/pipeline/pods/pipe-a/memory/learnings.consolidated.md +8 -0
  57. package/scripts/__fixtures__/pipeline/pods/pipe-a/memory/learnings.jsonl +83 -0
  58. package/scripts/__fixtures__/pipeline/pods/pipe-a/templates/make-tmpl.md +8 -0
  59. package/scripts/__fixtures__/pipeline/pods/pipe-a/workflows/wf-a.yaml +16 -0
  60. package/scripts/__fixtures__/pipeline/pods/pipe-b/agents/user.md +13 -0
  61. package/scripts/__fixtures__/pipeline/pods/pipe-b/memory/learnings.consolidated.md +8 -0
  62. package/scripts/__fixtures__/pipeline/pods/pipe-b/memory/learnings.jsonl +14 -0
  63. package/scripts/__fixtures__/pipeline/pods/pipe-b/templates/use-tmpl.md +6 -0
  64. package/scripts/__fixtures__/pipeline/pods/pipe-b/workflows/wf-b.yaml +16 -0
  65. package/scripts/__fixtures__/pod-run/agents/forge-chief.md +13 -0
  66. package/scripts/__fixtures__/pod-run/agents/pod-critic.md +13 -0
  67. package/scripts/__fixtures__/pod-run/templates/build-tmpl.md +8 -0
  68. package/scripts/__fixtures__/pod-run/templates/gate-tmpl.md +6 -0
  69. package/scripts/__fixtures__/pod-run/workflows/wf-min.yaml +43 -0
  70. package/scripts/__fixtures__/pod-run/workflows/wf-skip-modes.yaml +50 -0
  71. package/scripts/__fixtures__/pod-workflow/invalid-checkpoint-all-skippable.yaml +30 -0
  72. package/scripts/__fixtures__/pod-workflow/invalid-checkpoint-criteria-escalar-de-bloco.yaml +40 -0
  73. package/scripts/__fixtures__/pod-workflow/invalid-checkpoint-skip-mode-desconhecido.yaml +30 -0
  74. package/scripts/__fixtures__/pod-workflow/invalid-checkpoint-unknown-key.yaml +29 -0
  75. package/scripts/__fixtures__/pod-workflow/invalid-cycle.yaml +26 -0
  76. package/scripts/__fixtures__/pod-workflow/invalid-fix-loop-backedge.yaml +29 -0
  77. package/scripts/__fixtures__/pod-workflow/invalid-fix-loop-forward.yaml +29 -0
  78. package/scripts/__fixtures__/pod-workflow/invalid-handoff-open.yaml +27 -0
  79. package/scripts/__fixtures__/pod-workflow/invalid-knowledge-shape.yaml +18 -0
  80. package/scripts/__fixtures__/pod-workflow/invalid-missing-agent.yaml +15 -0
  81. package/scripts/__fixtures__/pod-workflow/invalid-missing-outputs.yaml +15 -0
  82. package/scripts/__fixtures__/pod-workflow/invalid-missing-template.yaml +15 -0
  83. package/scripts/__fixtures__/pod-workflow/invalid-missing-veto.yaml +13 -0
  84. package/scripts/__fixtures__/pod-workflow/invalid-template-not-on-disk.yaml +16 -0
  85. package/scripts/__fixtures__/pod-workflow/invalid-veto-prose.yaml +17 -0
  86. package/scripts/__fixtures__/pod-workflow/knowledge/a.md +4 -0
  87. package/scripts/__fixtures__/pod-workflow/knowledge/b.md +4 -0
  88. package/scripts/__fixtures__/pod-workflow/knowledge/c.md +4 -0
  89. package/scripts/__fixtures__/pod-workflow/templates/step-tmpl.md +7 -0
  90. package/scripts/__fixtures__/pod-workflow/valid-checkpoint-skip-modes.yaml +29 -0
  91. package/scripts/__fixtures__/pod-workflow/valid-fix-loop.yaml +30 -0
  92. package/scripts/__fixtures__/pod-workflow/valid-knowledge.yaml +30 -0
  93. package/scripts/__fixtures__/pod-workflow/valid-veto-always-true.yaml +20 -0
  94. package/scripts/__fixtures__/pod-workflow/valid.yaml +27 -0
  95. package/scripts/__fixtures__/smoke-canary/agents/canary-reporter.md +13 -0
  96. package/scripts/__fixtures__/smoke-canary/agents/canary-researcher.md +13 -0
  97. package/scripts/__fixtures__/smoke-canary/agents/canary-synth.md +13 -0
  98. package/scripts/__fixtures__/smoke-canary/memory/learnings.consolidated.md +10 -0
  99. package/scripts/__fixtures__/smoke-canary/memory/learnings.jsonl +448 -0
  100. package/scripts/__fixtures__/smoke-canary/templates/report-tmpl.md +9 -0
  101. package/scripts/__fixtures__/smoke-canary/templates/research-tmpl.md +7 -0
  102. package/scripts/__fixtures__/smoke-canary/templates/synth-tmpl.md +9 -0
  103. package/scripts/__fixtures__/smoke-canary/workflows/wf-canary.smoke.json +11 -0
  104. package/scripts/__fixtures__/smoke-canary/workflows/wf-canary.yaml +53 -0
  105. package/scripts/__fixtures__/source-audit/fake-green-bronze-unsignaled.yaml +10 -0
  106. package/scripts/__fixtures__/source-audit/fake-green-counts.yaml +9 -0
  107. package/scripts/__fixtures__/source-audit/fake-green-missing-evidence.yaml +9 -0
  108. package/scripts/__fixtures__/source-audit/fake-green-unclassified.yaml +10 -0
  109. package/scripts/__fixtures__/source-audit/fake-green-verdict.yaml +10 -0
  110. package/scripts/__fixtures__/source-audit/golden-blocked.yaml +10 -0
  111. package/scripts/__fixtures__/source-audit/golden.yaml +11 -0
  112. package/scripts/__fixtures__/sweep-forms/agents/forms-count.md +13 -0
  113. package/scripts/__fixtures__/sweep-forms/agents/forms-field.md +13 -0
  114. package/scripts/__fixtures__/sweep-forms/agents/forms-fileref.md +13 -0
  115. package/scripts/__fixtures__/sweep-forms/agents/forms-json.md +13 -0
  116. package/scripts/__fixtures__/sweep-forms/agents/forms-section.md +13 -0
  117. package/scripts/__fixtures__/sweep-forms/specs/wf-forms.spec.json +5 -0
  118. package/scripts/__fixtures__/sweep-forms/templates/t_count.md +5 -0
  119. package/scripts/__fixtures__/sweep-forms/templates/t_field.md +3 -0
  120. package/scripts/__fixtures__/sweep-forms/templates/t_fileref.md +3 -0
  121. package/scripts/__fixtures__/sweep-forms/templates/t_json.md +0 -0
  122. package/scripts/__fixtures__/sweep-forms/templates/t_section.md +3 -0
  123. package/scripts/__fixtures__/sweep-forms/workflows/wf-forms.smoke.json +13 -0
  124. package/scripts/__fixtures__/sweep-forms/workflows/wf-forms.yaml +67 -0
  125. package/scripts/__fixtures__/validate-story-acs-corpus/corpus-1-noop-state-json.fixture.md +18 -0
  126. package/scripts/__fixtures__/validate-story-acs-corpus/corpus-2-crash-buildworkflowyaml.fixture.md +26 -0
  127. package/scripts/__fixtures__/validate-story-acs-corpus/corpus-3-nasce-verde-skip-modes.fixture.md +29 -0
  128. package/scripts/__fixtures__/validate-story-acs-corpus/corpus-4-guarda-sem-irmao.fixture.md +17 -0
  129. package/scripts/__fixtures__/validate-story-acs-corpus/corpus-5a-diff-stat-sem-guarda.fixture.md +17 -0
  130. package/scripts/__fixtures__/validate-story-acs-corpus/corpus-5b-test-f-sobre-diretorio.fixture.md +20 -0
  131. package/scripts/__fixtures__/veto-checks/copy-clean.md +4 -0
  132. package/scripts/__fixtures__/veto-checks/copy-dashes.md +4 -0
  133. package/scripts/__fixtures__/veto-checks/n8n-bad.md +18 -0
  134. package/scripts/__fixtures__/veto-checks/n8n-ok.md +22 -0
  135. package/scripts/__fixtures__/veto-checks/page-bad.html +7 -0
  136. package/scripts/__fixtures__/veto-checks/phash/copy.png +0 -0
  137. package/scripts/__fixtures__/veto-checks/phash/distinct.png +0 -0
  138. package/scripts/__fixtures__/veto-checks/phash/distinct2.png +0 -0
  139. package/scripts/__fixtures__/veto-checks/phash/make-fixtures.cjs +203 -0
  140. package/scripts/__fixtures__/veto-checks/phash/ref.png +0 -0
  141. package/scripts/__fixtures__/veto-checks/slide-ok.html +15 -0
  142. package/scripts/__fixtures__/veto-checks/slide-overflow.html +14 -0
  143. package/scripts/__fixtures__/veto-checks/sweep-pod/agents/vc-checker.md +13 -0
  144. package/scripts/__fixtures__/veto-checks/sweep-pod/templates/check-tmpl.md +6 -0
  145. package/scripts/__fixtures__/veto-checks/sweep-pod/workflows/wf-vc.smoke.json +10 -0
  146. package/scripts/__fixtures__/veto-checks/sweep-pod/workflows/wf-vc.yaml +19 -0
  147. package/scripts/__fixtures__/voz-do-dono/README.md +23 -0
  148. package/scripts/__fixtures__/voz-do-dono/dono-escalar.yaml +9 -0
  149. package/scripts/__fixtures__/voz-do-dono/dono-guia.yaml +10 -0
  150. package/scripts/__fixtures__/voz-do-dono/peca-3a-pessoa.md +6 -0
  151. package/scripts/__fixtures__/voz-do-dono/peca-com-lexico-proibido.md +6 -0
  152. package/scripts/__fixtures__/voz-do-dono/peca-limpa-1a-pessoa.md +6 -0
  153. package/scripts/__tests__/derive-ready-transitions.test.cjs +269 -0
  154. package/scripts/__tests__/enforce-cycle-authority.test.cjs +869 -0
  155. package/scripts/__tests__/enforce-git-push-authority.test.cjs +701 -0
  156. package/scripts/__tests__/enforce-ready-oracles.test.cjs +745 -0
  157. package/scripts/__tests__/motor-scripts.test.cjs +339 -0
  158. package/scripts/__tests__/pc-run-pod-counter.test.cjs +58 -0
  159. package/scripts/__tests__/pc-run-pod.test.cjs +578 -0
  160. package/scripts/__tests__/validate-pod-workflow.test.cjs +90 -0
  161. package/scripts/__tests__/validate-story-acs.test.cjs +607 -0
  162. package/scripts/anti-path.test.cjs +163 -0
  163. package/scripts/arena.cjs +514 -0
  164. package/scripts/arena.test.cjs +213 -0
  165. package/scripts/brief-leitura-obrigatoria.test.cjs +364 -0
  166. package/scripts/consolidate-knowledge-runner.test.cjs +249 -0
  167. package/scripts/default-funcional.test.cjs +153 -0
  168. package/scripts/derive-ready-transitions.cjs +325 -0
  169. package/scripts/forge-additive.test.cjs +158 -0
  170. package/scripts/forge-assess-tier.cjs +205 -0
  171. package/scripts/forge-assess-tier.test.cjs +114 -0
  172. package/scripts/forge-canonical.test.cjs +624 -0
  173. package/scripts/forge-generate.cjs +1303 -0
  174. package/scripts/forge-harden-learning.cjs +921 -0
  175. package/scripts/forge-harden-learning.test.cjs +242 -0
  176. package/scripts/forge-ingest-memory.cjs +136 -0
  177. package/scripts/forge-upgrade-pod.cjs +368 -0
  178. package/scripts/forge.test.cjs +609 -0
  179. package/scripts/harden-knowledge.test.cjs +612 -0
  180. package/scripts/harness-g5-lite.cjs +243 -0
  181. package/scripts/harness-g5-lite.test.cjs +134 -0
  182. package/scripts/hn-carousel-contrato-entrada.test.cjs +96 -0
  183. package/scripts/migrate-squad-orchestration.test.cjs +146 -0
  184. package/scripts/migration-manifest-sf3.2.test.cjs +382 -0
  185. package/scripts/migration-manifest-sf3.3.test.cjs +170 -0
  186. package/scripts/migration-manifest-sf5.5.test.cjs +189 -0
  187. package/scripts/migration-manifest.cjs +1146 -0
  188. package/scripts/migration-manifest.test.cjs +186 -0
  189. package/scripts/npm-scope-invocation.test.cjs +194 -0
  190. package/scripts/owner-layer.cjs +442 -0
  191. package/scripts/owner-layer.test.cjs +358 -0
  192. package/scripts/pc-run-pipeline.cjs +289 -0
  193. package/scripts/pc-run-pipeline.test.cjs +256 -0
  194. package/scripts/pc-run-pod-countgte.test.cjs +66 -0
  195. package/scripts/pc-run-pod.cjs +1355 -0
  196. package/scripts/phash-gate.test.cjs +433 -0
  197. package/scripts/pod-export-compile.cjs +487 -0
  198. package/scripts/pod-export-compile.test.cjs +312 -0
  199. package/scripts/pod-export-executor.cjs +678 -0
  200. package/scripts/pod-export-executor.test.cjs +1341 -0
  201. package/scripts/pod-export-hardening.test.cjs +531 -0
  202. package/scripts/pod-export-postprocess.cjs +427 -0
  203. package/scripts/pod-export-postprocess.test.cjs +558 -0
  204. package/scripts/pod-export-queue-race.test.cjs +865 -0
  205. package/scripts/pod-export-release.cjs +473 -0
  206. package/scripts/pod-export-release.test.cjs +267 -0
  207. package/scripts/pod-export-service.cjs +1297 -0
  208. package/scripts/pod-export-service.test.cjs +489 -0
  209. package/scripts/pod-export-tools.cjs +470 -0
  210. package/scripts/pod-export-ui.cjs +805 -0
  211. package/scripts/pod-export-ui.test.cjs +301 -0
  212. package/scripts/pod-memory-budget.test.cjs +309 -0
  213. package/scripts/pod-memory-note.cjs +357 -0
  214. package/scripts/pod-memory-note.test.cjs +452 -0
  215. package/scripts/pod-memory.cjs +1252 -0
  216. package/scripts/pod-memory.test.cjs +951 -0
  217. package/scripts/render-png.test.cjs +307 -0
  218. package/scripts/smoke-isolation.test.cjs +100 -0
  219. package/scripts/smoke-pod-workflow.cjs +755 -0
  220. package/scripts/smoke-sweep.test.cjs +170 -0
  221. package/scripts/validate-adopt.js +235 -0
  222. package/scripts/validate-branding.js +84 -0
  223. package/scripts/validate-budgets.js +140 -0
  224. package/scripts/validate-fidelity-output.cjs +267 -0
  225. package/scripts/validate-fidelity-output.test.cjs +101 -0
  226. package/scripts/validate-install.js +230 -0
  227. package/scripts/validate-no-clone.cjs +220 -0
  228. package/scripts/validate-no-clone.test.cjs +77 -0
  229. package/scripts/validate-pipeline.cjs +145 -0
  230. package/scripts/validate-pod-workflow.cjs +878 -0
  231. package/scripts/validate-source-audit.cjs +170 -0
  232. package/scripts/validate-source-audit.test.cjs +90 -0
  233. package/scripts/validate-story-acs.cjs +862 -0
  234. package/scripts/validate-update-scope-motor.js +421 -0
  235. package/scripts/veto-checks/html-valid.cjs +92 -0
  236. package/scripts/veto-checks/lexical-check.cjs +62 -0
  237. package/scripts/veto-checks/phash-gate.cjs +589 -0
  238. package/scripts/veto-checks/render-gate.cjs +165 -0
  239. package/scripts/veto-checks/render-png.cjs +358 -0
  240. package/scripts/veto-checks.test.cjs +219 -0
  241. package/scripts/watcher-audit.cjs +178 -0
  242. package/template/.claude/CLAUDE.md +103 -0
  243. package/template/.claude/agents/pc-analyst.md +100 -0
  244. package/template/.claude/agents/pc-architect.md +32 -0
  245. package/template/.claude/agents/pc-dev.md +27 -0
  246. package/template/.claude/agents/pc-devops.md +45 -0
  247. package/template/.claude/agents/pc-planner.md +32 -0
  248. package/template/.claude/agents/pc-po.md +25 -0
  249. package/template/.claude/agents/pc-qa.md +25 -0
  250. package/template/.claude/commands/power/academy.md +9 -0
  251. package/template/.claude/commands/power/automation.md +9 -0
  252. package/template/.claude/commands/power/content-carousel.md +267 -0
  253. package/template/.claude/commands/power/content.md +9 -0
  254. package/template/.claude/commands/power/dev.md +9 -0
  255. package/template/.claude/commands/power/forge.md +224 -0
  256. package/template/.claude/commands/power/hormozi.md +221 -0
  257. package/template/.claude/commands/power/modo.md +57 -0
  258. package/template/.claude/hooks/README.md +114 -0
  259. package/template/.claude/hooks/context-budget.cjs +64 -0
  260. package/template/.claude/hooks/enforce-cycle-authority.cjs +457 -0
  261. package/template/.claude/hooks/enforce-git-push-authority.cjs +925 -0
  262. package/template/.claude/hooks/enforce-ready-oracles.cjs +502 -0
  263. package/template/.claude/rules/authority.md +76 -0
  264. package/template/.claude/rules/curadoria-de-conhecimento.md +30 -0
  265. package/template/.claude/rules/model-matrix.md +34 -0
  266. package/template/.claude/rules/orchestration.md +133 -0
  267. package/template/.claude/settings.json +50 -0
  268. package/template/.claude/skills/pc-apply-qa-fixes/SKILL.md +108 -0
  269. package/template/.claude/skills/pc-apply-qa-fixes/references/fix-loop.md +40 -0
  270. package/template/.claude/skills/pc-apply-qa-fixes/references/fix-request-template.md +70 -0
  271. package/template/.claude/skills/pc-arena/SKILL.md +96 -0
  272. package/template/.claude/skills/pc-close-story/SKILL.md +105 -0
  273. package/template/.claude/skills/pc-commit/SKILL.md +108 -0
  274. package/template/.claude/skills/pc-develop-story/SKILL.md +116 -0
  275. package/template/.claude/skills/pc-full-cycle/SKILL.md +150 -0
  276. package/template/.claude/skills/pc-pipeline/SKILL.md +63 -0
  277. package/template/.claude/skills/pc-pipeline/references/gate-templates.md +46 -0
  278. package/template/.claude/skills/pc-review-story/SKILL.md +129 -0
  279. package/template/.claude/skills/pc-review-story/references/false-positive-detection.md +50 -0
  280. package/template/.claude/skills/pc-review-story/references/nfr-assess.md +47 -0
  281. package/template/.claude/skills/pc-review-story/references/risk-profile.md +75 -0
  282. package/template/.claude/skills/pc-review-story/references/security-checklist.md +69 -0
  283. package/template/.claude/skills/pc-review-story/references/test-design.md +37 -0
  284. package/template/.claude/skills/pc-review-story/references/trace-requirements.md +46 -0
  285. package/template/.claude/skills/pc-run-pod/SKILL.md +123 -0
  286. package/template/.claude/skills/pc-validate-story/SKILL.md +114 -0
  287. package/template/.claude/skills/pc-wave/SKILL.md +133 -0
  288. package/template/.env.example +10 -0
  289. package/template/knowledge/analyst/brainstorming.md +40 -0
  290. package/template/knowledge/analyst/brief-skeleton.md +32 -0
  291. package/template/knowledge/analyst/competitor-skeleton.md +39 -0
  292. package/template/knowledge/analyst/elicitation-menu.md +49 -0
  293. package/template/knowledge/analyst/market-research-skeleton.md +36 -0
  294. package/template/knowledge/analyst/research-prompt-structure.md +48 -0
  295. package/template/knowledge/analyst/roi-skeleton.md +51 -0
  296. package/template/knowledge/voice-dna/README.md +99 -0
  297. package/template/knowledge/voice-dna/voice-dna.example.yaml +157 -0
  298. package/template/pods/README.md +64 -0
  299. package/template/pods/academy/README.md +37 -0
  300. package/template/pods/academy/agents/academy-chief.md +27 -0
  301. package/template/pods/academy/examples/palestra.example.md +142 -0
  302. package/template/pods/academy/pod-spec.json +44 -0
  303. package/template/pods/academy/templates/materiais-tmpl.md +17 -0
  304. package/template/pods/academy/templates/revisao-didatica-tmpl.md +20 -0
  305. package/template/pods/academy/workflows/wf-materiais-revisao.yaml +30 -0
  306. package/template/pods/authority-content/README.md +43 -0
  307. package/template/pods/authority-content/agents/content-chief.md +28 -0
  308. package/template/pods/authority-content/pod-spec.json +45 -0
  309. package/template/pods/authority-content/templates/criacao-na-voz-tmpl.md +17 -0
  310. package/template/pods/authority-content/templates/red-team-factual-tmpl.md +23 -0
  311. package/template/pods/authority-content/workflows/wf-criacao-redteam.yaml +30 -0
  312. package/template/pods/automation/README.md +37 -0
  313. package/template/pods/automation/agents/langgraph-architect.md +30 -0
  314. package/template/pods/automation/agents/n8n-architect.md +30 -0
  315. package/template/pods/automation/examples/README.md +46 -0
  316. package/template/pods/automation/examples/n8n-content-radar.example.json +380 -0
  317. package/template/pods/automation/knowledge/langgraph-patterns.md +126 -0
  318. package/template/pods/automation/knowledge/n8n-patterns.md +131 -0
  319. package/template/pods/automation/memory/README.md +16 -0
  320. package/template/pods/automation/memory/learnings.consolidated.md +8 -0
  321. package/template/pods/automation/memory/learnings.jsonl +0 -0
  322. package/template/pods/automation/pod-spec.json +109 -0
  323. package/template/pods/automation/specs/wf-langgraph-build.spec.json +107 -0
  324. package/template/pods/automation/squad-io.yaml +28 -0
  325. package/template/pods/automation/templates/lg-build-tmpl.md +17 -0
  326. package/template/pods/automation/templates/lg-design-tmpl.md +23 -0
  327. package/template/pods/automation/templates/lg-discover-tmpl.md +20 -0
  328. package/template/pods/automation/templates/lg-handoff-tmpl.md +20 -0
  329. package/template/pods/automation/templates/lg-test-tmpl.md +20 -0
  330. package/template/pods/automation/templates/n8n-build-tmpl.md +14 -0
  331. package/template/pods/automation/templates/n8n-design-tmpl.md +23 -0
  332. package/template/pods/automation/templates/n8n-discover-tmpl.md +20 -0
  333. package/template/pods/automation/templates/n8n-handoff-tmpl.md +20 -0
  334. package/template/pods/automation/templates/n8n-test-tmpl.md +20 -0
  335. package/template/pods/automation/workflows/wf-langgraph-build.smoke.json +11 -0
  336. package/template/pods/automation/workflows/wf-langgraph-build.yaml +64 -0
  337. package/template/pods/automation/workflows/wf-n8n-build.smoke.json +11 -0
  338. package/template/pods/automation/workflows/wf-n8n-build.yaml +65 -0
  339. package/template/pods/content-carousel/README.md +91 -0
  340. package/template/pods/content-carousel/agents/carousel-builder.md +28 -0
  341. package/template/pods/content-carousel/agents/carousel-visual.md +24 -0
  342. package/template/pods/content-carousel/agents/hn-curator.md +74 -0
  343. package/template/pods/content-carousel/config/heuristic-watcher-rubric.yaml +59 -0
  344. package/template/pods/content-carousel/knowledge/aquisicao-ancora.md +443 -0
  345. package/template/pods/content-carousel/knowledge/cta-brief.md +25 -0
  346. package/template/pods/content-carousel/knowledge/dono.example.yaml +45 -0
  347. package/template/pods/content-carousel/knowledge/identidade-visual-mascote.md +62 -0
  348. package/template/pods/content-carousel/knowledge/image-generation.md +62 -0
  349. package/template/pods/content-carousel/knowledge/selecao-de-ancora.md +60 -0
  350. package/template/pods/content-carousel/knowledge/slides-html.md +56 -0
  351. package/template/pods/content-carousel/memory/README.md +18 -0
  352. package/template/pods/content-carousel/memory/learnings.consolidated.md +6 -0
  353. package/template/pods/content-carousel/memory/learnings.jsonl +0 -0
  354. package/template/pods/content-carousel/pod-spec.json +100 -0
  355. package/template/pods/content-carousel/squad-io.yaml +10 -0
  356. package/template/pods/content-carousel/templates/assembly-tmpl.md +23 -0
  357. package/template/pods/content-carousel/templates/digest-tmpl.md +29 -0
  358. package/template/pods/content-carousel/templates/visuals-tmpl.md +20 -0
  359. package/template/pods/content-carousel/workflows/wf-content-carousel.smoke.json +23 -0
  360. package/template/pods/content-carousel/workflows/wf-content-carousel.yaml +80 -0
  361. package/template/pods/dev-ia/README.md +45 -0
  362. package/template/pods/dev-ia/agents/db-architect.md +33 -0
  363. package/template/pods/dev-ia/agents/ux-architect.md +29 -0
  364. package/template/pods/dev-ia/knowledge/db/migration-protocol.md +95 -0
  365. package/template/pods/dev-ia/knowledge/db/rls-patterns.md +101 -0
  366. package/template/pods/dev-ia/knowledge/db/schema-review-checklist.md +76 -0
  367. package/template/pods/dev-ia/memory/README.md +16 -0
  368. package/template/pods/dev-ia/memory/learnings.consolidated.md +8 -0
  369. package/template/pods/dev-ia/memory/learnings.jsonl +0 -0
  370. package/template/pods/dev-ia/pod-spec.json +34 -0
  371. package/template/pods/dev-ia/templates/schema-review-tmpl.md +23 -0
  372. package/template/pods/dev-ia/templates/ux-flow-review-tmpl.md +23 -0
  373. package/template/pods/dev-ia/tools/db-ops/backup-manager.sh +321 -0
  374. package/template/pods/dev-ia/tools/db-ops/best-practices-auditor.sh +534 -0
  375. package/template/pods/dev-ia/tools/db-ops/bootstrap-runner.sh +255 -0
  376. package/template/pods/dev-ia/tools/db-ops/data-loader.sh +616 -0
  377. package/template/pods/dev-ia/tools/db-ops/detect-database.sh +113 -0
  378. package/template/pods/dev-ia/tools/db-ops/explain-analyzer.sh +285 -0
  379. package/template/pods/dev-ia/tools/db-ops/health-checker.sh +323 -0
  380. package/template/pods/dev-ia/tools/db-ops/migration-runner.sh +308 -0
  381. package/template/pods/dev-ia/tools/db-ops/postgresql-schema-loader.sh +334 -0
  382. package/template/pods/dev-ia/tools/db-ops/query-runner.sh +171 -0
  383. package/template/pods/dev-ia/tools/db-ops/rls-policy-installer.sh +480 -0
  384. package/template/pods/dev-ia/tools/db-ops/rls-test-suite.sh +172 -0
  385. package/template/pods/dev-ia/tools/db-ops/schema-context-loader.sh +176 -0
  386. package/template/pods/hormozi-method/README.md +52 -0
  387. package/template/pods/hormozi-method/agents/acquisition-strategist.md +33 -0
  388. package/template/pods/hormozi-method/agents/conversion-copywriter.md +34 -0
  389. package/template/pods/hormozi-method/agents/monetization-architect.md +35 -0
  390. package/template/pods/hormozi-method/agents/offer-engineer.md +37 -0
  391. package/template/pods/hormozi-method/knowledge/core-four-leads.md +51 -0
  392. package/template/pods/hormozi-method/knowledge/grand-slam-offer.md +66 -0
  393. package/template/pods/hormozi-method/knowledge/growth-decision.md +38 -0
  394. package/template/pods/hormozi-method/knowledge/hooks-and-ads.md +56 -0
  395. package/template/pods/hormozi-method/knowledge/launch-email.md +31 -0
  396. package/template/pods/hormozi-method/knowledge/money-model.md +46 -0
  397. package/template/pods/hormozi-method/knowledge/opportunity-screening.md +44 -0
  398. package/template/pods/hormozi-method/knowledge/pages.md +25 -0
  399. package/template/pods/hormozi-method/knowledge/pos-lancamento-leads.md +56 -0
  400. package/template/pods/hormozi-method/knowledge/pricing.md +36 -0
  401. package/template/pods/hormozi-method/knowledge/retention-ltv.md +37 -0
  402. package/template/pods/hormozi-method/knowledge/scale-roadmap.md +35 -0
  403. package/template/pods/hormozi-method/knowledge/swipefiles-curados.md +44 -0
  404. package/template/pods/hormozi-method/knowledge/value-equation-diagnostic.md +77 -0
  405. package/template/pods/hormozi-method/memory/README.md +16 -0
  406. package/template/pods/hormozi-method/memory/learnings.consolidated.md +6 -0
  407. package/template/pods/hormozi-method/memory/learnings.jsonl +0 -0
  408. package/template/pods/hormozi-method/pod-spec.json +50 -0
  409. package/template/pods/hormozi-method/specs/wf-full-launch-sequence.spec.json +149 -0
  410. package/template/pods/hormozi-method/specs/wf-lead-magnet-pipeline.spec.json +125 -0
  411. package/template/pods/hormozi-method/specs/wf-money-model-design.spec.json +117 -0
  412. package/template/pods/hormozi-method/specs/wf-paid-ads-campaign.spec.json +132 -0
  413. package/template/pods/hormozi-method/specs/wf-scaling-diagnostic.spec.json +121 -0
  414. package/template/pods/hormozi-method/squad-io.yaml +43 -0
  415. package/template/pods/hormozi-method/templates/conversion-copywriter-tmpl.md +20 -0
  416. package/template/pods/hormozi-method/templates/launch-execucao-tmpl.md +17 -0
  417. package/template/pods/hormozi-method/templates/launch-fechamento-tmpl.md +17 -0
  418. package/template/pods/hormozi-method/templates/launch-pos-tmpl.md +17 -0
  419. package/template/pods/hormozi-method/templates/launch-preparacao-tmpl.md +17 -0
  420. package/template/pods/hormozi-method/templates/lm-copy-tmpl.md +17 -0
  421. package/template/pods/hormozi-method/templates/lm-distribuicao-tmpl.md +18 -0
  422. package/template/pods/hormozi-method/templates/lm-estrategia-tmpl.md +17 -0
  423. package/template/pods/hormozi-method/templates/mm-arquitetura-tmpl.md +18 -0
  424. package/template/pods/hormozi-method/templates/mm-copy-tmpl.md +17 -0
  425. package/template/pods/hormozi-method/templates/mm-diagnostico-tmpl.md +14 -0
  426. package/template/pods/hormozi-method/templates/monetization-architect-tmpl.md +17 -0
  427. package/template/pods/hormozi-method/templates/offer-engineer-tmpl.md +20 -0
  428. package/template/pods/hormozi-method/templates/paid-criativos-tmpl.md +19 -0
  429. package/template/pods/hormozi-method/templates/paid-fundacao-tmpl.md +17 -0
  430. package/template/pods/hormozi-method/templates/paid-teste-escala-tmpl.md +17 -0
  431. package/template/pods/hormozi-method/templates/scaling-diagnostico-tmpl.md +17 -0
  432. package/template/pods/hormozi-method/templates/scaling-priorizacao-tmpl.md +17 -0
  433. package/template/pods/hormozi-method/templates/scaling-roadmap-tmpl.md +17 -0
  434. package/template/pods/hormozi-method/workflows/wf-full-launch-sequence.smoke.json +12 -0
  435. package/template/pods/hormozi-method/workflows/wf-full-launch-sequence.yaml +56 -0
  436. package/template/pods/hormozi-method/workflows/wf-grand-slam-offer.smoke.json +11 -0
  437. package/template/pods/hormozi-method/workflows/wf-grand-slam-offer.yaml +45 -0
  438. package/template/pods/hormozi-method/workflows/wf-lead-magnet-pipeline.smoke.json +9 -0
  439. package/template/pods/hormozi-method/workflows/wf-lead-magnet-pipeline.yaml +45 -0
  440. package/template/pods/hormozi-method/workflows/wf-money-model-design.smoke.json +11 -0
  441. package/template/pods/hormozi-method/workflows/wf-money-model-design.yaml +45 -0
  442. package/template/pods/hormozi-method/workflows/wf-paid-ads-campaign.smoke.json +9 -0
  443. package/template/pods/hormozi-method/workflows/wf-paid-ads-campaign.yaml +46 -0
  444. package/template/pods/hormozi-method/workflows/wf-scaling-diagnostic.smoke.json +11 -0
  445. package/template/pods/hormozi-method/workflows/wf-scaling-diagnostic.yaml +44 -0
  446. package/template/pods/squad-forge/README.md +53 -0
  447. package/template/pods/squad-forge/agents/forge-chief.md +31 -0
  448. package/template/pods/squad-forge/agents/mind-extractor.md +29 -0
  449. package/template/pods/squad-forge/agents/pod-critic.md +26 -0
  450. package/template/pods/squad-forge/config/heuristic-watcher-rubric.yaml +74 -0
  451. package/template/pods/squad-forge/knowledge/fidelity-rubric.yaml +176 -0
  452. package/template/pods/squad-forge/knowledge/g6-memory-check.md +17 -0
  453. package/template/pods/squad-forge/knowledge/memory-ingest.md +16 -0
  454. package/template/pods/squad-forge/knowledge/source-audit-rubric.yaml +60 -0
  455. package/template/pods/squad-forge/memory/README.md +16 -0
  456. package/template/pods/squad-forge/memory/learnings.consolidated.md +8 -0
  457. package/template/pods/squad-forge/memory/learnings.jsonl +0 -0
  458. package/template/pods/squad-forge/pod-spec.json +166 -0
  459. package/template/pods/squad-forge/squad-io.yaml +13 -0
  460. package/template/pods/squad-forge/tasks/pipeline.md +158 -0
  461. package/template/pods/squad-forge/templates/discovery-tmpl.md +40 -0
  462. package/template/pods/squad-forge/templates/generation-tmpl.md +18 -0
  463. package/template/pods/squad-forge/templates/red-team-tmpl.md +17 -0
  464. package/template/pods/squad-forge/templates/register-tmpl.md +17 -0
  465. package/template/pods/squad-forge/templates/workflow-tmpl.yaml +101 -0
  466. package/template/pods/squad-forge/workflows/wf-forge.smoke.json +12 -0
  467. package/template/pods/squad-forge/workflows/wf-forge.yaml +60 -0
@@ -0,0 +1,267 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ /**
4
+ * pod-export-release.test.cjs — teste-guarda HERMÉTICO do mecanismo de release + selo (SF10.6).
5
+ *
6
+ * SEM API real, SEM rede (endpoint do compile mockado via checkEndpoint:false), SEM sessão real
7
+ * de pc-arena (os experimentos são construídos com o próprio motor arena.cjs, notas fabricadas).
8
+ * O lado EXPORT é injetado (deps.runExport) — o drive real do bundle é SF10.7. Fixture de pod =
9
+ * template/pods/content-carousel (mesma da suíte de compile).
10
+ *
11
+ * Cobre: AC1 (compile fresco por import), AC2 (G5 verde + cada divergência = VERMELHO com campo),
12
+ * AC3 (arena reveal-gate/verdictForAxis; ausência/incompleto/BASELINE-vence = VERMELHO), AC4
13
+ * (selo aditivo só com ambos verdes; hashes de conteúdo intocados; VERMELHO não altera o lock),
14
+ * AC5 (AUTO detecta-e-bloqueia / no-op), AC6 (MANUAL mesmo code-path).
15
+ */
16
+
17
+ const fs = require('node:fs');
18
+ const os = require('node:os');
19
+ const path = require('node:path');
20
+
21
+ const R = require('./pod-export-release.cjs');
22
+ const compileMod = require('./pod-export-compile.cjs');
23
+ const arena = require('./arena.cjs');
24
+
25
+ const REPO_ROOT = path.resolve(__dirname, '..');
26
+ const FIXTURE_POD = path.join(REPO_ROOT, 'template', 'pods', 'content-carousel');
27
+ const ARTS = ['p1.html', 'p2.html', 'p3.html', 'p4.html', 'p5.html', 'p6.html', 'p7.html'];
28
+
29
+ let failures = 0;
30
+ function assert(ok, msg) {
31
+ if (ok) console.log(`[OK ] ${msg}`);
32
+ else { console.error(`[FALHA] ${msg}`); failures++; }
33
+ }
34
+ function tmpDir(label) { return fs.mkdtempSync(path.join(os.tmpdir(), `sf10_6-${label}-`)); }
35
+
36
+ // ---------------------------------------------------------------------------
37
+ // Helpers de fixture.
38
+ // ---------------------------------------------------------------------------
39
+
40
+ /** Recompila a fixture hermética e devolve o lock esperado (determinístico). */
41
+ async function freshCompile() {
42
+ const { lock } = await compileMod.compile(FIXTURE_POD, { checkEndpoint: false });
43
+ return lock;
44
+ }
45
+
46
+ /** baseline.manifest.json (schema DF4-2) coerente com um lock; overrides p/ forçar divergências. */
47
+ function writeBaseline(dir, lock, over = {}) {
48
+ fs.mkdirSync(dir, { recursive: true });
49
+ const manifest = {
50
+ pod_sha: lock.pod_sha,
51
+ inputs: { scenario: 'pinned' },
52
+ modelo_pinado: lock.modelo_pinado,
53
+ artifacts: ARTS.slice(),
54
+ vetos: { digest: 'green', visuals: 'green', assembly: 'green' },
55
+ complete: true,
56
+ ...over,
57
+ };
58
+ fs.writeFileSync(path.join(dir, 'baseline.manifest.json'), `${JSON.stringify(manifest, null, 2)}\n`);
59
+ return dir;
60
+ }
61
+
62
+ /** Manifesto EXPORT (o que o executor produziria) — injetado via deps.runExport. */
63
+ function exportManifestOf(lock, over = {}) {
64
+ return { pod_sha: lock.pod_sha, modelo_pinado: lock.modelo_pinado, artifacts: ARTS.slice(), complete: true, ...over };
65
+ }
66
+ function runExportStub(manifest) { return async () => manifest; }
67
+
68
+ /**
69
+ * Constrói um experimento pc-arena REAL (motor arena.cjs) com desfecho determinístico.
70
+ * winner: 'EXPORT' | 'BASELINE' | 'TIE'. reveal: se false, deixa não-revelado. complete:false
71
+ * deixa a última rodada sem pontuar (reveal-gate bloqueado).
72
+ */
73
+ function buildArena(dir, { winner = 'EXPORT', reveal = true, complete = true } = {}) {
74
+ const rounds = 2;
75
+ const rubric = { scale: 5, dimensions: [{ name: 'qualidade', weight: 1, type: 'human' }], verdict: { minDiff: 0.3, kOfN: 1 } };
76
+ arena.init(dir, { arms: [R.ARM_EXPORT, R.ARM_BASELINE], rounds, rubric, labels: ['W', 'X'], seed: 42 });
77
+ const sealed = JSON.parse(fs.readFileSync(arena.sealedPath(dir), 'utf8')); // fixture: o "operador" conhece o mapa
78
+ const roundsToScore = complete ? rounds : rounds - 1;
79
+ for (let r = 1; r <= roundsToScore; r++) {
80
+ const map = sealed[String(r)]; // label -> arm
81
+ for (const label of ['W', 'X']) {
82
+ const arm = map[label];
83
+ let score;
84
+ if (winner === 'TIE') score = 4;
85
+ else if (winner === 'EXPORT') score = arm === R.ARM_EXPORT ? 5 : 3;
86
+ else score = arm === R.ARM_BASELINE ? 5 : 3; // BASELINE vence
87
+ arena.recordScore(dir, r, label, { qualidade: score });
88
+ }
89
+ }
90
+ if (reveal && complete) arena.reveal(dir);
91
+ return dir;
92
+ }
93
+
94
+ // ---------------------------------------------------------------------------
95
+ // Unidade: G5-determinístico (DF4-2).
96
+ // ---------------------------------------------------------------------------
97
+
98
+ async function unitG5() {
99
+ console.log('\n--- Unidade: compareG5 (DF4-2) ---');
100
+ const lock = await freshCompile();
101
+ const sha = lock.pod_sha;
102
+ const base = { pod_sha: sha, modelo_pinado: lock.modelo_pinado, artifacts: ARTS.slice(), vetos: { a: 'green', b: 'green', c: 'green' }, complete: true };
103
+ const exp = exportManifestOf(lock);
104
+
105
+ assert(R.compareG5(exp, base, sha, lock.modelo_pinado).verdict === 'green', 'G5 VERDE quando inventário/vetos/modelo/pod_sha coincidem');
106
+
107
+ const rBaseSha = R.compareG5(exp, { ...base, pod_sha: 'deadbeef' }, sha, lock.modelo_pinado);
108
+ assert(rBaseSha.verdict === 'red' && rBaseSha.divergence === 'pod_sha', 'G5 VERMELHO: baseline.pod_sha != sealed_pod_sha (binding de versão)');
109
+
110
+ const rExpSha = R.compareG5({ ...exp, pod_sha: 'cafe' }, base, sha, lock.modelo_pinado);
111
+ assert(rExpSha.verdict === 'red' && rExpSha.divergence === 'pod_sha', 'G5 VERMELHO: export.pod_sha != sealed_pod_sha');
112
+
113
+ const rBaseCount = R.compareG5(exp, { ...base, artifacts: ARTS.slice(0, 6) }, sha, lock.modelo_pinado);
114
+ assert(rBaseCount.verdict === 'red' && rBaseCount.divergence === 'inventario', 'G5 VERMELHO: inventário BASELINE != 7');
115
+
116
+ const rExpCount = R.compareG5({ ...exp, artifacts: ARTS.slice(0, 5) }, base, sha, lock.modelo_pinado);
117
+ assert(rExpCount.verdict === 'red' && rExpCount.divergence === 'inventario', 'G5 VERMELHO: inventário EXPORT != 7');
118
+
119
+ const rDiffSet = R.compareG5({ ...exp, artifacts: [...ARTS.slice(0, 6), 'x.html'] }, base, sha, lock.modelo_pinado);
120
+ assert(rDiffSet.verdict === 'red' && rDiffSet.divergence === 'inventario', 'G5 VERMELHO: conjuntos de peças divergem');
121
+
122
+ const rExpIncomplete = R.compareG5({ ...exp, complete: false }, base, sha, lock.modelo_pinado);
123
+ assert(rExpIncomplete.verdict === 'red' && rExpIncomplete.divergence === 'vetos', 'G5 VERMELHO: run EXPORT não atingiu complete');
124
+
125
+ const rVetoRed = R.compareG5(exp, { ...base, vetos: { a: 'green', b: 'red', c: 'green' } }, sha, lock.modelo_pinado);
126
+ assert(rVetoRed.verdict === 'red' && rVetoRed.divergence === 'vetos', 'G5 VERMELHO: veto não-verde no BASELINE');
127
+
128
+ const rBaseIncomplete = R.compareG5(exp, { ...base, complete: false }, sha, lock.modelo_pinado);
129
+ assert(rBaseIncomplete.verdict === 'red' && rBaseIncomplete.divergence === 'vetos', 'G5 VERMELHO: BASELINE não complete');
130
+
131
+ const rModel = R.compareG5(exp, { ...base, modelo_pinado: { agents: { x: 'outro' }, image: 'z' } }, sha, lock.modelo_pinado);
132
+ assert(rModel.verdict === 'red' && rModel.divergence === 'modelo_pinado', 'G5 VERMELHO: modelo pinado do BASELINE != lock');
133
+
134
+ const rModelExp = R.compareG5({ ...exp, modelo_pinado: { agents: { x: 'y' }, image: 'z' } }, base, sha, lock.modelo_pinado);
135
+ assert(rModelExp.verdict === 'red' && rModelExp.divergence === 'modelo_pinado', 'G5 VERMELHO: modelo usado no EXPORT != lock');
136
+ }
137
+
138
+ // ---------------------------------------------------------------------------
139
+ // Unidade: veredito pc-arena (DF4-3).
140
+ // ---------------------------------------------------------------------------
141
+
142
+ function unitArena() {
143
+ console.log('\n--- Unidade: arenaVerdict (DF4-3) ---');
144
+
145
+ const green = buildArena(tmpDir('arena-green'), { winner: 'EXPORT' });
146
+ const gv = R.arenaVerdict(green);
147
+ assert(gv.verdict === 'green' && gv.winner === 'B', 'ARENA VERDE: EXPORT vence a cega (winner B)');
148
+
149
+ const tie = buildArena(tmpDir('arena-tie'), { winner: 'TIE' });
150
+ assert(R.arenaVerdict(tie).verdict === 'green', 'ARENA VERDE: empate = export em paridade-ou-melhor');
151
+
152
+ const red = buildArena(tmpDir('arena-red'), { winner: 'BASELINE' });
153
+ const rv = R.arenaVerdict(red);
154
+ assert(rv.verdict === 'red' && rv.winner === 'A' && /BASELINE SUPERA/.test(rv.message), 'ARENA VERMELHO: BASELINE supera o EXPORT');
155
+
156
+ const incomplete = buildArena(tmpDir('arena-incompleto'), { winner: 'EXPORT', reveal: false, complete: false });
157
+ assert(R.arenaVerdict(incomplete).verdict === 'red', 'ARENA VERMELHO: experimento incompleto (reveal-gate)');
158
+
159
+ const unrevealed = buildArena(tmpDir('arena-naorevelado'), { winner: 'EXPORT', reveal: false, complete: true });
160
+ assert(R.arenaVerdict(unrevealed).verdict === 'red', 'ARENA VERMELHO: completo mas NÃO revelado (nunca revela pelo release)');
161
+
162
+ assert(R.arenaVerdict(path.join(os.tmpdir(), 'nao-existe-xyz')).verdict === 'red', 'ARENA VERMELHO: diretório ausente (nunca default-verde)');
163
+ assert(R.arenaVerdict(undefined).verdict === 'red', 'ARENA VERMELHO: --arena-dir ausente');
164
+ }
165
+
166
+ // ---------------------------------------------------------------------------
167
+ // Integração: release() — os 2 gatilhos, o selo aditivo, os bloqueios.
168
+ // ---------------------------------------------------------------------------
169
+
170
+ async function integration() {
171
+ console.log('\n--- Integração: release() ---');
172
+ const lock = await freshCompile();
173
+
174
+ // (AC4/AC6) MANUAL VERDE → sela; selo aditivo; hashes de conteúdo intocados.
175
+ {
176
+ const root = tmpDir('manual-green');
177
+ const lockPath = path.join(root, 'exports', 'content-carousel', 'export.lock.json');
178
+ const arenaDir = buildArena(tmpDir('ag'), { winner: 'EXPORT' });
179
+ const baselineDir = writeBaseline(tmpDir('bg'), lock);
180
+ const logs = [];
181
+ const r = await R.release('content-carousel', {
182
+ repoRoot: root, podDir: FIXTURE_POD, lockPath, checkEndpoint: false,
183
+ baselineDir, arenaDir, now: '2026-07-31T00:00:00.000Z', sealedBy: 'Daniel',
184
+ deps: { runExport: runExportStub(exportManifestOf(lock)) },
185
+ log: (m) => logs.push(m),
186
+ });
187
+ assert(r.status === 'sealed', 'MANUAL VERDE → status sealed');
188
+ const written = JSON.parse(fs.readFileSync(lockPath, 'utf8'));
189
+ assert(written.release && written.release.status === 'sealed' && written.release.trigger === 'manual', 'lock ganhou release.status=sealed, trigger=manual');
190
+ assert(written.release.sealed_pod_sha === lock.pod_sha, 'sealed_pod_sha == lock.pod_sha');
191
+ assert(written.release.evidence.g5.sha256 && written.release.evidence.arena.sealed_map_sha256, 'evidência referenciada por sha256 (G5 + sealed-map da arena)');
192
+ // Selo ADITIVO: removido o campo release, o lock é IDÊNTICO ao fresco (nenhum hash poluído).
193
+ const { release, ...content } = written;
194
+ assert(JSON.stringify(content) === JSON.stringify(lock), 'selo ADITIVO: pod_sha/per_file_sha/bundle_hashes/modelo IDÊNTICOS antes/depois (voláteis fora do hash)');
195
+ // Evidência G5 existe no path referenciado, com o sha256 registrado.
196
+ const evAbs = path.join(root, 'exports', 'content-carousel', written.release.evidence.g5.path);
197
+ assert(fs.existsSync(evAbs), 'arquivo de evidência G5 gravado no path do selo');
198
+ }
199
+
200
+ // (AC4) MANUAL G5 VERMELHO (baseline de OUTRO pod_sha) → NÃO sela; lock intocado.
201
+ {
202
+ const root = tmpDir('manual-g5red');
203
+ const lockPath = path.join(root, 'exports', 'content-carousel', 'export.lock.json');
204
+ fs.mkdirSync(path.dirname(lockPath), { recursive: true });
205
+ fs.writeFileSync(lockPath, '{"pod_sha":"PRE-EXISTENTE"}\n'); // selo/lock anterior
206
+ const arenaDir = buildArena(tmpDir('ar'), { winner: 'EXPORT' });
207
+ const baselineDir = writeBaseline(tmpDir('br'), lock, { pod_sha: 'OUTRA-VERSAO' });
208
+ const r = await R.release('content-carousel', {
209
+ repoRoot: root, podDir: FIXTURE_POD, lockPath, checkEndpoint: false,
210
+ baselineDir, arenaDir, deps: { runExport: runExportStub(exportManifestOf(lock)) }, log: () => {},
211
+ });
212
+ assert(r.status === 'red' && r.g5.verdict === 'red', 'MANUAL G5 VERMELHO → status red, sem selo');
213
+ assert(fs.readFileSync(lockPath, 'utf8').includes('PRE-EXISTENTE'), 'VERMELHO NÃO altera o lock pré-existente');
214
+ }
215
+
216
+ // (AC3/AC4) MANUAL ARENA VERMELHO (G5 verde) → NÃO sela.
217
+ {
218
+ const root = tmpDir('manual-arenared');
219
+ const lockPath = path.join(root, 'exports', 'content-carousel', 'export.lock.json');
220
+ const arenaDir = buildArena(tmpDir('aar'), { winner: 'BASELINE' });
221
+ const baselineDir = writeBaseline(tmpDir('bar'), lock);
222
+ const r = await R.release('content-carousel', {
223
+ repoRoot: root, podDir: FIXTURE_POD, lockPath, checkEndpoint: false,
224
+ baselineDir, arenaDir, deps: { runExport: runExportStub(exportManifestOf(lock)) }, log: () => {},
225
+ });
226
+ assert(r.status === 'red' && r.arena.verdict === 'red' && r.g5.verdict === 'green', 'MANUAL ARENA VERMELHO (G5 verde) → status red, sem selo');
227
+ assert(!fs.existsSync(lockPath), 'ARENA VERMELHO não escreve lock novo');
228
+ }
229
+
230
+ // (AC5) AUTO com pod_sha DIVERGENTE → BLOQUEIA e sinaliza, NUNCA sela.
231
+ {
232
+ const root = tmpDir('auto-block');
233
+ const lockPath = path.join(root, 'exports', 'content-carousel', 'export.lock.json');
234
+ fs.mkdirSync(path.dirname(lockPath), { recursive: true });
235
+ const stale = { ...lock, pod_sha: 'ANTIGO-DIVERGENTE' };
236
+ fs.writeFileSync(lockPath, compileMod.serializeLock(stale));
237
+ const r = await R.release('content-carousel', {
238
+ repoRoot: root, podDir: FIXTURE_POD, lockPath, checkEndpoint: false, ifChanged: true, log: () => {},
239
+ });
240
+ assert(r.status === 'blocked' && r.changed === true, 'AUTO pod_sha divergente → status blocked (detecta-e-bloqueia)');
241
+ assert(fs.readFileSync(lockPath, 'utf8').includes('ANTIGO-DIVERGENTE'), 'AUTO bloqueado NÃO sela / NÃO altera o lock');
242
+ const written = JSON.parse(fs.readFileSync(lockPath, 'utf8'));
243
+ assert(!written.release, 'AUTO NUNCA escreve release unattended (DF4-4)');
244
+ }
245
+
246
+ // (AC5) AUTO SEM mudança → no-op informativo, nada resela.
247
+ {
248
+ const root = tmpDir('auto-noop');
249
+ const lockPath = path.join(root, 'exports', 'content-carousel', 'export.lock.json');
250
+ fs.mkdirSync(path.dirname(lockPath), { recursive: true });
251
+ fs.writeFileSync(lockPath, compileMod.serializeLock(lock)); // pod_sha idêntico ao fresco
252
+ const before = fs.readFileSync(lockPath, 'utf8');
253
+ const r = await R.release('content-carousel', {
254
+ repoRoot: root, podDir: FIXTURE_POD, lockPath, checkEndpoint: false, ifChanged: true, log: () => {},
255
+ });
256
+ assert(r.status === 'noop' && r.changed === false, 'AUTO sem mudança → status noop');
257
+ assert(fs.readFileSync(lockPath, 'utf8') === before, 'AUTO no-op não reescreve o lock');
258
+ }
259
+ }
260
+
261
+ (async () => {
262
+ await unitG5();
263
+ unitArena();
264
+ await integration();
265
+ console.log(`\n${failures === 0 ? '[PASS]' : '[FAIL]'} pod-export-release.test.cjs — ${failures} falha(s).`);
266
+ process.exit(failures === 0 ? 0 : 1);
267
+ })().catch((e) => { console.error('[ERRO FATAL]', e); process.exit(1); });