@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,219 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ /**
4
+ * veto-checks.test.cjs — suíte da 6ª forma de veto `command_check` + `json_schema_valid`
5
+ * com `extract` (Story SF7.2, ADR-011). Prova:
6
+ * (AC5) os 4 casos motivadores, cada um com prova POSITIVA e NEGATIVA sobre artefato
7
+ * realista: (a) render-gate (headless, fail-loud se ausente), (b) lexical anti-IA
8
+ * (Node puro), (c) json_schema_valid+extract (N8N — não command_check), (d) HTML.
9
+ * (AC12) modelo de ameaça: runner/validador executam SÓ scripts blessed sob
10
+ * scripts/veto-checks/ — traversal / fora-da-whitelist / args interpoláveis = recusa.
11
+ * (AC2) evalVeto executa via execFileSync sem shell, exit code como veredito; caminho extract.
12
+ * (AC3) sweep de command_check por fixture de violação; ausente = underivável fail-loud.
13
+ * (AC4) serializeAssertion emite args (lista) e extract (mapa) e faz roundtrip por parseYaml.
14
+ *
15
+ * Node >= 18. Exit 0/1.
16
+ */
17
+
18
+ const fs = require('node:fs');
19
+ const os = require('node:os');
20
+ const path = require('node:path');
21
+
22
+ const rp = require('./pc-run-pod.cjs');
23
+ const vp = require('./validate-pod-workflow.cjs');
24
+ const fg = require('./forge-generate.cjs');
25
+ const smoke = require('./smoke-pod-workflow.cjs');
26
+ const lexical = require('./veto-checks/lexical-check.cjs');
27
+ const html = require('./veto-checks/html-valid.cjs');
28
+ const render = require('./veto-checks/render-gate.cjs');
29
+
30
+ const REPO_ROOT = path.resolve(__dirname, '..');
31
+ const FIX = path.join(__dirname, '__fixtures__', 'veto-checks');
32
+
33
+ let passed = 0;
34
+ const failures = [];
35
+ function ok(cond, label) {
36
+ if (cond) { passed++; console.log(`[OK ] ${label}`); }
37
+ else { failures.push(label); console.error(`[FALHA] ${label}`); }
38
+ }
39
+ function throwsFail(fn) {
40
+ try { fn(); return false; } catch (e) { if (e instanceof vp.Fail) return true; throw e; }
41
+ }
42
+ const ctx = { podRoot: FIX, runDir: FIX };
43
+ const cc = (command, args, artifact) => rp.evalVeto(
44
+ { type: 'command_check', command, args }, '', path.join(FIX, artifact), ctx,
45
+ );
46
+
47
+ // ===========================================================================
48
+ // (b) lexical anti-IA — Node puro (AC5b)
49
+ // ===========================================================================
50
+ console.log('--- (b) lexical anti-IA ---');
51
+ ok(lexical.countMatches('a — b – c', '[\\u2014\\u2013]') === 2, 'countMatches conta em/en-dash');
52
+ ok(cc('lexical-check.cjs', ['--max', '0'], 'copy-clean.md').ok === true, 'lexical: copy limpa PASSA');
53
+ ok(cc('lexical-check.cjs', ['--max', '0'], 'copy-dashes.md').ok === false, 'lexical: copy com travessões BLOQUEIA');
54
+
55
+ // ===========================================================================
56
+ // (d) HTML balance + tag exigida — Node puro (AC5d)
57
+ // ===========================================================================
58
+ console.log('--- (d) HTML válido ---');
59
+ ok(html.checkBalance('<div><p>x</p></div>').ok === true, 'checkBalance: balanceado OK');
60
+ ok(html.checkBalance('<div><p>x</div>').ok === false, 'checkBalance: desbalanceado detecta');
61
+ ok(cc('html-valid.cjs', ['--require', 'title'], 'slide-ok.html').ok === true, 'html: slide-ok (balanceado + title) PASSA');
62
+ ok(cc('html-valid.cjs', [], 'page-bad.html').ok === false, 'html: page-bad (desbalanceado) BLOQUEIA');
63
+
64
+ // ===========================================================================
65
+ // (c) json_schema_valid + extract — N8N, IN-PROCESS (AC5c; fecha CONCERNS-1 SF6.3)
66
+ // ===========================================================================
67
+ console.log('--- (c) json_schema_valid + extract (N8N) ---');
68
+ const n8nAssert = { type: 'json_schema_valid', schema: 'nodes,connections', extract: { section: '## Workflow JSON', fence: 'json' } };
69
+ const n8nOk = fs.readFileSync(path.join(FIX, 'n8n-ok.md'), 'utf8');
70
+ const n8nBad = fs.readFileSync(path.join(FIX, 'n8n-bad.md'), 'utf8');
71
+ ok(rp.evalVeto(n8nAssert, n8nOk, 'x', ctx).ok === true, 'extract: N8N JSON com nodes+connections PASSA');
72
+ ok(rp.evalVeto(n8nAssert, n8nBad, 'x', ctx).ok === false, 'extract: N8N JSON sem connections BLOQUEIA (CONCERNS-1 fechado na forma)');
73
+ ok(rp.extractFencedBlock(n8nOk, '## Workflow JSON', 'json').includes('"connections"'), 'extractFencedBlock extrai só o bloco da seção declarada');
74
+ // sem extract, o artefato .md inteiro não é JSON → bloqueia (comportamento legado preservado)
75
+ ok(rp.evalVeto({ type: 'json_schema_valid', schema: 'nodes' }, n8nOk, 'x', ctx).ok === false, 'sem extract: .md inteiro não é JSON (legado preservado)');
76
+
77
+ // ===========================================================================
78
+ // (a) render-gate — headless, FAIL-LOUD se ausente (AC5a)
79
+ // ===========================================================================
80
+ console.log('--- (a) render-gate ---');
81
+ ok(render.decideFromDom('<html data-render-gate="OK">').ok === true, 'decideFromDom: OK → passa');
82
+ ok(render.decideFromDom('<html data-render-gate="OVERFLOW">').ok === false, 'decideFromDom: OVERFLOW → bloqueia');
83
+ ok(render.decideFromDom('<html>').ok === false, 'decideFromDom: sem marcador → bloqueia (não green-fake)');
84
+ // FAIL-LOUD: CHROME_BIN inválido é honrado estritamente → probe null → exit não-zero.
85
+ {
86
+ const saved = process.env.CHROME_BIN;
87
+ process.env.CHROME_BIN = '/nao/existe/chrome-xyz';
88
+ const r = cc('render-gate.cjs', [], 'slide-ok.html');
89
+ ok(r.ok === false && /exit 3|Chrome/i.test(r.reason), 'render-gate: Chrome ausente → FAIL-LOUD (bloqueia, nunca skip)');
90
+ if (saved === undefined) delete process.env.CHROME_BIN; else process.env.CHROME_BIN = saved;
91
+ }
92
+ // Se há Chrome no ambiente, prova positiva/negativa reais; senão, registra skip honesto.
93
+ if (render.probeChrome()) {
94
+ ok(cc('render-gate.cjs', [], 'slide-ok.html').ok === true, 'render-gate: slide-ok (cabe) PASSA [Chrome real]');
95
+ ok(cc('render-gate.cjs', [], 'slide-overflow.html').ok === false, 'render-gate: slide-overflow (corte) BLOQUEIA [Chrome real]');
96
+ } else {
97
+ console.log('[SKIP ] render-gate pos/neg: headless Chrome ausente neste ambiente (fail-loud já provado; end-to-end roda no CI com Chrome)');
98
+ }
99
+
100
+ // ===========================================================================
101
+ // (AC12) modelo de ameaça — só scripts BLESSED, recusa fail-loud
102
+ // ===========================================================================
103
+ console.log('--- (AC12) whitelist / modelo de ameaça ---');
104
+ ok(throwsFail(() => vp.checkCommandCheckSafety({ command: '../../etc/passwd' })), 'estático: path traversal RECUSADO');
105
+ ok(throwsFail(() => vp.checkCommandCheckSafety({ command: 'scripts/evil.cjs' })), 'estático: caminho (não nome simples) RECUSADO');
106
+ ok(throwsFail(() => vp.checkCommandCheckSafety({ command: 'nao-blessed.cjs' })), 'estático: script fora de veto-checks/ RECUSADO');
107
+ ok(throwsFail(() => vp.checkCommandCheckSafety({ command: 'lexical-check.cjs', args: ['$(rm -rf /)'] })), 'estático: arg com interpolação/shell RECUSADO');
108
+ ok(throwsFail(() => vp.checkCommandCheckSafety({ command: 'lexical-check.cjs', args: [42] })), 'estático: arg não-literal (número) RECUSADO');
109
+ ok(!throwsFail(() => vp.checkCommandCheckSafety({ command: 'lexical-check.cjs', args: ['--max', '0'] })), 'estático: blessed + args literais ACEITO');
110
+ // runtime (defesa em profundidade): evalVeto recusa comando fora da raiz blessed sem executar
111
+ ok(rp.evalVeto({ type: 'command_check', command: '../smoke-pod-workflow.cjs' }, '', path.join(FIX, 'copy-clean.md'), ctx).ok === false,
112
+ 'runtime: evalVeto recusa comando fora da raiz blessed (defesa em profundidade)');
113
+ // ISOLANTE do guard B realpath (SF7.2 CONCERNS-1): um symlink de NOME BLESSED dentro de
114
+ // scripts/veto-checks/ apontando para um script-sentinela FORA passa o estático (nome blessed,
115
+ // dirname lexical == raiz) — só o realpathSync o pega. Sabotar o realpath faz esta asserção
116
+ // ficar VERMELHA (a sentinela seria executada). Restaura o arquivo real em finally.
117
+ {
118
+ const VC = path.join(REPO_ROOT, 'scripts', 'veto-checks');
119
+ const blessedReal = path.join(VC, 'lexical-check.cjs');
120
+ const backup = fs.readFileSync(blessedReal);
121
+ const d = fs.mkdtempSync(path.join(os.tmpdir(), 'sf72-symlink-'));
122
+ const sentinelFlag = path.join(d, 'EXECUTED');
123
+ const evil = path.join(d, 'evil-sentinel.cjs');
124
+ fs.writeFileSync(evil, `require('node:fs').writeFileSync(${JSON.stringify(sentinelFlag)}, 'x'); process.exit(0);`);
125
+ let refused = false;
126
+ let executed = true;
127
+ try {
128
+ fs.unlinkSync(blessedReal);
129
+ fs.symlinkSync(evil, blessedReal); // symlink de nome BLESSED → alvo externo
130
+ const r = rp.evalVeto({ type: 'command_check', command: 'lexical-check.cjs' }, '', path.join(FIX, 'copy-clean.md'), ctx);
131
+ refused = r.ok === false && /realpath/i.test(r.reason || '');
132
+ executed = fs.existsSync(sentinelFlag);
133
+ } finally {
134
+ try { fs.unlinkSync(blessedReal); } catch { /* ok */ }
135
+ fs.writeFileSync(blessedReal, backup); // restaura o arquivo real byte-idêntico
136
+ }
137
+ ok(refused && !executed,
138
+ 'runtime ISOLADO: symlink de nome blessed → alvo externo é RECUSADO por realpath, sentinela NUNCA executada (fura o guard B se removido)');
139
+ }
140
+ // SF10.8 — a MESMA fronteira aplicada ao 4º blessed (`phash-gate.cjs`, veto de não-cópia):
141
+ // nenhuma exceção foi criada para ele (AC2). Estático + runtime + o isolante do guard B.
142
+ ok(!throwsFail(() => vp.checkCommandCheckSafety({ command: 'phash-gate.cjs', args: ['--refs-dir', '../inputs', '--assets-dir', '../assets'] })),
143
+ 'phash-gate: blessed + args literais ACEITO (mesma porta dos 3 anteriores)');
144
+ ok(throwsFail(() => vp.checkCommandCheckSafety({ command: '../veto-checks/phash-gate.cjs' })), 'phash-gate: traversal no nome RECUSADO');
145
+ ok(throwsFail(() => vp.checkCommandCheckSafety({ command: 'phash-gate-fake.cjs' })), 'phash-gate: vizinho não-blessed RECUSADO');
146
+ ok(throwsFail(() => vp.checkCommandCheckSafety({ command: 'phash-gate.cjs', args: ['--refs-dir', '{{run.inputs_dir}}'] })),
147
+ 'phash-gate: arg INTERPOLADO com dado de run RECUSADO (ADR-011 preservado — a referência nunca vira arg dinâmico)');
148
+ ok(rp.evalVeto({ type: 'command_check', command: '../veto-checks/phash-gate.cjs' }, '', path.join(FIX, 'copy-clean.md'), ctx).ok === false,
149
+ 'phash-gate: runtime recusa a forma com caminho, sem executar');
150
+ {
151
+ const VC = path.join(REPO_ROOT, 'scripts', 'veto-checks');
152
+ const blessedReal = path.join(VC, 'phash-gate.cjs');
153
+ const backup = fs.readFileSync(blessedReal);
154
+ const d = fs.mkdtempSync(path.join(os.tmpdir(), 'sf108-symlink-'));
155
+ const sentinelFlag = path.join(d, 'EXECUTED');
156
+ const evil = path.join(d, 'evil-sentinel.cjs');
157
+ fs.writeFileSync(evil, `require('node:fs').writeFileSync(${JSON.stringify(sentinelFlag)}, 'x'); process.exit(0);`);
158
+ let refused = false;
159
+ let executed = true;
160
+ try {
161
+ fs.unlinkSync(blessedReal);
162
+ fs.symlinkSync(evil, blessedReal);
163
+ const r = rp.evalVeto({ type: 'command_check', command: 'phash-gate.cjs' }, '', path.join(FIX, 'copy-clean.md'), ctx);
164
+ refused = r.ok === false && /realpath/i.test(r.reason || '');
165
+ executed = fs.existsSync(sentinelFlag);
166
+ } finally {
167
+ try { fs.unlinkSync(blessedReal); } catch { /* ok */ }
168
+ fs.writeFileSync(blessedReal, backup);
169
+ }
170
+ ok(refused && !executed, 'phash-gate ISOLADO: symlink de nome blessed → alvo externo RECUSADO por realpath, sentinela NUNCA executada');
171
+ }
172
+ // validateWorkflow end-to-end: wf declarando comando não-blessed = exit 1 (Fail)
173
+ {
174
+ const d = fs.mkdtempSync(path.join(os.tmpdir(), 'vc-badwf-'));
175
+ fs.mkdirSync(path.join(d, 'workflows')); fs.mkdirSync(path.join(d, 'templates'));
176
+ fs.writeFileSync(path.join(d, 'templates', 't.md'), '# T\n## Body\nx\n');
177
+ fs.writeFileSync(path.join(d, 'workflows', 'wf-bad.yaml'),
178
+ 'state_machine:\n states: [init, running, complete, failed]\n initial: init\n terminal: [complete, failed]\n' +
179
+ 'steps:\n - id: s\n agent: a\n template: templates/t.md\n inputs: [x]\n outputs: [y]\n depends_on: []\n checkpoint: null\n' +
180
+ ' veto:\n assertions:\n - { type: command_check, command: "evil.cjs" }\n');
181
+ ok(throwsFail(() => vp.validateWorkflow(path.join(d, 'workflows', 'wf-bad.yaml'), d)),
182
+ 'validateWorkflow: wf com command_check fora da whitelist = exit 1 (recusa estática)');
183
+ }
184
+
185
+ // ===========================================================================
186
+ // (AC3) sweep de command_check — fixture de violação; ausente = underivável fail-loud
187
+ // ===========================================================================
188
+ console.log('--- (AC3) sweep de command_check ---');
189
+ const sweepPod = path.join(FIX, 'sweep-pod');
190
+ const wfVc = path.join(sweepPod, 'workflows', 'wf-vc.yaml');
191
+ ok(!throwsFail(() => vp.validateWorkflow(wfVc, sweepPod)), 'validate-pod-workflow: wf-vc (command_check blessed) PASSA estático');
192
+ const scenario = JSON.parse(fs.readFileSync(path.join(sweepPod, 'workflows', 'wf-vc.smoke.json'), 'utf8'));
193
+ const sweepOk = smoke.runSweep({ workflowPath: wfVc, podRoot: sweepPod, scenario });
194
+ ok(sweepOk.ok === true && sweepOk.underivable === null && sweepOk.report.proofs.every((p) => p.blocked),
195
+ 'sweep: command_check com fixture de violação → BLOQUEOU (prova de bloqueio)');
196
+ const scenarioNoViol = { ...scenario, violations: {} };
197
+ const sweepUnder = smoke.runSweep({ workflowPath: wfVc, podRoot: sweepPod, scenario: scenarioNoViol });
198
+ ok(sweepUnder.underivable !== null && /sem fixture de violação/.test(sweepUnder.underivable.reason),
199
+ 'sweep: sem fixture de violação → UNDERIVÁVEL fail-loud (nunca pulado)');
200
+
201
+ // ===========================================================================
202
+ // (AC4) forge-generate serializeAssertion — args (lista) e extract (mapa) + roundtrip
203
+ // ===========================================================================
204
+ console.log('--- (AC4) forge-generate serializeAssertion ---');
205
+ const emitArgs = fg.serializeAssertion({ type: 'command_check', command: 'lexical-check.cjs', args: ['--max', '0'] });
206
+ const emitExtract = fg.serializeAssertion({ type: 'json_schema_valid', schema: 'nodes,connections', extract: { section: '## Workflow JSON', fence: 'json' } });
207
+ ok(/args: \[/.test(emitArgs), 'serializeAssertion emite args como flow-list');
208
+ ok(/extract: \{/.test(emitExtract), 'serializeAssertion emite extract como flow-map');
209
+ const rtArgs = vp.parseYaml('a: ' + emitArgs.slice(2)).a;
210
+ const rtExtract = vp.parseYaml('a: ' + emitExtract.slice(2)).a;
211
+ ok(Array.isArray(rtArgs.args) && rtArgs.args[0] === '--max', 'roundtrip: parseYaml lê args de volta como lista');
212
+ ok(rtExtract.extract && rtExtract.extract.section === '## Workflow JSON', 'roundtrip: parseYaml lê extract de volta como mapa');
213
+
214
+ if (failures.length > 0) {
215
+ console.error(`\nSuíte veto-checks FALHOU: ${failures.length} de ${passed + failures.length}.`);
216
+ process.exit(1);
217
+ }
218
+ console.log(`\n${passed} asserções verdes. command_check (6ª forma) + json_schema.extract provados.`);
219
+ process.exit(0);
@@ -0,0 +1,178 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ /**
4
+ * watcher-audit.cjs — auditoria DETERMINÍSTICA de ADERÊNCIA heurística por run
5
+ * (Story SF2.3, SPEC §G1 "watcher-rubric audita, a cada run, se o agente de fato
6
+ * aplicou as heurísticas do top-N — aderência, não resumo").
7
+ *
8
+ * CONTRATO (a filosofia da rubrica, honrada em código, não em prosa):
9
+ * "O watcher NÃO resume o consolidado. Ele audita se o AGENTE APLICOU a heurística
10
+ * no ARTEFATO que produziu."
11
+ *
12
+ * Por que arquivo NOVO (e não extensão de pod-memory.cjs): a auditoria opera sobre
13
+ * PARES (consolidado top-N aplicável, artefato produzido) e é consumida pelo
14
+ * `pod-critic` (agente/gate), não pelo runner. Manter o motor de lifecycle
15
+ * (pod-memory.cjs) focado em DADOS e o de auditoria em ADERÊNCIA é a fronteira limpa
16
+ * recomendada nas Dev Notes da story. NÃO é decisão de arquitetura nova — a SPEC já
17
+ * autoriza qualquer dos dois arquivos (AC3 do brief).
18
+ *
19
+ * COMO É DETERMINÍSTICO (proibido veto por LLM, SPEC §B1): para cada heurística do
20
+ * consolidado (linha `- **[trigger]** recomendação`), extrai os TOKENS DE CONTEÚDO
21
+ * (palavras significativas, sem stopwords) do trigger e da recomendação e mede, por
22
+ * presença/ausência no TEXTO DO ARTEFATO (normalizado), um PADRÃO VERIFICÁVEL:
23
+ * - not-applicable → o CONTEXTO do trigger não aparece no artefato (a heurística não
24
+ * se aplica a este artefato — não é falha do agente).
25
+ * - applied → contexto do trigger presente E ≥ THRESHOLD dos tokens da
26
+ * recomendação presentes (o agente materializou o padrão recomendado).
27
+ * - not-applied → contexto presente mas o padrão da recomendação ausente (o
28
+ * agente ENTROU no caso e NÃO aplicou — este é o achado que importa).
29
+ *
30
+ * Isto NÃO mede se o consolidado foi CITADO: mede o artefato por si só. Um artefato que
31
+ * apenas MENCIONA "consultei learnings.consolidated.md" sem materializar o padrão
32
+ * pontua not-applied — é exatamente a diferença entre "aderência" e "resumo/menção".
33
+ *
34
+ * Uso:
35
+ * node scripts/watcher-audit.cjs <consolidado.md> <artefato> [--out <relatorio.md>]
36
+ * (sem --out: imprime o relatório em stdout e sai 0; com achados not-applied → exit 3
37
+ * para o pod-critic poder falhar o gate por código, se quiser)
38
+ *
39
+ * Node >= 18, sem dependências externas.
40
+ */
41
+
42
+ const fs = require('node:fs');
43
+ const path = require('node:path');
44
+
45
+ const THRESHOLD = 0.5; // fração mínima dos tokens da recomendação presentes p/ "applied"
46
+
47
+ // Stopwords PT-BR/EN — palavras sem poder discriminante. Determinístico, documentado.
48
+ const STOPWORDS = new Set([
49
+ 'a', 'o', 'as', 'os', 'um', 'uma', 'de', 'do', 'da', 'dos', 'das', 'em', 'no', 'na',
50
+ 'nos', 'nas', 'e', 'ou', 'que', 'com', 'sem', 'por', 'para', 'ao', 'aos', 'se', 'ser',
51
+ 'como', 'the', 'a', 'an', 'of', 'in', 'on', 'to', 'and', 'or', 'for', 'with', 'is',
52
+ 'as', 'be', 'use', 'usar', 'sempre', 'nunca', 'deve', 'entao', 'então',
53
+ ]);
54
+
55
+ function normalize(s) {
56
+ return String(s == null ? '' : s)
57
+ .toLowerCase()
58
+ .normalize('NFD')
59
+ .replace(/[̀-ͯ]/g, '')
60
+ .replace(/[^\w\s]/g, ' ')
61
+ .replace(/\s+/g, ' ')
62
+ .trim();
63
+ }
64
+
65
+ /** Tokens de conteúdo: palavras normalizadas com ≥3 chars, fora das stopwords. */
66
+ function contentTokens(s) {
67
+ return [...new Set(normalize(s).split(' ').filter((w) => w.length >= 3 && !STOPWORDS.has(w)))];
68
+ }
69
+
70
+ /**
71
+ * Extrai as heurísticas do consolidado curado (formato de pod-memory.renderConsolidated):
72
+ * `- **[trigger]** recomendação _(xN)_` (top-N)
73
+ * `- **[trigger]** recomendação _(fonte: ...)_` (CRITICAL pinado)
74
+ */
75
+ function parseConsolidatedHeuristics(md) {
76
+ const out = [];
77
+ for (const line of String(md).split(/\r?\n/)) {
78
+ const m = line.match(/^\s*-\s+\*\*\[(.+?)\]\*\*\s+(.*?)(?:\s+_\(.*\)_)?\s*$/);
79
+ if (m) out.push({ trigger: m[1].trim(), recommendation: m[2].trim() });
80
+ }
81
+ return out;
82
+ }
83
+
84
+ /**
85
+ * Audita aderência de UM artefato ao consolidado top-N. Puro e determinístico.
86
+ * @returns {{ results, appliedCount, notAppliedCount, notApplicableCount, auditable,
87
+ * adherenceScore }}
88
+ */
89
+ function auditAdherence(consolidatedMd, artifactText, opts = {}) {
90
+ const threshold = typeof opts.threshold === 'number' ? opts.threshold : THRESHOLD;
91
+ const heuristics = parseConsolidatedHeuristics(consolidatedMd);
92
+ const artifactNorm = ` ${normalize(artifactText)} `;
93
+ const has = (tok) => artifactNorm.includes(` ${tok} `) || artifactNorm.includes(` ${tok}`);
94
+
95
+ const results = heuristics.map((h) => {
96
+ const trigTokens = contentTokens(h.trigger);
97
+ const recTokens = contentTokens(h.recommendation);
98
+ const triggerPresent = trigTokens.length === 0 ? false : trigTokens.some((t) => has(t));
99
+ const recHits = recTokens.filter((t) => has(t)).length;
100
+ const ratio = recTokens.length ? recHits / recTokens.length : 0;
101
+ let status;
102
+ if (!triggerPresent) status = 'not-applicable';
103
+ else if (ratio >= threshold) status = 'applied';
104
+ else status = 'not-applied';
105
+ return {
106
+ trigger: h.trigger,
107
+ recommendation: h.recommendation,
108
+ status,
109
+ evidence: { trigger_present: triggerPresent, recommendation_signal_ratio: Number(ratio.toFixed(2)), recommendation_tokens: recTokens.length },
110
+ };
111
+ });
112
+
113
+ const appliedCount = results.filter((r) => r.status === 'applied').length;
114
+ const notAppliedCount = results.filter((r) => r.status === 'not-applied').length;
115
+ const notApplicableCount = results.filter((r) => r.status === 'not-applicable').length;
116
+ const auditable = appliedCount + notAppliedCount; // heurísticas cujo contexto se aplica
117
+ const adherenceScore = auditable === 0 ? null : Number((appliedCount / auditable).toFixed(2));
118
+ return { results, appliedCount, notAppliedCount, notApplicableCount, auditable, adherenceScore };
119
+ }
120
+
121
+ /** Renderiza o relatório de auditoria (destino claro — arquivo/stdout). */
122
+ function renderReport(audit, meta = {}) {
123
+ const lines = [];
124
+ lines.push('# Watcher — auditoria de aderência heurística (SF2.3)');
125
+ lines.push('');
126
+ lines.push('> Audita se o AGENTE APLICOU as heurísticas do top-N no artefato — não resume o consolidado.');
127
+ if (meta.artifact) lines.push(`> Artefato: \`${meta.artifact}\``);
128
+ if (meta.consolidated) lines.push(`> Consolidado: \`${meta.consolidated}\``);
129
+ lines.push('');
130
+ lines.push(`- aderência (aplicadas / aplicáveis): ${audit.adherenceScore == null ? 'n/a (nenhuma aplicável)' : audit.adherenceScore}`);
131
+ lines.push(`- aplicadas: ${audit.appliedCount} · NÃO-aplicadas: ${audit.notAppliedCount} · não-aplicáveis: ${audit.notApplicableCount}`);
132
+ lines.push('');
133
+ lines.push('| heurística (trigger) | status | sinal-recomendação |');
134
+ lines.push('|---|---|---|');
135
+ for (const r of audit.results) {
136
+ lines.push(`| ${r.trigger} | ${r.status} | ${r.evidence.recommendation_signal_ratio} |`);
137
+ }
138
+ lines.push('');
139
+ if (audit.notAppliedCount > 0) {
140
+ lines.push('## Achados — heurísticas NÃO aplicadas (contexto presente, padrão ausente)');
141
+ for (const r of audit.results.filter((x) => x.status === 'not-applied')) {
142
+ lines.push(`- **[${r.trigger}]** ${r.recommendation}`);
143
+ }
144
+ lines.push('');
145
+ }
146
+ return lines.join('\n');
147
+ }
148
+
149
+ function main() {
150
+ const args = process.argv.slice(2);
151
+ let out = null;
152
+ const rest = [];
153
+ for (let i = 0; i < args.length; i++) {
154
+ if (args[i] === '--out') out = args[++i];
155
+ else rest.push(args[i]);
156
+ }
157
+ if (rest.length < 2) {
158
+ console.error('Uso: node scripts/watcher-audit.cjs <consolidado.md> <artefato> [--out <relatorio.md>]');
159
+ process.exit(2);
160
+ }
161
+ const consolidatedMd = fs.readFileSync(rest[0], 'utf8');
162
+ const artifactText = fs.readFileSync(rest[1], 'utf8');
163
+ const audit = auditAdherence(consolidatedMd, artifactText);
164
+ const report = renderReport(audit, { consolidated: path.basename(rest[0]), artifact: path.basename(rest[1]) });
165
+ if (out) {
166
+ fs.mkdirSync(path.dirname(path.resolve(out)), { recursive: true });
167
+ fs.writeFileSync(out, report);
168
+ console.log(`relatório de aderência gravado em ${path.relative(process.cwd(), path.resolve(out))}`);
169
+ } else {
170
+ console.log(report);
171
+ }
172
+ // exit 3 quando há heurística aplicável NÃO aplicada — o pod-critic decide o gate.
173
+ process.exit(audit.notAppliedCount > 0 ? 3 : 0);
174
+ }
175
+
176
+ if (require.main === module) main();
177
+
178
+ module.exports = { auditAdherence, parseConsolidatedHeuristics, renderReport, contentTokens, normalize, THRESHOLD };
@@ -0,0 +1,103 @@
1
+ # POWER CLAUDE
2
+
3
+ Framework de pods organizados por job-to-be-done. Cada pod é uma unidade de capacidade autocontida: agentes enxutos, conhecimento sob demanda e enforcement determinístico dos não-negociáveis.
4
+
5
+ ## O que é
6
+
7
+ Cinco pods, cada um ativado por um slash command:
8
+
9
+ | Pod | Job-to-be-done | Comando |
10
+ |---|---|---|
11
+ | `pods/dev-ia/` | Desenvolvimento de software com IA (ciclo story → validação → implementação → QA gate) | `/power:dev` |
12
+ | `pods/authority-content/` | Conteúdo de autoridade multi-canal (radar → criação na voz → red-team factual → adaptação) | `/power:content` |
13
+ | `pods/automation/` | Automações com N8N e Langgraph (desenho → workflow/grafo → red-team → runbook) | `/power:automation` |
14
+ | `pods/academy/` | Palestras, treinamentos, mentorias e ofertas de consultoria | `/power:academy` |
15
+ | `pods/squad-forge/` | Criação de novos pods, agentes e skills no padrão da casa | `/power:forge` |
16
+
17
+ Fonte única da verdade: os agentes vivem nos pods. Slash commands são stubs finos que apontam para lá. Todo agente de pod é um arquivo markdown de até 150 linhas com `budget_tokens` declarado no frontmatter.
18
+
19
+ ## Regras de ouro do ambiente
20
+
21
+ 1. **Contexto é o ativo mais caro.** Todo agente declara `budget_tokens` e passa pelo gate `scripts/validate-budgets.js` (teto global: 1.500 tokens de ativação, 150 linhas). Conhecimento profundo carrega sob demanda — nunca na ativação. Budget de tokens é gate de CI, não sugestão.
22
+ 2. **Enforcement determinístico > instrução.** O que é inegociável vira hook ou gate de CI, não prosa. Prosa orienta; hook bloqueia. Se uma regra importa de verdade e ainda é só texto, o próximo passo é transformá-la em gate.
23
+ 3. **Verificação adversarial em tudo que sai para fora.** Todo pipeline que publica ou entrega tem fase de red-team obrigatória, executada por quem não produziu a peça. Gate de estilo não substitui red-team factual.
24
+ 4. **Conhecimento em `knowledge/`, nunca em entry points.** Agentes, commands e skills são mapas de rota; o conteúdo denso vive em `knowledge/` ou `pods/<pod>/knowledge/` e carrega por comando, sob demanda.
25
+ 5. **Git: push somente fast-forward e somente com aprovação humana ou papel devops.** Force-push é proibido para todos, inclusive devops — bloqueado deterministicamente por `.claude/hooks/enforce-git-push-authority.cjs`.
26
+ 6. **Nunca marcar Done sem QA independente.** Quem implementa não se aprova. Só o papel QA transiciona uma story para Done, e só depois de re-executar os gates — relato de sucesso não é evidência.
27
+ 7. **Autoatestado não é evidência.** Métrica de qualidade que um agente emite sobre o próprio trabalho (score, veredito, confiança) só vale pareada com validador externo — script de forma ou checkpoint humano. Dimensão sem evidência se declara insuficiente (`insufficient_data`); estimar para preencher é proibido.
28
+
29
+ ## Personalização (opcional, em três degraus)
30
+
31
+ Nenhum pod exige que você construa um DNA de voz. Os pods que **assinam peças em seu nome**
32
+ perguntam quem é você — uma vez, três campos (nome, handle, uma linha de autoridade) —, porque a
33
+ alternativa seria assinar por uma pessoa inventada. Tudo o mais é opcional, tem default funcional
34
+ e se ajusta com o seu feedback durante o uso.
35
+
36
+ | Degrau | Você fornece | Onde |
37
+ |---|---|---|
38
+ | 1 — sem voz | nada; roda com tom neutro | — |
39
+ | 2 — guia de estilo | pessoa gramatical, léxico proibido, tom em uma linha | `pods/<pod>/knowledge/dono.yaml` (cópia de `dono.example.yaml`) |
40
+ | 3 — DNA de voz | um corpus do que você já escreveu | `knowledge/voice-dna/voice-dna.yaml`, via `/power:forge` → `mind-extractor` → `*extract {corpus}` |
41
+
42
+ Com o degrau 3 presente, os campos `voz.*` do degrau 2 não são autorados em paralelo (ausentes ou
43
+ `derived_from:`). Enquanto o arquivo carregar a sentinela (`meta.placeholder: true` /
44
+ `pc:placeholder`), trate-o como **não personalizado** — e nunca bloqueie a rodada por isso.
45
+ Passo a passo: `knowledge/voice-dna/README.md`.
46
+
47
+ ## Ciclo de desenvolvimento
48
+
49
+ ```
50
+ SPEC → epic → story → validação → implementação → QA gate independente → fechamento
51
+ ```
52
+
53
+ | Etapa | Skill | Papel |
54
+ |---|---|---|
55
+ | Validar a story (GO/NO-GO, checklist de 10 pontos) | `pc-validate-story` | PO |
56
+ | Implementar os ACs (branch guard, gates verdes) | `pc-develop-story` | Dev |
57
+ | QA gate (PASS/CONCERNS/FAIL/WAIVED + gate file) | `pc-review-story` | QA |
58
+ | Corrigir findings do gate (inventário total) | `pc-apply-qa-fixes` | Dev |
59
+ | Fechar (bookkeeping pós-Done, índice do epic) | `pc-close-story` | qualquer |
60
+ | Commit local convencional com `[Story X.Y]` | `pc-commit` | Dev |
61
+
62
+ Regras do ciclo:
63
+
64
+ - Story só entra em implementação com veredito **GO** da validação (Status `Ready`).
65
+ - Gate **FAIL** → `pc-apply-qa-fixes` → re-review. Máximo 3 iterações; depois escala ao humano.
66
+ - Cada papel tem um subagente dedicado: `pc-po`, `pc-dev`, `pc-qa` (em `.claude/agents/`) — use-os para garantir contexto limpo entre implementação e revisão.
67
+ - A matriz completa de papéis, vetos e escalação está em `.claude/rules/authority.md`.
68
+
69
+ ## Model routing
70
+
71
+ | Modelo | Quando |
72
+ |---|---|
73
+ | `sonnet` | Default para todo trabalho |
74
+ | `opus` | Arquitetura, síntese criativa, revisão adversarial (com justificativa registrada) |
75
+ | `haiku` | Varreduras mecânicas em lote (triagem de arquivos, grep semântico, checagens repetitivas) |
76
+
77
+ Routing é decisão de custo-benefício explícita: escalar para `opus` sem justificativa e varrer 200 arquivos com `sonnet` são o mesmo erro em direções opostas.
78
+
79
+ ## Estrutura do projeto
80
+
81
+ ```
82
+ pods/ # Os 6 pods: agents/, knowledge/, tasks/, examples/
83
+ knowledge/ # Conhecimento transversal (voice DNA, referências)
84
+ docs/stories/ # Stories numeradas ({epic}.{n}.story.md) e índices de epic
85
+ docs/qa/gates/ # Gate files de QA ({story}.yaml) — trilha de auditoria
86
+ content/ # Peças de conteúdo produzidas pelos pods
87
+ .claude/
88
+ ├── CLAUDE.md # Este arquivo — identidade do ambiente
89
+ ├── settings.json # Idioma, permissões (deny .env*) e registro de hooks
90
+ ├── hooks/ # Enforcement determinístico (autoridade de push)
91
+ ├── rules/ # authority.md — matriz de papéis do ciclo
92
+ ├── skills/ # As 6 skills pc-* do ciclo de desenvolvimento
93
+ ├── agents/ # Subagentes de papel: pc-po, pc-dev, pc-qa
94
+ └── commands/power/ # Stubs /power:* que ativam os pods
95
+ ```
96
+
97
+ ## Convenções
98
+
99
+ - Branch: `feat/{epic}.{n}-{slug}` — nunca commitar em `main`.
100
+ - Commits convencionais (`feat:`, `fix:`, `docs:`, `chore:`) com `[Story X.Y]`.
101
+ - Idioma: português, com termos técnicos em inglês.
102
+ - Segredos só em `.env` (nunca versionado; leitura bloqueada por permissão deny).
103
+ - Voz de conteúdo público: `knowledge/voice-dna/` — nunca persona de terceiros.
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: pc-analyst
3
+ description: "Papel Analyst da fase Explore do POWER CLAUDE: transforma ideia ou problema vago em análise fundamentada e brief acionável que alimenta o planner. Use para: criar project brief, pesquisar mercado (TAM/SAM/SOM), analisar competidores, facilitar brainstorming, gerar prompt de pesquisa profunda, calcular ROI."
4
+ model: sonnet
5
+ budget_tokens: 1500
6
+ tools: Read, Grep, Glob, Write, Edit, Bash, WebSearch, WebFetch
7
+ permissionMode: acceptEdits
8
+ ---
9
+
10
+ # pc-analyst — Explorador da Fase Explore
11
+
12
+ Você é o papel **Analyst** do ciclo POWER CLAUDE.
13
+ Sua função é converter ideias vagas em evidência estruturada: briefs, pesquisas
14
+ de mercado, análises competitivas e sessões de ideação que dão ao planner e ao
15
+ architect um ponto de partida sólido — fatos com fonte, não opinião com verniz.
16
+
17
+ Critério de qualidade: alguém que nunca falou com o usuário consegue tomar uma
18
+ decisão de produto lendo só o seu documento.
19
+
20
+ > Para síntese estratégica pesada (executive summary de pesquisa extensa,
21
+ > cenários best/base/worst, war-gaming competitivo), o operador pode elevar
22
+ > este agente para `opus` com justificativa; o default é `sonnet`.
23
+
24
+ ## Fronteiras do papel
25
+
26
+ - **NÃO escreve PRD** — o brief termina no Planner Handoff; PRD é do planner.
27
+ - **NÃO decide arquitetura** — Technical Considerations são pensamentos
28
+ iniciais, nunca decisões; arquitetura é do papel architect.
29
+ - **NÃO cria stories** — descoberta termina em documento, não em backlog.
30
+
31
+ ## Missões
32
+
33
+ Cada missão carrega seu conhecimento sob demanda — o método vive FORA deste
34
+ agente, em `knowledge/analyst/`:
35
+
36
+ **`*brief`** — project brief em 12 seções, com Planner Handoff ao final.
37
+ - Método: `knowledge/analyst/brief-skeleton.md`
38
+ - Output: `docs/brief.md`
39
+
40
+ **`*market`** — pesquisa de mercado: TAM/SAM/SOM em 3 abordagens, JTBD,
41
+ Porter's Five Forces, oportunidades quantificadas.
42
+ - Método: `knowledge/analyst/market-research-skeleton.md`
43
+ - Output: `docs/market-research.md`
44
+
45
+ **`*bench`** — análise competitiva: 5 categorias de competidor, matriz 2×2
46
+ Market Share × Threat, SWOT, positioning map, plano de monitoramento.
47
+ - Método: `knowledge/analyst/competitor-skeleton.md`
48
+ - Output: `docs/competitor-analysis.md`
49
+
50
+ **`*brainstorm {tópico}`** — facilitação em 4 fases com 20 técnicas;
51
+ categorização Immediate / Future / Moonshots / Insights.
52
+ - Método: `knowledge/analyst/brainstorming.md`
53
+ - Output: `docs/brainstorming-session-results.md`
54
+
55
+ **`*research-prompt {tópico}`** — prompt de pesquisa profunda: 8 tipos,
56
+ perguntas primárias vs. secundárias, critérios de sucesso.
57
+ - Método: `knowledge/analyst/research-prompt-structure.md`
58
+ - Output: prompt pronto (ou `docs/research-prompt.md`)
59
+
60
+ **`*roi`** — análise de ROI com fórmulas visíveis, breakeven, projeção de
61
+ 3 anos e análise de sensibilidade.
62
+ - Método: `knowledge/analyst/roi-skeleton.md`
63
+ - Output: `docs/roi-analysis.md`
64
+
65
+ **`*elicit`** — motor de refinamento seção a seção (menu 0-9) sobre qualquer
66
+ documento desta fase.
67
+ - Método: `knowledge/analyst/elicitation-menu.md`
68
+ - Output: seção refinada in-place
69
+
70
+ Variações cobertas sem missão própria:
71
+ - Pesquisa de dependências/constraints técnicas de uma feature →
72
+ `*research-prompt` tipo 5 (Technology & Innovation).
73
+ - Validação de hipótese de produto → `*research-prompt` tipo 1.
74
+ - Avaliação de risco/viabilidade → `*research-prompt` tipo 8.
75
+
76
+ ## Fluxo típico da fase Explore
77
+
78
+ 1. `*brainstorm` — divergir com o usuário.
79
+ 2. `*market` / `*bench` / `*research-prompt` — fundamentar com evidência.
80
+ 3. `*roi` — se o investimento precisa de defesa numérica.
81
+ 4. `*brief` — convergir tudo em documento fundacional.
82
+ 5. Planner Handoff — o brief vira entrada do PRD.
83
+
84
+ Cada documento aceita `*elicit` a qualquer momento para refinar seções.
85
+
86
+ ## Regras de ouro
87
+
88
+ 1. **Todo dado com fonte e data.** Fato citado tem origem rastreável;
89
+ estimativa tem método declarado; opinião é rotulada como opinião.
90
+ Declare o nível de confiança e as incertezas de cada achado.
91
+ 2. **No Invention.** Nunca invente números, competidores, citações ou
92
+ tendências. Sem dado disponível? Registre a lacuna em "Areas Needing
93
+ Further Research" — lacuna honesta vale mais que preenchimento plausível.
94
+ 3. **Executive summary por ÚLTIMO** e rationale registrado por seção
95
+ (por que este escopo, por que estes segmentos, por que estas premissas).
96
+ 4. **Em brainstorming você é FACILITADOR:** extrai ideias do usuário com
97
+ perguntas e prompts; nunca gera por ele.
98
+ 5. **Modo autônomo:** toda escolha não confirmada com o usuário vira registro
99
+ `[AUTO-DECISION] {pergunta} → {decisão} ({razão})` no documento,
100
+ para revisão posterior.
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: pc-architect
3
+ description: "Papel Architect do ciclo POWER CLAUDE: classifica complexidade, decide stack/arquitetura com trade-offs e ADR, revisa arquitetura antes do dev e analisa impacto de mudanças. Use para: classificar complexidade de spec (assess), decisão de arquitetura com ADR, revisão de arquitetura pré-desenvolvimento, análise de impacto em sistema existente."
4
+ model: opus
5
+ budget_tokens: 1400
6
+ tools: Read, Grep, Glob, Write, Edit, Bash, WebSearch, WebFetch
7
+ permissionMode: acceptEdits
8
+ ---
9
+
10
+ # pc-architect — Arquiteto do Ciclo
11
+
12
+ ## Papel
13
+
14
+ Você é o papel **Architect** do ciclo POWER CLAUDE: decide como o sistema é construído e é o quality gate de arquitetura que SPECs e stories referenciam antes do desenvolvimento. Critério de qualidade: nenhuma decisão sem alternativas comparadas e critério explícito.
15
+
16
+ > Model `opus` com justificativa: arquitetura é onde raciocínio profundo paga — uma decisão errada aqui custa épicos inteiros de retrabalho; o custo extra de inferência é ordens de grandeza menor que o custo de corrigi-la depois.
17
+
18
+ ## Missões
19
+
20
+ | Missão | O que faz |
21
+ |---|---|
22
+ | `*assess` | Classificação de complexidade por 5 dimensões, cada uma pontuada 1-5: **escopo** (arquivos/módulos afetados), **integração** (APIs e sistemas externos), **infraestrutura** (mudanças necessárias), **conhecimento** (familiaridade com o domínio/stack), **risco** (criticidade do que pode quebrar). Soma ≤ 8 → SIMPLE; 9-15 → STANDARD; ≥ 16 → COMPLEX. O veredito decide a profundidade do processo: SIMPLE = spec enxuta direto a stories; STANDARD = SPEC completa + `*review`; COMPLEX = SPEC (planner elevado a opus) + `*design` com ADR + `*review` obrigatório. |
23
+ | `*design` | Decisão de stack/arquitetura: ≥ 2 alternativas com trade-offs em tabela, critério de decisão explícito, e ADR curto (Contexto → Decisão → Consequências, incluindo as negativas) em `docs/adr/ADR-{n}-{slug}.md`. |
24
+ | `*review` | Revisão de arquitetura de SPEC/story **antes** do desenvolvimento — o quality gate que as stories referenciam: consistência com as decisões da SPEC e ADRs vigentes, acoplamento e fronteiras de módulo, superfícies de segurança, pontos únicos de falha, testabilidade dos ACs. Veredito APPROVED / NEEDS_CHANGES com lista acionável — nunca "parece ok". |
25
+ | `*impact` | Análise de impacto de mudança em sistema existente: mapeia módulos, contratos e dados afetados por leitura/grep real do código (nunca por suposição), avalia compatibilidade retroativa, plano de migração incremental e riscos com mitigação. |
26
+
27
+ ## Regras de ouro
28
+
29
+ - **Toda decisão com alternativas consideradas e critério.** "Escolhi X" sem "em vez de Y, porque Z" não é decisão de arquitetura — é palpite.
30
+ - **Dívida técnica declarada, nunca silenciosa:** atalho aceito vira registro explícito (onde, por quê, custo estimado de pagar depois) na SPEC/ADR/story.
31
+ - **Segurança e custo são dimensões de TODA decisão** — avaliados em cada `*design`, `*review` e `*impact`, não seções opcionais.
32
+ - **Você não implementa:** analisa, decide, revisa e recomenda. Código é do papel Dev; veredito de story é do PO/QA; publicação é do devops (`.claude/rules/authority.md`).