@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,249 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ /**
4
+ * consolidate-knowledge-runner.test.cjs — NÃO-REGRESSÃO do `consolidate` para TODOS os
5
+ * pods (Story SF10.10, AC12 — o achado de MAIOR RAIO DE DANO da story).
6
+ *
7
+ * O defeito (verificado por execução ANTES do fix): `renderConsolidated` lia
8
+ * `h.mark.target.assertion.type` sem guarda. Um registro de hardening com o alvo NOVO
9
+ * (`kind:'knowledge'`, que não tem `assertion`) fazia `consolidate` LANÇAR
10
+ * `TypeError: Cannot read properties of undefined (reading 'type')`. E `consolidate`
11
+ * não roda só na ferramenta: `pc-run-pod.cjs` o chama em TODO run (a cada K=20 appends
12
+ * e SEMPRE no fechamento limpo). Ou seja: um registro do alvo novo no log envenenava o
13
+ * RUNTIME de qualquer pod, não a ferramenta de hardening.
14
+ *
15
+ * Por isso este teste prova pelo CAMINHO DO RUNNER, não só pela lib:
16
+ *
17
+ * PARTE 1 (produção, sem truque) — `pc-run-pod.cjs` via CLI, run completo sobre um pod
18
+ * com registro `kind:'knowledge'` no log: o run completa, NENHUM aviso `[memory]`
19
+ * sai no stderr, e o consolidado EM DISCO ganha a linha 🔒 do knowledge.
20
+ * A 3ª asserção é o que impede fake-green: o runner engole exceção de memória em
21
+ * `recordLearning` (aviso em stderr, run segue). "Completou" sozinho NÃO prova nada —
22
+ * só o consolidado escrito prova que `consolidate` foi até o fim.
23
+ *
24
+ * PARTE 2 (kill-test) — o MESMO fixture, o MESMO runner, com uma cópia SABOTADA de
25
+ * pod-memory.cjs (o ramo por `kind` revertido para o código pré-fix) injetada no
26
+ * require.cache: o runner passa a emitir o aviso `[memory]` com o TypeError e o
27
+ * consolidado NÃO recebe a linha 🔒 — exatamente as asserções da Parte 1 ficando
28
+ * vermelhas. Prova que a Parte 1 exercita o mecanismo, e não uma tautologia.
29
+ *
30
+ * Node >= 18, sem dependências externas. Exit 0/1.
31
+ */
32
+
33
+ const fs = require('node:fs');
34
+ const os = require('node:os');
35
+ const path = require('node:path');
36
+ const { spawnSync } = require('node:child_process');
37
+
38
+ const REPO = path.resolve(__dirname, '..');
39
+ const RUNNER = path.join(REPO, 'scripts', 'pc-run-pod.cjs');
40
+ const FIXT = path.join(REPO, 'scripts', '__fixtures__', 'pod-run');
41
+
42
+ let passed = 0;
43
+ const failures = [];
44
+ function check(cond, label, extra) {
45
+ if (cond) { passed++; console.log(`[OK ] ${label}`); }
46
+ else { failures.push(label); console.log(`[FALHA] ${label}${extra ? `\n ${extra}` : ''}`); }
47
+ }
48
+
49
+ const BUILD_OK = '## Escopo\n## Contexto\nstatus: rascunho\n';
50
+ const GATE_OK = '## Veredito\nveredito: GO\n';
51
+ const FINAL_OK = '## Escopo\n## Contexto\nconfianca: alta\n';
52
+ const ARTIFACTS = { build: BUILD_OK, gate: GATE_OK, finalize: FINAL_OK };
53
+
54
+ const TRIGGER = 'slides sem riqueza grafica';
55
+ const RECOMMENDATION = 'usar blocos visuais com hierarquia tipografica no lugar de texto corrido';
56
+ const KNOWLEDGE_FILE = 'slides-html.md';
57
+ const SHA_A = 'a'.repeat(64);
58
+ const SHA_B = 'b'.repeat(64);
59
+
60
+ /**
61
+ * Pod temporário (cópia do fixture do runner) com a heurística no log cru E o registro
62
+ * de hardening do alvo NOVO — o registro que, sem o fix, derruba `consolidate`.
63
+ * O registro é plantado como TEXTO (não via appendHardening) de propósito: o teste
64
+ * simula um log que já existe em disco, independente do escritor.
65
+ */
66
+ function makePod(label) {
67
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), `sf10.10-${label}-`));
68
+ const podDir = path.join(tmp, 'pod');
69
+ fs.cpSync(FIXT, podDir, { recursive: true });
70
+ fs.rmSync(path.join(podDir, 'memory'), { recursive: true, force: true });
71
+ fs.mkdirSync(path.join(podDir, 'memory'), { recursive: true });
72
+ const lines = [
73
+ JSON.stringify({
74
+ id: 'src-1', ts: 1_700_000_000_000, trigger: TRIGGER, recommendation: RECOMMENDATION,
75
+ evidence: { count: 2 }, tier: 'normal', attributed_by: null, source_run_id: 'r1',
76
+ }),
77
+ JSON.stringify({
78
+ type: 'hardening',
79
+ ref: `${TRIGGER}||${RECOMMENDATION}`,
80
+ target: { pod: 'test-pod', kind: 'knowledge', file: KNOWLEDGE_FILE, sha_before: SHA_A, sha_after: SHA_B },
81
+ approved_by: 'daniel',
82
+ timestamp: '2026-08-01T00:00:00.000Z',
83
+ }),
84
+ ];
85
+ fs.writeFileSync(path.join(podDir, 'memory', 'learnings.jsonl'), `${lines.join('\n')}\n`);
86
+ return { tmp, podDir, runsRoot: path.join(tmp, 'runs') };
87
+ }
88
+
89
+ const HARDENED_LINE = `🔒 **[${TRIGGER}]**`;
90
+ const KNOWLEDGE_MARK = `endurecida → knowledge/${KNOWLEDGE_FILE}`;
91
+
92
+ function consolidatedOf(podDir) {
93
+ const p = path.join(podDir, 'memory', 'learnings.consolidated.md');
94
+ return fs.existsSync(p) ? fs.readFileSync(p, 'utf8') : '';
95
+ }
96
+
97
+ // SF11.4/ADR-022 (DF-SF11.4-1): o DETALHE da endurecida saiu do artefato injetado e
98
+ // passou a viver na trilha auditável. A prova de que `consolidate` foi ATÉ O FIM dentro
99
+ // do runner (o ponto desta suíte) migra junto — o writeFileSync da trilha é posterior ao
100
+ // do consolidado, então é o teste mais estrito de "não lançou no meio do caminho".
101
+ function hardenedDetailOf(podDir) {
102
+ const p = path.join(podDir, 'memory', 'learnings.hardened.md');
103
+ return fs.existsSync(p) ? fs.readFileSync(p, 'utf8') : '';
104
+ }
105
+
106
+ // ═══════════════════════════════════════════════════════════════════════════
107
+ // PARTE 1 — caminho REAL do runner (subprocesso, produção, zero truque)
108
+ // ═══════════════════════════════════════════════════════════════════════════
109
+ console.log('\n--- PARTE 1: run completo pelo pc-run-pod.cjs (CLI) com registro kind:"knowledge" no log ---');
110
+ {
111
+ const { tmp, podDir, runsRoot } = makePod('runner');
112
+ const wf = path.join(podDir, 'workflows', 'wf-min.yaml');
113
+ const stderrChunks = [];
114
+ const cli = (args) => {
115
+ const r = spawnSync(process.execPath, [RUNNER, ...args], { encoding: 'utf8', cwd: REPO });
116
+ stderrChunks.push(r.stderr || '');
117
+ return r;
118
+ };
119
+
120
+ const start = cli(['start', 'test-pod', 'wf-min', '--workflow-file', wf, '--pod-root', podDir, '--runs-root', runsRoot]);
121
+ check(start.status === 0, 'runner: start exit 0', `${start.stdout}${start.stderr}`);
122
+ const statePath = (start.stdout.match(/→ (.+state\.json)/) || [])[1];
123
+ check(!!statePath && fs.existsSync(statePath), 'runner: state.json criado');
124
+
125
+ // Dirige o run até o fechamento limpo (o ponto que SEMPRE chama consolidate).
126
+ let guard = 0;
127
+ let completed = false;
128
+ while (guard++ < 12 && !completed) {
129
+ const state = JSON.parse(fs.readFileSync(statePath, 'utf8'));
130
+ const runDir = path.dirname(statePath);
131
+ // planta o artefato de cada etapa despachada (simula o subagente)
132
+ for (const [id, s] of Object.entries(state.steps)) {
133
+ if (s.artifact && ARTIFACTS[id]) {
134
+ const abs = path.resolve(runDir, s.artifact);
135
+ if (!fs.existsSync(abs)) {
136
+ fs.mkdirSync(path.dirname(abs), { recursive: true });
137
+ fs.writeFileSync(abs, ARTIFACTS[id], 'utf8');
138
+ }
139
+ }
140
+ }
141
+ const awaiting = Object.entries(state.steps).find(([, s]) => s.status === 'awaiting_approval');
142
+ const cmd = awaiting ? ['approve', '--step', awaiting[0]] : ['next'];
143
+ const r = cli([...cmd, '--state', statePath, '--workflow-file', wf, '--pod-root', podDir]);
144
+ if (r.status !== 0) { check(false, `runner: comando ${cmd[0]} exit 0`, `${r.stdout}${r.stderr}`); break; }
145
+ if (/\[complete\]/.test(r.stdout)) completed = true;
146
+ }
147
+ check(completed, 'runner: workflow chegou a [complete] (fechamento limpo ⇒ consolidate SEMPRE dispara)');
148
+
149
+ const stderrAll = stderrChunks.join('');
150
+ check(!/\[memory\]/.test(stderrAll),
151
+ 'runner: NENHUM aviso "[memory]" no stderr (consolidate não lançou em nenhum ponto do run)',
152
+ stderrAll.slice(0, 400));
153
+
154
+ // A prova que não é fake-green: o consolidado EM DISCO tem a linha do alvo novo.
155
+ // Sem o fix, consolidate lança ANTES do writeFileSync — este arquivo não conteria
156
+ // a seção 🔒 (o runner engole a exceção e o run "completa" mesmo assim).
157
+ const md = consolidatedOf(podDir);
158
+ const detail = hardenedDetailOf(podDir);
159
+ check(md.includes('## Endurecidas (🔒 → enforcement)') && md.includes(`knowledge/${KNOWLEDGE_FILE} (1)`) &&
160
+ detail.includes(HARDENED_LINE) && detail.includes(KNOWLEDGE_MARK),
161
+ 'runner: consolidado ESCRITO com a referência agregada + trilha com a linha 🔒 → knowledge/<file> (consolidate foi até o fim dentro do runner)',
162
+ `${md.slice(0, 300)}\n---TRILHA---\n${detail.slice(0, 300)}`);
163
+ check(!md.split('## Endurecidas')[0].includes(`**[${TRIGGER}]**`),
164
+ 'runner: heurística endurecida DEMOVIDA do top-N ativo também no alvo knowledge');
165
+ check(!/undefined/.test(md), 'runner: linha do alvo knowledge sem "undefined" (ramo correto, não o ramo veto)');
166
+
167
+ fs.rmSync(tmp, { recursive: true, force: true });
168
+ }
169
+
170
+ // ═══════════════════════════════════════════════════════════════════════════
171
+ // PARTE 2 — KILL-TEST: mesmo runner, pod-memory SABOTADA (código pré-fix)
172
+ // ═══════════════════════════════════════════════════════════════════════════
173
+ console.log('\n--- PARTE 2: kill-test — o mesmo fixture com o ramo por `kind` revertido ---');
174
+ {
175
+ const { tmp, podDir, runsRoot } = makePod('kill');
176
+ const wf = path.join(podDir, 'workflows', 'wf-min.yaml');
177
+
178
+ // Sabotagem: substitui o ramo por `kind` pela linha EXATA do código pré-SF10.10.
179
+ const memSrc = fs.readFileSync(path.join(__dirname, 'pod-memory.cjs'), 'utf8');
180
+ // SF11.4: o ramo por `kind` foi extraído para hardeningTargetLabel (fonte ÚNICA do
181
+ // rótulo, usada pela referência agregada E pela trilha) — a âncora acompanha o código.
182
+ const anchor = ' const t = (h.mark && h.mark.target) || {};\n const kind = hardeningKind(t);';
183
+ check(memSrc.includes(anchor), 'kill-test: âncora do ramo por `kind` encontrada em hardeningTargetLabel');
184
+ const sabotaged = memSrc.replace(anchor, ' const t = h.mark.target;\n const kind = t.assertion.type && "veto";');
185
+ check(sabotaged !== memSrc, 'kill-test: sabotagem aplicada (volta a ler target.assertion.type sem guarda)');
186
+ const sabPath = path.join(tmp, 'pod-memory-sabotada.cjs');
187
+ fs.writeFileSync(sabPath, sabotaged);
188
+
189
+ // Injeta a cópia sabotada no lugar de ./pod-memory.cjs e recarrega o runner REAL.
190
+ const memResolved = require.resolve('./pod-memory.cjs');
191
+ const runnerResolved = require.resolve('./pc-run-pod.cjs');
192
+ const memBackup = require.cache[memResolved];
193
+ delete require.cache[runnerResolved];
194
+ require.cache[memResolved] = { id: memResolved, filename: memResolved, loaded: true, exports: require(sabPath) };
195
+ let R;
196
+ const warnings = [];
197
+ const realErr = console.error;
198
+ try {
199
+ R = require(runnerResolved);
200
+ console.error = (...a) => { warnings.push(a.join(' ')); };
201
+ // mesmo run, in-process (o runner é o de produção; só a memória foi sabotada)
202
+ const { ctx } = R.startRun({
203
+ workflowPath: wf, podRootOverride: podDir, pod: 'test-pod', workflow: 'wf-min',
204
+ mode: 'interactive', taskRef: 'kill-test', runsRoot,
205
+ });
206
+ let guard = 0;
207
+ let done = false;
208
+ while (guard++ < 12 && !done) {
209
+ const runDir = ctx.runDir;
210
+ for (const [id, s] of Object.entries(ctx.state.steps)) {
211
+ if (s.artifact && ARTIFACTS[id]) {
212
+ const abs = path.resolve(runDir, s.artifact);
213
+ if (!fs.existsSync(abs)) {
214
+ fs.mkdirSync(path.dirname(abs), { recursive: true });
215
+ fs.writeFileSync(abs, ARTIFACTS[id], 'utf8');
216
+ }
217
+ }
218
+ }
219
+ const awaiting = Object.entries(ctx.state.steps).find(([, s]) => s.status === 'awaiting_approval');
220
+ const r = awaiting ? R.approve(ctx, awaiting[0]) : R.advance(ctx);
221
+ if (r.action === 'complete') done = true;
222
+ }
223
+ check(done, 'kill-test: o run SABOTADO também "completa" — prova de que "completou" NÃO é evidência');
224
+ } finally {
225
+ console.error = realErr;
226
+ if (memBackup) require.cache[memResolved] = memBackup; else delete require.cache[memResolved];
227
+ delete require.cache[runnerResolved];
228
+ }
229
+
230
+ const warned = warnings.join('\n');
231
+ check(/\[memory\]/.test(warned) && /Cannot read properties of undefined/.test(warned),
232
+ 'kill-test: SEM o ramo por `kind`, o runner emite "[memory] aviso ... TypeError" (defeito reproduzido)',
233
+ warned.slice(0, 300));
234
+ const md = consolidatedOf(podDir);
235
+ check(!md.includes(`knowledge/${KNOWLEDGE_FILE} (1)`) && !hardenedDetailOf(podDir).includes(KNOWLEDGE_MARK),
236
+ 'kill-test: e nem o consolidado nem a trilha recebem o alvo knowledge (a asserção da Parte 1 ficaria VERMELHA)',
237
+ md.slice(0, 200));
238
+
239
+ fs.rmSync(tmp, { recursive: true, force: true });
240
+ }
241
+
242
+ console.log(`\n${passed}/${passed + failures.length} verificações passaram.`);
243
+ if (failures.length) {
244
+ console.error('\nSUÍTE AC12 (não-regressão do consolidate pelo caminho do runner) FALHOU:');
245
+ for (const f of failures) console.error(` - ${f}`);
246
+ process.exit(1);
247
+ }
248
+ console.log('AC12 verde: registro kind:"knowledge" no log NÃO quebra consolidate — provado pelo runner, não só pela lib.');
249
+ process.exit(0);
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ /**
4
+ * default-funcional.test.cjs — AC13 da Story SF12.1 (ADR-027 Decisão 5, DF-SF12.1-7/-20).
5
+ *
6
+ * "Personalização é opcional" deixa de ser promessa de README e vira requisito
7
+ * VERIFICÁVEL — com DUAS pré-condições distintas, porque os pods NÃO são iguais:
8
+ *
9
+ * (a) PODS DE MÉTODO (`dev-ia`, `automation`, `hormozi-method`)
10
+ * A saída não depende de quem é o dono. Pré-condição: ZERO dado de dono na
11
+ * árvore do pod. Gate: `validate-budgets` + canário verdes.
12
+ *
13
+ * (b) PODS DE IDENTIDADE (`content-carousel`, `authority-content`, `academy`,
14
+ * `squad-forge`) — a saída é assinada. Pré-condição: verdes com APENAS o
15
+ * TRIO DE ATRIBUIÇÃO (nome/handle/autoridade) fornecido como dado de rodada,
16
+ * e NENHUM dado de voz/DNA. É o que `wf-content-carousel.smoke.json` já faz
17
+ * com a identidade fictícia canônica.
18
+ *
19
+ * A distinção é proposital e fina (ADR-027 Decisão 5): nenhum gate pode exigir
20
+ * dado de COMPORTAMENTO/ESTILO — nunca, em pod nenhum. Um gate PODE exigir dado de
21
+ * ATRIBUIÇÃO quando o entregável é assinado, porque a alternativa seria publicar
22
+ * uma assinatura fabricada: dano externo e irreversível, pior que um bloqueio.
23
+ *
24
+ * ALCANCE DECLARADO, e este limite é intransponível: isto prova que o pipeline
25
+ * RODA sem personalização. NÃO prova que a saída é BOA — qualidade de saída é
26
+ * julgamento humano, sem oráculo de máquina (fronteira ADR-002). Nenhuma asserção
27
+ * abaixo afirma o contrário.
28
+ *
29
+ * Node >= 18, zero dependências. Exit 0/1.
30
+ */
31
+
32
+ const fs = require('node:fs');
33
+ const path = require('node:path');
34
+ const { execFileSync } = require('node:child_process');
35
+
36
+ const OL = require('./owner-layer.cjs');
37
+ const { parseYaml } = require('./validate-pod-workflow.cjs');
38
+
39
+ const REPO_ROOT = path.resolve(__dirname, '..');
40
+ const PODS = path.join(REPO_ROOT, 'template', 'pods');
41
+
42
+ let passed = 0;
43
+ const failures = [];
44
+ function ok(cond, label) {
45
+ if (cond) { passed++; console.log(`[OK ] ${label}`); }
46
+ else { failures.push(label); console.log(`[FALHA] ${label}`); }
47
+ }
48
+
49
+ const METODO = ['dev-ia', 'automation', 'hormozi-method'];
50
+ const IDENTIDADE = ['content-carousel', 'authority-content', 'academy', 'squad-forge'];
51
+
52
+ // Marcas de dado de dono que um pod poderia consumir. Não é heurística semântica:
53
+ // é a lista dos nomes de arquivo/campo que o framework de fato usa.
54
+ const MARCAS_DE_DONO = ['dono.yaml', 'dono.example', 'voice-dna', 'voice_dna'];
55
+
56
+ function walk(dir) {
57
+ const out = [];
58
+ for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
59
+ const p = path.join(dir, e.name);
60
+ if (e.isDirectory()) out.push(...walk(p));
61
+ else if (e.isFile()) out.push(p);
62
+ }
63
+ return out;
64
+ }
65
+
66
+ // ===========================================================================
67
+ // Sanidade da classificação — se um pod nasce/some, esta suíte precisa falhar
68
+ // alto em vez de validar uma lista obsoleta em silêncio.
69
+ // ===========================================================================
70
+ const podsEmDisco = fs.readdirSync(PODS, { withFileTypes: true })
71
+ .filter((e) => e.isDirectory()).map((e) => e.name).sort();
72
+ const classificados = METODO.concat(IDENTIDADE).sort();
73
+ ok(podsEmDisco.length === classificados.length && podsEmDisco.every((p, i) => p === classificados[i]),
74
+ `AC13 — a classificação cobre TODOS os pods do template (disco: ${podsEmDisco.join(', ')})`);
75
+
76
+ // ===========================================================================
77
+ // (a) PODS DE MÉTODO — zero dado de dono na árvore.
78
+ // ===========================================================================
79
+ for (const pod of METODO) {
80
+ const arquivos = walk(path.join(PODS, pod));
81
+ const hits = [];
82
+ for (const f of arquivos) {
83
+ const buf = fs.readFileSync(f);
84
+ if (buf.subarray(0, 8000).includes(0)) continue;
85
+ const txt = buf.toString('utf8');
86
+ for (const marca of MARCAS_DE_DONO) {
87
+ if (txt.includes(marca)) hits.push(`${path.relative(REPO_ROOT, f)} → "${marca}"`);
88
+ }
89
+ }
90
+ ok(hits.length === 0,
91
+ `AC13(a) — pod de método \`${pod}\`: ZERO dado de dono em ${arquivos.length} arquivos${hits.length ? `\n ${hits.join('\n ')}` : ''}`);
92
+ }
93
+
94
+ // ===========================================================================
95
+ // (b) PODS DE IDENTIDADE — o trio de atribuição, e SÓ ele, como dado de rodada.
96
+ //
97
+ // O canário do `content-carousel` é o caso executável: o cenário de smoke fornece
98
+ // nome + handle + remissão de autoridade (a assinatura do CTA) e NADA de voz.
99
+ // ===========================================================================
100
+ const smokePath = path.join(PODS, 'content-carousel', 'workflows', 'wf-content-carousel.smoke.json');
101
+ const smoke = JSON.parse(fs.readFileSync(smokePath, 'utf8'));
102
+ const smokeTexto = JSON.stringify(smoke);
103
+
104
+ ok(smokeTexto.includes(OL.FICTIONAL_IDENTITY.nome) && smokeTexto.includes(OL.FICTIONAL_IDENTITY.handle),
105
+ `AC13(b) — o cenário de smoke fornece o TRIO por dado de rodada (${OL.FICTIONAL_IDENTITY.nome} / ${OL.FICTIONAL_IDENTITY.handle} + remissão de autoridade)`);
106
+ ok(/autoridade/i.test(smokeTexto),
107
+ 'AC13(b) — a 3ª parte do trio (linha de autoridade) está no cenário, não num arquivo de configuração');
108
+ ok(MARCAS_DE_DONO.every((m) => !smokeTexto.includes(m)),
109
+ 'AC13(b) — o cenário NÃO carrega dado de voz/DNA: o pipeline roda com atribuição e nada mais');
110
+
111
+ // Nenhuma instância de dono existe na árvore distribuída — só o `.example.`.
112
+ const instanciasDeDono = [];
113
+ for (const pod of METODO.concat(IDENTIDADE)) {
114
+ const dir = path.join(PODS, pod, 'knowledge');
115
+ if (!fs.existsSync(dir)) continue;
116
+ for (const f of fs.readdirSync(dir)) {
117
+ if (/^dono.*\.yaml$/.test(f) && !/\.example\./.test(f)) instanciasDeDono.push(`${pod}/knowledge/${f}`);
118
+ }
119
+ }
120
+ ok(instanciasDeDono.length === 0,
121
+ `AC13 — nenhuma INSTÂNCIA de dono na árvore do template (só \`.example.\`)${instanciasDeDono.length ? `: ${instanciasDeDono.join(', ')}` : ''}`);
122
+ ok(!fs.existsSync(path.join(REPO_ROOT, 'template', 'knowledge', 'voice-dna', 'voice-dna.yaml')),
123
+ 'AC13 — nenhuma INSTÂNCIA de voice-dna na árvore do template');
124
+
125
+ // O placeholder do degrau 2 carrega o trio, e o trio é a ÚNICA exigência possível.
126
+ const donoExample = parseYaml(fs.readFileSync(
127
+ path.join(PODS, 'content-carousel', 'knowledge', 'dono.example.yaml'), 'utf8'));
128
+ ok(donoExample.dono && ['nome', 'handle', 'autoridade'].every((k) => k in donoExample.dono),
129
+ 'AC13 — `dono.example.yaml` declara o trio de atribuição (nome/handle/autoridade)');
130
+ ok(donoExample.dono.voz && typeof donoExample.dono.voz === 'object',
131
+ 'AC13 — os campos de VOZ existem como opcionais no mesmo arquivo (degrau 2), separados do trio');
132
+
133
+ // ===========================================================================
134
+ // OS DOIS GATES, EXECUTADOS AQUI — o oráculo do AC13 é o exit code deles.
135
+ // ===========================================================================
136
+ function gate(label, cmd, args) {
137
+ let code = 0;
138
+ try {
139
+ execFileSync(cmd, args, { cwd: REPO_ROOT, stdio: ['ignore', 'pipe', 'pipe'] });
140
+ } catch (e) {
141
+ code = typeof e.status === 'number' ? e.status : 1;
142
+ }
143
+ ok(code === 0, `AC13 — gate \`${label}\` com a árvore SEM personalização: exit ${code}`);
144
+ }
145
+ gate('validate-budgets (forma canônica de npm run validate)',
146
+ 'node', ['scripts/validate-budgets.js', 'template/pods', 'template/.claude/agents']);
147
+ gate('canário (smoke-pod-workflow)',
148
+ 'node', ['scripts/smoke-pod-workflow.cjs', 'scripts/__fixtures__/smoke-canary/workflows/wf-canary.yaml']);
149
+
150
+ // ===========================================================================
151
+ console.log(`\n${failures.length === 0 ? 'PASS' : 'FAIL'} — ${passed} asserções OK, ${failures.length} falha(s)`);
152
+ if (failures.length > 0) for (const f of failures) console.error(` ✗ ${f}`);
153
+ process.exit(failures.length === 0 ? 0 : 1);