ceo-orchestration 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2356) hide show
  1. package/.claude/adr/ADR-001-runtime-state-directory.md +164 -0
  2. package/.claude/adr/ADR-002-hooks-package-layout.md +228 -0
  3. package/.claude/adr/ADR-003-branch-protection-replaces-skill-signing.md +266 -0
  4. package/.claude/adr/ADR-004-defer-bash-legacy-removal.md +171 -0
  5. package/.claude/adr/ADR-005-event-stream-v2.md +153 -0
  6. package/.claude/adr/ADR-006-registry-derived-manifests.md +145 -0
  7. package/.claude/adr/ADR-007-spec-v1-semver-rc-policy.md +159 -0
  8. package/.claude/adr/ADR-008-hook-adapter-layer.md +169 -0
  9. package/.claude/adr/ADR-009-squad-contract.md +167 -0
  10. package/.claude/adr/ADR-010-canonical-edit-sentinel.md +181 -0
  11. package/.claude/adr/ADR-011-event-stream-v2.1-injection-flag.md +150 -0
  12. package/.claude/adr/ADR-012-cross-adapter-golden-fixtures.md +182 -0
  13. package/.claude/adr/ADR-013-squad-trading-hft.md +135 -0
  14. package/.claude/adr/ADR-014-hook-migration-batch-policy.md +197 -0
  15. package/.claude/adr/ADR-015-reflexion-v2-outcome-loop.md +248 -0
  16. package/.claude/adr/ADR-016-spawn-token-tracking.md +179 -0
  17. package/.claude/adr/ADR-017-lesson-pruning-policy.md +193 -0
  18. package/.claude/adr/ADR-018-claim-grammar.md +302 -0
  19. package/.claude/adr/ADR-019-AMEND-1-confidence-gate-block-mode-lifecycle.md +128 -0
  20. package/.claude/adr/ADR-019-AMEND-2-CLASS-SHA_EXISTS-promote-to-high-confidence-block.md +67 -0
  21. package/.claude/adr/ADR-019-confidence-gate-enforcement-lifecycle.md +221 -0
  22. package/.claude/adr/ADR-020-lesson-pruning-policy-v2.md +171 -0
  23. package/.claude/adr/ADR-021-e2e-harness-contract.md +189 -0
  24. package/.claude/adr/ADR-022-reserved-slot.md +52 -0
  25. package/.claude/adr/ADR-023-docs-freshness-lifecycle.md +184 -0
  26. package/.claude/adr/ADR-024-perf-baseline-policy.md +222 -0
  27. package/.claude/adr/ADR-025-squad-edtech.md +236 -0
  28. package/.claude/adr/ADR-026-squad-government.md +263 -0
  29. package/.claude/adr/ADR-027-unified-agent-state-backend.md +266 -0
  30. package/.claude/adr/ADR-028-multi-llm-canonical-parity.md +244 -0
  31. package/.claude/adr/ADR-029-lexical-tfidf-retrieval.md +205 -0
  32. package/.claude/adr/ADR-030-llm-as-judge-methodology.md +336 -0
  33. package/.claude/adr/ADR-031-self-improving-skills.md +221 -0
  34. package/.claude/adr/ADR-032-interactive-debate-protocol.md +337 -0
  35. package/.claude/adr/ADR-033-cost-budget-enforcement.md +275 -0
  36. package/.claude/adr/ADR-034-shared-working-memory.md +233 -0
  37. package/.claude/adr/ADR-035-otel-export.md +242 -0
  38. package/.claude/adr/ADR-036-output-safety.md +263 -0
  39. package/.claude/adr/ADR-037-chaos-testing-methodology.md +289 -0
  40. package/.claude/adr/ADR-038-session-graph-continuity.md +243 -0
  41. package/.claude/adr/ADR-039-skill-marketplace-protocol.md +170 -0
  42. package/.claude/adr/ADR-040-AMEND-2-credential-blocking.md +390 -0
  43. package/.claude/adr/ADR-040-live-adapter-activation-contract.md +285 -0
  44. package/.claude/adr/ADR-041-transition-log-convention.md +272 -0
  45. package/.claude/adr/ADR-042-AMEND-1-read-only-mcp-tools-expansion.md +214 -0
  46. package/.claude/adr/ADR-042-mcp-server-contract.md +727 -0
  47. package/.claude/adr/ADR-043-soc2-audit-trail-mapping.md +503 -0
  48. package/.claude/adr/ADR-044-formal-verification-pilot.md +505 -0
  49. package/.claude/adr/ADR-045-policy-as-code-engine.md +705 -0
  50. package/.claude/adr/ADR-046-deterministic-replay.md +167 -0
  51. package/.claude/adr/ADR-047-predictive-budgeting.md +213 -0
  52. package/.claude/adr/ADR-048-cross-plan-memory.md +227 -0
  53. package/.claude/adr/ADR-049-policy-engine-dual-path-deprecation.md +96 -0
  54. package/.claude/adr/ADR-049a-worktree-orchestration-policy.md +414 -0
  55. package/.claude/adr/ADR-050-native-subagents-dual-rail.md +165 -0
  56. package/.claude/adr/ADR-051-skill-reference-expanded-trust-boundary.md +282 -0
  57. package/.claude/adr/ADR-052-multi-model-dispatch-by-role.md +444 -0
  58. package/.claude/adr/ADR-053-sentinel-hmac-deferred.md +227 -0
  59. package/.claude/adr/ADR-054-AMEND-1-anthropic-admin-key-tier.md +131 -0
  60. package/.claude/adr/ADR-054-github-token-rotation.md +111 -0
  61. package/.claude/adr/ADR-055-AMEND-1-spool-writer-async-drain.md +170 -0
  62. package/.claude/adr/ADR-055-AMEND-2-chain-reset-marker.md +126 -0
  63. package/.claude/adr/ADR-055-AMEND-3-opportunistic-drain-nonblocking.md +183 -0
  64. package/.claude/adr/ADR-055-audit-log-hmac-chain.md +264 -0
  65. package/.claude/adr/ADR-056-hook-lifecycle-expansion.md +261 -0
  66. package/.claude/adr/ADR-057-output-scan-redaction.md +268 -0
  67. package/.claude/adr/ADR-058-brainstorm-gate-and-two-pass-review.md +240 -0
  68. package/.claude/adr/ADR-059-skill-bootstrap-env-knob.md +204 -0
  69. package/.claude/adr/ADR-060-curated-skill-import-pipeline.md +464 -0
  70. package/.claude/adr/ADR-061-runtime-cost-streaming.md +171 -0
  71. package/.claude/adr/ADR-062-AMEND-1-rag-conditional-default-on-supersedes-opt-in.md +232 -0
  72. package/.claude/adr/ADR-062-rag-sidecar-mcp-opt-in.md +231 -0
  73. package/.claude/adr/ADR-063-agent-eval-empirical-dispatch-validation.md +609 -0
  74. package/.claude/adr/ADR-064-dynamic-tier-policy-learned-dispatch.md +288 -0
  75. package/.claude/adr/ADR-065-audit-event-naming-convention.md +185 -0
  76. package/.claude/adr/ADR-066-context-mode-orthogonal-to-manifest.md +92 -0
  77. package/.claude/adr/ADR-067-ceo-model-downshift-static-routing.md +219 -0
  78. package/.claude/adr/ADR-069-wondelai-skills-import-refused.md +183 -0
  79. package/.claude/adr/ADR-070-audit-emit-package-layout.md +228 -0
  80. package/.claude/adr/ADR-071-benchmark-comparison-methodology.md +209 -0
  81. package/.claude/adr/ADR-072-test-discovery-via-conftest.md +184 -0
  82. package/.claude/adr/ADR-073-semver-bump-criteria-sprint-32.md +209 -0
  83. package/.claude/adr/ADR-074-sprint-32-phase-3-b1-refused.md +320 -0
  84. package/.claude/adr/ADR-075-sprint-32-phase-5-b5-benchmark-refused.md +250 -0
  85. package/.claude/adr/ADR-076-sprint-32-final-closure.md +218 -0
  86. package/.claude/adr/ADR-077-2026-04-24-webfetch-injection-incident.md +203 -0
  87. package/.claude/adr/ADR-078-sentinel-cosign-clarification.md +295 -0
  88. package/.claude/adr/ADR-079-prompt-sha-salt-hmac-impact.md +221 -0
  89. package/.claude/adr/ADR-080-rail-anomaly-h4-defense-in-depth.md +1143 -0
  90. package/.claude/adr/ADR-081-token-as-time-unit.md +272 -0
  91. package/.claude/adr/ADR-082-l7c-mitigation-default-on.md +240 -0
  92. package/.claude/adr/ADR-083-mcp-injection-scanner.md +225 -0
  93. package/.claude/adr/ADR-084-multi-adapter-refused-claude-only.md +152 -0
  94. package/.claude/adr/ADR-085-framework-landscape-claude-only.md +183 -0
  95. package/.claude/adr/ADR-086-checkpointing-refused.md +124 -0
  96. package/.claude/adr/ADR-087-AMEND-1-otel-consume-native-opt-in.md +217 -0
  97. package/.claude/adr/ADR-087-otel-emit-refused.md +136 -0
  98. package/.claude/adr/ADR-088-guardrails-library-refused.md +128 -0
  99. package/.claude/adr/ADR-089-sec-cluster-disposition.md +182 -0
  100. package/.claude/adr/ADR-090-framework-activation-defaults.md +217 -0
  101. package/.claude/adr/ADR-091-dogfood-validation-deferred.md +128 -0
  102. package/.claude/adr/ADR-092-plan-closure-honest-deferral.md +165 -0
  103. package/.claude/adr/ADR-093-refused-adr-moratorium.md +181 -0
  104. package/.claude/adr/ADR-094-claude-sdk-compat-version-pinning.md +160 -0
  105. package/.claude/adr/ADR-095-calendar-gate-retraction.md +202 -0
  106. package/.claude/adr/ADR-096-vibecoder-only-by-design.md +215 -0
  107. package/.claude/adr/ADR-097-function-length-advisory-permanent.md +186 -0
  108. package/.claude/adr/ADR-098-ceo-boot-audit-emit-register.md +251 -0
  109. package/.claude/adr/ADR-099-changesets-adoption.md +245 -0
  110. package/.claude/adr/ADR-100-trusted-dependencies-re-affirm.md +208 -0
  111. package/.claude/adr/ADR-101-replay-redact-helper.md +106 -0
  112. package/.claude/adr/ADR-102-mcp-introspection-extends-042.md +165 -0
  113. package/.claude/adr/ADR-103-calendar-gate-final-purge.md +121 -0
  114. package/.claude/adr/ADR-104-AMEND-1-aek-dated-promotion-criteria.md +338 -0
  115. package/.claude/adr/ADR-104-adaptive-execution-kernel-advisory.md +210 -0
  116. package/.claude/adr/ADR-105-multi-llm-coordinated-supersede.md +126 -0
  117. package/.claude/adr/ADR-106-codex-mcp-adapter-contract.md +153 -0
  118. package/.claude/adr/ADR-107-pair-rail-mandatory-l2-plus.md +189 -0
  119. package/.claude/adr/ADR-108-cross-llm-veto-floor.md +129 -0
  120. package/.claude/adr/ADR-109-codex-skill-rehash-protocol.md +104 -0
  121. package/.claude/adr/ADR-110-codex-pretool-enforcement.md +94 -0
  122. package/.claude/adr/ADR-111-locked-corpus-governance.md +191 -0
  123. package/.claude/adr/ADR-112-grandfather-cap-scope-clarification.md +192 -0
  124. package/.claude/adr/ADR-113-plan-084-canonical-guard-extension.md +59 -0
  125. package/.claude/adr/ADR-114-codex-egress-redaction-symmetry.md +72 -0
  126. package/.claude/adr/ADR-115-post-sota-maintenance-mode.md +152 -0
  127. package/.claude/adr/ADR-116-AMEND-1-kernel-extension-v2.md +640 -0
  128. package/.claude/adr/ADR-116-kernel-hard-deny-tier-0-extension.md +465 -0
  129. package/.claude/adr/ADR-117-adr-id-collision-rename-policy.md +279 -0
  130. package/.claude/adr/ADR-118-AMEND-1-phase-c-enforcing-flip.md +191 -0
  131. package/.claude/adr/ADR-118-god-mode-auto-usable-state.md +338 -0
  132. package/.claude/adr/ADR-119-sentinel-unlock-contract.md +133 -0
  133. package/.claude/adr/ADR-120-pii-core-promotion.md +280 -0
  134. package/.claude/adr/ADR-121-sentinel-signers-rotation-policy.md +434 -0
  135. package/.claude/adr/ADR-122-dpop-mcp-bearer-replay-defense.md +232 -0
  136. package/.claude/adr/ADR-123-streaming-adapter-canonical-source.md +130 -0
  137. package/.claude/adr/ADR-124-post-audit-sota-execution-mode.md +362 -0
  138. package/.claude/adr/ADR-125-risk-tiered-defaulting-doctrine.md +355 -0
  139. package/.claude/adr/ADR-126-governed-sidecar-capability-model.md +509 -0
  140. package/.claude/adr/ADR-127-pair-rail-advisory-promotion.md +218 -0
  141. package/.claude/adr/ADR-128-c2-vector-memory-capability-class.md +380 -0
  142. package/.claude/adr/ADR-129-AMEND-1-key-floor-waiver-lift.md +249 -0
  143. package/.claude/adr/ADR-129-c1-crypto-capability-class.md +289 -0
  144. package/.claude/adr/ADR-131-c5-dev-tools-capability-class.md +215 -0
  145. package/.claude/adr/ADR-132-goap-advisory-planning-doctrine.md +333 -0
  146. package/.claude/adr/ADR-133-autonomous-loop-opt-in-capability-doctrine.md +440 -0
  147. package/.claude/adr/ADR-135-AMEND-1-write-mode-trust-boundary.md +457 -0
  148. package/.claude/adr/ADR-135-AMEND-2-write-mode-activation.md +175 -0
  149. package/.claude/adr/ADR-135-federation-contract-mvp.md +253 -0
  150. package/.claude/adr/ADR-136-AMEND-1-workflow-primitive-adoption.md +139 -0
  151. package/.claude/adr/ADR-136-workflow-engine-doctrine.md +155 -0
  152. package/.claude/adr/ADR-137-skill-priority-stack-decision.md +162 -0
  153. package/.claude/adr/ADR-138-ac-format-priority-and-story-anchor.md +149 -0
  154. package/.claude/adr/ADR-139-coverage-doctrine-tiered.md +133 -0
  155. package/.claude/adr/ADR-140-receiving-review-doctrine.md +136 -0
  156. package/.claude/adr/ADR-141-reduce-protocol.md +124 -0
  157. package/.claude/adr/ADR-142-opus-4-8-model-bump.md +116 -0
  158. package/.claude/adr/ADR-143-git-hook-bypass-guard.md +166 -0
  159. package/.claude/adr/ADR-144-subagent-model-tiering-frontmatter.md +111 -0
  160. package/.claude/adr/ADR-145-cross-model-review-persona-demand-modality.md +103 -0
  161. package/.claude/adr/ADR-146-adversary-review-hook.md +122 -0
  162. package/.claude/adr/ADR-147-eval-harness-doctrine.md +109 -0
  163. package/.claude/adr/ADR-148-canonical-pricing-source.md +123 -0
  164. package/.claude/adr/ADR-149-model-id-allowlist.md +196 -0
  165. package/.claude/adr/ADR-150-commit-signing-policy.md +12 -0
  166. package/.claude/adr/ADR-151-fan-plan-advisory-bridge.md +178 -0
  167. package/.claude/adr/ADR-152-claude-md-decomposition.md +262 -0
  168. package/.claude/adr/ADR-153-compaction-continuity.md +141 -0
  169. package/.claude/adr/ADR-154-updatedinput-single-rewriter.md +68 -0
  170. package/.claude/adr/ADR-155-install-baseline-manifest.md +66 -0
  171. package/.claude/adr/ADR-156-constitution-sync-cascade.md +122 -0
  172. package/.claude/adr/README.md +392 -0
  173. package/.claude/adversary.md +116 -0
  174. package/.claude/agent-metrics.md +101 -0
  175. package/.claude/agents/_dispatch.md +30 -0
  176. package/.claude/agents/_probe_architect.md +45 -0
  177. package/.claude/agents/_probe_canonical_edit.md +46 -0
  178. package/.claude/agents/_probe_missing_skill.md +42 -0
  179. package/.claude/agents/code-reviewer.md +166 -0
  180. package/.claude/agents/devops.md +114 -0
  181. package/.claude/agents/identity-trust-architect.md +234 -0
  182. package/.claude/agents/incident-commander.md +285 -0
  183. package/.claude/agents/llm-finops-architect.md +265 -0
  184. package/.claude/agents/performance-engineer.md +148 -0
  185. package/.claude/agents/qa-architect.md +167 -0
  186. package/.claude/agents/security-engineer.md +192 -0
  187. package/.claude/agents/threat-detection-engineer.md +238 -0
  188. package/.claude/benchmarks/_schemas/judge-prompt.md +26 -0
  189. package/.claude/benchmarks/_schemas/judge-rubric-example.json +11 -0
  190. package/.claude/benchmarks/_schemas/judge-rubric.yaml +39 -0
  191. package/.claude/benchmarks/calibration-grades.jsonl +6 -0
  192. package/.claude/benchmarks/human-sample-calibration.md +232 -0
  193. package/.claude/benchmarks/judge-rotation-schedule.md +61 -0
  194. package/.claude/benchmarks/retrieval-judgment-set.yaml +194 -0
  195. package/.claude/benchmarks/tests/test_retrieval_recall_gate.py +330 -0
  196. package/.claude/commands/agent-budget.md +105 -0
  197. package/.claude/commands/architect.md +130 -0
  198. package/.claude/commands/audit-page.md +149 -0
  199. package/.claude/commands/audit-tokens.md +89 -0
  200. package/.claude/commands/ceo-boot.md +118 -0
  201. package/.claude/commands/ceo-info.md +71 -0
  202. package/.claude/commands/debate.md +258 -0
  203. package/.claude/commands/effort.md +99 -0
  204. package/.claude/commands/fan-plan.md +129 -0
  205. package/.claude/commands/goap.md +163 -0
  206. package/.claude/commands/lesson-review.md +66 -0
  207. package/.claude/commands/memory-scratchpad.md +100 -0
  208. package/.claude/commands/onboard.md +204 -0
  209. package/.claude/commands/pitfall.md +54 -0
  210. package/.claude/commands/resume.md +90 -0
  211. package/.claude/commands/self-test.md +83 -0
  212. package/.claude/commands/skill-review.md +102 -0
  213. package/.claude/commands/spawn.md +212 -0
  214. package/.claude/commands/squad-install.md +94 -0
  215. package/.claude/commands/status.md +177 -0
  216. package/.claude/commands/terse.md +81 -0
  217. package/.claude/commands/veto-check.md +63 -0
  218. package/.claude/data/audit-registry.golden.txt +306 -0
  219. package/.claude/data/canonical_models.json +1030 -0
  220. package/.claude/data/confidence-gate-class-tiers.json +24 -0
  221. package/.claude/data/cookbook_patterns.json +139 -0
  222. package/.claude/data/federation/enabled.md +34 -0
  223. package/.claude/data/federation/lan-enabled.md +38 -0
  224. package/.claude/data/federation/peers.example.yaml +89 -0
  225. package/.claude/data/goap/action-cost-baseline.json +29 -0
  226. package/.claude/dispatcher/disable_predicate_eval.py +630 -0
  227. package/.claude/dispatcher/routing-matrix-loader.py +874 -0
  228. package/.claude/dispatcher/routing-matrix.yaml +343 -0
  229. package/.claude/dispatcher/tests/conftest.py +11 -0
  230. package/.claude/dispatcher/tests/test_disable_predicate_eval.py +424 -0
  231. package/.claude/dispatcher/tests/test_routing_matrix_loader.py +461 -0
  232. package/.claude/docs/dpop-scope.md +79 -0
  233. package/.claude/docs/sentinel-signers-rotation-DRAFT.md +117 -0
  234. package/.claude/eval/README.md +73 -0
  235. package/.claude/eval/reporter.py +109 -0
  236. package/.claude/eval/runner.py +532 -0
  237. package/.claude/eval/self_test.yaml +57 -0
  238. package/.claude/eval/tasks/__init__.py +185 -0
  239. package/.claude/eval/tasks/t01_fix_off_by_one.py +52 -0
  240. package/.claude/eval/tasks/t02_implement_fizzbuzz.py +65 -0
  241. package/.claude/eval/tasks/t03_json_config_parse.py +80 -0
  242. package/.claude/eval/tasks/t04_refactor_dedupe.py +71 -0
  243. package/.claude/eval/tasks/t05_add_unit_test.py +77 -0
  244. package/.claude/eval/tasks/t06_palindrome.py +58 -0
  245. package/.claude/eval/tasks/t07_sql_param_fix.py +69 -0
  246. package/.claude/eval/tasks/t08_word_count.py +53 -0
  247. package/.claude/eval/tasks/t09_readme_doc.py +64 -0
  248. package/.claude/eval/tasks/t10_binary_search.py +58 -0
  249. package/.claude/frontend-team.md +202 -0
  250. package/.claude/governance/README.md +37 -0
  251. package/.claude/governance/audit_tokens_allowlist.json +37 -0
  252. package/.claude/governance/codex-cli-binary-sha256.txt +32 -0
  253. package/.claude/governance/codex-cli-pin.txt +26 -0
  254. package/.claude/governance/function-length-grandfather.yaml +2095 -0
  255. package/.claude/governance/governance-waivers.yaml +28 -0
  256. package/.claude/governance/pair-rail-inputs-hash-manifest.txt +32 -0
  257. package/.claude/governance/pair-rail-verdict-template.md +58 -0
  258. package/.claude/governance/pair-rail-verdict-v1.16.0-rc.1.md +120 -0
  259. package/.claude/governance/pair-rail-verdict-v1.16.0.md +64 -0
  260. package/.claude/gpg-revocations.jsonl +1 -0
  261. package/.claude/hooks/SessionEnd.py +353 -0
  262. package/.claude/hooks/SessionStart.py +345 -0
  263. package/.claude/hooks/Stop.py +195 -0
  264. package/.claude/hooks/UserPromptSubmit.py +329 -0
  265. package/.claude/hooks/_lib/EXECUTION-CONTEXT-DEFERRED.md +82 -0
  266. package/.claude/hooks/_lib/__init__.py +26 -0
  267. package/.claude/hooks/_lib/action_required.py +592 -0
  268. package/.claude/hooks/_lib/adapters/__init__.py +87 -0
  269. package/.claude/hooks/_lib/adapters/_constants.py +127 -0
  270. package/.claude/hooks/_lib/adapters/claude.py +167 -0
  271. package/.claude/hooks/_lib/adapters/codex.py +754 -0
  272. package/.claude/hooks/_lib/adapters/live/__init__.py +378 -0
  273. package/.claude/hooks/_lib/adapters/live/_breaker.py +309 -0
  274. package/.claude/hooks/_lib/adapters/live/_cost.py +389 -0
  275. package/.claude/hooks/_lib/adapters/live/_policy.py +319 -0
  276. package/.claude/hooks/_lib/adapters/live/_result.py +206 -0
  277. package/.claude/hooks/_lib/adapters/live/_transport.py +681 -0
  278. package/.claude/hooks/_lib/adapters/live/claude.py +1027 -0
  279. package/.claude/hooks/_lib/adapters/live/claude_batch.py +652 -0
  280. package/.claude/hooks/_lib/adapters/live/gemini.py +270 -0
  281. package/.claude/hooks/_lib/adapters/live/local.py +195 -0
  282. package/.claude/hooks/_lib/adapters/live/openai.py +371 -0
  283. package/.claude/hooks/_lib/adversary_rules.py +196 -0
  284. package/.claude/hooks/_lib/agent_frontmatter.py +288 -0
  285. package/.claude/hooks/_lib/audit_emit.py +11746 -0
  286. package/.claude/hooks/_lib/audit_emit_dispatch.py +179 -0
  287. package/.claude/hooks/_lib/audit_hmac.py +1146 -0
  288. package/.claude/hooks/_lib/audit_rotation.py +101 -0
  289. package/.claude/hooks/_lib/canonical_json.py +145 -0
  290. package/.claude/hooks/_lib/codex_cli_shape.py +502 -0
  291. package/.claude/hooks/_lib/codex_egress_redact.py +185 -0
  292. package/.claude/hooks/_lib/confidence_labels.py +338 -0
  293. package/.claude/hooks/_lib/contract.py +254 -0
  294. package/.claude/hooks/_lib/cookbook_patterns.py +136 -0
  295. package/.claude/hooks/_lib/cost_envelope.py +719 -0
  296. package/.claude/hooks/_lib/credentials.py +188 -0
  297. package/.claude/hooks/_lib/effective_config.py +767 -0
  298. package/.claude/hooks/_lib/egress_taxonomy.py +448 -0
  299. package/.claude/hooks/_lib/embeddings.py +322 -0
  300. package/.claude/hooks/_lib/env_guard.py +353 -0
  301. package/.claude/hooks/_lib/env_persist_allowlist.py +147 -0
  302. package/.claude/hooks/_lib/escalation_signals.py +335 -0
  303. package/.claude/hooks/_lib/estimation/__init__.py +12 -0
  304. package/.claude/hooks/_lib/estimation/bayesian.py +147 -0
  305. package/.claude/hooks/_lib/estimation/pipeline.py +209 -0
  306. package/.claude/hooks/_lib/exceptions.py +101 -0
  307. package/.claude/hooks/_lib/execution_context.py +208 -0
  308. package/.claude/hooks/_lib/federation/__init__.py +104 -0
  309. package/.claude/hooks/_lib/federation/audit_chain.py +118 -0
  310. package/.claude/hooks/_lib/federation/audit_chain_ext.py +408 -0
  311. package/.claude/hooks/_lib/federation/cert_inspector.py +573 -0
  312. package/.claude/hooks/_lib/federation/client.py +327 -0
  313. package/.claude/hooks/_lib/federation/handlers/__init__.py +30 -0
  314. package/.claude/hooks/_lib/federation/handlers/audit_event_batch.py +346 -0
  315. package/.claude/hooks/_lib/federation/handlers/audit_event_push.py +395 -0
  316. package/.claude/hooks/_lib/federation/handlers/peer_register.py +484 -0
  317. package/.claude/hooks/_lib/federation/handlers/peer_revoke.py +356 -0
  318. package/.claude/hooks/_lib/federation/identity.py +1056 -0
  319. package/.claude/hooks/_lib/federation/rate_limit.py +476 -0
  320. package/.claude/hooks/_lib/federation/replay.py +284 -0
  321. package/.claude/hooks/_lib/federation/scopes.py +168 -0
  322. package/.claude/hooks/_lib/federation/server.py +2218 -0
  323. package/.claude/hooks/_lib/file_walker.py +145 -0
  324. package/.claude/hooks/_lib/filelock.py +191 -0
  325. package/.claude/hooks/_lib/frontmatter.py +124 -0
  326. package/.claude/hooks/_lib/git_bypass.py +971 -0
  327. package/.claude/hooks/_lib/gpg_verify.py +356 -0
  328. package/.claude/hooks/_lib/guardrail_validator.py +478 -0
  329. package/.claude/hooks/_lib/injection_patterns.py +252 -0
  330. package/.claude/hooks/_lib/injection_salt.py +160 -0
  331. package/.claude/hooks/_lib/mcp/__init__.py +5 -0
  332. package/.claude/hooks/_lib/mcp/bearer_replay.py +279 -0
  333. package/.claude/hooks/_lib/mcp/canonical_guard.py +1140 -0
  334. package/.claude/hooks/_lib/mcp_bearer_friction.py +475 -0
  335. package/.claude/hooks/_lib/mcp_injection_scan.py +250 -0
  336. package/.claude/hooks/_lib/mcp_routing.py +151 -0
  337. package/.claude/hooks/_lib/memory_shared.py +592 -0
  338. package/.claude/hooks/_lib/metrics.py +241 -0
  339. package/.claude/hooks/_lib/model_routing.py +227 -0
  340. package/.claude/hooks/_lib/otel/__init__.py +34 -0
  341. package/.claude/hooks/_lib/otel/bounded_exporter.py +373 -0
  342. package/.claude/hooks/_lib/otel/hook_bridge.py +53 -0
  343. package/.claude/hooks/_lib/otel/queue.py +229 -0
  344. package/.claude/hooks/_lib/otel_emit.py +604 -0
  345. package/.claude/hooks/_lib/output_scan.py +1062 -0
  346. package/.claude/hooks/_lib/output_scan_dedup.py +379 -0
  347. package/.claude/hooks/_lib/pair_rail_decide.py +244 -0
  348. package/.claude/hooks/_lib/payload.py +195 -0
  349. package/.claude/hooks/_lib/persona_routing.py +244 -0
  350. package/.claude/hooks/_lib/pii_patterns.py +851 -0
  351. package/.claude/hooks/_lib/plan_frontmatter.py +166 -0
  352. package/.claude/hooks/_lib/policy.py +1527 -0
  353. package/.claude/hooks/_lib/policy_preprocessors.py +462 -0
  354. package/.claude/hooks/_lib/rag_bridge.py +624 -0
  355. package/.claude/hooks/_lib/rag_events.py +171 -0
  356. package/.claude/hooks/_lib/rag_router.py +253 -0
  357. package/.claude/hooks/_lib/redact.py +228 -0
  358. package/.claude/hooks/_lib/replay_redact.py +511 -0
  359. package/.claude/hooks/_lib/scratchpad_lib.py +225 -0
  360. package/.claude/hooks/_lib/secret_patterns.py +905 -0
  361. package/.claude/hooks/_lib/sentinel_signers.py +740 -0
  362. package/.claude/hooks/_lib/spec_context_sanitizer.py +258 -0
  363. package/.claude/hooks/_lib/spool_writer.py +2613 -0
  364. package/.claude/hooks/_lib/state_store.py +476 -0
  365. package/.claude/hooks/_lib/subagent_dispatch.py +244 -0
  366. package/.claude/hooks/_lib/swarm_circuit_breaker.py +203 -0
  367. package/.claude/hooks/_lib/swarm_enable_gate.py +152 -0
  368. package/.claude/hooks/_lib/team.py +128 -0
  369. package/.claude/hooks/_lib/test_isolation.py +352 -0
  370. package/.claude/hooks/_lib/testing.py +351 -0
  371. package/.claude/hooks/_lib/tests/federation/test_federation_attack_surface.py +251 -0
  372. package/.claude/hooks/_lib/tests/federation/test_federation_audit_stitching.py +135 -0
  373. package/.claude/hooks/_lib/tests/federation/test_federation_identity.py +234 -0
  374. package/.claude/hooks/_lib/tests/federation/test_federation_replay.py +204 -0
  375. package/.claude/hooks/_lib/tests/federation/test_federation_sentinel_stage2.py +214 -0
  376. package/.claude/hooks/_lib/tests/federation/test_federation_server.py +385 -0
  377. package/.claude/hooks/_lib/tests/test_confidence_gate_class_block.py +313 -0
  378. package/.claude/hooks/_lib/tests/test_cost_envelope.py +759 -0
  379. package/.claude/hooks/_lib/tests/test_execution_context.py +254 -0
  380. package/.claude/hooks/_lib/tests/test_goap_advisory_invariant.py +134 -0
  381. package/.claude/hooks/_lib/tests/test_goap_planner.py +368 -0
  382. package/.claude/hooks/_lib/tests/test_plan104_audit_emit.py +324 -0
  383. package/.claude/hooks/_lib/tests/test_plan104_demand_resolver.py +584 -0
  384. package/.claude/hooks/_lib/tests/test_plan104_demand_scan.py +164 -0
  385. package/.claude/hooks/_lib/tests/test_plan104_microbench.py +109 -0
  386. package/.claude/hooks/_lib/tests/test_plan104_waive_parser.py +113 -0
  387. package/.claude/hooks/_lib/tests/test_plan105_audit_emit.py +259 -0
  388. package/.claude/hooks/_lib/tests/test_plan105_check_roadmap_binding.py +68 -0
  389. package/.claude/hooks/_lib/tests/test_plan105_goap_planner.py +158 -0
  390. package/.claude/hooks/_lib/tests/test_plan105_spawn_outcome.py +234 -0
  391. package/.claude/hooks/_lib/tests/test_rag_dead_code_disposition.py +262 -0
  392. package/.claude/hooks/_lib/tests/test_rag_router.py +209 -0
  393. package/.claude/hooks/_lib/tests/test_swarm_circuit_breaker.py +278 -0
  394. package/.claude/hooks/_lib/tests/test_swarm_kill_switch_chain.py +360 -0
  395. package/.claude/hooks/_lib/tier_policy/__init__.py +123 -0
  396. package/.claude/hooks/_lib/tier_policy/_agent_frontmatter.py +509 -0
  397. package/.claude/hooks/_lib/tier_policy/_constants.py +376 -0
  398. package/.claude/hooks/_lib/tier_policy/_types.py +355 -0
  399. package/.claude/hooks/_lib/tier_policy/fixtures/baseline.json +17 -0
  400. package/.claude/hooks/_lib/tier_policy/fixtures/oversize_64kib.json +1 -0
  401. package/.claude/hooks/_lib/tier_policy/fixtures/prototype_pollution_attack.yaml +14 -0
  402. package/.claude/hooks/_lib/tier_policy/fixtures/schema_v1_sample.json +5 -0
  403. package/.claude/hooks/_lib/tier_policy/fixtures/schema_v2_sample.json +17 -0
  404. package/.claude/hooks/_lib/tier_policy/fixtures/yaml_bomb_attack.yaml +20 -0
  405. package/.claude/hooks/_lib/tier_policy/loader.py +476 -0
  406. package/.claude/hooks/_lib/tokens.py +136 -0
  407. package/.claude/hooks/_lib/tool_lifecycle.py +488 -0
  408. package/.claude/hooks/_lib/trusted_env.py +77 -0
  409. package/.claude/hooks/_python-hook.sh +242 -0
  410. package/.claude/hooks/accel_dispatch.py +172 -0
  411. package/.claude/hooks/adequacy_gate.py +424 -0
  412. package/.claude/hooks/audit_log.py +1352 -0
  413. package/.claude/hooks/auto_boot.py +518 -0
  414. package/.claude/hooks/check_adversary.py +273 -0
  415. package/.claude/hooks/check_agent_spawn.py +2696 -0
  416. package/.claude/hooks/check_anti_ceo_overhead.py +786 -0
  417. package/.claude/hooks/check_arbitration_kernel.py +544 -0
  418. package/.claude/hooks/check_bash_canonical_forensic.py +180 -0
  419. package/.claude/hooks/check_bash_safety.py +1483 -0
  420. package/.claude/hooks/check_budget.py +916 -0
  421. package/.claude/hooks/check_canonical_edit.py +1197 -0
  422. package/.claude/hooks/check_closeout_guard.py +154 -0
  423. package/.claude/hooks/check_codex_filewrite.py +366 -0
  424. package/.claude/hooks/check_codex_response.py +403 -0
  425. package/.claude/hooks/check_confidence_gate.py +545 -0
  426. package/.claude/hooks/check_config_change.py +346 -0
  427. package/.claude/hooks/check_config_protection.py +381 -0
  428. package/.claude/hooks/check_cost_envelope.py +286 -0
  429. package/.claude/hooks/check_fluency_nudge.py +747 -0
  430. package/.claude/hooks/check_mcp_response.py +234 -0
  431. package/.claude/hooks/check_output_safety.py +237 -0
  432. package/.claude/hooks/check_output_secrets.py +518 -0
  433. package/.claude/hooks/check_pair_rail.py +1700 -0
  434. package/.claude/hooks/check_plan_edit.py +905 -0
  435. package/.claude/hooks/check_postcompact_reinject.py +265 -0
  436. package/.claude/hooks/check_precompact_continuity.py +379 -0
  437. package/.claude/hooks/check_protocol_semver_cascade.py +401 -0
  438. package/.claude/hooks/check_read_injection.py +366 -0
  439. package/.claude/hooks/check_scratchpad_access.py +228 -0
  440. package/.claude/hooks/check_setup_verification.py +297 -0
  441. package/.claude/hooks/check_skill_bootstrap_post.py +339 -0
  442. package/.claude/hooks/check_skill_patch_sentinel.py +413 -0
  443. package/.claude/hooks/check_skill_reference_read.py +518 -0
  444. package/.claude/hooks/check_subagent_fabrication.py +45 -0
  445. package/.claude/hooks/check_subagent_start.py +232 -0
  446. package/.claude/hooks/check_tier_policy.py +211 -0
  447. package/.claude/hooks/check_tier_policy_misrouting_24h.py +187 -0
  448. package/.claude/hooks/check_webfetch_injection.py +277 -0
  449. package/.claude/hooks/check_worktree_writer.py +773 -0
  450. package/.claude/hooks/codex_review_user_code.py +304 -0
  451. package/.claude/hooks/emit_architect_outcome.py +232 -0
  452. package/.claude/hooks/latency_report.py +343 -0
  453. package/.claude/hooks/policy_dispatch.py +168 -0
  454. package/.claude/hooks/review_loop.py +560 -0
  455. package/.claude/hooks/route.py +115 -0
  456. package/.claude/hooks/tests/_agent_fixture.py +153 -0
  457. package/.claude/hooks/tests/adapters/__init__.py +0 -0
  458. package/.claude/hooks/tests/adapters/live/__init__.py +0 -0
  459. package/.claude/hooks/tests/adapters/live/test_adapters.py +488 -0
  460. package/.claude/hooks/tests/adapters/live/test_audit_wiring.py +81 -0
  461. package/.claude/hooks/tests/adapters/live/test_breaker.py +272 -0
  462. package/.claude/hooks/tests/adapters/live/test_cost.py +191 -0
  463. package/.claude/hooks/tests/adapters/live/test_o7_modernization.py +670 -0
  464. package/.claude/hooks/tests/adapters/live/test_policy.py +168 -0
  465. package/.claude/hooks/tests/conftest.py +139 -0
  466. package/.claude/hooks/tests/fixtures/adapters/claude/in/agent_spawn_compliant.json +9 -0
  467. package/.claude/hooks/tests/fixtures/adapters/claude/in/bash_safe_command.json +8 -0
  468. package/.claude/hooks/tests/fixtures/adapters/claude/in/post_audit_event.json +1 -0
  469. package/.claude/hooks/tests/fixtures/adapters/claude/out/allow.json +1 -0
  470. package/.claude/hooks/tests/fixtures/adapters/claude/out/block_with_reason.json +1 -0
  471. package/.claude/hooks/tests/fixtures/adapters/codex/in/.gitkeep +1 -0
  472. package/.claude/hooks/tests/fixtures/adapters/codex/out/.gitkeep +1 -0
  473. package/.claude/hooks/tests/fixtures/adapters/gemini/GAPS.md +46 -0
  474. package/.claude/hooks/tests/fixtures/adapters/gemini/in/agent_spawn_minimal.json +1 -0
  475. package/.claude/hooks/tests/fixtures/adapters/gemini/in/bash_minimal.json +1 -0
  476. package/.claude/hooks/tests/fixtures/adapters/gemini/out/allow.json +1 -0
  477. package/.claude/hooks/tests/fixtures/adapters/local/in/agent_spawn_ollama.json +19 -0
  478. package/.claude/hooks/tests/fixtures/adapters/local/in/bash_minimal.json +8 -0
  479. package/.claude/hooks/tests/fixtures/adapters/local/out/allow.json +1 -0
  480. package/.claude/hooks/tests/fixtures/adapters/openai/in/agent_spawn_chat_completions.json +13 -0
  481. package/.claude/hooks/tests/fixtures/adapters/openai/in/bash_responses_api.json +9 -0
  482. package/.claude/hooks/tests/fixtures/adapters/openai/out/allow.json +1 -0
  483. package/.claude/hooks/tests/fixtures/anti_ceo_overhead/should-NOT-block-on-Y.ndjson +13 -0
  484. package/.claude/hooks/tests/fixtures/anti_ceo_overhead/should-block-on-X.ndjson +9 -0
  485. package/.claude/hooks/tests/fixtures/byte_identity/__init__.py +5 -0
  486. package/.claude/hooks/tests/fixtures/byte_identity/bash_safety_fuzzer.py +287 -0
  487. package/.claude/hooks/tests/fixtures/byte_identity/plan_edit_fuzzer.py +364 -0
  488. package/.claude/hooks/tests/fixtures/exchange_keys/negative/aws-iam-policy-arn-id-25.txt +2 -0
  489. package/.claude/hooks/tests/fixtures/exchange_keys/negative/blog-paragraph-18.txt +1 -0
  490. package/.claude/hooks/tests/fixtures/exchange_keys/negative/boilerplate-26.txt +4 -0
  491. package/.claude/hooks/tests/fixtures/exchange_keys/negative/cdn-cache-key-12.txt +2 -0
  492. package/.claude/hooks/tests/fixtures/exchange_keys/negative/certificate-fingerprint-10.txt +2 -0
  493. package/.claude/hooks/tests/fixtures/exchange_keys/negative/changelog-19.txt +1 -0
  494. package/.claude/hooks/tests/fixtures/exchange_keys/negative/commit-sha-01.txt +4 -0
  495. package/.claude/hooks/tests/fixtures/exchange_keys/negative/django-csrf-token-24.txt +3 -0
  496. package/.claude/hooks/tests/fixtures/exchange_keys/negative/docker-image-04.txt +2 -0
  497. package/.claude/hooks/tests/fixtures/exchange_keys/negative/docs-example-22.txt +3 -0
  498. package/.claude/hooks/tests/fixtures/exchange_keys/negative/haiku-20.txt +1 -0
  499. package/.claude/hooks/tests/fixtures/exchange_keys/negative/hex-placeholder-15.txt +3 -0
  500. package/.claude/hooks/tests/fixtures/exchange_keys/negative/hex-short-23.txt +5 -0
  501. package/.claude/hooks/tests/fixtures/exchange_keys/negative/image-thumbnail-09.txt +3 -0
  502. package/.claude/hooks/tests/fixtures/exchange_keys/negative/jwt-payload-decoded-08.txt +3 -0
  503. package/.claude/hooks/tests/fixtures/exchange_keys/negative/kubernetes-uid-06.txt +3 -0
  504. package/.claude/hooks/tests/fixtures/exchange_keys/negative/md5-hash-02.txt +2 -0
  505. package/.claude/hooks/tests/fixtures/exchange_keys/negative/phone-number-16.txt +3 -0
  506. package/.claude/hooks/tests/fixtures/exchange_keys/negative/postgres-uuid-05.txt +2 -0
  507. package/.claude/hooks/tests/fixtures/exchange_keys/negative/redis-cluster-node-13.txt +3 -0
  508. package/.claude/hooks/tests/fixtures/exchange_keys/negative/session-token-11.txt +3 -0
  509. package/.claude/hooks/tests/fixtures/exchange_keys/negative/sha256-checksum-03.txt +3 -0
  510. package/.claude/hooks/tests/fixtures/exchange_keys/negative/short-token-21.txt +2 -0
  511. package/.claude/hooks/tests/fixtures/exchange_keys/negative/software-license-14.txt +4 -0
  512. package/.claude/hooks/tests/fixtures/exchange_keys/negative/telemetry-trace-07.txt +3 -0
  513. package/.claude/hooks/tests/fixtures/exchange_keys/negative/zip-postal-17.txt +4 -0
  514. package/.claude/hooks/tests/fixtures/exchange_keys/positive/binance-api-key-alnum-03.txt +1 -0
  515. package/.claude/hooks/tests/fixtures/exchange_keys/positive/binance-api-key-hex-01.txt +3 -0
  516. package/.claude/hooks/tests/fixtures/exchange_keys/positive/binance-api-key-hex-02.txt +2 -0
  517. package/.claude/hooks/tests/fixtures/exchange_keys/positive/bip39-mnemonic-12-31.txt +2 -0
  518. package/.claude/hooks/tests/fixtures/exchange_keys/positive/bip39-mnemonic-12-33.txt +2 -0
  519. package/.claude/hooks/tests/fixtures/exchange_keys/positive/bip39-mnemonic-24-32.txt +2 -0
  520. package/.claude/hooks/tests/fixtures/exchange_keys/positive/bitfinex-api-key-11.txt +1 -0
  521. package/.claude/hooks/tests/fixtures/exchange_keys/positive/bitfinex-api-key-12.txt +1 -0
  522. package/.claude/hooks/tests/fixtures/exchange_keys/positive/bitfinex-api-key-13.txt +2 -0
  523. package/.claude/hooks/tests/fixtures/exchange_keys/positive/bitstamp-api-key-30.txt +3 -0
  524. package/.claude/hooks/tests/fixtures/exchange_keys/positive/bitstamp-customer-id-29.txt +2 -0
  525. package/.claude/hooks/tests/fixtures/exchange_keys/positive/bybit-api-key-18.txt +2 -0
  526. package/.claude/hooks/tests/fixtures/exchange_keys/positive/bybit-api-key-19.txt +1 -0
  527. package/.claude/hooks/tests/fixtures/exchange_keys/positive/bybit-api-secret-20.txt +1 -0
  528. package/.claude/hooks/tests/fixtures/exchange_keys/positive/bybit-combined-21.txt +3 -0
  529. package/.claude/hooks/tests/fixtures/exchange_keys/positive/coinbase-api-key-uuid-04.txt +2 -0
  530. package/.claude/hooks/tests/fixtures/exchange_keys/positive/coinbase-api-secret-b64-05.txt +1 -0
  531. package/.claude/hooks/tests/fixtures/exchange_keys/positive/coinbase-combined-07.txt +4 -0
  532. package/.claude/hooks/tests/fixtures/exchange_keys/positive/coinbase-passphrase-06.txt +1 -0
  533. package/.claude/hooks/tests/fixtures/exchange_keys/positive/evm-private-key-34.txt +2 -0
  534. package/.claude/hooks/tests/fixtures/exchange_keys/positive/evm-private-key-35.txt +1 -0
  535. package/.claude/hooks/tests/fixtures/exchange_keys/positive/evm-private-key-36.txt +2 -0
  536. package/.claude/hooks/tests/fixtures/exchange_keys/positive/generic-api-key-37.txt +2 -0
  537. package/.claude/hooks/tests/fixtures/exchange_keys/positive/generic-api-key-38.txt +3 -0
  538. package/.claude/hooks/tests/fixtures/exchange_keys/positive/generic-api-key-39.txt +2 -0
  539. package/.claude/hooks/tests/fixtures/exchange_keys/positive/kraken-api-key-08.txt +1 -0
  540. package/.claude/hooks/tests/fixtures/exchange_keys/positive/kraken-api-secret-09.txt +1 -0
  541. package/.claude/hooks/tests/fixtures/exchange_keys/positive/kraken-combined-10.txt +4 -0
  542. package/.claude/hooks/tests/fixtures/exchange_keys/positive/kucoin-api-key-uuid-26.txt +2 -0
  543. package/.claude/hooks/tests/fixtures/exchange_keys/positive/kucoin-api-secret-uuid-27.txt +1 -0
  544. package/.claude/hooks/tests/fixtures/exchange_keys/positive/kucoin-passphrase-28.txt +1 -0
  545. package/.claude/hooks/tests/fixtures/exchange_keys/positive/okx-api-key-uuid-22.txt +1 -0
  546. package/.claude/hooks/tests/fixtures/exchange_keys/positive/okx-api-secret-23.txt +2 -0
  547. package/.claude/hooks/tests/fixtures/exchange_keys/positive/okx-combined-25.txt +4 -0
  548. package/.claude/hooks/tests/fixtures/exchange_keys/positive/okx-passphrase-24.txt +1 -0
  549. package/.claude/hooks/tests/fixtures/hooks/audit_log/in.json +1 -0
  550. package/.claude/hooks/tests/fixtures/hooks/audit_log/out.json +0 -0
  551. package/.claude/hooks/tests/fixtures/hooks/check_agent_spawn/in.json +1 -0
  552. package/.claude/hooks/tests/fixtures/hooks/check_agent_spawn/out.json +1 -0
  553. package/.claude/hooks/tests/fixtures/hooks/check_bash_safety/in.json +1 -0
  554. package/.claude/hooks/tests/fixtures/hooks/check_bash_safety/out.json +1 -0
  555. package/.claude/hooks/tests/fixtures/hooks/check_canonical_edit/in.json +1 -0
  556. package/.claude/hooks/tests/fixtures/hooks/check_canonical_edit/out.json +1 -0
  557. package/.claude/hooks/tests/fixtures/hooks/check_confidence_gate/in.json +1 -0
  558. package/.claude/hooks/tests/fixtures/hooks/check_confidence_gate/out.json +1 -0
  559. package/.claude/hooks/tests/fixtures/hooks/check_plan_edit/in.json +1 -0
  560. package/.claude/hooks/tests/fixtures/hooks/check_plan_edit/out.json +1 -0
  561. package/.claude/hooks/tests/fixtures/hooks/check_read_injection/in.json +1 -0
  562. package/.claude/hooks/tests/fixtures/hooks/check_read_injection/out.json +1 -0
  563. package/.claude/hooks/tests/fixtures/lifecycle/concurrent_interleaved.json +36 -0
  564. package/.claude/hooks/tests/fixtures/lifecycle/orphaned_pre.json +8 -0
  565. package/.claude/hooks/tests/fixtures/lifecycle/paired_bash_post.json +8 -0
  566. package/.claude/hooks/tests/fixtures/lifecycle/paired_bash_pre.json +9 -0
  567. package/.claude/hooks/tests/fixtures/normalized/agent_spawn_chat_completions.json +36 -0
  568. package/.claude/hooks/tests/fixtures/normalized/agent_spawn_compliant.json +24 -0
  569. package/.claude/hooks/tests/fixtures/normalized/agent_spawn_minimal.json +24 -0
  570. package/.claude/hooks/tests/fixtures/normalized/agent_spawn_ollama.json +42 -0
  571. package/.claude/hooks/tests/fixtures/normalized/bash_minimal.json +23 -0
  572. package/.claude/hooks/tests/fixtures/normalized/bash_responses_api.json +32 -0
  573. package/.claude/hooks/tests/fixtures/normalized/bash_safe_command.json +23 -0
  574. package/.claude/hooks/tests/fixtures/normalized/post_audit_event.json +31 -0
  575. package/.claude/hooks/tests/fixtures/output_safety/control/01_random_hash_log.txt +1 -0
  576. package/.claude/hooks/tests/fixtures/output_safety/control/02_docs_mention_email_no_address.txt +1 -0
  577. package/.claude/hooks/tests/fixtures/output_safety/control/03_partial_jwt_two_segments.txt +1 -0
  578. package/.claude/hooks/tests/fixtures/output_safety/control/04_random_11_digits_no_cpf_context.txt +1 -0
  579. package/.claude/hooks/tests/fixtures/output_safety/control/05_credit_card_shape_invalid_luhn.txt +1 -0
  580. package/.claude/hooks/tests/fixtures/output_safety/positive/01_api_key_anthropic.txt +1 -0
  581. package/.claude/hooks/tests/fixtures/output_safety/positive/02_api_key_github_pat_classic.txt +1 -0
  582. package/.claude/hooks/tests/fixtures/output_safety/positive/03_api_key_github_fine_grained.txt +1 -0
  583. package/.claude/hooks/tests/fixtures/output_safety/positive/04_api_key_aws_access_key.txt +1 -0
  584. package/.claude/hooks/tests/fixtures/output_safety/positive/05_api_key_aws_secret_assignment.txt +1 -0
  585. package/.claude/hooks/tests/fixtures/output_safety/positive/06_jwt.txt +1 -0
  586. package/.claude/hooks/tests/fixtures/output_safety/positive/07_bearer.txt +1 -0
  587. package/.claude/hooks/tests/fixtures/output_safety/positive/08_cpf_with_context.txt +1 -0
  588. package/.claude/hooks/tests/fixtures/output_safety/positive/09_cnpj_with_context.txt +1 -0
  589. package/.claude/hooks/tests/fixtures/output_safety/positive/10_credit_card_luhn_valid.txt +1 -0
  590. package/.claude/hooks/tests/fixtures/output_safety/positive/11_email_in_login_context.txt +1 -0
  591. package/.claude/hooks/tests/fixtures/output_safety/positive/12_nfkc_full_width.txt +1 -0
  592. package/.claude/hooks/tests/fixtures/output_safety/positive/13_zero_width_evasion.txt +1 -0
  593. package/.claude/hooks/tests/fixtures/output_safety/positive/14_bidi_evasion.txt +1 -0
  594. package/.claude/hooks/tests/fixtures/output_safety/positive/15_base64_encoded_secret.txt +1 -0
  595. package/.claude/hooks/tests/fixtures/output_scan/scenarios.jsonl +45 -0
  596. package/.claude/hooks/tests/fixtures/sample_payload_clean.json +13 -0
  597. package/.claude/hooks/tests/fixtures/sample_payload_with_secrets.json +12 -0
  598. package/.claude/hooks/tests/mutations/README.md +86 -0
  599. package/.claude/hooks/tests/mutations/__init__.py +14 -0
  600. package/.claude/hooks/tests/mutations/engine_mutations/__init__.py +15 -0
  601. package/.claude/hooks/tests/mutations/engine_mutations/mutation_01_parser_accepts_anchor.py +51 -0
  602. package/.claude/hooks/tests/mutations/engine_mutations/mutation_02_parser_skip_depth_limit.py +38 -0
  603. package/.claude/hooks/tests/mutations/engine_mutations/mutation_03_parser_accept_multi_doc.py +47 -0
  604. package/.claude/hooks/tests/mutations/engine_mutations/mutation_04_parser_accepts_bom.py +41 -0
  605. package/.claude/hooks/tests/mutations/engine_mutations/mutation_05_parser_scalar_len_off_by_one.py +61 -0
  606. package/.claude/hooks/tests/mutations/engine_mutations/mutation_06_parser_accepts_python_tag.py +50 -0
  607. package/.claude/hooks/tests/mutations/engine_mutations/mutation_07_parser_accepts_tab_indent.py +56 -0
  608. package/.claude/hooks/tests/mutations/engine_mutations/mutation_08_compiler_skip_regex_compile.py +45 -0
  609. package/.claude/hooks/tests/mutations/engine_mutations/mutation_09_compiler_regex_pattern_cap_off.py +31 -0
  610. package/.claude/hooks/tests/mutations/engine_mutations/mutation_10_compiler_accept_unknown_form.py +42 -0
  611. package/.claude/hooks/tests/mutations/engine_mutations/mutation_11_compiler_missing_predicate_tolerated.py +79 -0
  612. package/.claude/hooks/tests/mutations/engine_mutations/mutation_12_compiler_duplicate_rule_id_tolerated.py +66 -0
  613. package/.claude/hooks/tests/mutations/engine_mutations/mutation_13_compiler_missing_top_level_key_tolerated.py +46 -0
  614. package/.claude/hooks/tests/mutations/engine_mutations/mutation_14_compiler_schema_version_passthrough.py +43 -0
  615. package/.claude/hooks/tests/mutations/engine_mutations/mutation_15_evaluator_any_empty_returns_true.py +41 -0
  616. package/.claude/hooks/tests/mutations/engine_mutations/mutation_16_evaluator_all_empty_returns_true.py +37 -0
  617. package/.claude/hooks/tests/mutations/engine_mutations/mutation_17_evaluator_not_passthrough.py +37 -0
  618. package/.claude/hooks/tests/mutations/engine_mutations/mutation_18_evaluator_eq_true_on_type_mismatch.py +51 -0
  619. package/.claude/hooks/tests/mutations/engine_mutations/mutation_19_evaluator_regex_match_only.py +43 -0
  620. package/.claude/hooks/tests/mutations/engine_mutations/mutation_20_evaluator_path_under_no_realpath.py +48 -0
  621. package/.claude/hooks/tests/mutations/engine_mutations/mutation_21_evaluator_in_accepts_any.py +37 -0
  622. package/.claude/hooks/tests/mutations/engine_mutations/mutation_22_evaluator_length_off_by_one.py +45 -0
  623. package/.claude/hooks/tests/mutations/engine_mutations/mutation_23_evaluator_first_match_becomes_last.py +66 -0
  624. package/.claude/hooks/tests/mutations/engine_mutations/mutation_24_error_model_wrong_kind_on_parse.py +39 -0
  625. package/.claude/hooks/tests/mutations/engine_mutations/mutation_25_error_model_fail_open_on_load.py +42 -0
  626. package/.claude/hooks/tests/mutations/policy_mutations/__init__.py +16 -0
  627. package/.claude/hooks/tests/mutations/policy_mutations/mutation_bash_01_remove_credential_leak.py +49 -0
  628. package/.claude/hooks/tests/mutations/policy_mutations/mutation_bash_02_remove_rm_rf.py +44 -0
  629. package/.claude/hooks/tests/mutations/policy_mutations/mutation_bash_03_remove_git_reset_hard.py +44 -0
  630. package/.claude/hooks/tests/mutations/policy_mutations/mutation_bash_04_remove_git_push_force.py +44 -0
  631. package/.claude/hooks/tests/mutations/policy_mutations/mutation_bash_05_reorder_rules.py +59 -0
  632. package/.claude/hooks/tests/mutations/policy_mutations/mutation_bash_06_change_reason_enum.py +54 -0
  633. package/.claude/hooks/tests/mutations/policy_mutations/mutation_bash_07_default_flipped_to_block.py +56 -0
  634. package/.claude/hooks/tests/mutations/policy_mutations/mutation_bash_08_flip_rm_rf_to_allow.py +49 -0
  635. package/.claude/hooks/tests/mutations/policy_mutations/mutation_plan_01_remove_illegal_transition.py +79 -0
  636. package/.claude/hooks/tests/mutations/policy_mutations/mutation_plan_02_remove_illegal_status.py +80 -0
  637. package/.claude/hooks/tests/mutations/policy_mutations/mutation_plan_03_remove_missing_reviewed_at.py +80 -0
  638. package/.claude/hooks/tests/mutations/policy_mutations/mutation_plan_04_remove_missing_completed_at.py +80 -0
  639. package/.claude/hooks/tests/mutations/policy_mutations/mutation_plan_05_remove_missing_related_commits.py +79 -0
  640. package/.claude/hooks/tests/mutations/policy_mutations/mutation_plan_06_remove_missing_abandonment_reason.py +80 -0
  641. package/.claude/hooks/tests/mutations/policy_mutations/mutation_plan_07_scope_guard_inverted.py +93 -0
  642. package/.claude/hooks/tests/mutations/policy_mutations/mutation_plan_08_default_block.py +90 -0
  643. package/.claude/hooks/tests/probes/test_architect_probe.py +286 -0
  644. package/.claude/hooks/tests/probes/test_canonical_edit_probe.py +190 -0
  645. package/.claude/hooks/tests/probes/test_skill_content_probe.py +219 -0
  646. package/.claude/hooks/tests/test_SessionEnd.py +59 -0
  647. package/.claude/hooks/tests/test_SessionStart.py +42 -0
  648. package/.claude/hooks/tests/test_UserPromptSubmit.py +47 -0
  649. package/.claude/hooks/tests/test_accel_dispatch.py +96 -0
  650. package/.claude/hooks/tests/test_action_required_invariants.py +274 -0
  651. package/.claude/hooks/tests/test_adapter_drift_detector.py +254 -0
  652. package/.claude/hooks/tests/test_adapter_golden.py +198 -0
  653. package/.claude/hooks/tests/test_adequacy_gate.py +86 -0
  654. package/.claude/hooks/tests/test_adr_052_role_to_model_coverage.py +112 -0
  655. package/.claude/hooks/tests/test_adr_058_brainstorm_structure.py +280 -0
  656. package/.claude/hooks/tests/test_adversary_rules_live.py +400 -0
  657. package/.claude/hooks/tests/test_agent_frontmatter.py +377 -0
  658. package/.claude/hooks/tests/test_anti_ceo_overhead.py +591 -0
  659. package/.claude/hooks/tests/test_audit_emit.py +1707 -0
  660. package/.claude/hooks/tests/test_audit_emit_api_contract.py +693 -0
  661. package/.claude/hooks/tests/test_audit_emit_async_flush.py +563 -0
  662. package/.claude/hooks/tests/test_audit_emit_backpressure.py +138 -0
  663. package/.claude/hooks/tests/test_audit_emit_callsite_coverage_matrix.py +101 -0
  664. package/.claude/hooks/tests/test_audit_emit_chain_length.py +357 -0
  665. package/.claude/hooks/tests/test_audit_emit_coverage.py +2679 -0
  666. package/.claude/hooks/tests/test_audit_emit_ghost_action_guard.py +447 -0
  667. package/.claude/hooks/tests/test_audit_emit_plan088_canonical13.py +323 -0
  668. package/.claude/hooks/tests/test_audit_emit_rotation.py +218 -0
  669. package/.claude/hooks/tests/test_audit_emit_veto_v214.py +202 -0
  670. package/.claude/hooks/tests/test_audit_emit_wire_audit.py +699 -0
  671. package/.claude/hooks/tests/test_audit_hmac.py +334 -0
  672. package/.claude/hooks/tests/test_audit_hmac_branch_coverage.py +212 -0
  673. package/.claude/hooks/tests/test_audit_hmac_chain_monotonicity_property.py +136 -0
  674. package/.claude/hooks/tests/test_audit_hmac_coverage_v214.py +358 -0
  675. package/.claude/hooks/tests/test_audit_hmac_hardening.py +302 -0
  676. package/.claude/hooks/tests/test_audit_hmac_rotation_scenarios.py +231 -0
  677. package/.claude/hooks/tests/test_audit_hmac_verify_chain.py +443 -0
  678. package/.claude/hooks/tests/test_audit_log.py +280 -0
  679. package/.claude/hooks/tests/test_audit_log_coverage.py +173 -0
  680. package/.claude/hooks/tests/test_audit_log_path_d.py +516 -0
  681. package/.claude/hooks/tests/test_audit_log_phase1.py +358 -0
  682. package/.claude/hooks/tests/test_audit_log_schema_consistency.py +97 -0
  683. package/.claude/hooks/tests/test_audit_log_security.py +289 -0
  684. package/.claude/hooks/tests/test_audit_log_tokens.py +92 -0
  685. package/.claude/hooks/tests/test_audit_log_v2_7.py +378 -0
  686. package/.claude/hooks/tests/test_audit_log_v2_8_model.py +201 -0
  687. package/.claude/hooks/tests/test_audit_rotation.py +158 -0
  688. package/.claude/hooks/tests/test_audit_stream_verbose_protection.py +86 -0
  689. package/.claude/hooks/tests/test_audit_tokens_content_ban.py +512 -0
  690. package/.claude/hooks/tests/test_auto_boot.py +28 -0
  691. package/.claude/hooks/tests/test_available_models_mirror.py +226 -0
  692. package/.claude/hooks/tests/test_bash_canonical_forensic.py +74 -0
  693. package/.claude/hooks/tests/test_bash_canonical_interceptor.py +79 -0
  694. package/.claude/hooks/tests/test_brotli_passthrough.py +145 -0
  695. package/.claude/hooks/tests/test_byte_identity_fuzzer.py +185 -0
  696. package/.claude/hooks/tests/test_byte_identity_harness.py +953 -0
  697. package/.claude/hooks/tests/test_canonical_guard_typed_exceptions.py +117 -0
  698. package/.claude/hooks/tests/test_canonical_json.py +153 -0
  699. package/.claude/hooks/tests/test_chain_invariants_property.py +132 -0
  700. package/.claude/hooks/tests/test_check_adversary_live.py +149 -0
  701. package/.claude/hooks/tests/test_check_agent_spawn.py +1084 -0
  702. package/.claude/hooks/tests/test_check_agent_spawn_coverage.py +277 -0
  703. package/.claude/hooks/tests/test_check_agent_spawn_effort_token.py +74 -0
  704. package/.claude/hooks/tests/test_check_agent_spawn_import_isolation.py +82 -0
  705. package/.claude/hooks/tests/test_check_agent_spawn_model_routing_mode.py +245 -0
  706. package/.claude/hooks/tests/test_check_agent_spawn_reference_bypass.py +385 -0
  707. package/.claude/hooks/tests/test_check_agent_spawn_routing_promotion.py +302 -0
  708. package/.claude/hooks/tests/test_check_agent_spawn_skill_reference.py +336 -0
  709. package/.claude/hooks/tests/test_check_arbitration_kernel.py +472 -0
  710. package/.claude/hooks/tests/test_check_arbitration_kernel_v214.py +157 -0
  711. package/.claude/hooks/tests/test_check_bash_safety.py +546 -0
  712. package/.claude/hooks/tests/test_check_bash_safety_canonical_matrix.py +336 -0
  713. package/.claude/hooks/tests/test_check_bash_safety_cp_chaining.py +120 -0
  714. package/.claude/hooks/tests/test_check_bash_safety_h5_rewrite.py +462 -0
  715. package/.claude/hooks/tests/test_check_budget.py +580 -0
  716. package/.claude/hooks/tests/test_check_budget_max_tokens.py +397 -0
  717. package/.claude/hooks/tests/test_check_budget_quota_hint.py +115 -0
  718. package/.claude/hooks/tests/test_check_canonical_edit.py +302 -0
  719. package/.claude/hooks/tests/test_check_canonical_edit_coverage.py +370 -0
  720. package/.claude/hooks/tests/test_check_canonical_edit_kernel_v2.py +401 -0
  721. package/.claude/hooks/tests/test_check_canonical_edit_markers.py +473 -0
  722. package/.claude/hooks/tests/test_check_canonical_edit_mcp.py +401 -0
  723. package/.claude/hooks/tests/test_check_canonical_edit_session67_format.py +245 -0
  724. package/.claude/hooks/tests/test_check_codex_filewrite.py +964 -0
  725. package/.claude/hooks/tests/test_check_codex_response.py +419 -0
  726. package/.claude/hooks/tests/test_check_compaction_continuity.py +450 -0
  727. package/.claude/hooks/tests/test_check_confidence_gate.py +326 -0
  728. package/.claude/hooks/tests/test_check_config_change.py +369 -0
  729. package/.claude/hooks/tests/test_check_config_protection.py +364 -0
  730. package/.claude/hooks/tests/test_check_fluency_nudge.py +321 -0
  731. package/.claude/hooks/tests/test_check_mcp_response.py +261 -0
  732. package/.claude/hooks/tests/test_check_output_safety.py +314 -0
  733. package/.claude/hooks/tests/test_check_output_secrets.py +488 -0
  734. package/.claude/hooks/tests/test_check_output_secrets_coverage.py +321 -0
  735. package/.claude/hooks/tests/test_check_pair_rail.py +897 -0
  736. package/.claude/hooks/tests/test_check_pair_rail_decide_canonical.py +297 -0
  737. package/.claude/hooks/tests/test_check_pair_rail_golden.py +362 -0
  738. package/.claude/hooks/tests/test_check_pair_rail_hook_integration.py +120 -0
  739. package/.claude/hooks/tests/test_check_pair_rail_matrix.py +1077 -0
  740. package/.claude/hooks/tests/test_check_plan_edit.py +679 -0
  741. package/.claude/hooks/tests/test_check_plan_edit_stranded.py +310 -0
  742. package/.claude/hooks/tests/test_check_protocol_semver_cascade.py +141 -0
  743. package/.claude/hooks/tests/test_check_protocol_semver_cascade_settings_wired.py +297 -0
  744. package/.claude/hooks/tests/test_check_protocol_semver_cascade_synccascade.py +365 -0
  745. package/.claude/hooks/tests/test_check_read_injection.py +143 -0
  746. package/.claude/hooks/tests/test_check_read_injection_coverage.py +237 -0
  747. package/.claude/hooks/tests/test_check_read_injection_pathbound.py +153 -0
  748. package/.claude/hooks/tests/test_check_scratchpad_access.py +244 -0
  749. package/.claude/hooks/tests/test_check_skill_bootstrap_post.py +256 -0
  750. package/.claude/hooks/tests/test_check_skill_patch_sentinel.py +439 -0
  751. package/.claude/hooks/tests/test_check_skill_reference_read.py +170 -0
  752. package/.claude/hooks/tests/test_check_skill_reference_read_v2.py +388 -0
  753. package/.claude/hooks/tests/test_check_subagent_fabrication.py +54 -0
  754. package/.claude/hooks/tests/test_check_subagent_start.py +505 -0
  755. package/.claude/hooks/tests/test_check_tier_policy.py +48 -0
  756. package/.claude/hooks/tests/test_check_tier_policy_misrouting_24h.py +294 -0
  757. package/.claude/hooks/tests/test_check_webfetch_injection.py +49 -0
  758. package/.claude/hooks/tests/test_claim_producer_pair_end_to_end_loop_perf.py +227 -0
  759. package/.claude/hooks/tests/test_claude_adapter_thinking.py +731 -0
  760. package/.claude/hooks/tests/test_claude_batch_adapter.py +672 -0
  761. package/.claude/hooks/tests/test_closeout_guard.py +184 -0
  762. package/.claude/hooks/tests/test_codex_adapter.py +777 -0
  763. package/.claude/hooks/tests/test_codex_cli_shape.py +217 -0
  764. package/.claude/hooks/tests/test_codex_egress_proof_telemetry.py +214 -0
  765. package/.claude/hooks/tests/test_codex_egress_redact.py +342 -0
  766. package/.claude/hooks/tests/test_codex_egress_redact_outgoing.py +236 -0
  767. package/.claude/hooks/tests/test_codex_reply_multi_turn.py +72 -0
  768. package/.claude/hooks/tests/test_codex_review_user_code.py +44 -0
  769. package/.claude/hooks/tests/test_codex_strict_json.py +123 -0
  770. package/.claude/hooks/tests/test_confidence_gate_producer_pair.py +522 -0
  771. package/.claude/hooks/tests/test_confidence_labels.py +362 -0
  772. package/.claude/hooks/tests/test_contract.py +237 -0
  773. package/.claude/hooks/tests/test_cookbook_advisor_hook.py +208 -0
  774. package/.claude/hooks/tests/test_credentials.py +195 -0
  775. package/.claude/hooks/tests/test_detect_repo_profile_branches.py +116 -0
  776. package/.claude/hooks/tests/test_e2e_hook_chain.py +184 -0
  777. package/.claude/hooks/tests/test_effective_config.py +648 -0
  778. package/.claude/hooks/tests/test_emit_architect_outcome.py +175 -0
  779. package/.claude/hooks/tests/test_env_persist_allowlist.py +365 -0
  780. package/.claude/hooks/tests/test_escalation_signals.py +357 -0
  781. package/.claude/hooks/tests/test_estimation_bayesian_pipeline.py +140 -0
  782. package/.claude/hooks/tests/test_execution_context_deferral.py +222 -0
  783. package/.claude/hooks/tests/test_fail_open_contract.py +118 -0
  784. package/.claude/hooks/tests/test_file_walker.py +332 -0
  785. package/.claude/hooks/tests/test_filelock.py +131 -0
  786. package/.claude/hooks/tests/test_filelock_contract.py +172 -0
  787. package/.claude/hooks/tests/test_find_sentinels_pattern_matrix.py +114 -0
  788. package/.claude/hooks/tests/test_flip_closures.py +219 -0
  789. package/.claude/hooks/tests/test_frontmatter.py +139 -0
  790. package/.claude/hooks/tests/test_git_bypass_guard.py +1095 -0
  791. package/.claude/hooks/tests/test_gpg_verify.py +578 -0
  792. package/.claude/hooks/tests/test_hook_byte_fidelity.py +113 -0
  793. package/.claude/hooks/tests/test_hook_latency.py +245 -0
  794. package/.claude/hooks/tests/test_hook_latency_import.py +178 -0
  795. package/.claude/hooks/tests/test_injection_patterns.py +276 -0
  796. package/.claude/hooks/tests/test_injection_patterns_bypass.py +276 -0
  797. package/.claude/hooks/tests/test_injection_salt.py +191 -0
  798. package/.claude/hooks/tests/test_kernel_subsumes_security_critical_lib.py +88 -0
  799. package/.claude/hooks/tests/test_kill_switch_godmode_enforcing.py +101 -0
  800. package/.claude/hooks/tests/test_latency_report.py +28 -0
  801. package/.claude/hooks/tests/test_lib_canonical_import.py +355 -0
  802. package/.claude/hooks/tests/test_lifecycle_edge_cases.py +565 -0
  803. package/.claude/hooks/tests/test_live_adapters.py +463 -0
  804. package/.claude/hooks/tests/test_live_audit_isolation.py +357 -0
  805. package/.claude/hooks/tests/test_mcp_bearer_friction_buffer.py +276 -0
  806. package/.claude/hooks/tests/test_mcp_bearer_friction_emit.py +117 -0
  807. package/.claude/hooks/tests/test_mcp_canonical_guard.py +1989 -0
  808. package/.claude/hooks/tests/test_mcp_injection_repro_harness.py +437 -0
  809. package/.claude/hooks/tests/test_mcp_injection_scan.py +228 -0
  810. package/.claude/hooks/tests/test_mcp_routing_resolve.py +246 -0
  811. package/.claude/hooks/tests/test_memory_shared.py +412 -0
  812. package/.claude/hooks/tests/test_metrics.py +115 -0
  813. package/.claude/hooks/tests/test_migrated_hooks_fixtures.py +121 -0
  814. package/.claude/hooks/tests/test_model_routing.py +175 -0
  815. package/.claude/hooks/tests/test_model_routing_resolve.py +97 -0
  816. package/.claude/hooks/tests/test_model_routing_resolve_full.py +318 -0
  817. package/.claude/hooks/tests/test_otel_bounded_exporter.py +521 -0
  818. package/.claude/hooks/tests/test_otel_emit.py +243 -0
  819. package/.claude/hooks/tests/test_otel_queue.py +334 -0
  820. package/.claude/hooks/tests/test_otel_wire_defaultoff.py +392 -0
  821. package/.claude/hooks/tests/test_output_scan.py +1119 -0
  822. package/.claude/hooks/tests/test_output_scan_dedup.py +329 -0
  823. package/.claude/hooks/tests/test_output_scan_fixtures.py +136 -0
  824. package/.claude/hooks/tests/test_pair_rail_decide.py +141 -0
  825. package/.claude/hooks/tests/test_payload.py +89 -0
  826. package/.claude/hooks/tests/test_persona_coverage_wire.py +376 -0
  827. package/.claude/hooks/tests/test_persona_routing_enforcing.py +119 -0
  828. package/.claude/hooks/tests/test_phase_c_advisory_audit.py +75 -0
  829. package/.claude/hooks/tests/test_pii_patterns.py +558 -0
  830. package/.claude/hooks/tests/test_plan114_wires.py +468 -0
  831. package/.claude/hooks/tests/test_plan128_emit_wiring.py +74 -0
  832. package/.claude/hooks/tests/test_plan132_codex_review_observe.py +99 -0
  833. package/.claude/hooks/tests/test_plan133_a1_env_guard.py +221 -0
  834. package/.claude/hooks/tests/test_plan133_a2_canonical_skill_unicode.py +359 -0
  835. package/.claude/hooks/tests/test_plan133_a2_invisible_unicode.py +239 -0
  836. package/.claude/hooks/tests/test_plan133_a3_egress_taxonomy.py +221 -0
  837. package/.claude/hooks/tests/test_plan133_e1_adversary.py +360 -0
  838. package/.claude/hooks/tests/test_plan_085_wave_c_callsites_preserved.py +147 -0
  839. package/.claude/hooks/tests/test_plan_091_expected_callsites.py +206 -0
  840. package/.claude/hooks/tests/test_plan_frontmatter.py +217 -0
  841. package/.claude/hooks/tests/test_policy_coverage_residual_session73.py +597 -0
  842. package/.claude/hooks/tests/test_policy_coverage_v214.py +1099 -0
  843. package/.claude/hooks/tests/test_policy_dispatch.py +454 -0
  844. package/.claude/hooks/tests/test_policy_engine.py +791 -0
  845. package/.claude/hooks/tests/test_policy_fuzz_bomb.py +356 -0
  846. package/.claude/hooks/tests/test_policy_golden_error_kinds.py +287 -0
  847. package/.claude/hooks/tests/test_policy_mutations.py +359 -0
  848. package/.claude/hooks/tests/test_policy_preprocessors.py +514 -0
  849. package/.claude/hooks/tests/test_policy_redos_guards.py +393 -0
  850. package/.claude/hooks/tests/test_rag_bridge.py +675 -0
  851. package/.claude/hooks/tests/test_rag_events.py +202 -0
  852. package/.claude/hooks/tests/test_red_team_fixtures.py +427 -0
  853. package/.claude/hooks/tests/test_redact.py +506 -0
  854. package/.claude/hooks/tests/test_redact_redos.py +254 -0
  855. package/.claude/hooks/tests/test_redact_secrets_parity.py +334 -0
  856. package/.claude/hooks/tests/test_replay_determinism.py +263 -0
  857. package/.claude/hooks/tests/test_review_loop.py +28 -0
  858. package/.claude/hooks/tests/test_review_loop_wiring.py +206 -0
  859. package/.claude/hooks/tests/test_route.py +36 -0
  860. package/.claude/hooks/tests/test_rubric_catalogue.py +359 -0
  861. package/.claude/hooks/tests/test_scratchpad_lib.py +259 -0
  862. package/.claude/hooks/tests/test_secret_patterns.py +680 -0
  863. package/.claude/hooks/tests/test_secret_patterns_provenance.py +82 -0
  864. package/.claude/hooks/tests/test_sentinel_session_cache.py +324 -0
  865. package/.claude/hooks/tests/test_sentinel_session_cache_tier1.py +205 -0
  866. package/.claude/hooks/tests/test_sentinel_signers.py +641 -0
  867. package/.claude/hooks/tests/test_session_75_kernel_findings.py +180 -0
  868. package/.claude/hooks/tests/test_session_76_audit_v3_findings.py +493 -0
  869. package/.claude/hooks/tests/test_session_77_audit_v3_backlog_findings.py +644 -0
  870. package/.claude/hooks/tests/test_session_77_round_2_findings.py +135 -0
  871. package/.claude/hooks/tests/test_session_77_round_3_findings.py +159 -0
  872. package/.claude/hooks/tests/test_session_77_round_4_findings.py +120 -0
  873. package/.claude/hooks/tests/test_session_end.py +113 -0
  874. package/.claude/hooks/tests/test_session_start.py +293 -0
  875. package/.claude/hooks/tests/test_skill_unknown_ratio_path_d.py +249 -0
  876. package/.claude/hooks/tests/test_smart_loading_resolver_caching.py +140 -0
  877. package/.claude/hooks/tests/test_spec_context_sanitizer.py +179 -0
  878. package/.claude/hooks/tests/test_spool_drain_contended_skip.py +249 -0
  879. package/.claude/hooks/tests/test_spool_drain_rotation_property_b.py +227 -0
  880. package/.claude/hooks/tests/test_spool_drain_rotation_race.py +395 -0
  881. package/.claude/hooks/tests/test_spool_writer_cache.py +463 -0
  882. package/.claude/hooks/tests/test_state_store.py +302 -0
  883. package/.claude/hooks/tests/test_stop.py +133 -0
  884. package/.claude/hooks/tests/test_streaming_rate_cap.py +108 -0
  885. package/.claude/hooks/tests/test_subagent_dispatch.py +248 -0
  886. package/.claude/hooks/tests/test_subagent_model_override_removed.py +108 -0
  887. package/.claude/hooks/tests/test_team.py +95 -0
  888. package/.claude/hooks/tests/test_template_dogfood_parity.py +106 -0
  889. package/.claude/hooks/tests/test_terminal_compress.py +135 -0
  890. package/.claude/hooks/tests/test_test_env_context_agent_binding.py +140 -0
  891. package/.claude/hooks/tests/test_testing_helper.py +53 -0
  892. package/.claude/hooks/tests/test_thinking_budget_command.py +229 -0
  893. package/.claude/hooks/tests/test_tier_policy_agent_frontmatter.py +421 -0
  894. package/.claude/hooks/tests/test_tier_policy_agent_frontmatter_disposition.py +175 -0
  895. package/.claude/hooks/tests/test_tier_policy_constants.py +336 -0
  896. package/.claude/hooks/tests/test_tier_policy_loader.py +544 -0
  897. package/.claude/hooks/tests/test_tier_policy_loader_fallback_observed.py +169 -0
  898. package/.claude/hooks/tests/test_tier_policy_types.py +270 -0
  899. package/.claude/hooks/tests/test_tokens_lib.py +118 -0
  900. package/.claude/hooks/tests/test_tool_lifecycle.py +598 -0
  901. package/.claude/hooks/tests/test_tool_lifecycle_perf.py +110 -0
  902. package/.claude/hooks/tests/test_turbo_profile.py +28 -0
  903. package/.claude/hooks/tests/test_turbo_sessionstart.py +79 -0
  904. package/.claude/hooks/tests/test_two_writer_chain.py +175 -0
  905. package/.claude/hooks/tests/test_upgrade_retry.py +346 -0
  906. package/.claude/hooks/tests/test_user_prompt_submit.py +254 -0
  907. package/.claude/hooks/tests/test_user_prompt_submit_salt.py +204 -0
  908. package/.claude/hooks/tests/test_verify_after_edit.py +100 -0
  909. package/.claude/hooks/tests/test_veto_floor_bijection.py +174 -0
  910. package/.claude/hooks/tests/test_w5_cookbook_remediation.py +712 -0
  911. package/.claude/hooks/tests/test_w5_scrub_enforcement.py +371 -0
  912. package/.claude/hooks/tests/test_webfetch_injection.py +280 -0
  913. package/.claude/hooks/tests/test_wiredeadmod_estimation_wiring.py +283 -0
  914. package/.claude/hooks/tests/test_wiredeadmod_spawn_wiring.py +303 -0
  915. package/.claude/hooks/tests/test_worktree_writer.py +509 -0
  916. package/.claude/hooks/turbo_profile.py +554 -0
  917. package/.claude/hooks/turbo_sessionstart.py +472 -0
  918. package/.claude/hooks/verify_after_edit.py +281 -0
  919. package/.claude/pitfalls-catalog.yaml +150 -0
  920. package/.claude/plans/AUDIT-LOG-SCHEMA.md +548 -0
  921. package/.claude/plans/DEBATE-SCHEMA.md +539 -0
  922. package/.claude/plans/PLAN-128/AB-PROTOCOL.md +121 -0
  923. package/.claude/plans/PLAN-128/measure-state.sh +101 -0
  924. package/.claude/plans/PLAN-139-canonical-invariants-and-debt-ledger.md +253 -0
  925. package/.claude/plans/PLAN-140/architect/round-1/approved.md +40 -0
  926. package/.claude/plans/PLAN-140-compaction-hook-origin-dropfix.md +95 -0
  927. package/.claude/plans/PLAN-141/architect/round-1/approved.md +28 -0
  928. package/.claude/plans/PLAN-141-mcp-smoke-staging-ruff-tolerance.md +72 -0
  929. package/.claude/plans/PLAN-142/architect/round-1/anonymization-map.md +11 -0
  930. package/.claude/plans/PLAN-142/architect/round-1/consensus.md +95 -0
  931. package/.claude/plans/PLAN-142/architect/round-1/devops-engineer.md +57 -0
  932. package/.claude/plans/PLAN-142/architect/round-1/proposal.md +57 -0
  933. package/.claude/plans/PLAN-142/architect/round-1/security-engineer.md +55 -0
  934. package/.claude/plans/PLAN-142/architect/round-1/vp-engineering.md +58 -0
  935. package/.claude/plans/PLAN-142/architect/round-2/anonymization-map.md +11 -0
  936. package/.claude/plans/PLAN-142/architect/round-2/approved.md +65 -0
  937. package/.claude/plans/PLAN-142/architect/round-2/consensus.md +78 -0
  938. package/.claude/plans/PLAN-142/architect/round-2/devops-engineer.md +58 -0
  939. package/.claude/plans/PLAN-142/architect/round-2/security-engineer.md +56 -0
  940. package/.claude/plans/PLAN-142/architect/round-2/vp-engineering.md +54 -0
  941. package/.claude/plans/PLAN-142/staging/EXECUTION-RUNBOOK.md +74 -0
  942. package/.claude/plans/PLAN-142/staging/STAGING-NOTES.md +63 -0
  943. package/.claude/plans/PLAN-142/staging/check_pair_rail__invoke_and_consume.py.txt +644 -0
  944. package/.claude/plans/PLAN-142/staging/codex_adapter_parsers.py.txt +677 -0
  945. package/.claude/plans/PLAN-142/staging/codex_cli_shape.py +433 -0
  946. package/.claude/plans/PLAN-142-codex-cli-0139-adapter-migration.md +224 -0
  947. package/.claude/plans/PLAN-143/architect/round-1/anonymization-map.md +22 -0
  948. package/.claude/plans/PLAN-143/architect/round-1/consensus.md +108 -0
  949. package/.claude/plans/PLAN-143/architect/round-1/devops-engineer.md +228 -0
  950. package/.claude/plans/PLAN-143/architect/round-1/proposal.md +48 -0
  951. package/.claude/plans/PLAN-143/architect/round-1/security-engineer.md +224 -0
  952. package/.claude/plans/PLAN-143/architect/round-1/vp-engineering.md +166 -0
  953. package/.claude/plans/PLAN-143/patches/PLAN143-item1-env-inventory.NOTE.md +106 -0
  954. package/.claude/plans/PLAN-143/patches/PLAN143-item2-spool-writer-rotate-guard.patch +41 -0
  955. package/.claude/plans/PLAN-143/patches/PLAN143-item3-audit-emit-exit-code.patch +32 -0
  956. package/.claude/plans/PLAN-143-repo-hygiene-debt.md +201 -0
  957. package/.claude/plans/PLAN-SCHEMA.md +870 -0
  958. package/.claude/plans/README.md +208 -0
  959. package/.claude/plans/examples/debate-round-1/consensus.md +166 -0
  960. package/.claude/plans/examples/debate-round-1/devops-engineer.md +133 -0
  961. package/.claude/plans/examples/debate-round-1/proposal.md +66 -0
  962. package/.claude/plans/examples/debate-round-1/security-engineer.md +109 -0
  963. package/.claude/plans/examples/debate-round-1/vp-engineering.md +110 -0
  964. package/.claude/policies/.drift-manifest.json +16 -0
  965. package/.claude/policies/bash-safety.policy.yaml +37 -0
  966. package/.claude/policies/fixtures/.gitkeep +0 -0
  967. package/.claude/policies/fixtures/bash-safety.fixtures.jsonl +46 -0
  968. package/.claude/policies/fixtures/plan-edit.fixtures.jsonl +36 -0
  969. package/.claude/policies/grandfather-cap.policy.yaml +85 -0
  970. package/.claude/policies/plan-edit.policy.yaml +152 -0
  971. package/.claude/policies/rubric-violation-catalogue.yaml +187 -0
  972. package/.claude/policies/schemas/repo-profile-skill-binding.schema.json +126 -0
  973. package/.claude/policies/schemas/repo-profile.schema.json +83 -0
  974. package/.claude/policies/schemas/squad-bundle-frontmatter.schema.json +152 -0
  975. package/.claude/policies/secret-patterns-exchange.yaml +368 -0
  976. package/.claude/policies/smart-loading-cap-table.yaml +34 -0
  977. package/.claude/proposals/.gitkeep +0 -0
  978. package/.claude/proposals/README.md +42 -0
  979. package/.claude/proposals/SP-001-code-review-checklist-2026-04-20.md +65 -0
  980. package/.claude/proposals/SP-001-code-review-checklist-2026-04-20.md.asc +8 -0
  981. package/.claude/proposals/SP-002-security-and-auth-2026-04-20.md +74 -0
  982. package/.claude/proposals/SP-002-security-and-auth-2026-04-20.md.asc +8 -0
  983. package/.claude/proposals/SP-003-design-system-and-components-2026-04-20.md +67 -0
  984. package/.claude/proposals/SP-003-design-system-and-components-2026-04-20.md.asc +8 -0
  985. package/.claude/proposals/SP-004-accessibility-and-wcag-2026-04-20.md +68 -0
  986. package/.claude/proposals/SP-004-accessibility-and-wcag-2026-04-20.md.asc +8 -0
  987. package/.claude/proposals/SP-005-ux-and-user-journeys-2026-04-20.md +63 -0
  988. package/.claude/proposals/SP-005-ux-and-user-journeys-2026-04-20.md.asc +8 -0
  989. package/.claude/proposals/SP-006-chaos-and-resilience-2026-04-20.md +79 -0
  990. package/.claude/proposals/SP-006-chaos-and-resilience-2026-04-20.md.asc +8 -0
  991. package/.claude/proposals/SP-007-ai-llm-orchestration-2026-04-20.md +76 -0
  992. package/.claude/proposals/SP-007-ai-llm-orchestration-2026-04-20.md.asc +8 -0
  993. package/.claude/proposals/SP-008-performance-engineering-2026-04-20.md +82 -0
  994. package/.claude/proposals/SP-008-performance-engineering-2026-04-20.md.asc +8 -0
  995. package/.claude/proposals/SP-009-code-review-checklist-2026-04-20.md +76 -0
  996. package/.claude/proposals/SP-009-code-review-checklist-2026-04-20.md.asc +8 -0
  997. package/.claude/proposals/SP-010-accessibility-and-wcag-adopter-note-2026-04-20.md +77 -0
  998. package/.claude/proposals/SP-010-accessibility-and-wcag-adopter-note-2026-04-20.md.asc +8 -0
  999. package/.claude/proposals/SP-011-design-system-and-components-adopter-note-2026-04-20.md +79 -0
  1000. package/.claude/proposals/SP-011-design-system-and-components-adopter-note-2026-04-20.md.asc +8 -0
  1001. package/.claude/proposals/SP-012-ux-and-user-journeys-adopter-note-2026-04-20.md +83 -0
  1002. package/.claude/proposals/SP-012-ux-and-user-journeys-adopter-note-2026-04-20.md.asc +8 -0
  1003. package/.claude/proposals/SP-013-frontend-performance-optimization-2026-04-20.md +82 -0
  1004. package/.claude/proposals/SP-013-frontend-performance-optimization-2026-04-20.md.asc +8 -0
  1005. package/.claude/proposals/SP-014-observability-and-ops-2026-04-20.md +80 -0
  1006. package/.claude/proposals/SP-014-observability-and-ops-2026-04-20.md.asc +8 -0
  1007. package/.claude/proposals/SP-015-testing-strategy-2026-04-20.md +87 -0
  1008. package/.claude/proposals/SP-015-testing-strategy-2026-04-20.md.asc +8 -0
  1009. package/.claude/proposals/SP-016-code-review-checklist-fluency-rubric-2026-04-28.md +111 -0
  1010. package/.claude/proposals/SP-016-code-review-checklist-fluency-rubric-2026-04-28.md.asc +8 -0
  1011. package/.claude/proposals/SP-017-chaos-and-resilience-adopter-note-2026-04-28.md +87 -0
  1012. package/.claude/proposals/SP-017-chaos-and-resilience-adopter-note-2026-04-28.md.asc +8 -0
  1013. package/.claude/proposals/SP-018-ceo-orchestration-inventory-regen-2026-04-21.md +64 -0
  1014. package/.claude/proposals/SP-018-ceo-orchestration-inventory-regen-2026-04-21.md.asc +8 -0
  1015. package/.claude/proposals/SP-019-terse-mode-2026-04-21.md +107 -0
  1016. package/.claude/proposals/SP-019-terse-mode-2026-04-21.md.asc +8 -0
  1017. package/.claude/proposals/SP-020-ceo-orchestration-audit-tokens-2026-04-21.md +74 -0
  1018. package/.claude/proposals/SP-020-ceo-orchestration-audit-tokens-2026-04-21.md.asc +8 -0
  1019. package/.claude/proposals/SP-021-ceo-orchestration-autonomous-loop-2026-04-21.md +71 -0
  1020. package/.claude/proposals/SP-021-ceo-orchestration-autonomous-loop-2026-04-21.md.asc +8 -0
  1021. package/.claude/rag/_index_core.py +344 -0
  1022. package/.claude/rag/indexignore +101 -0
  1023. package/.claude/rag/install-sidecar.sh +275 -0
  1024. package/.claude/rag/models.manifest.json +19 -0
  1025. package/.claude/rag/requirements.lock +40 -0
  1026. package/.claude/rag/sidecar-config.template.json +53 -0
  1027. package/.claude/rag/tests/test_index_core.py +262 -0
  1028. package/.claude/rag/tests/test_install_sidecar.sh +132 -0
  1029. package/.claude/scripts/.known_actions_floor.lock +0 -0
  1030. package/.claude/scripts/admin-invite.py +199 -0
  1031. package/.claude/scripts/adopter-metrics.py +712 -0
  1032. package/.claude/scripts/aek-calibration-c2.py +253 -0
  1033. package/.claude/scripts/aek-calibration-c3.py +382 -0
  1034. package/.claude/scripts/aggregate-changesets.py +350 -0
  1035. package/.claude/scripts/architect-bundle-validate.py +227 -0
  1036. package/.claude/scripts/audit-dashboard.py +1320 -0
  1037. package/.claude/scripts/audit-log-labels.jsonl +0 -0
  1038. package/.claude/scripts/audit-log-retain.py +404 -0
  1039. package/.claude/scripts/audit-query.py +3333 -0
  1040. package/.claude/scripts/audit-telemetry.py +337 -0
  1041. package/.claude/scripts/audit-tokens.py +502 -0
  1042. package/.claude/scripts/audit-verify-chain.py +537 -0
  1043. package/.claude/scripts/backup-audit.py +247 -0
  1044. package/.claude/scripts/benchmark/plan-071-import-floor/README.md +194 -0
  1045. package/.claude/scripts/benchmark/plan-071-import-floor/fixtures/baseline.json +1 -0
  1046. package/.claude/scripts/benchmark/plan-071-import-floor/fixtures/expected_quantiles.json +11 -0
  1047. package/.claude/scripts/benchmark/plan-071-import-floor/import_floor_bench.py +791 -0
  1048. package/.claude/scripts/benchmark/plan-071-import-floor/run_bench.sh +180 -0
  1049. package/.claude/scripts/benchmark-fallback-scorer.py +254 -0
  1050. package/.claude/scripts/benchmark-judge.py +621 -0
  1051. package/.claude/scripts/budget-summary.py +946 -0
  1052. package/.claude/scripts/build-canonical-models.py +645 -0
  1053. package/.claude/scripts/calibration-kappa.py +262 -0
  1054. package/.claude/scripts/cc-analytics-pull.py +393 -0
  1055. package/.claude/scripts/ceo-backup.sh +307 -0
  1056. package/.claude/scripts/ceo-boot.py +3017 -0
  1057. package/.claude/scripts/ceo-cost.py +1116 -0
  1058. package/.claude/scripts/ceo-diagnose.py +486 -0
  1059. package/.claude/scripts/ceo-escalation-detector.py +743 -0
  1060. package/.claude/scripts/ceo-health.py +584 -0
  1061. package/.claude/scripts/ceo-info.py +1001 -0
  1062. package/.claude/scripts/ceo-restore.sh +215 -0
  1063. package/.claude/scripts/chaos-inject.py +439 -0
  1064. package/.claude/scripts/check-action-sha-drift.py +275 -0
  1065. package/.claude/scripts/check-active-hooks-executable.py +119 -0
  1066. package/.claude/scripts/check-adr-chain.py +617 -0
  1067. package/.claude/scripts/check-audit-action-name-convention.py +221 -0
  1068. package/.claude/scripts/check-audit-hmac-null.py +253 -0
  1069. package/.claude/scripts/check-audit-read-api-stable.py +239 -0
  1070. package/.claude/scripts/check-audit-registry-coverage.py +999 -0
  1071. package/.claude/scripts/check-auto-activation-flags.py +180 -0
  1072. package/.claude/scripts/check-canonical-doc-freshness.py +222 -0
  1073. package/.claude/scripts/check-claude-md-claims.py +346 -0
  1074. package/.claude/scripts/check-confidence-gate-drift.py +295 -0
  1075. package/.claude/scripts/check-conformance-harness-mapping.py +503 -0
  1076. package/.claude/scripts/check-contamination.sh +25 -0
  1077. package/.claude/scripts/check-creative-rewrite.py +596 -0
  1078. package/.claude/scripts/check-debate-round-lifecycle.py +185 -0
  1079. package/.claude/scripts/check-debt-ledger.py +305 -0
  1080. package/.claude/scripts/check-docs-drift.py +259 -0
  1081. package/.claude/scripts/check-docs-freshness.py +487 -0
  1082. package/.claude/scripts/check-flip-criteria-drift.py +426 -0
  1083. package/.claude/scripts/check-flip-release-gate-consistency.py +134 -0
  1084. package/.claude/scripts/check-framework-updates.sh +239 -0
  1085. package/.claude/scripts/check-function-length.py +426 -0
  1086. package/.claude/scripts/check-model-deprecations.py +377 -0
  1087. package/.claude/scripts/check-originator-residue.py +248 -0
  1088. package/.claude/scripts/check-pitfall-regression.sh +153 -0
  1089. package/.claude/scripts/check-policy-drift.py +74 -0
  1090. package/.claude/scripts/check-roadmap-binding.py +170 -0
  1091. package/.claude/scripts/check-rule-invariants.py +385 -0
  1092. package/.claude/scripts/check-sdk-compat.sh +76 -0
  1093. package/.claude/scripts/check-secret-pattern-coverage.py +175 -0
  1094. package/.claude/scripts/check-sidecar-manifest.py +493 -0
  1095. package/.claude/scripts/check-skill-activation-mode.py +41 -0
  1096. package/.claude/scripts/check-skill-health.sh +179 -0
  1097. package/.claude/scripts/check-spec-drift.py +147 -0
  1098. package/.claude/scripts/check-staleness.py +506 -0
  1099. package/.claude/scripts/check-stdlib-only.py +373 -0
  1100. package/.claude/scripts/check-substrate-watch.py +285 -0
  1101. package/.claude/scripts/check-swarm-harness-mapping.py +380 -0
  1102. package/.claude/scripts/check-test-audit-isolation.py +622 -0
  1103. package/.claude/scripts/check-test-env-hygiene.py +509 -0
  1104. package/.claude/scripts/check-threat-model-freshness.py +313 -0
  1105. package/.claude/scripts/check-tier-boundaries.py +233 -0
  1106. package/.claude/scripts/check-tla-schema-drift.py +272 -0
  1107. package/.claude/scripts/check_atlas_fpr.py +595 -0
  1108. package/.claude/scripts/check_contamination.py +337 -0
  1109. package/.claude/scripts/check_known_actions_floor.py +155 -0
  1110. package/.claude/scripts/check_threat_model_coverage.py +214 -0
  1111. package/.claude/scripts/check_translations_drift.py +199 -0
  1112. package/.claude/scripts/codex_invoke.py +436 -0
  1113. package/.claude/scripts/compare-adopters.py +549 -0
  1114. package/.claude/scripts/confidence-gate-backfill.py +261 -0
  1115. package/.claude/scripts/confidence_gate.py +736 -0
  1116. package/.claude/scripts/context-budget.py +1887 -0
  1117. package/.claude/scripts/contextual-recommender.py +815 -0
  1118. package/.claude/scripts/cost-table.yaml +99 -0
  1119. package/.claude/scripts/debate-converge.py +335 -0
  1120. package/.claude/scripts/debate-emit.py +132 -0
  1121. package/.claude/scripts/debate-orchestrate.py +972 -0
  1122. package/.claude/scripts/detect-repo-profile.py +1280 -0
  1123. package/.claude/scripts/detectors/__init__.py +19 -0
  1124. package/.claude/scripts/detectors/looping.py +127 -0
  1125. package/.claude/scripts/detectors/overpowered.py +96 -0
  1126. package/.claude/scripts/detectors/retry_churn.py +119 -0
  1127. package/.claude/scripts/detectors/schema.py +94 -0
  1128. package/.claude/scripts/detectors/tests/__init__.py +0 -0
  1129. package/.claude/scripts/detectors/tests/fixtures.py +420 -0
  1130. package/.claude/scripts/detectors/tests/test_looping.py +124 -0
  1131. package/.claude/scripts/detectors/tests/test_overpowered.py +114 -0
  1132. package/.claude/scripts/detectors/tests/test_retry_churn.py +101 -0
  1133. package/.claude/scripts/detectors/tests/test_schema.py +109 -0
  1134. package/.claude/scripts/detectors/tests/test_tool_cascade.py +131 -0
  1135. package/.claude/scripts/detectors/tests/test_wasteful_thinking.py +112 -0
  1136. package/.claude/scripts/detectors/tests/test_weak_model.py +104 -0
  1137. package/.claude/scripts/detectors/tool_cascade.py +127 -0
  1138. package/.claude/scripts/detectors/wasteful_thinking.py +99 -0
  1139. package/.claude/scripts/detectors/weak_model.py +92 -0
  1140. package/.claude/scripts/env-inventory-check.py +268 -0
  1141. package/.claude/scripts/env-inventory.json +3305 -0
  1142. package/.claude/scripts/extract-skill.py +456 -0
  1143. package/.claude/scripts/fan-plan-parser.py +370 -0
  1144. package/.claude/scripts/find-orphan-sentinels.py +89 -0
  1145. package/.claude/scripts/first-run-wizard.py +1151 -0
  1146. package/.claude/scripts/fixtures/cloned-trading-repo/.env.example +1 -0
  1147. package/.claude/scripts/fixtures/cloned-trading-repo/exchanges/binance.py +3 -0
  1148. package/.claude/scripts/fixtures/cloned-trading-repo/exchanges/coinbase.py +3 -0
  1149. package/.claude/scripts/fixtures/cloned-trading-repo/package.json +5 -0
  1150. package/.claude/scripts/fixtures/cloned-trading-repo/strategies/grid.py +3 -0
  1151. package/.claude/scripts/fixtures/cloned-trading-repo/strategies/pairs.py +3 -0
  1152. package/.claude/scripts/fixtures/missing-package-manifest/README.md +3 -0
  1153. package/.claude/scripts/fixtures/missing-package-manifest/src/main.py +1 -0
  1154. package/.claude/scripts/fixtures/mixed-frontend-backend/package.json +9 -0
  1155. package/.claude/scripts/fixtures/mixed-frontend-backend/requirements.txt +2 -0
  1156. package/.claude/scripts/fixtures/mixed-frontend-backend/src/api/handler.py +2 -0
  1157. package/.claude/scripts/fixtures/mixed-frontend-backend/src/pages/index.tsx +1 -0
  1158. package/.claude/scripts/fixtures/monorepo/apps/app-a/README.md +1 -0
  1159. package/.claude/scripts/fixtures/monorepo/apps/app-b/index.ts +1 -0
  1160. package/.claude/scripts/fixtures/monorepo/package.json +5 -0
  1161. package/.claude/scripts/fixtures/monorepo/packages/lib-a/index.js +1 -0
  1162. package/.claude/scripts/fixtures/monorepo/packages/lib-b/index.js +1 -0
  1163. package/.claude/scripts/fixtures/monorepo/pnpm-workspace.yaml +3 -0
  1164. package/.claude/scripts/fixtures/persona-coverage-expected-thresholds.yaml +20 -0
  1165. package/.claude/scripts/flip-criteria-drift-allowlist.txt +31 -0
  1166. package/.claude/scripts/generate-adr-index.py +339 -0
  1167. package/.claude/scripts/generate-available-models.py +280 -0
  1168. package/.claude/scripts/generate-dispatch.py +430 -0
  1169. package/.claude/scripts/generate-sbom.py +287 -0
  1170. package/.claude/scripts/generate-skill-inventory.sh +193 -0
  1171. package/.claude/scripts/github-api-client.py +297 -0
  1172. package/.claude/scripts/goap-planner.py +742 -0
  1173. package/.claude/scripts/hook-profiler.py +671 -0
  1174. package/.claude/scripts/import-skill.py +569 -0
  1175. package/.claude/scripts/import_ui_ux_pro_max.py +137 -0
  1176. package/.claude/scripts/inject-agent-context.sh +948 -0
  1177. package/.claude/scripts/k-calibration.py +456 -0
  1178. package/.claude/scripts/key-hygiene.py +511 -0
  1179. package/.claude/scripts/lesson-restore.py +171 -0
  1180. package/.claude/scripts/lesson_ranker.py +100 -0
  1181. package/.claude/scripts/lessons.py +883 -0
  1182. package/.claude/scripts/lint-skills.py +555 -0
  1183. package/.claude/scripts/local/README.md +280 -0
  1184. package/.claude/scripts/local/check-doc-skill-paths.sh +124 -0
  1185. package/.claude/scripts/local/dependency-graph.py +684 -0
  1186. package/.claude/scripts/local/estimate-calibrator.py +240 -0
  1187. package/.claude/scripts/local/findings-pretty-print.py +78 -0
  1188. package/.claude/scripts/local/generate-ceremony.sh +558 -0
  1189. package/.claude/scripts/local/pair-rail-gate.sh +156 -0
  1190. package/.claude/scripts/local/release-dry-run.py +853 -0
  1191. package/.claude/scripts/local/tests/test_dependency_graph.py +364 -0
  1192. package/.claude/scripts/local/tests/test_generate_ceremony.sh +144 -0
  1193. package/.claude/scripts/local/tests/test_release_dry_run.py +743 -0
  1194. package/.claude/scripts/local/validate-findings.py +168 -0
  1195. package/.claude/scripts/local/validate-saved-workflows.js +69 -0
  1196. package/.claude/scripts/local/verify-counts.sh +420 -0
  1197. package/.claude/scripts/local/verify-scope-coverage.py +205 -0
  1198. package/.claude/scripts/local/verify-staging-manifest.py +188 -0
  1199. package/.claude/scripts/local/wave-readonly-monitor.py +271 -0
  1200. package/.claude/scripts/log-friction.sh +290 -0
  1201. package/.claude/scripts/mcp/code_nav_bridge.py +259 -0
  1202. package/.claude/scripts/mcp-server/__init__.py +16 -0
  1203. package/.claude/scripts/mcp-server/auth.py +333 -0
  1204. package/.claude/scripts/mcp-server/cost.py +108 -0
  1205. package/.claude/scripts/mcp-server/dispatch.py +853 -0
  1206. package/.claude/scripts/mcp-server/handlers/__init__.py +16 -0
  1207. package/.claude/scripts/mcp-server/handlers/audit_query.py +384 -0
  1208. package/.claude/scripts/mcp-server/handlers/get_audit_log.py +163 -0
  1209. package/.claude/scripts/mcp-server/handlers/get_cost_budget.py +130 -0
  1210. package/.claude/scripts/mcp-server/handlers/get_debate_state.py +207 -0
  1211. package/.claude/scripts/mcp-server/handlers/get_skill.py +199 -0
  1212. package/.claude/scripts/mcp-server/handlers/list_agents.py +236 -0
  1213. package/.claude/scripts/mcp-server/handlers/list_pitfalls.py +192 -0
  1214. package/.claude/scripts/mcp-server/handlers/list_skills.py +197 -0
  1215. package/.claude/scripts/mcp-server/handlers/plan_status.py +489 -0
  1216. package/.claude/scripts/mcp-server/handlers/server_capabilities.py +127 -0
  1217. package/.claude/scripts/mcp-server/handlers/spawn_agent.py +274 -0
  1218. package/.claude/scripts/mcp-server/http_transport.py +373 -0
  1219. package/.claude/scripts/mcp-server/rate_limit.py +345 -0
  1220. package/.claude/scripts/mcp-server/server.py +212 -0
  1221. package/.claude/scripts/mcp-server/start-mcp-server.sh +111 -0
  1222. package/.claude/scripts/mcp-server/stdio_transport.py +150 -0
  1223. package/.claude/scripts/mcp-server/tests/__init__.py +1 -0
  1224. package/.claude/scripts/mcp-server/tests/test_auth.py +454 -0
  1225. package/.claude/scripts/mcp-server/tests/test_cost.py +122 -0
  1226. package/.claude/scripts/mcp-server/tests/test_dispatch.py +448 -0
  1227. package/.claude/scripts/mcp-server/tests/test_dispatch_bearer_replay_wire.py +358 -0
  1228. package/.claude/scripts/mcp-server/tests/test_handlers_get_audit_log.py +107 -0
  1229. package/.claude/scripts/mcp-server/tests/test_handlers_get_skill.py +108 -0
  1230. package/.claude/scripts/mcp-server/tests/test_handlers_list_agents.py +92 -0
  1231. package/.claude/scripts/mcp-server/tests/test_handlers_list_pitfalls.py +103 -0
  1232. package/.claude/scripts/mcp-server/tests/test_handlers_list_skills.py +121 -0
  1233. package/.claude/scripts/mcp-server/tests/test_handlers_server_capabilities.py +128 -0
  1234. package/.claude/scripts/mcp-server/tests/test_handlers_spawn_agent.py +275 -0
  1235. package/.claude/scripts/mcp-server/tests/test_http_transport.py +418 -0
  1236. package/.claude/scripts/mcp-server/tests/test_rate_limit.py +239 -0
  1237. package/.claude/scripts/mcp-server/tests/test_server.py +125 -0
  1238. package/.claude/scripts/mcp-server/tests/test_stdio_transport.py +196 -0
  1239. package/.claude/scripts/mcp-soak-monitor.py +224 -0
  1240. package/.claude/scripts/memory-prioritize.py +516 -0
  1241. package/.claude/scripts/migrate-grandfather-to-sha256.py +384 -0
  1242. package/.claude/scripts/model-deprecations.json +165 -0
  1243. package/.claude/scripts/morning-ceremony.py +266 -0
  1244. package/.claude/scripts/morning_ledger.py +446 -0
  1245. package/.claude/scripts/mutation-floors.yaml +51 -0
  1246. package/.claude/scripts/mutation-test.py +506 -0
  1247. package/.claude/scripts/nightly-proposals.py +210 -0
  1248. package/.claude/scripts/optimizer/__init__.py +46 -0
  1249. package/.claude/scripts/optimizer/_codex_redaction.py +101 -0
  1250. package/.claude/scripts/optimizer/_skeleton.py +137 -0
  1251. package/.claude/scripts/optimizer/codex_phase_gate.py +257 -0
  1252. package/.claude/scripts/optimizer/complexity_gate.py +208 -0
  1253. package/.claude/scripts/optimizer/fanout.py +249 -0
  1254. package/.claude/scripts/optimizer/model_choice.py +151 -0
  1255. package/.claude/scripts/optimizer/model_normalize.py +118 -0
  1256. package/.claude/scripts/optimizer/rag_recommender.py +110 -0
  1257. package/.claude/scripts/optimizer/recommender.py +213 -0
  1258. package/.claude/scripts/optimizer/tests/__init__.py +0 -0
  1259. package/.claude/scripts/optimizer/tests/test_codex_phase_gate.py +314 -0
  1260. package/.claude/scripts/optimizer/tests/test_codex_review_invoked_emission.py +225 -0
  1261. package/.claude/scripts/optimizer/tests/test_optimizer_complexity_gate.py +122 -0
  1262. package/.claude/scripts/optimizer/tests/test_optimizer_fanout.py +134 -0
  1263. package/.claude/scripts/optimizer/tests/test_optimizer_model_choice.py +124 -0
  1264. package/.claude/scripts/optimizer/tests/test_optimizer_model_normalize.py +155 -0
  1265. package/.claude/scripts/optimizer/tests/test_optimizer_rag_recommender.py +190 -0
  1266. package/.claude/scripts/optimizer/tests/test_optimizer_recommender.py +131 -0
  1267. package/.claude/scripts/optimizer/tests/test_optimizer_skeleton.py +117 -0
  1268. package/.claude/scripts/optimizer/tests/test_optimizer_types.py +53 -0
  1269. package/.claude/scripts/optimizer/types.py +122 -0
  1270. package/.claude/scripts/osv_check.py +559 -0
  1271. package/.claude/scripts/otel-export.py +329 -0
  1272. package/.claude/scripts/otel-local-sink.py +470 -0
  1273. package/.claude/scripts/persona_demand_resolver.py +658 -0
  1274. package/.claude/scripts/persona_demand_scan.py +382 -0
  1275. package/.claude/scripts/persona_waive_parser.py +127 -0
  1276. package/.claude/scripts/pitfall-query.py +218 -0
  1277. package/.claude/scripts/plan-tokens.py +843 -0
  1278. package/.claude/scripts/policy-shadow-runner.py +445 -0
  1279. package/.claude/scripts/predict-budget/predict-plan-cost.py +581 -0
  1280. package/.claude/scripts/predict-budget/tests/test_predict_plan_cost.py +375 -0
  1281. package/.claude/scripts/profile-opus-4-7.py +557 -0
  1282. package/.claude/scripts/prune-lessons.py +453 -0
  1283. package/.claude/scripts/rate-card-calibrate.py +283 -0
  1284. package/.claude/scripts/rate-card-fixtures.json +18 -0
  1285. package/.claude/scripts/reality-ledger.py +2175 -0
  1286. package/.claude/scripts/red-team-corpus/.byte-identity-check.txt +86 -0
  1287. package/.claude/scripts/red-team-corpus/README.md +132 -0
  1288. package/.claude/scripts/red-team-corpus/external/EXT-001-prompt-inject.md +24 -0
  1289. package/.claude/scripts/red-team-corpus/external/EXT-002-hackaprompt.md +25 -0
  1290. package/.claude/scripts/red-team-corpus/external/EXT-003-gcg.md +31 -0
  1291. package/.claude/scripts/red-team-corpus/external/EXT-004-tap.md +23 -0
  1292. package/.claude/scripts/red-team-corpus/external/EXT-005-cybersecurity-eval.md +30 -0
  1293. package/.claude/scripts/red-team-corpus/external/EXT-006-anthropic-samples.md +26 -0
  1294. package/.claude/scripts/red-team-corpus/external/EXT-007-trojan-source.md +26 -0
  1295. package/.claude/scripts/red-team-corpus/external/EXT-008-owasp-llm-top10.md +33 -0
  1296. package/.claude/scripts/red-team-corpus/external/EXT-009-jailbreak-bench.md +24 -0
  1297. package/.claude/scripts/red-team-corpus/external/EXT-010-advbench.md +22 -0
  1298. package/.claude/scripts/red-team-corpus/external/EXT-011-mitre-atlas.md +25 -0
  1299. package/.claude/scripts/red-team-corpus/external/EXT-012-npm-typosquat.md +23 -0
  1300. package/.claude/scripts/red-team-corpus/external/EXT-013-log-tamper-poc.md +25 -0
  1301. package/.claude/scripts/red-team-corpus/external/EXT-014-cwe-798-credentials.md +24 -0
  1302. package/.claude/scripts/red-team-corpus/external/EXT-015-garak.md +28 -0
  1303. package/.claude/scripts/red-team-corpus/external/EXT-016-skill-content-injection-via-markdown.jsonl +1 -0
  1304. package/.claude/scripts/red-team-corpus/external/EXT-017-persona-impersonation-ceo.jsonl +1 -0
  1305. package/.claude/scripts/red-team-corpus/external/EXT-018-file-assignment-wildcard-escape.jsonl +1 -0
  1306. package/.claude/scripts/red-team-corpus/external/EXT-019-veto-bypass-force-proceed.jsonl +1 -0
  1307. package/.claude/scripts/red-team-corpus/external/EXT-020-canonical-edit-circumvent-settings.jsonl +1 -0
  1308. package/.claude/scripts/red-team-corpus/external/EXT-021-spawn-without-agent-profile.jsonl +1 -0
  1309. package/.claude/scripts/red-team-corpus/external/EXT-022-hidden-unicode-in-skill-name.jsonl +1 -0
  1310. package/.claude/scripts/red-team-corpus/external/EXT-023-mcp-spawn-governance-bypass.jsonl +1 -0
  1311. package/.claude/scripts/red-team-corpus/external/EXT-024-adapter-credential-in-error-trace.jsonl +1 -0
  1312. package/.claude/scripts/red-team-corpus/external/EXT-025-sandbox-escape-nested-subshell.jsonl +1 -0
  1313. package/.claude/scripts/red-team-corpus/external/EXT-026-plan-edit-without-debate.jsonl +1 -0
  1314. package/.claude/scripts/red-team-corpus/external/EXT-027-audit-log-rotation-race.jsonl +1 -0
  1315. package/.claude/scripts/red-team-corpus/external/EXT-028-npm-dependency-confusion.jsonl +1 -0
  1316. package/.claude/scripts/red-team-corpus/external/EXT-029-output-safety-unicode-confusable.jsonl +1 -0
  1317. package/.claude/scripts/red-team-corpus/external/EXT-030-adapter-retry-storm-dos.jsonl +1 -0
  1318. package/.claude/scripts/red-team-corpus/external/EXT-031-team-md-direct-edit.jsonl +1 -0
  1319. package/.claude/scripts/red-team-corpus/external/EXT-032-sandbox-env-var-exfil.jsonl +1 -0
  1320. package/.claude/scripts/red-team-corpus/external/EXT-033-mcp-rate-limit-bypass-headers.jsonl +1 -0
  1321. package/.claude/scripts/red-team-corpus/external/EXT-034-otel-span-attribute-leak.jsonl +1 -0
  1322. package/.claude/scripts/red-team-corpus/external/EXT-035-skill-patch-polyglot-payload.jsonl +1 -0
  1323. package/.claude/scripts/red-team-corpus/external/EXT-036-output-safety-base64-triple-wrap.jsonl +1 -0
  1324. package/.claude/scripts/red-team-corpus/external/EXT-037-plan-id-cross-plan-memory-read.jsonl +1 -0
  1325. package/.claude/scripts/red-team-corpus/external/EXT-038-npm-slsa-provenance-strip.jsonl +1 -0
  1326. package/.claude/scripts/red-team-corpus/external/EXT-039-adapter-exfil-streaming-chunk.jsonl +1 -0
  1327. package/.claude/scripts/red-team-corpus/external/EXT-040-sandbox-symlink-to-secrets.jsonl +1 -0
  1328. package/.claude/scripts/red-team-corpus/external/README.md +63 -0
  1329. package/.claude/scripts/red-team-corpus/flake-budget.yaml +244 -0
  1330. package/.claude/scripts/red-team-corpus/provenance.md +74 -0
  1331. package/.claude/scripts/red-team-corpus/regression/REG-001-s3-audit-emission-gap.jsonl +1 -0
  1332. package/.claude/scripts/red-team-corpus/regression/REG-002-audit-registry-miss.jsonl +1 -0
  1333. package/.claude/scripts/red-team-corpus/regression/REG-003-breaker-provider-kwarg-missing.jsonl +1 -0
  1334. package/.claude/scripts/red-team-corpus/regression/REG-004-canonical-edit-conftest-block.jsonl +1 -0
  1335. package/.claude/scripts/red-team-corpus/regression/REG-005-mcp-dispatch-oversized-handler.jsonl +1 -0
  1336. package/.claude/scripts/red-team-corpus/regression/REG-006-audit-registry-false-orphan.jsonl +1 -0
  1337. package/.claude/scripts/red-team-corpus/regression/REG-007-spec-count-undercount.jsonl +1 -0
  1338. package/.claude/scripts/red-team-corpus/regression/REG-008-adr-reserved-slot-phantom.jsonl +1 -0
  1339. package/.claude/scripts/red-team-corpus/regression/REG-009-tlc-pending-placeholder.jsonl +1 -0
  1340. package/.claude/scripts/red-team-corpus/regression/REG-010-mutation-kill-rate-fake.jsonl +1 -0
  1341. package/.claude/scripts/red-team-corpus/regression/REG-011-byte-identity-governance-persona.jsonl +1 -0
  1342. package/.claude/scripts/red-team-corpus/regression/REG-012-conformance-mapping-partial-path.jsonl +1 -0
  1343. package/.claude/scripts/red-team-corpus/regression/REG-013-l1-fairness-lazy-fire.jsonl +1 -0
  1344. package/.claude/scripts/red-team-corpus/regression/REG-014-mcp-path-traversal-skill.jsonl +1 -0
  1345. package/.claude/scripts/red-team-corpus/regression/REG-015-mcp-hmac-timestamp-skew.jsonl +1 -0
  1346. package/.claude/scripts/red-team-corpus/synthetic/SYN-001-skill-patch-bidi-trojan.jsonl +1 -0
  1347. package/.claude/scripts/red-team-corpus/synthetic/SYN-002-skill-patch-zero-width-smuggle.jsonl +1 -0
  1348. package/.claude/scripts/red-team-corpus/synthetic/SYN-003-skill-patch-exec-smuggled-fence.jsonl +1 -0
  1349. package/.claude/scripts/red-team-corpus/synthetic/SYN-004-skill-patch-oversized-diff.jsonl +1 -0
  1350. package/.claude/scripts/red-team-corpus/synthetic/SYN-005-audit-log-byte-rewrite.jsonl +1 -0
  1351. package/.claude/scripts/red-team-corpus/synthetic/SYN-006-audit-log-truncation.jsonl +1 -0
  1352. package/.claude/scripts/red-team-corpus/synthetic/SYN-007-audit-log-lock-race.jsonl +1 -0
  1353. package/.claude/scripts/red-team-corpus/synthetic/SYN-008-plan-id-env-spoof.jsonl +1 -0
  1354. package/.claude/scripts/red-team-corpus/synthetic/SYN-009-plan-id-frontmatter-hijack.jsonl +1 -0
  1355. package/.claude/scripts/red-team-corpus/synthetic/SYN-010-plan-id-cross-plan-read.jsonl +1 -0
  1356. package/.claude/scripts/red-team-corpus/synthetic/SYN-011-sandbox-escape-curl-exfil.jsonl +1 -0
  1357. package/.claude/scripts/red-team-corpus/synthetic/SYN-012-sandbox-escape-env-dump.jsonl +1 -0
  1358. package/.claude/scripts/red-team-corpus/synthetic/SYN-013-sandbox-escape-symlink-plant.jsonl +1 -0
  1359. package/.claude/scripts/red-team-corpus/synthetic/SYN-014-mcp-handler-governance-bypass.jsonl +1 -0
  1360. package/.claude/scripts/red-team-corpus/synthetic/SYN-015-mcp-handler-acl-enumeration.jsonl +1 -0
  1361. package/.claude/scripts/red-team-corpus/synthetic/SYN-016-mcp-handler-rate-limit-evasion.jsonl +1 -0
  1362. package/.claude/scripts/red-team-corpus/synthetic/SYN-017-adapter-exfil-via-error-message.jsonl +1 -0
  1363. package/.claude/scripts/red-team-corpus/synthetic/SYN-018-adapter-exfil-otel-attr.jsonl +1 -0
  1364. package/.claude/scripts/red-team-corpus/synthetic/SYN-019-adapter-exfil-retry-replay.jsonl +1 -0
  1365. package/.claude/scripts/red-team-corpus/synthetic/SYN-020-output-safety-nfkc-bypass.jsonl +1 -0
  1366. package/.claude/scripts/red-team-corpus/synthetic/SYN-021-output-safety-base64-double-wrap.jsonl +1 -0
  1367. package/.claude/scripts/red-team-corpus/synthetic/SYN-022-output-safety-entropy-below-threshold.jsonl +1 -0
  1368. package/.claude/scripts/red-team-corpus/synthetic/SYN-023-output-safety-regex-obfuscation.jsonl +1 -0
  1369. package/.claude/scripts/red-team-corpus/synthetic/SYN-024-output-safety-luhn-partial.jsonl +1 -0
  1370. package/.claude/scripts/red-team-corpus/synthetic/SYN-025-npm-tamper-supply-chain.jsonl +1 -0
  1371. package/.claude/scripts/red-team-corpus/synthetic/SYN-026-npm-tamper-typo-squat.jsonl +1 -0
  1372. package/.claude/scripts/red-team-corpus/synthetic/SYN-027-npm-tamper-unsigned-slsa.jsonl +1 -0
  1373. package/.claude/scripts/red-team-corpus/v1/fixtures.jsonl +67 -0
  1374. package/.claude/scripts/red-team-corpus/v1/fixtures.jsonl.sha256 +1 -0
  1375. package/.claude/scripts/red-team-corpus/v1/labels.json +88 -0
  1376. package/.claude/scripts/red-team-eval.py +1099 -0
  1377. package/.claude/scripts/registry.py +438 -0
  1378. package/.claude/scripts/replay/__init__.py +0 -0
  1379. package/.claude/scripts/replay/replay-session.py +1232 -0
  1380. package/.claude/scripts/replay/tests/__init__.py +0 -0
  1381. package/.claude/scripts/replay/tests/fixtures/api-key-01-positive.jsonl +1 -0
  1382. package/.claude/scripts/replay/tests/fixtures/api-key-02-positive.jsonl +1 -0
  1383. package/.claude/scripts/replay/tests/fixtures/api-key-03-positive.jsonl +1 -0
  1384. package/.claude/scripts/replay/tests/fixtures/api-key-04-positive.jsonl +1 -0
  1385. package/.claude/scripts/replay/tests/fixtures/api-key-05-negative.jsonl +1 -0
  1386. package/.claude/scripts/replay/tests/fixtures/api-key-06-negative.jsonl +1 -0
  1387. package/.claude/scripts/replay/tests/fixtures/api-key-07-negative.jsonl +1 -0
  1388. package/.claude/scripts/replay/tests/fixtures/api-key-08-negative.jsonl +1 -0
  1389. package/.claude/scripts/replay/tests/fixtures/cpf-cnpj-01-positive.jsonl +1 -0
  1390. package/.claude/scripts/replay/tests/fixtures/cpf-cnpj-02-positive.jsonl +1 -0
  1391. package/.claude/scripts/replay/tests/fixtures/cpf-cnpj-03-positive.jsonl +1 -0
  1392. package/.claude/scripts/replay/tests/fixtures/cpf-cnpj-04-positive.jsonl +1 -0
  1393. package/.claude/scripts/replay/tests/fixtures/cpf-cnpj-05-negative.jsonl +1 -0
  1394. package/.claude/scripts/replay/tests/fixtures/cpf-cnpj-06-negative.jsonl +1 -0
  1395. package/.claude/scripts/replay/tests/fixtures/cpf-cnpj-07-negative.jsonl +1 -0
  1396. package/.claude/scripts/replay/tests/fixtures/cpf-cnpj-08-negative.jsonl +1 -0
  1397. package/.claude/scripts/replay/tests/fixtures/email-in-log-01-positive.jsonl +1 -0
  1398. package/.claude/scripts/replay/tests/fixtures/email-in-log-02-positive.jsonl +1 -0
  1399. package/.claude/scripts/replay/tests/fixtures/email-in-log-03-positive.jsonl +1 -0
  1400. package/.claude/scripts/replay/tests/fixtures/email-in-log-04-positive.jsonl +1 -0
  1401. package/.claude/scripts/replay/tests/fixtures/email-in-log-05-negative.jsonl +1 -0
  1402. package/.claude/scripts/replay/tests/fixtures/email-in-log-06-negative.jsonl +1 -0
  1403. package/.claude/scripts/replay/tests/fixtures/email-in-log-07-negative.jsonl +1 -0
  1404. package/.claude/scripts/replay/tests/fixtures/email-in-log-08-negative.jsonl +1 -0
  1405. package/.claude/scripts/replay/tests/fixtures/homoglyph-01-positive.jsonl +1 -0
  1406. package/.claude/scripts/replay/tests/fixtures/homoglyph-02-positive.jsonl +1 -0
  1407. package/.claude/scripts/replay/tests/fixtures/homoglyph-03-positive.jsonl +1 -0
  1408. package/.claude/scripts/replay/tests/fixtures/homoglyph-04-positive.jsonl +1 -0
  1409. package/.claude/scripts/replay/tests/fixtures/homoglyph-05-negative.jsonl +1 -0
  1410. package/.claude/scripts/replay/tests/fixtures/homoglyph-06-negative.jsonl +1 -0
  1411. package/.claude/scripts/replay/tests/fixtures/homoglyph-07-negative.jsonl +1 -0
  1412. package/.claude/scripts/replay/tests/fixtures/homoglyph-08-negative.jsonl +1 -0
  1413. package/.claude/scripts/replay/tests/fixtures/jwt-01-positive.jsonl +1 -0
  1414. package/.claude/scripts/replay/tests/fixtures/jwt-02-positive.jsonl +1 -0
  1415. package/.claude/scripts/replay/tests/fixtures/jwt-03-positive.jsonl +1 -0
  1416. package/.claude/scripts/replay/tests/fixtures/jwt-04-positive.jsonl +1 -0
  1417. package/.claude/scripts/replay/tests/fixtures/jwt-05-negative.jsonl +1 -0
  1418. package/.claude/scripts/replay/tests/fixtures/jwt-06-negative.jsonl +1 -0
  1419. package/.claude/scripts/replay/tests/fixtures/jwt-07-negative.jsonl +1 -0
  1420. package/.claude/scripts/replay/tests/fixtures/jwt-08-negative.jsonl +1 -0
  1421. package/.claude/scripts/replay/tests/fixtures/os-path-01-positive.jsonl +1 -0
  1422. package/.claude/scripts/replay/tests/fixtures/os-path-02-positive.jsonl +1 -0
  1423. package/.claude/scripts/replay/tests/fixtures/os-path-03-positive.jsonl +1 -0
  1424. package/.claude/scripts/replay/tests/fixtures/os-path-04-positive.jsonl +1 -0
  1425. package/.claude/scripts/replay/tests/fixtures/os-path-05-negative.jsonl +1 -0
  1426. package/.claude/scripts/replay/tests/fixtures/os-path-06-negative.jsonl +1 -0
  1427. package/.claude/scripts/replay/tests/fixtures/os-path-07-negative.jsonl +1 -0
  1428. package/.claude/scripts/replay/tests/fixtures/os-path-08-negative.jsonl +1 -0
  1429. package/.claude/scripts/replay/tests/fixtures/pan-01-positive.jsonl +1 -0
  1430. package/.claude/scripts/replay/tests/fixtures/pan-02-positive.jsonl +1 -0
  1431. package/.claude/scripts/replay/tests/fixtures/pan-03-positive.jsonl +1 -0
  1432. package/.claude/scripts/replay/tests/fixtures/pan-04-positive.jsonl +1 -0
  1433. package/.claude/scripts/replay/tests/fixtures/pan-05-negative.jsonl +1 -0
  1434. package/.claude/scripts/replay/tests/fixtures/pan-06-negative.jsonl +1 -0
  1435. package/.claude/scripts/replay/tests/fixtures/pan-07-negative.jsonl +1 -0
  1436. package/.claude/scripts/replay/tests/fixtures/pan-08-negative.jsonl +1 -0
  1437. package/.claude/scripts/replay/tests/test_replay_redact_lib.py +971 -0
  1438. package/.claude/scripts/replay/tests/test_replay_session.py +396 -0
  1439. package/.claude/scripts/replay/tests/test_replay_session_capture.py +522 -0
  1440. package/.claude/scripts/repo-profile.schema.json +83 -0
  1441. package/.claude/scripts/run-promotion-gate.py +631 -0
  1442. package/.claude/scripts/run-skill-benchmark.py +1276 -0
  1443. package/.claude/scripts/scan-injection-strict.sh +162 -0
  1444. package/.claude/scripts/scan-injection.py +305 -0
  1445. package/.claude/scripts/scan-upstream-injection.py +663 -0
  1446. package/.claude/scripts/scratchpad.py +427 -0
  1447. package/.claude/scripts/self_test.py +602 -0
  1448. package/.claude/scripts/session-graph-build.py +728 -0
  1449. package/.claude/scripts/session-resume.py +363 -0
  1450. package/.claude/scripts/set-quality-profile.sh +229 -0
  1451. package/.claude/scripts/skill-budget-generator.py +599 -0
  1452. package/.claude/scripts/skill-import-rubric.py +368 -0
  1453. package/.claude/scripts/skill-index-build.py +534 -0
  1454. package/.claude/scripts/skill-patch-apply.py +1088 -0
  1455. package/.claude/scripts/skill-patch-propose.py +690 -0
  1456. package/.claude/scripts/skill-retrieve.py +522 -0
  1457. package/.claude/scripts/skill_grandfather_parser.py +295 -0
  1458. package/.claude/scripts/smart-loading-resolver.py +994 -0
  1459. package/.claude/scripts/spot-check-findings.py +211 -0
  1460. package/.claude/scripts/squad-export.py +437 -0
  1461. package/.claude/scripts/squad-import.py +741 -0
  1462. package/.claude/scripts/status.py +315 -0
  1463. package/.claude/scripts/statusline-ceo.py +597 -0
  1464. package/.claude/scripts/substrate-watch.json +54 -0
  1465. package/.claude/scripts/success-receipt.py +1038 -0
  1466. package/.claude/scripts/swarm/__init__.py +42 -0
  1467. package/.claude/scripts/swarm/_benchmark_replay.py +259 -0
  1468. package/.claude/scripts/swarm/_child_isolation.py +113 -0
  1469. package/.claude/scripts/swarm/_coordinator_sim.py +293 -0
  1470. package/.claude/scripts/swarm/_governors.py +277 -0
  1471. package/.claude/scripts/swarm/_integration.py +547 -0
  1472. package/.claude/scripts/swarm/_parent_death.py +176 -0
  1473. package/.claude/scripts/swarm/_process_group.py +250 -0
  1474. package/.claude/scripts/swarm/_replay_tournament.py +214 -0
  1475. package/.claude/scripts/swarm/_spawn_gate.py +292 -0
  1476. package/.claude/scripts/swarm/_subagent_fabrication.py +444 -0
  1477. package/.claude/scripts/swarm/_worktree_pool.py +276 -0
  1478. package/.claude/scripts/swarm/coordinator.py +543 -0
  1479. package/.claude/scripts/swarm/file_assignment.py +111 -0
  1480. package/.claude/scripts/swarm/fixtures/mcp_corpus.json +111 -0
  1481. package/.claude/scripts/swarm/kill_switch.py +260 -0
  1482. package/.claude/scripts/swarm/loop_runner.py +486 -0
  1483. package/.claude/scripts/swarm/recovery.py +178 -0
  1484. package/.claude/scripts/swarm/test_mcp_injection_repro.py +518 -0
  1485. package/.claude/scripts/swarm/test_rail_anomaly_repro.py +586 -0
  1486. package/.claude/scripts/swarm/tests/__init__.py +1 -0
  1487. package/.claude/scripts/swarm/tests/test_benchmark_manifest_schema.py +227 -0
  1488. package/.claude/scripts/swarm/tests/test_benchmark_replay.py +248 -0
  1489. package/.claude/scripts/swarm/tests/test_child_isolation.py +138 -0
  1490. package/.claude/scripts/swarm/tests/test_coordinator.py +289 -0
  1491. package/.claude/scripts/swarm/tests/test_coordinator_production_integration.py +434 -0
  1492. package/.claude/scripts/swarm/tests/test_coordinator_sim.py +192 -0
  1493. package/.claude/scripts/swarm/tests/test_coordinator_tick.py +165 -0
  1494. package/.claude/scripts/swarm/tests/test_file_assignment.py +100 -0
  1495. package/.claude/scripts/swarm/tests/test_governors.py +269 -0
  1496. package/.claude/scripts/swarm/tests/test_integration.py +344 -0
  1497. package/.claude/scripts/swarm/tests/test_kill_switch.py +307 -0
  1498. package/.claude/scripts/swarm/tests/test_loop_runner.py +168 -0
  1499. package/.claude/scripts/swarm/tests/test_loop_runner_circuit_breaker.py +555 -0
  1500. package/.claude/scripts/swarm/tests/test_loop_runner_gate_enforcement.py +304 -0
  1501. package/.claude/scripts/swarm/tests/test_loop_runner_gate_kill_switch.py +147 -0
  1502. package/.claude/scripts/swarm/tests/test_loop_runner_sentinel_revocation_slo.py +112 -0
  1503. package/.claude/scripts/swarm/tests/test_optimizer_killswitch.py +205 -0
  1504. package/.claude/scripts/swarm/tests/test_parent_death.py +128 -0
  1505. package/.claude/scripts/swarm/tests/test_parent_death_integration.py +305 -0
  1506. package/.claude/scripts/swarm/tests/test_process_group.py +132 -0
  1507. package/.claude/scripts/swarm/tests/test_process_group_reap.py +212 -0
  1508. package/.claude/scripts/swarm/tests/test_rail_anomaly_repro.py +516 -0
  1509. package/.claude/scripts/swarm/tests/test_recovery.py +165 -0
  1510. package/.claude/scripts/swarm/tests/test_replay_tournament.py +284 -0
  1511. package/.claude/scripts/swarm/tests/test_spawn_gate.py +265 -0
  1512. package/.claude/scripts/swarm/tests/test_subagent_fabrication.py +824 -0
  1513. package/.claude/scripts/swarm/tests/test_swarm_activation_smoke.py +112 -0
  1514. package/.claude/scripts/swarm/tests/test_tournament.py +195 -0
  1515. package/.claude/scripts/swarm/tests/test_worktree_pool.py +252 -0
  1516. package/.claude/scripts/swarm/tournament.py +261 -0
  1517. package/.claude/scripts/task-route.py +807 -0
  1518. package/.claude/scripts/test-env-hygiene-allowlist.yaml +1093 -0
  1519. package/.claude/scripts/tests/DEFERRED.md +99 -0
  1520. package/.claude/scripts/tests/conftest.py +42 -0
  1521. package/.claude/scripts/tests/fixtures/aggregate-changesets/bad-type.md +4 -0
  1522. package/.claude/scripts/tests/fixtures/aggregate-changesets/missing-frontmatter.md +1 -0
  1523. package/.claude/scripts/tests/fixtures/aggregate-changesets/multidoc.md +6 -0
  1524. package/.claude/scripts/tests/fixtures/aggregate-changesets/sample-CHANGELOG.md +29 -0
  1525. package/.claude/scripts/tests/fixtures/aggregate-changesets/second-minor.md +4 -0
  1526. package/.claude/scripts/tests/fixtures/aggregate-changesets/single-patch.md +4 -0
  1527. package/.claude/scripts/tests/fixtures/aggregate-changesets/third-major.md +4 -0
  1528. package/.claude/scripts/tests/fixtures/aggregate-changesets/unknown-key.md +6 -0
  1529. package/.claude/scripts/tests/fixtures/bad_lessons/bidi_override.md +12 -0
  1530. package/.claude/scripts/tests/fixtures/bad_lessons/fenced_python.md +19 -0
  1531. package/.claude/scripts/tests/fixtures/bad_lessons/homoglyph.md +11 -0
  1532. package/.claude/scripts/tests/fixtures/bad_lessons/injection.md +11 -0
  1533. package/.claude/scripts/tests/fixtures/bad_lessons/long_line.md +9 -0
  1534. package/.claude/scripts/tests/fixtures/bad_lessons/oversized.md +261 -0
  1535. package/.claude/scripts/tests/fixtures/bad_lessons/zero_width.md +11 -0
  1536. package/.claude/scripts/tests/fixtures/budget_summary/generate_fixtures.py +368 -0
  1537. package/.claude/scripts/tests/fixtures/claims/README.md +21 -0
  1538. package/.claude/scripts/tests/fixtures/claims/function_exists/neg-missing.txt +1 -0
  1539. package/.claude/scripts/tests/fixtures/claims/function_exists/neg-no-file.txt +1 -0
  1540. package/.claude/scripts/tests/fixtures/claims/function_exists/pos-extract.txt +1 -0
  1541. package/.claude/scripts/tests/fixtures/claims/function_exists/pos-main.txt +1 -0
  1542. package/.claude/scripts/tests/fixtures/claims/function_exists/pos-verify.txt +1 -0
  1543. package/.claude/scripts/tests/fixtures/claims/function_exists/quoted-colon-path.txt +1 -0
  1544. package/.claude/scripts/tests/fixtures/claims/import_resolves/codeblock-skipped.txt +8 -0
  1545. package/.claude/scripts/tests/fixtures/claims/import_resolves/neg-blocked-os.txt +6 -0
  1546. package/.claude/scripts/tests/fixtures/claims/import_resolves/neg-relative.txt +5 -0
  1547. package/.claude/scripts/tests/fixtures/claims/import_resolves/pos-dotted.txt +6 -0
  1548. package/.claude/scripts/tests/fixtures/claims/import_resolves/pos-stdlib-like.txt +5 -0
  1549. package/.claude/scripts/tests/fixtures/claims/line_range/neg-missing-file.txt +1 -0
  1550. package/.claude/scripts/tests/fixtures/claims/line_range/neg-too-long.txt +1 -0
  1551. package/.claude/scripts/tests/fixtures/claims/line_range/pos-large.txt +1 -0
  1552. package/.claude/scripts/tests/fixtures/claims/line_range/pos-small.txt +1 -0
  1553. package/.claude/scripts/tests/fixtures/claims/line_range/quoted-path.txt +1 -0
  1554. package/.claude/scripts/tests/fixtures/claims/path_exists/codeblock-skipped.txt +7 -0
  1555. package/.claude/scripts/tests/fixtures/claims/path_exists/neg-absolute-outside.txt +6 -0
  1556. package/.claude/scripts/tests/fixtures/claims/path_exists/neg-dotdot-escape.txt +7 -0
  1557. package/.claude/scripts/tests/fixtures/claims/path_exists/neg-imaginary.txt +1 -0
  1558. package/.claude/scripts/tests/fixtures/claims/path_exists/neg-proc-self.txt +6 -0
  1559. package/.claude/scripts/tests/fixtures/claims/path_exists/neg-symlink-escape.txt +8 -0
  1560. package/.claude/scripts/tests/fixtures/claims/path_exists/neg-typo.txt +1 -0
  1561. package/.claude/scripts/tests/fixtures/claims/path_exists/pos-claude.txt +1 -0
  1562. package/.claude/scripts/tests/fixtures/claims/path_exists/pos-readme.txt +1 -0
  1563. package/.claude/scripts/tests/fixtures/claims/path_exists/pos-self.txt +1 -0
  1564. package/.claude/scripts/tests/fixtures/claims/sha_exists/neg-fake.txt +1 -0
  1565. package/.claude/scripts/tests/fixtures/claims/sha_exists/neg-not-sha.txt +1 -0
  1566. package/.claude/scripts/tests/fixtures/claims/sha_exists/pos-head.txt +4 -0
  1567. package/.claude/scripts/tests/fixtures/claims/sha_exists/pos-root.txt +1 -0
  1568. package/.claude/scripts/tests/fixtures/claims/sha_exists/pos-short.txt +1 -0
  1569. package/.claude/scripts/tests/fixtures/claims/test_passes/neg-missing-file.txt +1 -0
  1570. package/.claude/scripts/tests/fixtures/claims/test_passes/neg-wrong-test.txt +1 -0
  1571. package/.claude/scripts/tests/fixtures/claims/test_passes/pos-audit-emit.txt +1 -0
  1572. package/.claude/scripts/tests/fixtures/claims/test_passes/pos-extra.txt +1 -0
  1573. package/.claude/scripts/tests/fixtures/claims/test_passes/pos-file.txt +1 -0
  1574. package/.claude/scripts/tests/fixtures/claims/test_passes/quoted-pytest-selector.txt +1 -0
  1575. package/.claude/scripts/tests/fixtures/debate_convergence/converged-pair-1/round-1/a.md +39 -0
  1576. package/.claude/scripts/tests/fixtures/debate_convergence/converged-pair-1/round-1/b.md +36 -0
  1577. package/.claude/scripts/tests/fixtures/debate_convergence/converged-pair-1/round-2/a.md +36 -0
  1578. package/.claude/scripts/tests/fixtures/debate_convergence/converged-pair-1/round-2/b.md +36 -0
  1579. package/.claude/scripts/tests/fixtures/debate_convergence/not-converged-pair-1/round-1/a.md +35 -0
  1580. package/.claude/scripts/tests/fixtures/debate_convergence/not-converged-pair-1/round-1/b.md +34 -0
  1581. package/.claude/scripts/tests/fixtures/debate_convergence/not-converged-pair-1/round-2/a.md +35 -0
  1582. package/.claude/scripts/tests/fixtures/debate_convergence/not-converged-pair-1/round-2/b.md +34 -0
  1583. package/.claude/scripts/tests/fixtures/debate_convergence/partial-overlap/round-1/a.md +35 -0
  1584. package/.claude/scripts/tests/fixtures/debate_convergence/partial-overlap/round-2/a.md +36 -0
  1585. package/.claude/scripts/tests/fixtures/debate_convergence/with-secret/round-1/a.md +36 -0
  1586. package/.claude/scripts/tests/fixtures/debate_convergence/with-secret/round-1/b.md +33 -0
  1587. package/.claude/scripts/tests/fixtures/debate_convergence/with-secret/round-2/a.md +34 -0
  1588. package/.claude/scripts/tests/fixtures/docs_freshness/link_anchor_only.md +10 -0
  1589. package/.claude/scripts/tests/fixtures/docs_freshness/link_broken.md +5 -0
  1590. package/.claude/scripts/tests/fixtures/docs_freshness/link_external_url.md +9 -0
  1591. package/.claude/scripts/tests/fixtures/docs_freshness/link_in_fenced_code.md +18 -0
  1592. package/.claude/scripts/tests/fixtures/docs_freshness/link_in_frontmatter.md +10 -0
  1593. package/.claude/scripts/tests/fixtures/docs_freshness/link_in_html_comment.md +10 -0
  1594. package/.claude/scripts/tests/fixtures/docs_freshness/link_in_inline_code.md +7 -0
  1595. package/.claude/scripts/tests/fixtures/docs_freshness/link_in_table.md +6 -0
  1596. package/.claude/scripts/tests/fixtures/docs_freshness/link_relative_parent.md +7 -0
  1597. package/.claude/scripts/tests/fixtures/docs_freshness/link_url_encoded.md +5 -0
  1598. package/.claude/scripts/tests/fixtures/docs_freshness/real_target.md +3 -0
  1599. package/.claude/scripts/tests/fixtures/docs_freshness/sub/dir.md +3 -0
  1600. package/.claude/scripts/tests/fixtures/docs_freshness/with%20space.md +3 -0
  1601. package/.claude/scripts/tests/fixtures/good_lessons/clean_auth.md +11 -0
  1602. package/.claude/scripts/tests/fixtures/good_lessons/clean_logging.md +11 -0
  1603. package/.claude/scripts/tests/fixtures/good_lessons/clean_retry.md +11 -0
  1604. package/.claude/scripts/tests/fixtures/gpg-keyring-fixture.py +209 -0
  1605. package/.claude/scripts/tests/fixtures/injection/benign-01.txt +8 -0
  1606. package/.claude/scripts/tests/fixtures/injection/benign-02.txt +5 -0
  1607. package/.claude/scripts/tests/fixtures/injection/benign-03.txt +7 -0
  1608. package/.claude/scripts/tests/fixtures/injection/benign-04.txt +9 -0
  1609. package/.claude/scripts/tests/fixtures/injection/benign-05.txt +7 -0
  1610. package/.claude/scripts/tests/fixtures/injection/benign-06.txt +7 -0
  1611. package/.claude/scripts/tests/fixtures/injection/benign-07.txt +11 -0
  1612. package/.claude/scripts/tests/fixtures/injection/benign-08.txt +4 -0
  1613. package/.claude/scripts/tests/fixtures/injection/malicious-01.txt +4 -0
  1614. package/.claude/scripts/tests/fixtures/injection/malicious-02.txt +2 -0
  1615. package/.claude/scripts/tests/fixtures/injection/malicious-03.txt +4 -0
  1616. package/.claude/scripts/tests/fixtures/injection/malicious-04.txt +2 -0
  1617. package/.claude/scripts/tests/fixtures/injection/malicious-05.txt +2 -0
  1618. package/.claude/scripts/tests/fixtures/injection/malicious-06.txt +5 -0
  1619. package/.claude/scripts/tests/fixtures/injection/malicious-07.txt +5 -0
  1620. package/.claude/scripts/tests/fixtures/injection/malicious-08.txt +2 -0
  1621. package/.claude/scripts/tests/fixtures/injection/malicious-09.txt +3 -0
  1622. package/.claude/scripts/tests/fixtures/injection/malicious-10.txt +2 -0
  1623. package/.claude/scripts/tests/fixtures/injection/malicious-11.txt +3 -0
  1624. package/.claude/scripts/tests/fixtures/injection/malicious-12.txt +5 -0
  1625. package/.claude/scripts/tests/fixtures/plan-tokens-calibration/manifest.json +49 -0
  1626. package/.claude/scripts/tests/fixtures/plan-tokens-calibration/plan-051.md +36 -0
  1627. package/.claude/scripts/tests/fixtures/plan-tokens-calibration/plan-052.md +32 -0
  1628. package/.claude/scripts/tests/fixtures/plan-tokens-calibration/plan-058.md +31 -0
  1629. package/.claude/scripts/tests/fixtures/reality-ledger/detector-1-boundary/docs/SAMPLE.md +8 -0
  1630. package/.claude/scripts/tests/fixtures/reality-ledger/detector-1-negative/.claude/scripts/sample.py +12 -0
  1631. package/.claude/scripts/tests/fixtures/reality-ledger/detector-1-negative/docs/SAMPLE.md +4 -0
  1632. package/.claude/scripts/tests/fixtures/reality-ledger/detector-1-positive/.claude/scripts/sample.py +12 -0
  1633. package/.claude/scripts/tests/fixtures/reality-ledger/detector-1-positive/docs/SAMPLE.md +9 -0
  1634. package/.claude/scripts/tests/fixtures/reality-ledger/detector-2-boundary/README.md +4 -0
  1635. package/.claude/scripts/tests/fixtures/reality-ledger/detector-2-negative/.claude/rag/requirements.lock +4 -0
  1636. package/.claude/scripts/tests/fixtures/reality-ledger/detector-2-positive/.claude/rag/requirements.lock +2 -0
  1637. package/.claude/scripts/tests/fixtures/reality-ledger/detector-3-boundary/.claude/agents/devops.md +8 -0
  1638. package/.claude/scripts/tests/fixtures/reality-ledger/detector-3-negative/.claude/agents/devops.md +5 -0
  1639. package/.claude/scripts/tests/fixtures/reality-ledger/detector-3-negative/audit-log.jsonl +2 -0
  1640. package/.claude/scripts/tests/fixtures/reality-ledger/detector-3-positive/.claude/agents/devops.md +7 -0
  1641. package/.claude/scripts/tests/fixtures/reality-ledger/detector-3-positive/audit-log.jsonl +4 -0
  1642. package/.claude/scripts/tests/fixtures/reality-ledger/detector-4-boundary/.claude/adr/ADR-997-fixture-superseded.md +8 -0
  1643. package/.claude/scripts/tests/fixtures/reality-ledger/detector-4-negative/.claude/adr/ADR-998-fixture-negative.md +16 -0
  1644. package/.claude/scripts/tests/fixtures/reality-ledger/detector-4-positive/.claude/adr/ADR-999-fixture-positive.md +15 -0
  1645. package/.claude/scripts/tests/fixtures/reality-ledger/detector-6-boundary/.claude/hooks/_lib/.do-not-import-from-here +15 -0
  1646. package/.claude/scripts/tests/fixtures/reality-ledger/detector-6-boundary/.claude/hooks/_lib/audit_emit.py +8 -0
  1647. package/.claude/scripts/tests/fixtures/reality-ledger/detector-6-boundary/.claude/scripts/dynamic_action.py +12 -0
  1648. package/.claude/scripts/tests/fixtures/reality-ledger/detector-6-negative/.claude/hooks/_lib/.do-not-import-from-here +15 -0
  1649. package/.claude/scripts/tests/fixtures/reality-ledger/detector-6-negative/.claude/hooks/_lib/audit_emit.py +11 -0
  1650. package/.claude/scripts/tests/fixtures/reality-ledger/detector-6-negative/.claude/scripts/registered_emitter.py +8 -0
  1651. package/.claude/scripts/tests/fixtures/reality-ledger/detector-6-positive/.claude/hooks/_lib/.do-not-import-from-here +15 -0
  1652. package/.claude/scripts/tests/fixtures/reality-ledger/detector-6-positive/.claude/hooks/_lib/audit_emit.py +12 -0
  1653. package/.claude/scripts/tests/fixtures/reality-ledger/detector-6-positive/.claude/scripts/phantom_emitter.py +13 -0
  1654. package/.claude/scripts/tests/fixtures/reality-ledger/issue-body-template.md +47 -0
  1655. package/.claude/scripts/tests/fixtures/reality-ledger/redaction/_test_corpus.py +7 -0
  1656. package/.claude/scripts/tests/fixtures/repo_profile/cloned-trading-repo/.env.example +5 -0
  1657. package/.claude/scripts/tests/fixtures/repo_profile/cloned-trading-repo/Cargo.toml +9 -0
  1658. package/.claude/scripts/tests/fixtures/repo_profile/cloned-trading-repo/README.md +6 -0
  1659. package/.claude/scripts/tests/fixtures/repo_profile/cloned-trading-repo/exchanges/binance.py +6 -0
  1660. package/.claude/scripts/tests/fixtures/repo_profile/cloned-trading-repo/strategies/triangular.py +4 -0
  1661. package/.claude/scripts/tests/fixtures/repo_profile/missing-package-manifest/README.md +7 -0
  1662. package/.claude/scripts/tests/fixtures/repo_profile/missing-package-manifest/notes.md +1 -0
  1663. package/.claude/scripts/tests/fixtures/repo_profile/mixed-frontend-backend/README.md +6 -0
  1664. package/.claude/scripts/tests/fixtures/repo_profile/mixed-frontend-backend/api/server.js +4 -0
  1665. package/.claude/scripts/tests/fixtures/repo_profile/mixed-frontend-backend/package.json +15 -0
  1666. package/.claude/scripts/tests/fixtures/repo_profile/mixed-frontend-backend/pages/index.tsx +3 -0
  1667. package/.claude/scripts/tests/fixtures/repo_profile/monorepo/README.md +6 -0
  1668. package/.claude/scripts/tests/fixtures/repo_profile/monorepo/apps/backend/.gitkeep +0 -0
  1669. package/.claude/scripts/tests/fixtures/repo_profile/monorepo/apps/frontend/.gitkeep +0 -0
  1670. package/.claude/scripts/tests/fixtures/repo_profile/monorepo/package.json +5 -0
  1671. package/.claude/scripts/tests/fixtures/repo_profile/monorepo/packages/shared/.gitkeep +0 -0
  1672. package/.claude/scripts/tests/fixtures/sample_audit_log.jsonl +50 -0
  1673. package/.claude/scripts/tests/fixtures/siem/.gitkeep +0 -0
  1674. package/.claude/scripts/tests/fixtures/smart_loading/profile-engine.yaml +8 -0
  1675. package/.claude/scripts/tests/fixtures/smart_loading/profile-fail-closed.yaml +7 -0
  1676. package/.claude/scripts/tests/fixtures/smart_loading/profile-fintech.yaml +9 -0
  1677. package/.claude/scripts/tests/fixtures/smart_loading/profile-frontend.yaml +9 -0
  1678. package/.claude/scripts/tests/fixtures/smart_loading/profile-generic.yaml +8 -0
  1679. package/.claude/scripts/tests/fixtures/smart_loading/profile-trading-readonly.yaml +9 -0
  1680. package/.claude/scripts/tests/fixtures/smart_loading/synthetic-skill-catalog.yaml +186 -0
  1681. package/.claude/scripts/tests/fixtures/squad_marketplace/.gitkeep +4 -0
  1682. package/.claude/scripts/tests/fixtures/task-route/calibration-holdout.json +49 -0
  1683. package/.claude/scripts/tests/fixtures/task-route/calibration-train.json +174 -0
  1684. package/.claude/scripts/tests/perf/__init__.py +3 -0
  1685. package/.claude/scripts/tests/perf/perf_utils.py +134 -0
  1686. package/.claude/scripts/tests/perf/test_kernel_hard_deny_microbench.py +149 -0
  1687. package/.claude/scripts/tests/perf/test_optimizer_complexity_gate_p99.py +145 -0
  1688. package/.claude/scripts/tests/perf/test_wave_c_canonical_json.py +132 -0
  1689. package/.claude/scripts/tests/perf/test_wave_c_filelock_mkdir.py +71 -0
  1690. package/.claude/scripts/tests/perf/test_wave_c_plan_glob_cache.py +84 -0
  1691. package/.claude/scripts/tests/perf/test_wave_c_preview_collapse.py +98 -0
  1692. package/.claude/scripts/tests/perf/test_wave_c_sys_modules.py +104 -0
  1693. package/.claude/scripts/tests/test_a4_pricing_doctrine.py +127 -0
  1694. package/.claude/scripts/tests/test_admin_invite.py +173 -0
  1695. package/.claude/scripts/tests/test_adopter_metrics.py +723 -0
  1696. package/.claude/scripts/tests/test_aek_calibration_c2.py +107 -0
  1697. package/.claude/scripts/tests/test_aek_calibration_c3.py +192 -0
  1698. package/.claude/scripts/tests/test_aek_state_machine.py +385 -0
  1699. package/.claude/scripts/tests/test_aggregate_changesets.py +646 -0
  1700. package/.claude/scripts/tests/test_architect_bundle_validate.py +159 -0
  1701. package/.claude/scripts/tests/test_audit_dashboard.py +822 -0
  1702. package/.claude/scripts/tests/test_audit_log_dispatch_hint.py +91 -0
  1703. package/.claude/scripts/tests/test_audit_log_retain.py +394 -0
  1704. package/.claude/scripts/tests/test_audit_query.py +1177 -0
  1705. package/.claude/scripts/tests/test_audit_query_by_domain.py +576 -0
  1706. package/.claude/scripts/tests/test_audit_query_claims.py +92 -0
  1707. package/.claude/scripts/tests/test_audit_query_critical.py +267 -0
  1708. package/.claude/scripts/tests/test_audit_query_tokens.py +106 -0
  1709. package/.claude/scripts/tests/test_audit_telemetry.py +214 -0
  1710. package/.claude/scripts/tests/test_audit_tokens.py +255 -0
  1711. package/.claude/scripts/tests/test_audit_verify_chain.py +189 -0
  1712. package/.claude/scripts/tests/test_backup_audit.py +295 -0
  1713. package/.claude/scripts/tests/test_benchmark_fallback_scorer.py +299 -0
  1714. package/.claude/scripts/tests/test_benchmark_judge.py +569 -0
  1715. package/.claude/scripts/tests/test_benchmarks_replay.py +313 -0
  1716. package/.claude/scripts/tests/test_budget_summary.py +628 -0
  1717. package/.claude/scripts/tests/test_build_canonical_models.py +349 -0
  1718. package/.claude/scripts/tests/test_calibration_kappa.py +234 -0
  1719. package/.claude/scripts/tests/test_cc_analytics_pull.py +296 -0
  1720. package/.claude/scripts/tests/test_ceo_backup.py +318 -0
  1721. package/.claude/scripts/tests/test_ceo_boot.py +643 -0
  1722. package/.claude/scripts/tests/test_ceo_boot_audit_emit.py +484 -0
  1723. package/.claude/scripts/tests/test_ceo_boot_enhanced.py +706 -0
  1724. package/.claude/scripts/tests/test_ceo_boot_persona_cadence.py +392 -0
  1725. package/.claude/scripts/tests/test_ceo_boot_plan_082.py +365 -0
  1726. package/.claude/scripts/tests/test_ceo_boot_tamper_tripwires.py +556 -0
  1727. package/.claude/scripts/tests/test_ceo_boot_task_candidate.py +868 -0
  1728. package/.claude/scripts/tests/test_ceo_cost.py +221 -0
  1729. package/.claude/scripts/tests/test_ceo_cost_stream.py +1076 -0
  1730. package/.claude/scripts/tests/test_ceo_diagnose.py +314 -0
  1731. package/.claude/scripts/tests/test_ceo_escalation_detector.py +591 -0
  1732. package/.claude/scripts/tests/test_ceo_health.py +202 -0
  1733. package/.claude/scripts/tests/test_ceo_info.py +542 -0
  1734. package/.claude/scripts/tests/test_chaos_inject_lockdown.py +384 -0
  1735. package/.claude/scripts/tests/test_check_action_sha_drift.py +174 -0
  1736. package/.claude/scripts/tests/test_check_active_hooks_executable.py +79 -0
  1737. package/.claude/scripts/tests/test_check_adr_chain.py +665 -0
  1738. package/.claude/scripts/tests/test_check_audit_hmac_null.py +178 -0
  1739. package/.claude/scripts/tests/test_check_audit_read_api_stable.py +176 -0
  1740. package/.claude/scripts/tests/test_check_audit_registry_coverage.py +744 -0
  1741. package/.claude/scripts/tests/test_check_auto_activation_flags.py +140 -0
  1742. package/.claude/scripts/tests/test_check_canonical_doc_freshness.py +149 -0
  1743. package/.claude/scripts/tests/test_check_claude_md_claims.py +223 -0
  1744. package/.claude/scripts/tests/test_check_conformance_harness_mapping.py +243 -0
  1745. package/.claude/scripts/tests/test_check_contamination.py +161 -0
  1746. package/.claude/scripts/tests/test_check_creative_rewrite.py +183 -0
  1747. package/.claude/scripts/tests/test_check_debate_round_lifecycle.py +162 -0
  1748. package/.claude/scripts/tests/test_check_debt_ledger.py +227 -0
  1749. package/.claude/scripts/tests/test_check_doc_skill_paths.py +99 -0
  1750. package/.claude/scripts/tests/test_check_docs_freshness.py +224 -0
  1751. package/.claude/scripts/tests/test_check_flip_criteria_drift.py +343 -0
  1752. package/.claude/scripts/tests/test_check_flip_release_gate_consistency.py +195 -0
  1753. package/.claude/scripts/tests/test_check_function_length.py +519 -0
  1754. package/.claude/scripts/tests/test_check_model_deprecations.py +368 -0
  1755. package/.claude/scripts/tests/test_check_originator_residue.py +165 -0
  1756. package/.claude/scripts/tests/test_check_rule_invariants.py +327 -0
  1757. package/.claude/scripts/tests/test_check_sdk_compat.py +88 -0
  1758. package/.claude/scripts/tests/test_check_sidecar_manifest_sbom_sync.py +177 -0
  1759. package/.claude/scripts/tests/test_check_spec_drift.py +358 -0
  1760. package/.claude/scripts/tests/test_check_staleness.py +128 -0
  1761. package/.claude/scripts/tests/test_check_stdlib_only_exceptions.py +91 -0
  1762. package/.claude/scripts/tests/test_check_substrate_watch.py +234 -0
  1763. package/.claude/scripts/tests/test_check_test_audit_isolation.py +322 -0
  1764. package/.claude/scripts/tests/test_check_test_env_hygiene.py +432 -0
  1765. package/.claude/scripts/tests/test_check_threat_model_coverage.py +251 -0
  1766. package/.claude/scripts/tests/test_check_threat_model_freshness.py +235 -0
  1767. package/.claude/scripts/tests/test_check_tier_boundaries.py +225 -0
  1768. package/.claude/scripts/tests/test_check_tla_schema_drift.py +246 -0
  1769. package/.claude/scripts/tests/test_check_translations_drift.py +262 -0
  1770. package/.claude/scripts/tests/test_code_nav_bridge.py +192 -0
  1771. package/.claude/scripts/tests/test_compaction_template.py +163 -0
  1772. package/.claude/scripts/tests/test_compare_adopters.py +646 -0
  1773. package/.claude/scripts/tests/test_confidence_gate.py +611 -0
  1774. package/.claude/scripts/tests/test_confidence_gate_backfill.py +212 -0
  1775. package/.claude/scripts/tests/test_context_budget.py +1400 -0
  1776. package/.claude/scripts/tests/test_contextual_recommender.py +723 -0
  1777. package/.claude/scripts/tests/test_coverage_audit_marker.py +109 -0
  1778. package/.claude/scripts/tests/test_debate_converge.py +399 -0
  1779. package/.claude/scripts/tests/test_debate_emit_cli.py +153 -0
  1780. package/.claude/scripts/tests/test_debate_orchestrate.py +575 -0
  1781. package/.claude/scripts/tests/test_detect_repo_profile.py +434 -0
  1782. package/.claude/scripts/tests/test_discover_foreign_context.py +208 -0
  1783. package/.claude/scripts/tests/test_dispatch_archetype_hint.py +429 -0
  1784. package/.claude/scripts/tests/test_dispatch_frontmatter_validation.py +274 -0
  1785. package/.claude/scripts/tests/test_drift_wire.py +259 -0
  1786. package/.claude/scripts/tests/test_embeddings.py +249 -0
  1787. package/.claude/scripts/tests/test_env_inventory_check.py +197 -0
  1788. package/.claude/scripts/tests/test_eval_c3.py +474 -0
  1789. package/.claude/scripts/tests/test_extract_skill.py +572 -0
  1790. package/.claude/scripts/tests/test_fan_plan_parser.py +213 -0
  1791. package/.claude/scripts/tests/test_find_orphan_sentinels.py +62 -0
  1792. package/.claude/scripts/tests/test_first_run_wizard.py +634 -0
  1793. package/.claude/scripts/tests/test_generate_adr_index.py +146 -0
  1794. package/.claude/scripts/tests/test_generate_available_models.py +209 -0
  1795. package/.claude/scripts/tests/test_generate_dispatch.py +90 -0
  1796. package/.claude/scripts/tests/test_generate_skill_inventory.py +76 -0
  1797. package/.claude/scripts/tests/test_github_api_client.py +146 -0
  1798. package/.claude/scripts/tests/test_governance_waivers_gate.py +176 -0
  1799. package/.claude/scripts/tests/test_hook_profiler.py +426 -0
  1800. package/.claude/scripts/tests/test_import_skill.py +927 -0
  1801. package/.claude/scripts/tests/test_import_skill_skip_rubric_auth.py +198 -0
  1802. package/.claude/scripts/tests/test_inject_agent_context_mitigated_dispatch.py +266 -0
  1803. package/.claude/scripts/tests/test_inject_agent_context_reference_mode.py +105 -0
  1804. package/.claude/scripts/tests/test_inspired_by_validator.py +307 -0
  1805. package/.claude/scripts/tests/test_install_dispatcher_present_maintainer.py +76 -0
  1806. package/.claude/scripts/tests/test_install_maintainer_unchanged.py +86 -0
  1807. package/.claude/scripts/tests/test_install_npm_sha256.py +113 -0
  1808. package/.claude/scripts/tests/test_install_sh_placeholders.py +268 -0
  1809. package/.claude/scripts/tests/test_install_sh_self_sha.py +244 -0
  1810. package/.claude/scripts/tests/test_install_sh_session_75_flags.py +147 -0
  1811. package/.claude/scripts/tests/test_install_user_dispatcher_present.py +75 -0
  1812. package/.claude/scripts/tests/test_install_user_no_writes_outside_claude.py +75 -0
  1813. package/.claude/scripts/tests/test_install_user_passes_validate_governance.py +73 -0
  1814. package/.claude/scripts/tests/test_install_user_preserves_existing_repo.py +135 -0
  1815. package/.claude/scripts/tests/test_install_user_skips_governance_hooks.py +102 -0
  1816. package/.claude/scripts/tests/test_k_calibration.py +415 -0
  1817. package/.claude/scripts/tests/test_key_hygiene.py +372 -0
  1818. package/.claude/scripts/tests/test_lesson_ranker.py +82 -0
  1819. package/.claude/scripts/tests/test_lesson_restore.py +91 -0
  1820. package/.claude/scripts/tests/test_lessons.py +278 -0
  1821. package/.claude/scripts/tests/test_lessons_concurrency.py +118 -0
  1822. package/.claude/scripts/tests/test_lessons_emit.py +114 -0
  1823. package/.claude/scripts/tests/test_lessons_inject.py +144 -0
  1824. package/.claude/scripts/tests/test_lessons_v2.py +264 -0
  1825. package/.claude/scripts/tests/test_lint_skills.py +525 -0
  1826. package/.claude/scripts/tests/test_log_friction.py +436 -0
  1827. package/.claude/scripts/tests/test_memory_prioritize.py +315 -0
  1828. package/.claude/scripts/tests/test_morning_ledger.py +415 -0
  1829. package/.claude/scripts/tests/test_mutation_test.py +144 -0
  1830. package/.claude/scripts/tests/test_npm_rebuild.py +154 -0
  1831. package/.claude/scripts/tests/test_osv_check.py +411 -0
  1832. package/.claude/scripts/tests/test_otel_export.py +613 -0
  1833. package/.claude/scripts/tests/test_otel_local_sink.py +262 -0
  1834. package/.claude/scripts/tests/test_owasp_llm_top_10_benchmark.py +235 -0
  1835. package/.claude/scripts/tests/test_parse_coverage_tier1.py +107 -0
  1836. package/.claude/scripts/tests/test_pitfall_query.py +148 -0
  1837. package/.claude/scripts/tests/test_plan_frontmatter_status.py +217 -0
  1838. package/.claude/scripts/tests/test_plan_id_uniqueness.py +133 -0
  1839. package/.claude/scripts/tests/test_plan_schema_enforcement.py +251 -0
  1840. package/.claude/scripts/tests/test_plan_tokens.py +513 -0
  1841. package/.claude/scripts/tests/test_plan_vcheck_gate.py +257 -0
  1842. package/.claude/scripts/tests/test_policy_shadow_runner.py +312 -0
  1843. package/.claude/scripts/tests/test_prune_lessons.py +341 -0
  1844. package/.claude/scripts/tests/test_quality_profile.py +392 -0
  1845. package/.claude/scripts/tests/test_rate_card_calibrate.py +185 -0
  1846. package/.claude/scripts/tests/test_reality_ledger.py +1723 -0
  1847. package/.claude/scripts/tests/test_red_team_eval.py +566 -0
  1848. package/.claude/scripts/tests/test_red_team_eval_sha.py +260 -0
  1849. package/.claude/scripts/tests/test_registry.py +290 -0
  1850. package/.claude/scripts/tests/test_run_benchmark.py +639 -0
  1851. package/.claude/scripts/tests/test_run_skill_benchmark_emit.py +195 -0
  1852. package/.claude/scripts/tests/test_run_skill_benchmark_judge_mode.py +306 -0
  1853. package/.claude/scripts/tests/test_scan_injection.py +191 -0
  1854. package/.claude/scripts/tests/test_scan_injection_strict.sh +201 -0
  1855. package/.claude/scripts/tests/test_scratchpad_cli.py +317 -0
  1856. package/.claude/scripts/tests/test_self_test.py +369 -0
  1857. package/.claude/scripts/tests/test_session_graph.py +511 -0
  1858. package/.claude/scripts/tests/test_session_resume.py +306 -0
  1859. package/.claude/scripts/tests/test_siem_rule_fixtures_have_paired_positive_negative.py +112 -0
  1860. package/.claude/scripts/tests/test_skill_budget_generator.py +329 -0
  1861. package/.claude/scripts/tests/test_skill_grandfather_parser.py +314 -0
  1862. package/.claude/scripts/tests/test_skill_import_rubric.py +497 -0
  1863. package/.claude/scripts/tests/test_skill_patch_apply_create_new_skill.py +459 -0
  1864. package/.claude/scripts/tests/test_skill_patch_propose.py +294 -0
  1865. package/.claude/scripts/tests/test_skill_patch_shadow_race.py +271 -0
  1866. package/.claude/scripts/tests/test_skill_retrieval.py +486 -0
  1867. package/.claude/scripts/tests/test_skill_retrieve_rag_wire.py +747 -0
  1868. package/.claude/scripts/tests/test_smart_loading_resolver.py +808 -0
  1869. package/.claude/scripts/tests/test_squad_export.py +265 -0
  1870. package/.claude/scripts/tests/test_squad_grandfather_cap.py +434 -0
  1871. package/.claude/scripts/tests/test_squad_import.py +905 -0
  1872. package/.claude/scripts/tests/test_statusline_ceo.py +543 -0
  1873. package/.claude/scripts/tests/test_success_receipt.py +448 -0
  1874. package/.claude/scripts/tests/test_task_route.py +456 -0
  1875. package/.claude/scripts/tests/test_token_budget_guard.py +418 -0
  1876. package/.claude/scripts/tests/test_token_estimator.py +395 -0
  1877. package/.claude/scripts/tests/test_trading_readonly.py +705 -0
  1878. package/.claude/scripts/tests/test_ui_ux_imports.py +223 -0
  1879. package/.claude/scripts/tests/test_validate_skill_frontmatter_pii_core.py +630 -0
  1880. package/.claude/scripts/tests/test_validate_spec_context.py +128 -0
  1881. package/.claude/scripts/tests/test_validate_squad_contract.py +221 -0
  1882. package/.claude/scripts/tests/test_value_dashboard.py +593 -0
  1883. package/.claude/scripts/tests/test_verify_adr_118_rationale.py +183 -0
  1884. package/.claude/scripts/tests/test_verify_atlas_binding.py +159 -0
  1885. package/.claude/scripts/tests/test_verify_counts.py +138 -0
  1886. package/.claude/scripts/tests/test_verify_counts_remediation.py +258 -0
  1887. package/.claude/scripts/tests/test_verify_persona_coverage.py +576 -0
  1888. package/.claude/scripts/tests/test_veto_check.py +171 -0
  1889. package/.claude/scripts/tests/test_workflow_devops_p2.py +229 -0
  1890. package/.claude/scripts/tier_policy_cli/__init__.py +43 -0
  1891. package/.claude/scripts/tier_policy_cli/_agent_frontmatter.py +196 -0
  1892. package/.claude/scripts/tier_policy_cli/_constants.py +92 -0
  1893. package/.claude/scripts/tier_policy_cli/_types.py +228 -0
  1894. package/.claude/scripts/tier_policy_cli/apply.py +1139 -0
  1895. package/.claude/scripts/tier_policy_cli/cli.py +795 -0
  1896. package/.claude/scripts/tier_policy_cli/learn.py +846 -0
  1897. package/.claude/scripts/tier_policy_cli/loader.py +535 -0
  1898. package/.claude/scripts/tier_policy_cli/setup.py +33 -0
  1899. package/.claude/scripts/tier_policy_cli/tests/__init__.py +0 -0
  1900. package/.claude/scripts/tier_policy_cli/tests/test_adversarial.py +605 -0
  1901. package/.claude/scripts/tier_policy_cli/tests/test_agent_frontmatter.py +231 -0
  1902. package/.claude/scripts/tier_policy_cli/tests/test_apply.py +698 -0
  1903. package/.claude/scripts/tier_policy_cli/tests/test_check_tier_policy_hook.py +187 -0
  1904. package/.claude/scripts/tier_policy_cli/tests/test_cli.py +434 -0
  1905. package/.claude/scripts/tier_policy_cli/tests/test_constants.py +113 -0
  1906. package/.claude/scripts/tier_policy_cli/tests/test_learn.py +1380 -0
  1907. package/.claude/scripts/tier_policy_cli/tests/test_learn_mutation.py +549 -0
  1908. package/.claude/scripts/tier_policy_cli/tests/test_loader.py +368 -0
  1909. package/.claude/scripts/tier_policy_cli/tests/test_types.py +152 -0
  1910. package/.claude/scripts/token-budget-guard.py +657 -0
  1911. package/.claude/scripts/token-estimator.py +957 -0
  1912. package/.claude/scripts/tournament/__init__.py +22 -0
  1913. package/.claude/scripts/tournament/check_fixture.py +271 -0
  1914. package/.claude/scripts/tournament/fixtures/CORPUS_SHA256.txt +10 -0
  1915. package/.claude/scripts/tournament/fixtures/code-review.jsonl +10 -0
  1916. package/.claude/scripts/tournament/fixtures/docs-writing.jsonl +10 -0
  1917. package/.claude/scripts/tournament/fixtures/performance-triage.jsonl +10 -0
  1918. package/.claude/scripts/tournament/fixtures/security-review.jsonl +10 -0
  1919. package/.claude/scripts/tournament/fixtures/test-design.jsonl +10 -0
  1920. package/.claude/scripts/tournament/judge.py +269 -0
  1921. package/.claude/scripts/tournament/loader.py +262 -0
  1922. package/.claude/scripts/tournament/regen_corpus_sha.py +93 -0
  1923. package/.claude/scripts/tournament/reporter.py +328 -0
  1924. package/.claude/scripts/tournament/runner.py +707 -0
  1925. package/.claude/scripts/tournament/scorer.py +118 -0
  1926. package/.claude/scripts/tournament/tests/__init__.py +0 -0
  1927. package/.claude/scripts/tournament/tests/_fake_dispatcher.py +233 -0
  1928. package/.claude/scripts/tournament/tests/golden/strict_report_seed42.jsonl +6 -0
  1929. package/.claude/scripts/tournament/tests/test_fixture_envelope.py +106 -0
  1930. package/.claude/scripts/tournament/tests/test_fixture_security.py +227 -0
  1931. package/.claude/scripts/tournament/tests/test_judge.py +299 -0
  1932. package/.claude/scripts/tournament/tests/test_loader.py +223 -0
  1933. package/.claude/scripts/tournament/tests/test_model_id_parity.py +136 -0
  1934. package/.claude/scripts/tournament/tests/test_reporter.py +450 -0
  1935. package/.claude/scripts/tournament/tests/test_reporter_golden.py +182 -0
  1936. package/.claude/scripts/tournament/tests/test_runner.py +313 -0
  1937. package/.claude/scripts/tournament/tests/test_runner_fail_open.py +204 -0
  1938. package/.claude/scripts/tournament/tests/test_scorer.py +138 -0
  1939. package/.claude/scripts/tournament/tests/test_tournament_e2e_smoke.py +147 -0
  1940. package/.claude/scripts/tournament/tests/test_tournament_properties.py +181 -0
  1941. package/.claude/scripts/trading-readonly-escape-hatch.sh +244 -0
  1942. package/.claude/scripts/trading-readonly-guardrails.py +1136 -0
  1943. package/.claude/scripts/translations-pairs.yaml +60 -0
  1944. package/.claude/scripts/validate-findings.py +243 -0
  1945. package/.claude/scripts/validate-governance.sh +1238 -0
  1946. package/.claude/scripts/validate-skill-frontmatter.py +679 -0
  1947. package/.claude/scripts/validate-spec-context.py +146 -0
  1948. package/.claude/scripts/validate-squad-contract.py +318 -0
  1949. package/.claude/scripts/validate_governance_fast.py +555 -0
  1950. package/.claude/scripts/value-dashboard.py +851 -0
  1951. package/.claude/scripts/verify-adr-118-rationale.py +285 -0
  1952. package/.claude/scripts/verify-atlas-binding.py +331 -0
  1953. package/.claude/scripts/verify-persona-coverage.py +531 -0
  1954. package/.claude/scripts/verify-sprint3-invariants.sh +133 -0
  1955. package/.claude/scripts/veto-check.py +218 -0
  1956. package/.claude/security/README.md +200 -0
  1957. package/.claude/security/sentinel-signers-registry.yaml +60 -0
  1958. package/.claude/sentinel-signers.txt +24 -0
  1959. package/.claude/settings.json +786 -0
  1960. package/.claude/sidecars/c1-crypto/cryptography-mvp/README.md +89 -0
  1961. package/.claude/sidecars/c1-crypto/cryptography-mvp/boundary_test.py +114 -0
  1962. package/.claude/sidecars/c1-crypto/cryptography-mvp/install.sh +45 -0
  1963. package/.claude/sidecars/c1-crypto/cryptography-mvp/manifest.json +52 -0
  1964. package/.claude/sidecars/c1-crypto/cryptography-mvp/sidecar_code/cert_inspector.py +775 -0
  1965. package/.claude/sidecars/c1-crypto/stdlib-ssl-mvp/boundary_test.py +318 -0
  1966. package/.claude/sidecars/c1-crypto/stdlib-ssl-mvp/install.sh +57 -0
  1967. package/.claude/sidecars/c1-crypto/stdlib-ssl-mvp/manifest.json +48 -0
  1968. package/.claude/sidecars/c2-vector-memory/lightrag-mvp/README.md +88 -0
  1969. package/.claude/sidecars/c2-vector-memory/lightrag-mvp/boundary_test.py +221 -0
  1970. package/.claude/sidecars/c2-vector-memory/lightrag-mvp/install.sh +33 -0
  1971. package/.claude/sidecars/c2-vector-memory/lightrag-mvp/manifest.json +59 -0
  1972. package/.claude/sidecars/c5-dev-tools/hypothesis/boundary_test.py +142 -0
  1973. package/.claude/sidecars/c5-dev-tools/hypothesis/install.sh +46 -0
  1974. package/.claude/sidecars/c5-dev-tools/hypothesis/manifest.json +52 -0
  1975. package/.claude/sidecars/c5-dev-tools/hypothesis/tests/__init__.py +0 -0
  1976. package/.claude/sidecars/c5-dev-tools/hypothesis/tests/test_audit_emit_known_actions_property.py +123 -0
  1977. package/.claude/sidecars/c5-dev-tools/hypothesis/tests/test_canonical_guard_symmetry_property.py +67 -0
  1978. package/.claude/sidecars/c5-dev-tools/hypothesis/tests/test_payload_roundtrip_property.py +73 -0
  1979. package/.claude/sidecars/c5-dev-tools/hypothesis/tests/test_redact_idempotence_property.py +68 -0
  1980. package/.claude/skill-governance-grandfather.yaml +39 -0
  1981. package/.claude/skill-patch-signers.txt +19 -0
  1982. package/.claude/skills/core/agent-architect/SKILL.md +126 -0
  1983. package/.claude/skills/core/ai-llm-orchestration/SKILL.md +620 -0
  1984. package/.claude/skills/core/ai-llm-orchestration/SKILL.md.shadow.md +121 -0
  1985. package/.claude/skills/core/architecture-decisions/SKILL.md +364 -0
  1986. package/.claude/skills/core/architecture-decisions/benchmarks/architecture-decisions.yaml +257 -0
  1987. package/.claude/skills/core/ceo-orchestration/SKILL-frontend.md +117 -0
  1988. package/.claude/skills/core/ceo-orchestration/SKILL.md +700 -0
  1989. package/.claude/skills/core/chaos-and-resilience/SKILL.md +568 -0
  1990. package/.claude/skills/core/chaos-and-resilience/SKILL.md.shadow.md +553 -0
  1991. package/.claude/skills/core/code-intelligence-lsp/SKILL.md +375 -0
  1992. package/.claude/skills/core/code-review-checklist/SKILL.md +675 -0
  1993. package/.claude/skills/core/code-review-checklist/SKILL.md.shadow.md +337 -0
  1994. package/.claude/skills/core/code-review-checklist/benchmarks/code-review-checklist.yaml +444 -0
  1995. package/.claude/skills/core/codebase-onboarding/SKILL.md +515 -0
  1996. package/.claude/skills/core/compliance-lgpd/SKILL-frontend.md +513 -0
  1997. package/.claude/skills/core/compliance-lgpd/SKILL.md +817 -0
  1998. package/.claude/skills/core/consent-lifecycle/SKILL.md +149 -0
  1999. package/.claude/skills/core/cookbook-advisor/SKILL.md +191 -0
  2000. package/.claude/skills/core/coverage-audit/SKILL.md +116 -0
  2001. package/.claude/skills/core/cross-llm-pair-review/SKILL.md +212 -0
  2002. package/.claude/skills/core/data-schema-design/SKILL.md +933 -0
  2003. package/.claude/skills/core/devops-ci-cd/SKILL.md +659 -0
  2004. package/.claude/skills/core/dpo-reporting/SKILL.md +187 -0
  2005. package/.claude/skills/core/evidence-based-qa/SKILL.md +565 -0
  2006. package/.claude/skills/core/git-workflow-discipline/SKILL.md +600 -0
  2007. package/.claude/skills/core/growth-and-launch/SKILL-frontend.md +800 -0
  2008. package/.claude/skills/core/growth-and-launch/SKILL.md +903 -0
  2009. package/.claude/skills/core/help-me/SKILL.md +177 -0
  2010. package/.claude/skills/core/help-me/tests/test_help_me_skill.py +490 -0
  2011. package/.claude/skills/core/identity-and-trust-architecture/SKILL.md +1062 -0
  2012. package/.claude/skills/core/incident-management/SKILL.md +421 -0
  2013. package/.claude/skills/core/incremental-refactoring/SKILL-frontend.md +210 -0
  2014. package/.claude/skills/core/incremental-refactoring/SKILL.md +226 -0
  2015. package/.claude/skills/core/llm-routing-and-finops/SKILL.md +828 -0
  2016. package/.claude/skills/core/mcp-server-authoring/SKILL.md +685 -0
  2017. package/.claude/skills/core/minimal-change-discipline/SKILL.md +545 -0
  2018. package/.claude/skills/core/monetization-and-billing/SKILL-frontend.md +562 -0
  2019. package/.claude/skills/core/monetization-and-billing/SKILL.md +585 -0
  2020. package/.claude/skills/core/observability-and-ops/SKILL-frontend.md +290 -0
  2021. package/.claude/skills/core/observability-and-ops/SKILL.md +612 -0
  2022. package/.claude/skills/core/observability-and-ops/SKILL.md.shadow.md +324 -0
  2023. package/.claude/skills/core/parallelization-by-default/SKILL.md +176 -0
  2024. package/.claude/skills/core/parallelization-by-default/tests/test_parallelization_skill.py +490 -0
  2025. package/.claude/skills/core/performance-engineering/SKILL.md +219 -0
  2026. package/.claude/skills/core/performance-engineering/SKILL.md.shadow.md +204 -0
  2027. package/.claude/skills/core/pii-data-flow/SKILL.md +166 -0
  2028. package/.claude/skills/core/pre-plan-brainstorm/CHECKLIST.md +87 -0
  2029. package/.claude/skills/core/pre-plan-brainstorm/SKILL.md +186 -0
  2030. package/.claude/skills/core/product-conversion-readiness/SKILL-frontend.md +668 -0
  2031. package/.claude/skills/core/product-conversion-readiness/SKILL.md +941 -0
  2032. package/.claude/skills/core/public-api-design/SKILL.md +603 -0
  2033. package/.claude/skills/core/public-api-design/benchmarks/public-api-design.yaml +261 -0
  2034. package/.claude/skills/core/receiving-review/SKILL.md +131 -0
  2035. package/.claude/skills/core/receiving-review/benchmarks/receiving-review.yaml +254 -0
  2036. package/.claude/skills/core/requirement-quality-checklist/SKILL.md +97 -0
  2037. package/.claude/skills/core/security-and-auth/SKILL.md +868 -0
  2038. package/.claude/skills/core/security-and-auth/SKILL.md.shadow.md +500 -0
  2039. package/.claude/skills/core/security-and-auth/benchmarks/owasp-basics.yaml +491 -0
  2040. package/.claude/skills/core/security-and-auth/benchmarks/owasp-llm-top-10.yaml +769 -0
  2041. package/.claude/skills/core/spec-clarify/SKILL.md +120 -0
  2042. package/.claude/skills/core/state-machines-and-invariants/SKILL.md +288 -0
  2043. package/.claude/skills/core/technical-writing/SKILL.md +432 -0
  2044. package/.claude/skills/core/terse-mode/SKILL.md +80 -0
  2045. package/.claude/skills/core/terse-mode/SKILL.md.shadow.md +65 -0
  2046. package/.claude/skills/core/testing-strategy/SKILL.md +1026 -0
  2047. package/.claude/skills/core/testing-strategy/SKILL.md.shadow.md +983 -0
  2048. package/.claude/skills/domains/academic-humanities/examples/PLAN-EXAMPLE-ACH.md +126 -0
  2049. package/.claude/skills/domains/academic-humanities/pitfalls.yaml +68 -0
  2050. package/.claude/skills/domains/academic-humanities/skills/anthropologist/SKILL.md +394 -0
  2051. package/.claude/skills/domains/academic-humanities/skills/geographer/SKILL.md +453 -0
  2052. package/.claude/skills/domains/academic-humanities/skills/historian/SKILL.md +255 -0
  2053. package/.claude/skills/domains/academic-humanities/skills/narratologist/SKILL.md +398 -0
  2054. package/.claude/skills/domains/academic-humanities/skills/psychologist/SKILL.md +271 -0
  2055. package/.claude/skills/domains/academic-humanities/task-chains.yaml +125 -0
  2056. package/.claude/skills/domains/academic-humanities/team-personas.md +278 -0
  2057. package/.claude/skills/domains/business-support/examples/PLAN-EXAMPLE-BSP.md +115 -0
  2058. package/.claude/skills/domains/business-support/pitfalls.yaml +69 -0
  2059. package/.claude/skills/domains/business-support/skills/analytics-reporter/SKILL.md +339 -0
  2060. package/.claude/skills/domains/business-support/skills/executive-summary/SKILL.md +268 -0
  2061. package/.claude/skills/domains/business-support/skills/finance-tracker/SKILL.md +321 -0
  2062. package/.claude/skills/domains/business-support/skills/support-responder/SKILL.md +341 -0
  2063. package/.claude/skills/domains/business-support/task-chains.yaml +118 -0
  2064. package/.claude/skills/domains/business-support/team-personas.md +259 -0
  2065. package/.claude/skills/domains/civil-engineering/skills/civil-engineer/SKILL.md +275 -0
  2066. package/.claude/skills/domains/community/NOTICE.md +83 -0
  2067. package/.claude/skills/domains/community/skills/advanced-evaluation/SKILL.md +463 -0
  2068. package/.claude/skills/domains/community/skills/agent-evaluation/SKILL.md +400 -0
  2069. package/.claude/skills/domains/community/skills/agentic-actions-auditor/SKILL.md +410 -0
  2070. package/.claude/skills/domains/community/team-personas.md +41 -0
  2071. package/.claude/skills/domains/devrel/examples/api-deprecation-comms.md +180 -0
  2072. package/.claude/skills/domains/devrel/pitfalls.yaml +74 -0
  2073. package/.claude/skills/domains/devrel/skills/developer-advocate/SKILL.md +382 -0
  2074. package/.claude/skills/domains/devrel/task-chains.yaml +129 -0
  2075. package/.claude/skills/domains/devrel/team-personas.md +260 -0
  2076. package/.claude/skills/domains/edtech/examples/PLAN-EXAMPLE.md +89 -0
  2077. package/.claude/skills/domains/edtech/pitfalls.yaml +98 -0
  2078. package/.claude/skills/domains/edtech/skills/assessment-integrity/SKILL.md +208 -0
  2079. package/.claude/skills/domains/edtech/skills/learning-analytics/SKILL.md +212 -0
  2080. package/.claude/skills/domains/edtech/skills/student-data-privacy/SKILL.md +197 -0
  2081. package/.claude/skills/domains/edtech/skills/study-abroad-advisory/SKILL.md +582 -0
  2082. package/.claude/skills/domains/edtech/task-chains.yaml +122 -0
  2083. package/.claude/skills/domains/edtech/team-personas.md +252 -0
  2084. package/.claude/skills/domains/embedded/skills/embedded-firmware/SKILL.md +471 -0
  2085. package/.claude/skills/domains/finance-accounting/examples/new-subscription-revenue.md +135 -0
  2086. package/.claude/skills/domains/finance-accounting/pitfalls.yaml +74 -0
  2087. package/.claude/skills/domains/finance-accounting/skills/bookkeeper-controller/SKILL.md +427 -0
  2088. package/.claude/skills/domains/finance-accounting/skills/financial-analyst/SKILL.md +348 -0
  2089. package/.claude/skills/domains/finance-accounting/skills/fpa-analyst/SKILL.md +366 -0
  2090. package/.claude/skills/domains/finance-accounting/skills/tax-strategist/SKILL.md +358 -0
  2091. package/.claude/skills/domains/finance-accounting/task-chains.yaml +90 -0
  2092. package/.claude/skills/domains/finance-accounting/team-personas.md +281 -0
  2093. package/.claude/skills/domains/fintech/ORG_CHART.md +167 -0
  2094. package/.claude/skills/domains/fintech/commands/audit-ai.md +124 -0
  2095. package/.claude/skills/domains/fintech/commands/deploy.md +15 -0
  2096. package/.claude/skills/domains/fintech/commands/status.md +13 -0
  2097. package/.claude/skills/domains/fintech/frontend-team-personas.md +503 -0
  2098. package/.claude/skills/domains/fintech/pitfalls.yaml +58 -0
  2099. package/.claude/skills/domains/fintech/scripts/check-pitfall-regression.sh +80 -0
  2100. package/.claude/skills/domains/fintech/scripts/check-type-sync.sh +110 -0
  2101. package/.claude/skills/domains/fintech/skills/blockchain-security-audit/SKILL.md +492 -0
  2102. package/.claude/skills/domains/fintech/skills/equity-research/SKILL.md +459 -0
  2103. package/.claude/skills/domains/fintech/skills/exchange-api-integration/SKILL.md +315 -0
  2104. package/.claude/skills/domains/fintech/skills/exchange-onboarding-playbook/SKILL.md +527 -0
  2105. package/.claude/skills/domains/fintech/skills/financial-correctness-and-math/SKILL-frontend.md +308 -0
  2106. package/.claude/skills/domains/fintech/skills/financial-correctness-and-math/SKILL.md +340 -0
  2107. package/.claude/skills/domains/fintech/skills/financial-display/SKILL.md +193 -0
  2108. package/.claude/skills/domains/fintech/skills/frontend-data-layer/SKILL.md +206 -0
  2109. package/.claude/skills/domains/fintech/skills/frontend-patterns/SKILL.md +387 -0
  2110. package/.claude/skills/domains/fintech/skills/prediction-markets/SKILL.md +139 -0
  2111. package/.claude/skills/domains/fintech/skills/real-time-market-systems/SKILL.md +315 -0
  2112. package/.claude/skills/domains/fintech/skills/solidity-smart-contracts/SKILL.md +356 -0
  2113. package/.claude/skills/domains/fintech/skills/trading-execution/SKILL.md +126 -0
  2114. package/.claude/skills/domains/fintech/task-chains.yaml +46 -0
  2115. package/.claude/skills/domains/fintech/team-personas.md +773 -0
  2116. package/.claude/skills/domains/government/examples/PLAN-EXAMPLE.md +158 -0
  2117. package/.claude/skills/domains/government/pitfalls.yaml +114 -0
  2118. package/.claude/skills/domains/government/skills/accessibility-section-508/SKILL.md +183 -0
  2119. package/.claude/skills/domains/government/skills/digital-presales/SKILL.md +359 -0
  2120. package/.claude/skills/domains/government/skills/foia-and-records/SKILL.md +211 -0
  2121. package/.claude/skills/domains/government/skills/public-procurement/SKILL.md +264 -0
  2122. package/.claude/skills/domains/government/task-chains.yaml +88 -0
  2123. package/.claude/skills/domains/government/team-personas.md +296 -0
  2124. package/.claude/skills/domains/healthcare/examples/patient-portal-symptom-checker.md +130 -0
  2125. package/.claude/skills/domains/healthcare/pitfalls.yaml +74 -0
  2126. package/.claude/skills/domains/healthcare/skills/healthcare-customer-service/SKILL.md +369 -0
  2127. package/.claude/skills/domains/healthcare/skills/marketing-compliance/SKILL.md +367 -0
  2128. package/.claude/skills/domains/healthcare/task-chains.yaml +87 -0
  2129. package/.claude/skills/domains/healthcare/team-personas.md +273 -0
  2130. package/.claude/skills/domains/hospitality/skills/guest-services/SKILL.md +417 -0
  2131. package/.claude/skills/domains/hr/examples/attrition-model-launch.md +128 -0
  2132. package/.claude/skills/domains/hr/pitfalls.yaml +74 -0
  2133. package/.claude/skills/domains/hr/skills/hr-onboarding/SKILL.md +435 -0
  2134. package/.claude/skills/domains/hr/skills/recruitment-specialist/SKILL.md +400 -0
  2135. package/.claude/skills/domains/hr/task-chains.yaml +91 -0
  2136. package/.claude/skills/domains/hr/team-personas.md +251 -0
  2137. package/.claude/skills/domains/i18n-business/examples/PLAN-EXAMPLE-I18N.md +115 -0
  2138. package/.claude/skills/domains/i18n-business/pitfalls.yaml +68 -0
  2139. package/.claude/skills/domains/i18n-business/skills/cultural-intelligence/SKILL.md +448 -0
  2140. package/.claude/skills/domains/i18n-business/skills/french-consulting/SKILL.md +347 -0
  2141. package/.claude/skills/domains/i18n-business/skills/korean-business/SKILL.md +360 -0
  2142. package/.claude/skills/domains/i18n-business/skills/language-translator/SKILL.md +389 -0
  2143. package/.claude/skills/domains/i18n-business/task-chains.yaml +117 -0
  2144. package/.claude/skills/domains/i18n-business/team-personas.md +258 -0
  2145. package/.claude/skills/domains/identity-systems/examples/passkey-rollout.md +137 -0
  2146. package/.claude/skills/domains/identity-systems/pitfalls.yaml +74 -0
  2147. package/.claude/skills/domains/identity-systems/skills/identity-graph-operator/SKILL.md +353 -0
  2148. package/.claude/skills/domains/identity-systems/task-chains.yaml +90 -0
  2149. package/.claude/skills/domains/identity-systems/team-personas.md +233 -0
  2150. package/.claude/skills/domains/legal/examples/client-intake-pii-flow.md +177 -0
  2151. package/.claude/skills/domains/legal/pitfalls.yaml +77 -0
  2152. package/.claude/skills/domains/legal/skills/client-intake/SKILL.md +407 -0
  2153. package/.claude/skills/domains/legal/skills/document-review/SKILL.md +373 -0
  2154. package/.claude/skills/domains/legal/skills/legal-billing/SKILL.md +331 -0
  2155. package/.claude/skills/domains/legal/task-chains.yaml +131 -0
  2156. package/.claude/skills/domains/legal/team-personas.md +260 -0
  2157. package/.claude/skills/domains/lgpd-heavy-saas/examples/PLAN-EXAMPLE.md +120 -0
  2158. package/.claude/skills/domains/lgpd-heavy-saas/pitfalls.yaml +90 -0
  2159. package/.claude/skills/domains/lgpd-heavy-saas/task-chains.yaml +83 -0
  2160. package/.claude/skills/domains/lgpd-heavy-saas/team-personas.md +159 -0
  2161. package/.claude/skills/domains/marketing-global/skills/agentic-search-optimizer/SKILL.md +391 -0
  2162. package/.claude/skills/domains/marketing-global/skills/ai-citation-strategist/SKILL.md +343 -0
  2163. package/.claude/skills/domains/marketing-global/skills/app-store-optimizer/SKILL.md +495 -0
  2164. package/.claude/skills/domains/marketing-global/skills/book-co-author/SKILL.md +220 -0
  2165. package/.claude/skills/domains/marketing-global/skills/carousel-growth-engine/SKILL.md +393 -0
  2166. package/.claude/skills/domains/marketing-global/skills/content-creator/SKILL.md +416 -0
  2167. package/.claude/skills/domains/marketing-global/skills/growth-hacker/SKILL.md +495 -0
  2168. package/.claude/skills/domains/marketing-global/skills/instagram-curator/SKILL.md +419 -0
  2169. package/.claude/skills/domains/marketing-global/skills/linkedin-content-creator/SKILL.md +291 -0
  2170. package/.claude/skills/domains/marketing-global/skills/podcast-strategist/SKILL.md +408 -0
  2171. package/.claude/skills/domains/marketing-global/skills/reddit-community-builder/SKILL.md +295 -0
  2172. package/.claude/skills/domains/marketing-global/skills/seo-specialist/SKILL.md +352 -0
  2173. package/.claude/skills/domains/marketing-global/skills/social-media-strategist/SKILL.md +349 -0
  2174. package/.claude/skills/domains/marketing-global/skills/tiktok-strategist/SKILL.md +329 -0
  2175. package/.claude/skills/domains/marketing-global/skills/twitter-engager/SKILL.md +382 -0
  2176. package/.claude/skills/domains/marketing-global/skills/video-optimization-specialist/SKILL.md +386 -0
  2177. package/.claude/skills/domains/mobile/examples/PLAN-EXAMPLE-MOB.md +129 -0
  2178. package/.claude/skills/domains/mobile/pitfalls.yaml +69 -0
  2179. package/.claude/skills/domains/mobile/skills/mobile-app-builder/SKILL.md +446 -0
  2180. package/.claude/skills/domains/mobile/task-chains.yaml +126 -0
  2181. package/.claude/skills/domains/mobile/team-personas.md +292 -0
  2182. package/.claude/skills/domains/paid-media/examples/new-channel-launch.md +122 -0
  2183. package/.claude/skills/domains/paid-media/pitfalls.yaml +79 -0
  2184. package/.claude/skills/domains/paid-media/skills/auditor/SKILL.md +362 -0
  2185. package/.claude/skills/domains/paid-media/skills/creative-strategist/SKILL.md +457 -0
  2186. package/.claude/skills/domains/paid-media/skills/paid-social-strategist/SKILL.md +493 -0
  2187. package/.claude/skills/domains/paid-media/skills/ppc-strategist/SKILL.md +450 -0
  2188. package/.claude/skills/domains/paid-media/skills/programmatic-buyer/SKILL.md +396 -0
  2189. package/.claude/skills/domains/paid-media/skills/search-query-analyst/SKILL.md +336 -0
  2190. package/.claude/skills/domains/paid-media/skills/tracking-specialist/SKILL.md +457 -0
  2191. package/.claude/skills/domains/paid-media/task-chains.yaml +121 -0
  2192. package/.claude/skills/domains/paid-media/team-personas.md +251 -0
  2193. package/.claude/skills/domains/project-management/examples/PLAN-EXAMPLE-PMG.md +117 -0
  2194. package/.claude/skills/domains/project-management/pitfalls.yaml +68 -0
  2195. package/.claude/skills/domains/project-management/skills/experiment-tracker/SKILL.md +293 -0
  2196. package/.claude/skills/domains/project-management/skills/project-shepherd/SKILL.md +312 -0
  2197. package/.claude/skills/domains/project-management/skills/studio-operations/SKILL.md +333 -0
  2198. package/.claude/skills/domains/project-management/skills/studio-producer/SKILL.md +329 -0
  2199. package/.claude/skills/domains/project-management/task-chains.yaml +118 -0
  2200. package/.claude/skills/domains/project-management/team-personas.md +264 -0
  2201. package/.claude/skills/domains/real-estate-finance/examples/PLAN-EXAMPLE-REF.md +129 -0
  2202. package/.claude/skills/domains/real-estate-finance/pitfalls.yaml +68 -0
  2203. package/.claude/skills/domains/real-estate-finance/skills/buyer-seller-agent/SKILL.md +410 -0
  2204. package/.claude/skills/domains/real-estate-finance/skills/loan-officer-assistant/SKILL.md +415 -0
  2205. package/.claude/skills/domains/real-estate-finance/task-chains.yaml +123 -0
  2206. package/.claude/skills/domains/real-estate-finance/team-personas.md +287 -0
  2207. package/.claude/skills/domains/retail/skills/customer-returns/SKILL.md +363 -0
  2208. package/.claude/skills/domains/saas-platforms/examples/enterprise-tier-isolation.md +147 -0
  2209. package/.claude/skills/domains/saas-platforms/pitfalls.yaml +74 -0
  2210. package/.claude/skills/domains/saas-platforms/skills/cms-developer/SKILL.md +377 -0
  2211. package/.claude/skills/domains/saas-platforms/skills/filament-specialist/SKILL.md +316 -0
  2212. package/.claude/skills/domains/saas-platforms/skills/salesforce-architect/SKILL.md +369 -0
  2213. package/.claude/skills/domains/saas-platforms/task-chains.yaml +90 -0
  2214. package/.claude/skills/domains/saas-platforms/team-personas.md +283 -0
  2215. package/.claude/skills/domains/sales/examples/qbr-revenue-forecast.md +158 -0
  2216. package/.claude/skills/domains/sales/pitfalls.yaml +73 -0
  2217. package/.claude/skills/domains/sales/skills/account-strategist/SKILL.md +408 -0
  2218. package/.claude/skills/domains/sales/skills/deal-strategist/SKILL.md +292 -0
  2219. package/.claude/skills/domains/sales/skills/discovery-coach/SKILL.md +257 -0
  2220. package/.claude/skills/domains/sales/skills/outbound-strategist/SKILL.md +262 -0
  2221. package/.claude/skills/domains/sales/skills/pipeline-analyst/SKILL.md +317 -0
  2222. package/.claude/skills/domains/sales/skills/proposal-strategist/SKILL.md +288 -0
  2223. package/.claude/skills/domains/sales/skills/sales-coach/SKILL.md +306 -0
  2224. package/.claude/skills/domains/sales/skills/sales-engineer/SKILL.md +272 -0
  2225. package/.claude/skills/domains/sales/skills/sales-outreach/SKILL.md +338 -0
  2226. package/.claude/skills/domains/sales/task-chains.yaml +123 -0
  2227. package/.claude/skills/domains/sales/team-personas.md +249 -0
  2228. package/.claude/skills/domains/supply-chain/skills/supply-chain-strategist/SKILL.md +340 -0
  2229. package/.claude/skills/domains/trading-hft/examples/PLAN-EXAMPLE.md +145 -0
  2230. package/.claude/skills/domains/trading-hft/pitfalls.yaml +99 -0
  2231. package/.claude/skills/domains/trading-hft/skills/kill-switches/SKILL.md +128 -0
  2232. package/.claude/skills/domains/trading-hft/skills/latency-budgets/SKILL.md +117 -0
  2233. package/.claude/skills/domains/trading-hft/skills/order-routing/SKILL.md +97 -0
  2234. package/.claude/skills/domains/trading-hft/task-chains.yaml +97 -0
  2235. package/.claude/skills/domains/trading-hft/team-personas.md +155 -0
  2236. package/.claude/skills/domains/training-l-and-d/skills/corporate-training-designer/SKILL.md +268 -0
  2237. package/.claude/skills/domains/voice-ai/skills/voice-ai-integration/SKILL.md +405 -0
  2238. package/.claude/skills/frontend/NOTICE.md +80 -0
  2239. package/.claude/skills/frontend/accessibility-and-wcag/SKILL.md +395 -0
  2240. package/.claude/skills/frontend/accessibility-and-wcag/SKILL.md.shadow.md +181 -0
  2241. package/.claude/skills/frontend/accessibility-and-wcag/benchmarks/accessibility-and-wcag.yaml +420 -0
  2242. package/.claude/skills/frontend/accessibility-and-wcag/reference/charts-accessibility.yaml +357 -0
  2243. package/.claude/skills/frontend/code-quality-and-typescript/SKILL.md +167 -0
  2244. package/.claude/skills/frontend/design-system-and-components/SKILL.md +155 -0
  2245. package/.claude/skills/frontend/design-system-and-components/SKILL.md.shadow.md +138 -0
  2246. package/.claude/skills/frontend/design-system-and-components/reference/fonts.yaml +811 -0
  2247. package/.claude/skills/frontend/design-system-and-components/reference/palettes.yaml +3066 -0
  2248. package/.claude/skills/frontend/frontend-accessibility/SKILL.md +213 -0
  2249. package/.claude/skills/frontend/frontend-data-layer/SKILL.md +310 -0
  2250. package/.claude/skills/frontend/frontend-patterns/SKILL.md +771 -0
  2251. package/.claude/skills/frontend/frontend-performance-optimization/SKILL.md +228 -0
  2252. package/.claude/skills/frontend/frontend-performance-optimization/SKILL.md.shadow.md +213 -0
  2253. package/.claude/skills/frontend/ux-and-user-journeys/SKILL.md +153 -0
  2254. package/.claude/skills/frontend/ux-and-user-journeys/SKILL.md.shadow.md +138 -0
  2255. package/.claude/skills/frontend/ux-and-user-journeys/reference/guidelines.yaml +997 -0
  2256. package/.claude/squad-revocations.jsonl +5 -0
  2257. package/.claude/task-chains.yaml +151 -0
  2258. package/.claude/team.md +825 -0
  2259. package/.claude/templates/squad-bundle/README.md +208 -0
  2260. package/.claude/templates/squad-bundle/conftest.py +27 -0
  2261. package/.claude/templates/squad-bundle/examples/template-example.md.template +94 -0
  2262. package/.claude/templates/squad-bundle/pitfalls.yaml.template +88 -0
  2263. package/.claude/templates/squad-bundle/task-chains.yaml.template +92 -0
  2264. package/.claude/templates/squad-bundle/team-personas.md.template +161 -0
  2265. package/.claude/trust/README.md +89 -0
  2266. package/.claude/trust/owner.asc +11 -0
  2267. package/.claude/workflows/README.md +124 -0
  2268. package/.claude/workflows/audit-fanout.js +204 -0
  2269. package/.claude/workflows/eval-baseline-n20.js +330 -0
  2270. package/.claude/workflows/nightly-hygiene.js +176 -0
  2271. package/LICENSE +21 -0
  2272. package/PROTOCOL.md +597 -0
  2273. package/README.md +167 -0
  2274. package/SPEC/v1/README.md +181 -0
  2275. package/SPEC/v1/adapters.schema.md +272 -0
  2276. package/SPEC/v1/audit-log.schema.md +1514 -0
  2277. package/SPEC/v1/audit-query.schema.md +152 -0
  2278. package/SPEC/v1/benchmarks.schema.md +166 -0
  2279. package/SPEC/v1/claude-sdk-compat.md +123 -0
  2280. package/SPEC/v1/debate.schema.md +35 -0
  2281. package/SPEC/v1/hook-io.schema.md +94 -0
  2282. package/SPEC/v1/install-cli.md +234 -0
  2283. package/SPEC/v1/judge-payload.schema.md +98 -0
  2284. package/SPEC/v1/live-adapters-policy.schema.md +118 -0
  2285. package/SPEC/v1/mcp-server.schema.md +558 -0
  2286. package/SPEC/v1/memory-shared.schema.md +365 -0
  2287. package/SPEC/v1/normalized_envelope.schema.md +183 -0
  2288. package/SPEC/v1/npm-shim.md +95 -0
  2289. package/SPEC/v1/plan.schema.md +34 -0
  2290. package/SPEC/v1/policy-dsl.schema.md +466 -0
  2291. package/SPEC/v1/predict-budget.schema.md +289 -0
  2292. package/SPEC/v1/rag-sidecar.schema.md +222 -0
  2293. package/SPEC/v1/red-team-corpus.schema.md +186 -0
  2294. package/SPEC/v1/replay.schema.md +272 -0
  2295. package/SPEC/v1/scratchpad.schema.md +172 -0
  2296. package/SPEC/v1/sentinel-format.schema.md +306 -0
  2297. package/SPEC/v1/session-graph.schema.md +236 -0
  2298. package/SPEC/v1/skill-frontmatter.schema.md +83 -0
  2299. package/SPEC/v1/skill-index.schema.md +197 -0
  2300. package/SPEC/v1/skill-proposals.schema.md +175 -0
  2301. package/SPEC/v1/soc2-control-map.schema.md +797 -0
  2302. package/SPEC/v1/squad-manifest.schema.md +157 -0
  2303. package/SPEC/v1/state-stores.schema.md +146 -0
  2304. package/SPEC/v1/tier-policy.schema.md +264 -0
  2305. package/SPEC/v1/tournament-report.schema.md +156 -0
  2306. package/VERSION +1 -0
  2307. package/bin/ceo-orch-init.js +55 -0
  2308. package/package.json +42 -0
  2309. package/scripts/_framework_manifest_set.sh +237 -0
  2310. package/scripts/_hash_lib.sh +92 -0
  2311. package/scripts/build-plugin.py +351 -0
  2312. package/scripts/discover_foreign_context.py +151 -0
  2313. package/scripts/install-accelerators.sh +166 -0
  2314. package/scripts/install-npm.sh +254 -0
  2315. package/scripts/install.sh +1932 -0
  2316. package/scripts/local/OWNER-CEREMONY-PLAN-094-WAVE-A.sh +648 -0
  2317. package/scripts/local/OWNER-CEREMONY-S82-V1120.sh +169 -0
  2318. package/scripts/local/plan-093-apply-kernel-edits.py +496 -0
  2319. package/scripts/local/plan-093-execute-ceremony.sh +118 -0
  2320. package/scripts/local/plan-093-kernel-override-restart.sh +115 -0
  2321. package/scripts/local/plan-093-ship-v1.26.0.sh +226 -0
  2322. package/scripts/local/plan-094-apply-wave-a-c-e.py +398 -0
  2323. package/scripts/local/smoke-install-parity.sh +168 -0
  2324. package/scripts/local/trading-readonly-escape-hatch.sh +244 -0
  2325. package/scripts/measure-repo-size.sh +98 -0
  2326. package/scripts/npm-rebuild.sh +172 -0
  2327. package/scripts/publish-plugin.sh +144 -0
  2328. package/scripts/tests/smoke-install.sh +260 -0
  2329. package/scripts/tests/test-install-sandbox-merge.sh +137 -0
  2330. package/scripts/tests/test_install_baseline_manifest.sh +392 -0
  2331. package/scripts/uninstall.sh +282 -0
  2332. package/scripts/upgrade.sh +1260 -0
  2333. package/templates/.claude/tier-policy.json +35 -0
  2334. package/templates/.claude/tier-policy.json.sigchain +1 -0
  2335. package/templates/.env.example +134 -0
  2336. package/templates/.github/CODEOWNERS.template +33 -0
  2337. package/templates/.github/workflows/benchmarks.yml.template +145 -0
  2338. package/templates/.github/workflows/validate.yml.template +226 -0
  2339. package/templates/.mcp.json +13 -0
  2340. package/templates/CLAUDE.md +125 -0
  2341. package/templates/MEMORY.md +36 -0
  2342. package/templates/README.md +46 -0
  2343. package/templates/compaction.md +130 -0
  2344. package/templates/docs/BRANCH-PROTECTION.md +203 -0
  2345. package/templates/docs/rotation-log.md +18 -0
  2346. package/templates/oidc-proxy/README.md +141 -0
  2347. package/templates/oidc-proxy/broker.config.example.json +29 -0
  2348. package/templates/oidc-proxy/oidc_key_broker.py +361 -0
  2349. package/templates/oidc-proxy/tests/test_oidc_key_broker.py +361 -0
  2350. package/templates/scripts/statusline-ceo.py +597 -0
  2351. package/templates/settings/settings.base.json +708 -0
  2352. package/templates/settings/settings.stack.node.json +19 -0
  2353. package/templates/settings/settings.stack.otel.json +25 -0
  2354. package/templates/settings/settings.stack.sandbox.json +57 -0
  2355. package/templates/settings/settings.user.json +265 -0
  2356. package/templates/team-personas-reference.md +269 -0
@@ -0,0 +1,1932 @@
1
+ #!/usr/bin/env bash
2
+ # install.sh — install ceo-orchestration into a target repo
3
+ #
4
+ # Usage:
5
+ # ./install.sh <target-repo-path> [options]
6
+ #
7
+ # Options:
8
+ # --link Use symlinks instead of copies (for submodule mode)
9
+ # --ceremony <m|u> Ceremony mode (WS4-ceremony-help):
10
+ # maintainer (default, full governance) OR
11
+ # user (no-GPG; advisory hooks only; writes .claude/ only)
12
+ # --profile <list> Comma-separated profiles to install (default: core,frontend)
13
+ # Available: core, frontend, <domain-name>
14
+ # Example: --profile core,fintech
15
+ # --profile core,frontend,fintech
16
+ # --stack <name> Stack-specific hooks to merge into settings.json
17
+ # Available: node, none
18
+ # Example: --stack node (adds tsc + vitest pre-commit gate)
19
+ # Default: none
20
+ # --github-owner <handle> GitHub handle to substitute into CODEOWNERS.template
21
+ # and {{OWNER_HANDLE}} placeholders (e.g. --github-owner alice).
22
+ # If omitted, the placeholder is left in place
23
+ # for manual editing (with a stderr warning).
24
+ # --with-reference-personas Also install templates/team-personas-reference.md
25
+ # into target (opt-in; 8 fictional personas as
26
+ # concrete examples of the archetype-based team).
27
+ # Default: off (archetype templates only).
28
+ #
29
+ # --dry-run Print what WOULD be done (mkdir, cp, sed) without
30
+ # touching $TARGET. Exit 0 after preview.
31
+ #
32
+ # Placeholder substitution flags (override env + default values):
33
+ # --owner <name> -> {{OWNER_NAME}} (env: CEO_OWNER)
34
+ # --project <name> -> {{PROJECT_NAME}} (env: CEO_PROJECT; default: target basename)
35
+ # --project-path <path> -> {{PROJECT_PATH}} (env: CEO_PROJECT_PATH; default: $TARGET)
36
+ # --stack-name <str> -> {{STACK}} (env: CEO_STACK; default: --stack value)
37
+ # --deploy-command <cmd> -> {{DEPLOY_COMMAND}} (env: CEO_DEPLOY_COMMAND)
38
+ # --deploy-platform <str> -> {{DEPLOY_PLATFORM}} (env: CEO_DEPLOY_PLATFORM)
39
+ # --deploy-target <str> -> {{DEPLOY_TARGET}} (env: CEO_DEPLOY_TARGET)
40
+ # --runtime-notes <str> -> {{RUNTIME_NOTES}} (env: CEO_RUNTIME_NOTES)
41
+ # --database <str> -> {{DATABASE}} (env: CEO_DATABASE)
42
+ # --n-backend <int> -> {{N_BACKEND}} (env: CEO_N_BACKEND)
43
+ # --n-frontend <int> -> {{N_FRONTEND}} (env: CEO_N_FRONTEND)
44
+ # --frontend-stack <str> -> {{FRONTEND_STACK}} (env: CEO_FRONTEND_STACK)
45
+ # --frontend-path <str> -> {{FRONTEND_PATH}} (env: CEO_FRONTEND_PATH)
46
+ # --frontend-repo-path <str> -> {{FRONTEND_REPO_PATH}} (env: CEO_FRONTEND_REPO_PATH)
47
+ # --ui-library <str> -> {{UI_LIBRARY}} (env: CEO_UI_LIBRARY)
48
+ # --state-management <str> -> {{STATE_MANAGEMENT}} (env: CEO_STATE_MANAGEMENT)
49
+ # --realtime-transport <str> -> {{REALTIME_TRANSPORT}} (env: CEO_REALTIME_TRANSPORT)
50
+ # --charting-library <str> -> {{CHARTING_LIBRARY}} (env: CEO_CHARTING_LIBRARY)
51
+ # --auth-provider <str> -> {{AUTH_PROVIDER}} (env: CEO_AUTH_PROVIDER)
52
+ # --i18n-framework <str> -> {{I18N_FRAMEWORK}} (env: CEO_I18N_FRAMEWORK)
53
+ # --test-framework <str> -> {{TEST_FRAMEWORK}} (env: CEO_TEST_FRAMEWORK)
54
+ # --test-tool <str> -> {{TEST_TOOL}} (env: CEO_TEST_TOOL)
55
+ # --test-count <int> -> {{TEST_COUNT}} (env: CEO_TEST_COUNT)
56
+ # --lint-tool <str> -> {{LINT_TOOL}} (env: CEO_LINT_TOOL)
57
+ # --ci-tool <str> -> {{CI_TOOL}} (env: CEO_CI_TOOL)
58
+ # --app-name <str> -> {{APP_NAME}} (env: CEO_APP_NAME)
59
+ # --source-file-count <int> -> {{SOURCE_FILE_COUNT}} (env: CEO_SOURCE_FILE_COUNT)
60
+ # --line-count <int> -> {{LINE_COUNT}} (env: CEO_LINE_COUNT)
61
+ # --lines <int> -> {{LINES}} (env: CEO_LINES)
62
+ # --file-count <int> -> {{FILE_COUNT}} (env: CEO_FILE_COUNT)
63
+ # --page-count <int> -> {{PAGE_COUNT}} (env: CEO_PAGE_COUNT)
64
+ # --component-count <int> -> {{COMPONENT_COUNT}} (env: CEO_COMPONENT_COUNT)
65
+ # --hook-count <int> -> {{HOOK_COUNT}} (env: CEO_HOOK_COUNT)
66
+ # --bundle-size <str> -> {{BUNDLE_SIZE}} (env: CEO_BUNDLE_SIZE)
67
+ #
68
+ # -h, --help Show this help
69
+ #
70
+ # --strict-placeholders Post-install validator: fail install if any
71
+ # `{{X}}` placeholder remains unsubstituted in
72
+ # installed files. Recommended for CI / first
73
+ # install of a new adopter. Equivalent to
74
+ # exporting `CEO_INSTALL_STRICT_PH=1`.
75
+ # (Session 75 Codex Finding 5 — wired here.)
76
+ #
77
+ # --verify Re-checksum installed skill SHAs against the
78
+ # source manifest (.claude/skill-manifest.sha256
79
+ # if shipped). Basic integrity check. Sigstore
80
+ # backend is OUT OF SCOPE per Owner D2 (Session
81
+ # 75 lock); use OS-level package signing if you
82
+ # need cryptographic provenance.
83
+ #
84
+ # --verify-sigstore DEPRECATED alias for --verify (Session 76
85
+ # audit-v3 / Codex DIM-19 closure). Emits a
86
+ # stderr deprecation warning and behaves
87
+ # identically to --verify. The sigstore
88
+ # backend is NOT reintroduced (Owner D2).
89
+ # deprecated_in 1.11.4 / removed_in 2.0.0.
90
+ #
91
+ # What it does:
92
+ # 1. (NEW — F-CHAOS-2) Snapshots existing $TARGET/.claude/ to a backup
93
+ # tempdir and restores it atomically on any failure. Cleans the
94
+ # backup on success. trap cleanup_on_failure EXIT.
95
+ # 2. Always installs:
96
+ # - .claude/team.md, .claude/frontend-team.md (template with placeholders)
97
+ # - .claude/skills/core/ (universal skills)
98
+ # - .claude/skills/frontend/ (if frontend profile selected)
99
+ # - .claude/hooks/, .claude/scripts/, .claude/commands/
100
+ # - .claude/pitfalls-catalog.yaml, .claude/task-chains.yaml, .claude/agent-metrics.md
101
+ # 3. If --profile includes a domain name (e.g. fintech):
102
+ # - Installs .claude/skills/domains/<domain>/ with its skills, pitfalls, task-chains,
103
+ # team-personas, commands, scripts.
104
+ # 4. Produces .claude/settings.json from templates/settings/settings.base.json
105
+ # (+ settings.stack.<stack>.json if --stack is set), using jq to merge.
106
+ # Hard-fails (rc=3) if --stack is EXPLICITLY supplied and jq is missing.
107
+ # 5. Copies templates/CLAUDE.md to target as CLAUDE.md (only if missing)
108
+ # 6. Copies templates/MEMORY.md to target as MEMORY.md (only if missing)
109
+ # 6b. (PLAN-135 W1 S5-lite) Copies templates/.mcp.json to target as
110
+ # .mcp.json (only if missing — project-scope MCP registration for
111
+ # the Codex pair-rail; maintainer ceremony only, same EXISTS->SKIP
112
+ # idempotency as CLAUDE.md/MEMORY.md).
113
+ # 7. (NEW — P1-CR-3) Runs a sed substitution pass over freshly-installed
114
+ # template files for the placeholders supplied via CLI / env. Any
115
+ # placeholder left unrendered is reported with a stderr warning and
116
+ # listed at the end.
117
+ # 8. Lists placeholders the user must fill in.
118
+ #
119
+ # Idempotent: re-running won't clobber edited files.
120
+ #
121
+ # Portability: this script targets bash >= 3.2 (macOS default). It uses
122
+ # no bash-4-only features (no associative arrays, no `mapfile`, no
123
+ # `read -d ''`, no `${var^^}`). Tested on Darwin bash-3.2 and Linux
124
+ # bash-5.x.
125
+
126
+ # ----------------------------------------------------------------------
127
+ # DevOps-P1-3: bash version guard (must appear BEFORE `set -euo pipefail`
128
+ # so an old shell that doesn't understand newer constructs errors out
129
+ # with a friendly message, not a syntax error)
130
+ # ----------------------------------------------------------------------
131
+ if [ -z "${BASH_VERSINFO:-}" ]; then
132
+ echo "ERROR: install.sh requires bash (detected non-bash shell)" >&2
133
+ echo " Run: bash scripts/install.sh <target>" >&2
134
+ exit 1
135
+ fi
136
+
137
+ if [ "${BASH_VERSINFO[0]}" -lt 3 ] || \
138
+ { [ "${BASH_VERSINFO[0]}" -eq 3 ] && [ "${BASH_VERSINFO[1]}" -lt 2 ]; }; then
139
+ echo "ERROR: install.sh requires bash >= 3.2 (detected ${BASH_VERSION})" >&2
140
+ exit 1
141
+ fi
142
+
143
+ # ----------------------------------------------------------------------
144
+ # P2-SEC-F (PLAN-019 Phase 3 Wave 3B): required-deps preflight.
145
+ # Defense-in-depth: if any of jq, sed, git is missing, fail early with
146
+ # a clear error pointing to the package manager. Upstream hardened
147
+ # bootstrap (checksum-verified deps) is documented in docs/INSTALL.md
148
+ # under "Hardened bootstrap".
149
+ # ----------------------------------------------------------------------
150
+ _missing_deps=""
151
+ for _cmd in sed git; do
152
+ if ! command -v "$_cmd" >/dev/null 2>&1; then
153
+ _missing_deps="${_missing_deps:+$_missing_deps }$_cmd"
154
+ fi
155
+ done
156
+ # jq is conditionally required (only when --stack is explicit). We warn
157
+ # softly here; the hard-fail lives in build_settings() below.
158
+ if [ -n "$_missing_deps" ]; then
159
+ echo "ERROR: install.sh requires: $_missing_deps" >&2
160
+ echo " Install via your package manager (apt/brew/dnf) and retry." >&2
161
+ exit 3
162
+ fi
163
+ unset _missing_deps _cmd
164
+
165
+ set -euo pipefail
166
+
167
+ # Resolve SCRIPT_DIR with a readlink-with-fallback so the script works
168
+ # when invoked via a symlink (e.g. from /usr/local/bin/install-ceo).
169
+ _resolve_script_path() {
170
+ local src="$1"
171
+ # If GNU/BSD readlink is available, prefer it; fall back to $src as-is.
172
+ if command -v readlink >/dev/null 2>&1; then
173
+ # Try `readlink -f` (GNU) first; on macOS this may not exist, so
174
+ # fall through to plain readlink which follows one symlink level.
175
+ local resolved
176
+ if resolved="$(readlink -f "$src" 2>/dev/null)" && [ -n "$resolved" ]; then
177
+ printf '%s\n' "$resolved"
178
+ return 0
179
+ fi
180
+ # Manual one-level dereference loop for macOS bash 3.2 without -f.
181
+ while [ -L "$src" ]; do
182
+ local link_target
183
+ link_target="$(readlink "$src")"
184
+ case "$link_target" in
185
+ /*) src="$link_target" ;;
186
+ *) src="$(cd "$(dirname "$src")" && pwd)/$link_target" ;;
187
+ esac
188
+ done
189
+ fi
190
+ printf '%s\n' "$src"
191
+ }
192
+
193
+ SCRIPT_SRC="$(_resolve_script_path "${BASH_SOURCE[0]}")"
194
+ SCRIPT_DIR="$( cd "$( dirname "$SCRIPT_SRC" )" && pwd )"
195
+ SOURCE_DIR="$( cd "$SCRIPT_DIR/.." && pwd )"
196
+
197
+ # PLAN-138 Wave C (ADR-155) — portable SHA-256 helpers + the single shared
198
+ # framework-owned enumeration. Sourced (not executed). Fail-open: if the
199
+ # helper is somehow absent (partial checkout), the baseline-manifest step is
200
+ # simply skipped later — the install itself never depends on it.
201
+ if [ -f "$SCRIPT_DIR/_hash_lib.sh" ]; then
202
+ # shellcheck source=scripts/_hash_lib.sh
203
+ . "$SCRIPT_DIR/_hash_lib.sh"
204
+ fi
205
+ if [ -f "$SCRIPT_DIR/_framework_manifest_set.sh" ]; then
206
+ # shellcheck source=scripts/_framework_manifest_set.sh
207
+ . "$SCRIPT_DIR/_framework_manifest_set.sh"
208
+ fi
209
+
210
+ # ----------------------------------------------------------------------
211
+ # P0-15 (PLAN-045 Session 41 / PLAN-044 F-15R2-01, 2026-04-20;
212
+ # narrative clarified PLAN-063 DIM-01 P1, 2026-04-30):
213
+ # supply-chain self-verification.
214
+ #
215
+ # The LAST line of this script is a `# CEO-INSTALL-SHA256: <hex>` trailer
216
+ # populated at release-tag cut by .github/workflows/release.yml. At
217
+ # install time the script sha256-hashes its own body (everything except
218
+ # the trailer line) and compares. Fail-CLOSED (rc=5) on mismatch,
219
+ # missing trailer, or malformed trailer.
220
+ #
221
+ # Source-tag = GPG-only; the placeholder is INTENTIONAL for source
222
+ # installs. Specifically:
223
+ # - The NPM-shim path (npm/install.sh, see scripts/install-npm.sh)
224
+ # anchors version verification on package.json, not on this trailer.
225
+ # Source-tree clones therefore never see a populated trailer and
226
+ # that is by design.
227
+ # - The PLACEHOLDER_RELEASE_FILL trailer applies ONLY to release-tag
228
+ # cuts where .github/workflows/release.yml rewrites the last line
229
+ # with the canonical hex.
230
+ # - Tampering-detection still works for release-tag installs: any
231
+ # post-cut byte change to install.sh trips the SHA mismatch.
232
+ #
233
+ # Bypass: CEO_INSTALL_SKIP_SELF_SHA=1 (for local dev / tests). Emits a
234
+ # stderr warning so adopters are aware.
235
+ # Placeholder: the literal value `PLACEHOLDER_RELEASE_FILL` indicates
236
+ # a source checkout not processed by release.yml; skipped with
237
+ # a stderr warning. Set by the release workflow to the real hex
238
+ # at tag cut. This is the intended behavior for source-tree
239
+ # clones — see notes above.
240
+ # ----------------------------------------------------------------------
241
+ _self_sha_compute() {
242
+ # SHA256 of everything in the script EXCEPT the last line.
243
+ # Portable across macOS (shasum) and Linux (sha256sum). Reads file
244
+ # twice via awk so it works without GNU-only `head -n -1`.
245
+ local script_path="$1"
246
+ local hasher=""
247
+ if command -v shasum >/dev/null 2>&1; then
248
+ hasher="shasum -a 256"
249
+ elif command -v sha256sum >/dev/null 2>&1; then
250
+ hasher="sha256sum"
251
+ else
252
+ return 1
253
+ fi
254
+ awk 'NR==FNR{n++; next} FNR < n' "$script_path" "$script_path" \
255
+ | eval "$hasher" | awk '{print $1}'
256
+ }
257
+
258
+ _verify_self_sha() {
259
+ local script_path="$1"
260
+ if [ "${CEO_INSTALL_SKIP_SELF_SHA:-0}" = "1" ]; then
261
+ echo "WARN: install.sh self-SHA verification skipped (CEO_INSTALL_SKIP_SELF_SHA=1)" >&2
262
+ return 0
263
+ fi
264
+ local trailer
265
+ trailer="$(tail -n 1 "$script_path" 2>/dev/null || true)"
266
+ case "$trailer" in
267
+ "# CEO-INSTALL-SHA256: "*)
268
+ local expected="${trailer##"# CEO-INSTALL-SHA256: "}"
269
+ if [ "$expected" = "PLACEHOLDER_RELEASE_FILL" ]; then
270
+ echo "WARN: install.sh self-SHA trailer is the unpopulated placeholder." >&2
271
+ echo " (Source checkout, not a release tarball. Proceeding.)" >&2
272
+ return 0
273
+ fi
274
+ local actual
275
+ if ! actual="$(_self_sha_compute "$script_path")"; then
276
+ echo "ERROR: install.sh self-SHA cannot compute — shasum/sha256sum missing." >&2
277
+ exit 5
278
+ fi
279
+ if [ "$actual" != "$expected" ]; then
280
+ echo "ERROR: install.sh self-SHA MISMATCH (supply-chain tampering suspected)." >&2
281
+ echo " expected: $expected" >&2
282
+ echo " actual: $actual" >&2
283
+ echo " The install.sh file has been modified since release cut." >&2
284
+ echo " If this is intentional (local dev), set" >&2
285
+ echo " CEO_INSTALL_SKIP_SELF_SHA=1 to bypass." >&2
286
+ exit 5
287
+ fi
288
+ ;;
289
+ *)
290
+ echo "ERROR: install.sh missing/malformed CEO-INSTALL-SHA256 trailer." >&2
291
+ echo " Expected last line: '# CEO-INSTALL-SHA256: <hex>'" >&2
292
+ echo " Got: '$trailer'" >&2
293
+ exit 5
294
+ ;;
295
+ esac
296
+ }
297
+
298
+ _verify_self_sha "$SCRIPT_SRC"
299
+
300
+ # ---- Arg parsing ----
301
+
302
+ TARGET=""
303
+ MODE="copy"
304
+ PROFILE="core,frontend"
305
+ STACK="none"
306
+ STACK_EXPLICIT=0
307
+ GITHUB_OWNER=""
308
+ WITH_REFERENCE_PERSONAS=0
309
+ DRY_RUN=0
310
+ STRICT_PLACEHOLDERS=0
311
+ # Session 75 Codex Finding 5 closure: post-install integrity check.
312
+ CEREMONY="maintainer" # WS4-ceremony-var
313
+ _WS4_PRESNAP="" # WS4-ceremony-var (set under -u; populated in non-dry-run)
314
+ # Re-checksums installed skill SHAs against the source manifest.
315
+ VERIFY=0
316
+
317
+ # Placeholder values — resolved from CLI > env > "" (report-only).
318
+ # Default values for values we can derive deterministically are set later
319
+ # (after $TARGET is known).
320
+ PH_OWNER_NAME="${CEO_OWNER:-}"
321
+ PH_PROJECT_NAME="${CEO_PROJECT:-}"
322
+ PH_PROJECT_PATH="${CEO_PROJECT_PATH:-}"
323
+ PH_STACK="${CEO_STACK:-}"
324
+ # PLAN-085 Wave A.5 (F-A-CR-0005): PROTOCOL.md pointer placeholder
325
+ # {{PROTOCOL_SOURCE}} substitution. Resolved (CLI > env > $SOURCE_DIR
326
+ # default) so freshly installed PROTOCOL.md pointers don't leak the
327
+ # literal `{{PROTOCOL_SOURCE}}` marker.
328
+ PH_PROTOCOL_SOURCE="${CEO_PROTOCOL_SOURCE:-}"
329
+ PH_DEPLOY_COMMAND="${CEO_DEPLOY_COMMAND:-}"
330
+ PH_DEPLOY_PLATFORM="${CEO_DEPLOY_PLATFORM:-}"
331
+ PH_DEPLOY_TARGET="${CEO_DEPLOY_TARGET:-}"
332
+ PH_RUNTIME_NOTES="${CEO_RUNTIME_NOTES:-}"
333
+ PH_DATABASE="${CEO_DATABASE:-}"
334
+ PH_N_BACKEND="${CEO_N_BACKEND:-}"
335
+ PH_N_FRONTEND="${CEO_N_FRONTEND:-}"
336
+ PH_FRONTEND_STACK="${CEO_FRONTEND_STACK:-}"
337
+ PH_FRONTEND_PATH="${CEO_FRONTEND_PATH:-}"
338
+ PH_FRONTEND_REPO_PATH="${CEO_FRONTEND_REPO_PATH:-}"
339
+ PH_UI_LIBRARY="${CEO_UI_LIBRARY:-}"
340
+ PH_STATE_MANAGEMENT="${CEO_STATE_MANAGEMENT:-}"
341
+ PH_REALTIME_TRANSPORT="${CEO_REALTIME_TRANSPORT:-}"
342
+ PH_CHARTING_LIBRARY="${CEO_CHARTING_LIBRARY:-}"
343
+ PH_AUTH_PROVIDER="${CEO_AUTH_PROVIDER:-}"
344
+ PH_I18N_FRAMEWORK="${CEO_I18N_FRAMEWORK:-}"
345
+ PH_TEST_FRAMEWORK="${CEO_TEST_FRAMEWORK:-}"
346
+ PH_TEST_TOOL="${CEO_TEST_TOOL:-}"
347
+ PH_TEST_COUNT="${CEO_TEST_COUNT:-}"
348
+ PH_LINT_TOOL="${CEO_LINT_TOOL:-}"
349
+ PH_CI_TOOL="${CEO_CI_TOOL:-}"
350
+ PH_APP_NAME="${CEO_APP_NAME:-}"
351
+ PH_SOURCE_FILE_COUNT="${CEO_SOURCE_FILE_COUNT:-}"
352
+ PH_LINE_COUNT="${CEO_LINE_COUNT:-}"
353
+ PH_LINES="${CEO_LINES:-}"
354
+ PH_FILE_COUNT="${CEO_FILE_COUNT:-}"
355
+ PH_PAGE_COUNT="${CEO_PAGE_COUNT:-}"
356
+ PH_COMPONENT_COUNT="${CEO_COMPONENT_COUNT:-}"
357
+ PH_HOOK_COUNT="${CEO_HOOK_COUNT:-}"
358
+ PH_BUNDLE_SIZE="${CEO_BUNDLE_SIZE:-}"
359
+ PH_CITY="${CEO_CITY:-}"
360
+ PH_COUNTRY="${CEO_COUNTRY:-}"
361
+ PH_DOMAIN="${CEO_DOMAIN:-}"
362
+ PH_FOUNDER_NAME="${CEO_FOUNDER_NAME:-}"
363
+ PH_LEGAL_ID="${CEO_LEGAL_ID:-}"
364
+ PH_PRODUCTION_URL="${CEO_PRODUCTION_URL:-}"
365
+
366
+ print_help() {
367
+ # PLAN-087 B.6: print the full help block (was truncating at line 80
368
+ # which silently dropped the --verify-sigstore deprecation notice and
369
+ # the LGPD/fintech placeholder flags --city/--country/--domain/
370
+ # --founder-name/--legal-id/--production-url). Range bounded by the
371
+ # "Portability:" trailer to stay drift-stable.
372
+ sed -n '3,120p' "$0"
373
+ exit 0
374
+ }
375
+
376
+ while [[ $# -gt 0 ]]; do
377
+ case "$1" in
378
+ --link)
379
+ MODE="link"; shift ;;
380
+ --profile)
381
+ PROFILE="${2:-}"; shift 2 ;;
382
+ --ceremony) # WS4-ceremony-case
383
+ CEREMONY="${2:-}"
384
+ case "$CEREMONY" in
385
+ maintainer|user) ;;
386
+ *)
387
+ echo "ERROR: --ceremony must be 'maintainer' or 'user' (got: $CEREMONY)" >&2
388
+ exit 2
389
+ ;;
390
+ esac
391
+ shift 2 ;;
392
+ --stack)
393
+ STACK="${2:-}"; STACK_EXPLICIT=1; shift 2 ;;
394
+ --github-owner)
395
+ GITHUB_OWNER="${2:-}"; shift 2 ;;
396
+ --with-reference-personas)
397
+ WITH_REFERENCE_PERSONAS=1; shift ;;
398
+ --dry-run)
399
+ DRY_RUN=1; shift ;;
400
+ --strict-placeholders)
401
+ # Session 75 Codex Finding 5: was advertised in docs/READINESS-STATUS.md
402
+ # but the parser rejected it. Now wired — mirrors CEO_INSTALL_STRICT_PH=1
403
+ # post-install validator (fails install if any `{{X}}` placeholder
404
+ # remains unsubstituted in installed files).
405
+ STRICT_PLACEHOLDERS=1; shift ;;
406
+ --verify)
407
+ # Session 75 Codex Finding 5: re-checksum installed skill SHAs vs
408
+ # source manifest. Basic integrity check; sigstore backend OUT OF
409
+ # SCOPE per Owner D2 lock.
410
+ VERIFY=1; shift ;;
411
+ --verify-sigstore)
412
+ # Session 76 audit-v3 Finding D / Codex DIM-19 closure: deprecated
413
+ # alias for `--verify`. Owner D2 (Session 75) ruled the sigstore
414
+ # backend out of scope, but SemVer policy in SPEC/v1/install-cli.md
415
+ # §Deprecation requires alias retention with stdout warning + 90-day
416
+ # window before MAJOR removal. This emits the warning and behaves
417
+ # identically to --verify; the sigstore transparency-log path is
418
+ # NOT reintroduced (per D2). deprecated_in 1.11.4 / removed_in 2.0.0.
419
+ printf 'WARNING: --verify-sigstore is deprecated since v1.11.4 (sigstore backend removed per Session 75 Owner D2 lock); use --verify instead. Will be removed in v2.0.0 — see SPEC/v1/install-cli.md §Deprecation.\n' >&2
420
+ VERIFY=1; shift ;;
421
+
422
+ --target)
423
+ # Accept --target <dir> as alias for the positional form, to match
424
+ # the PLAN-019 Wave 2A acceptance invocation.
425
+ if [[ -z "$TARGET" ]]; then
426
+ TARGET="${2:-}"
427
+ else
428
+ echo "ERROR: --target conflicts with positional target: $TARGET" >&2
429
+ exit 1
430
+ fi
431
+ shift 2 ;;
432
+
433
+ # Placeholder substitution flags
434
+ --owner) PH_OWNER_NAME="${2:-}"; shift 2 ;;
435
+ --project) PH_PROJECT_NAME="${2:-}"; shift 2 ;;
436
+ --project-path) PH_PROJECT_PATH="${2:-}"; shift 2 ;;
437
+ --stack-name) PH_STACK="${2:-}"; shift 2 ;;
438
+ --protocol-source) PH_PROTOCOL_SOURCE="${2:-}"; shift 2 ;;
439
+ --deploy-command) PH_DEPLOY_COMMAND="${2:-}"; shift 2 ;;
440
+ --deploy-platform) PH_DEPLOY_PLATFORM="${2:-}"; shift 2 ;;
441
+ --deploy-target) PH_DEPLOY_TARGET="${2:-}"; shift 2 ;;
442
+ --runtime-notes) PH_RUNTIME_NOTES="${2:-}"; shift 2 ;;
443
+ --database) PH_DATABASE="${2:-}"; shift 2 ;;
444
+ --n-backend) PH_N_BACKEND="${2:-}"; shift 2 ;;
445
+ --n-frontend) PH_N_FRONTEND="${2:-}"; shift 2 ;;
446
+ --frontend-stack) PH_FRONTEND_STACK="${2:-}"; shift 2 ;;
447
+ --frontend-path) PH_FRONTEND_PATH="${2:-}"; shift 2 ;;
448
+ --frontend-repo-path) PH_FRONTEND_REPO_PATH="${2:-}"; shift 2 ;;
449
+ --ui-library) PH_UI_LIBRARY="${2:-}"; shift 2 ;;
450
+ --state-management) PH_STATE_MANAGEMENT="${2:-}"; shift 2 ;;
451
+ --realtime-transport) PH_REALTIME_TRANSPORT="${2:-}"; shift 2 ;;
452
+ --charting-library) PH_CHARTING_LIBRARY="${2:-}"; shift 2 ;;
453
+ --auth-provider) PH_AUTH_PROVIDER="${2:-}"; shift 2 ;;
454
+ --i18n-framework) PH_I18N_FRAMEWORK="${2:-}"; shift 2 ;;
455
+ --test-framework) PH_TEST_FRAMEWORK="${2:-}"; shift 2 ;;
456
+ --test-tool) PH_TEST_TOOL="${2:-}"; shift 2 ;;
457
+ --test-count) PH_TEST_COUNT="${2:-}"; shift 2 ;;
458
+ --lint-tool) PH_LINT_TOOL="${2:-}"; shift 2 ;;
459
+ --ci-tool) PH_CI_TOOL="${2:-}"; shift 2 ;;
460
+ --app-name) PH_APP_NAME="${2:-}"; shift 2 ;;
461
+ --source-file-count) PH_SOURCE_FILE_COUNT="${2:-}"; shift 2 ;;
462
+ --line-count) PH_LINE_COUNT="${2:-}"; shift 2 ;;
463
+ --lines) PH_LINES="${2:-}"; shift 2 ;;
464
+ --file-count) PH_FILE_COUNT="${2:-}"; shift 2 ;;
465
+ --page-count) PH_PAGE_COUNT="${2:-}"; shift 2 ;;
466
+ --component-count) PH_COMPONENT_COUNT="${2:-}"; shift 2 ;;
467
+ --hook-count) PH_HOOK_COUNT="${2:-}"; shift 2 ;;
468
+ --bundle-size) PH_BUNDLE_SIZE="${2:-}"; shift 2 ;;
469
+ --city) PH_CITY="${2:-}"; shift 2 ;;
470
+ --country) PH_COUNTRY="${2:-}"; shift 2 ;;
471
+ --domain) PH_DOMAIN="${2:-}"; shift 2 ;;
472
+ --founder-name) PH_FOUNDER_NAME="${2:-}"; shift 2 ;;
473
+ --legal-id) PH_LEGAL_ID="${2:-}"; shift 2 ;;
474
+ --production-url) PH_PRODUCTION_URL="${2:-}"; shift 2 ;;
475
+
476
+ -h|--help)
477
+ print_help ;;
478
+ -*)
479
+ # PLAN-044 audit-v2 C4-P0-01 fix (Wave B): exit 2 (CLI usage error
480
+ # convention per LSB) so adopter wrappers can distinguish "user
481
+ # passed an unknown flag" from "install operation failed mid-flight"
482
+ # (which uses exit 1 elsewhere in the script).
483
+ echo "ERROR: unknown option: $1" >&2
484
+ echo "Run '$0 --help' for usage." >&2
485
+ exit 2 ;;
486
+ *)
487
+ if [[ -z "$TARGET" ]]; then
488
+ TARGET="$1"
489
+ else
490
+ echo "ERROR: unexpected positional arg: $1" >&2
491
+ exit 1
492
+ fi
493
+ shift ;;
494
+ esac
495
+ done
496
+
497
+ # Dry-run mode also tolerates `--target /tmp/foo` as a convenience, even
498
+ # though positional is the canonical form — this is what ACCEPTANCE-1
499
+ # expects (`install.sh --dry-run --target /tmp/smoke-dry`).
500
+ if [[ -z "$TARGET" ]]; then
501
+ # No target — in dry-run mode we fabricate a synthetic path for preview
502
+ # output. Session 75 Codex Finding 5 closure: prior code created the
503
+ # tmp dir on disk despite "no files modified" promise; now we keep
504
+ # the path purely synthetic.
505
+ if [[ "$DRY_RUN" -eq 1 ]]; then
506
+ TARGET="${TMPDIR:-/tmp}/ceo-dry-run-preview"
507
+ else
508
+ echo "Usage: $0 <target-repo-path> [--link] [--profile <list>] [--stack <name>] [--dry-run]" >&2
509
+ echo "Run '$0 --help' for full options." >&2
510
+ exit 1
511
+ fi
512
+ fi
513
+
514
+ if [[ ! -d "$TARGET" ]]; then
515
+ if [[ "$DRY_RUN" -eq 1 ]]; then
516
+ # Preview only — let the user see what WOULD happen if the dir existed.
517
+ # Session 75 Codex Finding 5 closure: do NOT mkdir in dry-run; the
518
+ # promise is "no files modified". Synthesize an absolute-path string
519
+ # via realpath -m (no-existence flag) for the rest of the script.
520
+ echo "(dry-run) NOTE: target directory does not exist: $TARGET" >&2
521
+ else
522
+ echo "ERROR: target directory does not exist: $TARGET" >&2
523
+ exit 1
524
+ fi
525
+ fi
526
+
527
+ # Resolve TARGET to absolute form. Real installs cd into the dir;
528
+ # dry-runs use realpath -m (path may not exist on disk yet).
529
+ if [[ "$DRY_RUN" -eq 1 && ! -d "$TARGET" ]]; then
530
+ if command -v realpath >/dev/null 2>&1; then
531
+ TARGET="$( realpath -m "$TARGET" 2>/dev/null || realpath "$TARGET" 2>/dev/null || echo "$TARGET" )"
532
+ fi
533
+ else
534
+ TARGET="$( cd "$TARGET" && pwd )"
535
+ fi
536
+
537
+ # Fill in deterministic defaults for placeholders now that $TARGET is known.
538
+ if [[ -z "$PH_PROJECT_NAME" ]]; then
539
+ PH_PROJECT_NAME="$( basename "$TARGET" )"
540
+ fi
541
+ if [[ -z "$PH_PROJECT_PATH" ]]; then
542
+ PH_PROJECT_PATH="$TARGET"
543
+ fi
544
+ if [[ -z "$PH_STACK" ]]; then
545
+ PH_STACK="$STACK"
546
+ fi
547
+ # PLAN-085 Wave A.5 deterministic default — point PROTOCOL_SOURCE at
548
+ # the framework checkout we are installing FROM. Adopters override via
549
+ # --protocol-source / CEO_PROTOCOL_SOURCE if their framework lives
550
+ # elsewhere post-install. Falling back to $SOURCE_DIR keeps the
551
+ # resulting PROTOCOL.md pointer working out-of-the-box (cd into it
552
+ # and `git pull` works on day 1).
553
+ if [[ -z "$PH_PROTOCOL_SOURCE" ]]; then
554
+ PH_PROTOCOL_SOURCE="$SOURCE_DIR"
555
+ fi
556
+
557
+ # Split PROFILE into array (e.g. "core,fintech" -> [core, fintech])
558
+ IFS=',' read -r -a PROFILE_PARTS <<< "$PROFILE"
559
+
560
+ echo "==> Installing ceo-orchestration"
561
+ echo " Source: $SOURCE_DIR"
562
+ echo " Target: $TARGET"
563
+ echo " Mode: $MODE"
564
+ echo " Profile: $PROFILE"
565
+ echo " Ceremony: $CEREMONY" # WS4-ceremony-banner
566
+ echo " Stack: $STACK"
567
+ echo " GitHub owner: ${GITHUB_OWNER:-<unset — placeholder kept>}"
568
+ if [[ "$DRY_RUN" -eq 1 ]]; then
569
+ echo " Dry-run: YES (no files will be written)"
570
+ fi
571
+ echo ""
572
+
573
+ # ---------------------------------------------------------------------
574
+ # F-CHAOS-2/DevOps-P1-1: atomic install + rollback-on-failure
575
+ # ---------------------------------------------------------------------
576
+ # Strategy:
577
+ # - If $TARGET/.claude/ already exists, snapshot it to $BACKUP_DIR.
578
+ # - On ANY failure (trap EXIT rc != 0), remove the partial
579
+ # $TARGET/.claude/ and move the backup back into place.
580
+ # - On success, remove the backup in an explicit cleanup step.
581
+ # The backup is placed in a unique mktemp tempdir so it cannot collide
582
+ # with user data.
583
+
584
+ BACKUP_DIR=""
585
+ INSTALL_SUCCEEDED=0
586
+
587
+ # WS4-mtime-helper: portable file mtime (epoch seconds) — GNU + BSD stat.
588
+ detect_mtime() {
589
+ stat -c %Y "$1" 2>/dev/null || stat -f %m "$1" 2>/dev/null || echo 0
590
+ }
591
+
592
+ cleanup_on_failure() {
593
+ local rc=$?
594
+ if [[ "$DRY_RUN" -eq 1 ]]; then
595
+ # Dry-run never touches $TARGET, so never restore.
596
+ exit "$rc"
597
+ fi
598
+ if [[ "$INSTALL_SUCCEEDED" -eq 1 ]]; then
599
+ # Success — clean the backup silently.
600
+ if [[ -n "$BACKUP_DIR" && -d "$BACKUP_DIR" ]]; then
601
+ rm -rf "$BACKUP_DIR" 2>/dev/null || true
602
+ fi
603
+ exit "$rc"
604
+ fi
605
+ if [[ $rc -ne 0 && -n "$BACKUP_DIR" && -d "$BACKUP_DIR/.claude" ]]; then
606
+ echo "::error::install failed (rc=$rc) — restoring $TARGET/.claude from $BACKUP_DIR" >&2
607
+ if [[ -d "$TARGET/.claude" ]]; then
608
+ rm -rf "$TARGET/.claude" 2>/dev/null || true
609
+ fi
610
+ mv "$BACKUP_DIR/.claude" "$TARGET/.claude" 2>/dev/null || true
611
+ rm -rf "$BACKUP_DIR" 2>/dev/null || true
612
+ echo "::error::rollback complete — target restored to pre-install state" >&2
613
+ fi
614
+ exit "$rc"
615
+ }
616
+ trap cleanup_on_failure EXIT
617
+
618
+ if [[ "$DRY_RUN" -eq 0 ]]; then
619
+ if [[ -d "$TARGET/.claude" ]]; then
620
+ BACKUP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/ceo-install-backup.XXXXXX")"
621
+ cp -R "$TARGET/.claude" "$BACKUP_DIR/.claude"
622
+ echo " SNAPSHOT: $TARGET/.claude -> $BACKUP_DIR/.claude (for rollback)"
623
+ fi
624
+ mkdir -p "$TARGET/.claude"
625
+ # WS4-presnapshot: record pre-existing non-.claude top-level entries so
626
+ # the post-install guard (user ceremony) can detect any CREATE or MODIFY
627
+ # outside .claude/. Snapshot = "name<TAB>size<TAB>mtime" per entry.
628
+ _WS4_PRESNAP=""
629
+ if [[ "$CEREMONY" == "user" ]]; then
630
+ _WS4_PRESNAP="$(mktemp -t ceo-ws4-presnap-XXXXXX)"
631
+ for _ws4_e in "$TARGET"/* "$TARGET"/.[!.]* "$TARGET"/..?*; do
632
+ [[ -e "$_ws4_e" ]] || continue
633
+ _ws4_b="$(basename "$_ws4_e")"
634
+ case "$_ws4_b" in
635
+ .claude|.git) continue ;;
636
+ esac
637
+ if [[ -f "$_ws4_e" ]]; then
638
+ _ws4_sz="$(wc -c < "$_ws4_e" 2>/dev/null | tr -d ' ')"
639
+ _ws4_mt="$(detect_mtime "$_ws4_e" 2>/dev/null || echo 0)"
640
+ printf '%s\t%s\t%s\n' "$_ws4_b" "$_ws4_sz" "$_ws4_mt" >> "$_WS4_PRESNAP"
641
+ else
642
+ printf '%s\tDIR\t0\n' "$_ws4_b" >> "$_WS4_PRESNAP"
643
+ fi
644
+ done
645
+ fi
646
+ else
647
+ echo " (dry-run) would snapshot $TARGET/.claude if present"
648
+ echo " (dry-run) would mkdir -p $TARGET/.claude"
649
+ fi
650
+
651
+ # ---- Helpers ----
652
+
653
+ # PLAN-120-FOLLOWUP WS-D (E10-F4) — refuse to write through a pre-existing
654
+ # symlinked INTERMEDIATE path component under $TARGET. The leaf $dst is
655
+ # already guarded by the `-L "$dst"` skip below; this closes the gap where
656
+ # e.g. $TARGET/.claude -> /etc would make `mkdir -p` + `cp -R` write under
657
+ # /etc. Walks every component strictly between $TARGET and dirname($dst)
658
+ # and hard-fails (exit 1, picked up by the rollback trap) if any existing
659
+ # component is a symlink. Legitimate `--mode link` installs symlink only
660
+ # the LEAF, never a parent, so this never trips them.
661
+ _assert_no_symlink_parents() {
662
+ local rel_path="$1"
663
+ # Only validate paths we write under $TARGET.
664
+ local parent_rel
665
+ parent_rel="$( dirname "$rel_path" )"
666
+ [[ "$parent_rel" == "." ]] && return 0
667
+ local cur="$TARGET"
668
+ local IFS='/'
669
+ local comp
670
+ for comp in $parent_rel; do
671
+ [[ -z "$comp" || "$comp" == "." ]] && continue
672
+ cur="$cur/$comp"
673
+ if [[ -L "$cur" ]]; then
674
+ echo "::error::refusing install — symlinked path component under target: $cur" >&2
675
+ echo "::error::an intermediate component of '$rel_path' is a symlink; aborting to avoid write-through escape" >&2
676
+ exit 1
677
+ fi
678
+ done
679
+ return 0
680
+ }
681
+
682
+ install_one() {
683
+ local rel_path="$1"
684
+ local src="$SOURCE_DIR/$rel_path"
685
+ local dst="$TARGET/$rel_path"
686
+
687
+ if [[ ! -e "$src" ]]; then
688
+ echo " SKIP (source missing): $rel_path"
689
+ return
690
+ fi
691
+
692
+ if [[ "$DRY_RUN" -eq 1 ]]; then
693
+ if [[ -e "$dst" || -L "$dst" ]]; then
694
+ echo " (dry-run) EXISTS (would skip): $rel_path"
695
+ elif [[ "$MODE" == "link" ]]; then
696
+ echo " (dry-run) would LINK: $rel_path"
697
+ else
698
+ echo " (dry-run) would COPY: $rel_path"
699
+ fi
700
+ return
701
+ fi
702
+
703
+ _assert_no_symlink_parents "$rel_path"
704
+ mkdir -p "$( dirname "$dst" )"
705
+
706
+ if [[ -e "$dst" || -L "$dst" ]]; then
707
+ echo " EXISTS (skipping): $rel_path"
708
+ return
709
+ fi
710
+
711
+ if [[ "$MODE" == "link" ]]; then
712
+ ln -s "$src" "$dst"
713
+ echo " LINKED: $rel_path"
714
+ else
715
+ if [[ -d "$src" ]]; then
716
+ cp -R "$src" "$dst"
717
+ else
718
+ cp "$src" "$dst"
719
+ fi
720
+ echo " COPIED: $rel_path"
721
+ fi
722
+ }
723
+
724
+ install_template() {
725
+ local src_rel="$1"
726
+ local dst_rel="$2"
727
+ local src="$SOURCE_DIR/$src_rel"
728
+ local dst="$TARGET/$dst_rel"
729
+
730
+ if [[ ! -f "$src" ]]; then
731
+ echo " SKIP (template missing): $src_rel"
732
+ return
733
+ fi
734
+
735
+ if [[ "$DRY_RUN" -eq 1 ]]; then
736
+ if [[ -e "$dst" ]]; then
737
+ echo " (dry-run) EXISTS (would skip template): $dst_rel"
738
+ else
739
+ echo " (dry-run) would COPY template: $src_rel -> $dst_rel"
740
+ fi
741
+ return
742
+ fi
743
+
744
+ if [[ -e "$dst" ]]; then
745
+ echo " EXISTS (skipping template): $dst_rel"
746
+ return
747
+ fi
748
+
749
+ mkdir -p "$( dirname "$dst" )"
750
+ cp "$src" "$dst"
751
+ echo " COPIED template: $src_rel -> $dst_rel"
752
+ }
753
+
754
+ has_profile() {
755
+ local p="$1"
756
+ for part in "${PROFILE_PARTS[@]}"; do
757
+ if [[ "$part" == "$p" ]]; then
758
+ return 0
759
+ fi
760
+ done
761
+ return 1
762
+ }
763
+
764
+ # ---- 1. Team rosters (always installed — these are templates with placeholders) ----
765
+
766
+ install_one ".claude/team.md"
767
+ install_one ".claude/frontend-team.md"
768
+
769
+ # ---- 2. Core skills (always installed if 'core' in profile) ----
770
+
771
+ if has_profile "core"; then
772
+ echo ""
773
+ echo "==> Installing core skills"
774
+ install_one ".claude/skills/core"
775
+ fi
776
+
777
+ # ---- 3. Frontend skills (installed if 'frontend' in profile) ----
778
+
779
+ if has_profile "frontend"; then
780
+ echo ""
781
+ echo "==> Installing frontend skills"
782
+ install_one ".claude/skills/frontend"
783
+ fi
784
+
785
+ # ---- 4. Domain skills (installed per domain name in profile) ----
786
+
787
+ for part in "${PROFILE_PARTS[@]}"; do
788
+ if [[ "$part" != "core" && "$part" != "frontend" ]]; then
789
+ DOMAIN_SRC="$SOURCE_DIR/.claude/skills/domains/$part"
790
+ if [[ ! -d "$DOMAIN_SRC" ]]; then
791
+ echo ""
792
+ echo " WARNING: domain '$part' not found at $DOMAIN_SRC — skipping"
793
+ continue
794
+ fi
795
+ echo ""
796
+ echo "==> Installing domain: $part"
797
+ install_one ".claude/skills/domains/$part"
798
+ fi
799
+ done
800
+
801
+ # ---- 5. Protocol enforcement (hooks, scripts, catalogs — always installed) ----
802
+ #
803
+ # NOTE (PLAN-003 Phase 0 I-4): hooks/ and scripts/ are installed
804
+ # SELECTIVELY — only top-level files + hooks/_lib/ are shipped to
805
+ # targets. Framework-internal directories excluded:
806
+ #
807
+ # .claude/hooks/tests/ — 89 unit tests for the framework itself
808
+ # .claude/hooks/legacy/ — Sprint 1 bash fallbacks (removed in
809
+ # Sprint 3 Item C once invariants met)
810
+ # .claude/scripts/tests/ — 74 unit tests for audit-query,
811
+ # run-skill-benchmark, check-tier-boundaries
812
+ #
813
+ # Rationale: targets don't need our tests or fallbacks — they add ~100
814
+ # files of bloat. Target installs should only carry the ACTIVE runtime
815
+ # surface: _lib/, _python-hook.sh, active Python hooks, and active
816
+ # scripts. New hooks added at the top level (e.g. check_bash_safety.py
817
+ # in I-5a) are picked up automatically by the *.py/*.sh glob below.
818
+
819
+ # PLAN-120-FOLLOWUP WS-D (E4-F1/E4-F2) — install _lib/ SELECTIVELY. A flat
820
+ # `install_one .claude/hooks/_lib` does cp -R (or a whole-tree symlink),
821
+ # which drags the framework's OWN test harness into the adopter runtime:
822
+ # _lib/tests/ (emits real audit events with no session redirect — no
823
+ # conftest ships) + test_isolation.py / testing.py (both `import pytest`
824
+ # at module top). We iterate the top-level _lib entries and skip exactly
825
+ # those three names; everything else (all runtime *.py + the runtime
826
+ # subdirs adapters/ estimation/ federation/ mcp/ otel/ tier_policy/ +
827
+ # __init__.py) ships. New runtime modules are picked up automatically by
828
+ # the glob, matching the install_scripts_selective convention.
829
+ install_lib_selective() {
830
+ echo ""
831
+ echo "==> Installing hooks/_lib (runtime only — tests/, test_isolation.py, testing.py excluded)"
832
+ local e base
833
+ for e in "$SOURCE_DIR/.claude/hooks/_lib/"*; do
834
+ [[ -e "$e" ]] || continue
835
+ base="$( basename "$e" )"
836
+ case "$base" in
837
+ tests|test_isolation.py|testing.py|__pycache__) continue ;;
838
+ esac
839
+ install_one ".claude/hooks/_lib/$base"
840
+ done
841
+ }
842
+
843
+ install_hooks_selective() {
844
+ echo ""
845
+ echo "==> Installing hooks (top-level + _lib/, tests/ + legacy/ excluded)"
846
+ install_lib_selective
847
+ local f base
848
+ for f in "$SOURCE_DIR/.claude/hooks/"*.sh "$SOURCE_DIR/.claude/hooks/"*.py; do
849
+ [[ -f "$f" ]] || continue
850
+ base="$( basename "$f" )"
851
+ install_one ".claude/hooks/$base"
852
+ done
853
+ }
854
+
855
+ # WS4-dispatcher-fn: E6-F5 fix — copy .claude/dispatcher/ (validate-governance.sh REQUIRES it)
856
+ install_dispatcher() {
857
+ local src="$SOURCE_DIR/.claude/dispatcher"
858
+ local dst="$TARGET/.claude/dispatcher"
859
+ if [[ ! -d "$src" ]]; then
860
+ echo " SKIP: .claude/dispatcher/ absent in source" >&2
861
+ return 0
862
+ fi
863
+ echo ""
864
+ echo "==> Installing dispatcher (.claude/dispatcher/ — E6-F5 validate-governance gate)"
865
+ local f
866
+ if [[ "$DRY_RUN" -eq 1 ]]; then
867
+ for f in routing-matrix.yaml routing-matrix-loader.py disable_predicate_eval.py; do
868
+ [[ -f "$src/$f" ]] && echo " (dry-run) would COPY: .claude/dispatcher/$f"
869
+ done
870
+ return 0
871
+ fi
872
+ mkdir -p "$dst"
873
+ for f in routing-matrix.yaml routing-matrix-loader.py disable_predicate_eval.py; do
874
+ if [[ -f "$src/$f" ]]; then
875
+ cp "$src/$f" "$dst/$f"
876
+ echo " COPIED: .claude/dispatcher/$f"
877
+ fi
878
+ done
879
+ }
880
+
881
+ install_scripts_selective() {
882
+ echo ""
883
+ echo "==> Installing scripts (top-level only, tests/ excluded)"
884
+ # PLAN-085 Wave A.1 (F-A-QA-0001-c7f21a3e): *.yaml extension added to
885
+ # the glob so policy/config YAMLs co-located with scripts/ ship to
886
+ # adopters. Without this, files like smart-loading-cap-table.yaml
887
+ # (pre-Wave-A.2 location) were silently dropped, breaking the
888
+ # first-run-wizard.py crash chain documented in PLAN-084 Wave C.4.
889
+ # Post-A.2 the cap-table lives in .claude/policies/, but keeping
890
+ # *.yaml in the script glob is the right default for any future
891
+ # YAML siblings in .claude/scripts/ (and is the install convention
892
+ # we should have shipped from day 1).
893
+ local f base
894
+ for f in "$SOURCE_DIR/.claude/scripts/"*.sh \
895
+ "$SOURCE_DIR/.claude/scripts/"*.py \
896
+ "$SOURCE_DIR/.claude/scripts/"*.yaml; do
897
+ [[ -f "$f" ]] || continue
898
+ base="$( basename "$f" )"
899
+ install_one ".claude/scripts/$base"
900
+ done
901
+ }
902
+
903
+ # PLAN-085 Wave A.3 — install tier-policy.json + .sigchain from
904
+ # templates/.claude/ to adopter .claude/. Files exist in templates/
905
+ # (TLA+ ADJ-007 ledger) but were never installed because no install_one
906
+ # call referenced them. They are required for canonical-guard tier
907
+ # enforcement at adopter sites.
908
+ install_tier_policy() {
909
+ echo ""
910
+ echo "==> Installing tier-policy (templates/.claude/tier-policy.json + .sigchain)"
911
+ install_template "templates/.claude/tier-policy.json" ".claude/tier-policy.json"
912
+ install_template "templates/.claude/tier-policy.json.sigchain" ".claude/tier-policy.json.sigchain"
913
+ }
914
+
915
+ # PLAN-133 E2 — OSV.dev / OSSF malicious-packages supply-chain advisory.
916
+ #
917
+ # OPT-IN + DEFAULT-OFF + NEVER-HANG. With CEO_OSV_GATE unset this is a no-op
918
+ # (we never add latency or network egress to a default install). When an
919
+ # adopter / CI opts in (CEO_OSV_GATE=advisory or =block), this scans the
920
+ # install commands the framework ships (the squad-install / accelerator npx/
921
+ # uvx/pip lines) against OSV.dev for MAL-* advisories via .claude/scripts/
922
+ # osv_check.py.
923
+ #
924
+ # Hard-timeout + offline-safe + fail-OPEN contract:
925
+ # * A hard `timeout` ceiling (CEO_OSV_TIMEOUT_S, default 4s) wraps the call
926
+ # so the gate can NEVER out-live or hang a fast install step.
927
+ # * If neither `timeout`/`gtimeout` nor python3 is present, we SKIP (advisory)
928
+ # and print a breadcrumb — we never block on missing infra.
929
+ # * `advisory` mode never changes the install exit status (rc=0 always).
930
+ # * `block` mode fails the install (rc=4 from this function → caller may halt)
931
+ # ONLY on a concrete MAL advisory hit. A timeout / unknown / malformed
932
+ # response is fail-OPEN by contract and never blocks.
933
+ osv_supply_chain_advisory() {
934
+ local mode="${CEO_OSV_GATE:-}"
935
+ case "$mode" in
936
+ advisory|block) ;;
937
+ *) return 0 ;; # default-OFF: opted out, no-op
938
+ esac
939
+
940
+ local checker="$SOURCE_DIR/.claude/scripts/osv_check.py"
941
+ if [[ ! -f "$checker" ]]; then
942
+ echo " SKIP: osv_check.py absent — supply-chain advisory not run" >&2
943
+ return 0
944
+ fi
945
+ if ! command -v python3 >/dev/null 2>&1; then
946
+ echo " SKIP: python3 absent — supply-chain advisory not run" >&2
947
+ return 0
948
+ fi
949
+
950
+ # Hard-timeout wrapper. Prefer GNU `timeout`, fall back to macOS `gtimeout`,
951
+ # else run bare (osv_check.py has its own per-request hard ceiling, so even
952
+ # without an outer `timeout` the call is bounded).
953
+ local timeout_s="${CEO_OSV_TIMEOUT_S:-4}"
954
+ local outer_budget=$(( ${timeout_s%.*} + 6 )) # request budget + slack
955
+ local TO=()
956
+ if command -v timeout >/dev/null 2>&1; then
957
+ TO=(timeout -k 2 "${outer_budget}s")
958
+ elif command -v gtimeout >/dev/null 2>&1; then
959
+ TO=(gtimeout -k 2 "${outer_budget}s")
960
+ fi
961
+
962
+ echo ""
963
+ echo "==> Supply-chain advisory (OSV.dev / OSSF malicious-packages) — mode=$mode"
964
+
965
+ # The framework ships no third-party runtime installs of its own (stdlib
966
+ # only). The surface this gate guards is the set of install commands an
967
+ # adopter/squad may run; we feed those that are statically known. For the
968
+ # framework install itself there is nothing to query, so this is a wired,
969
+ # exercised, never-hang code path with an empty default target list.
970
+ local cmd rc
971
+ local -a OSV_TARGET_COMMANDS=()
972
+ # Adopters / squad-install pass commands via CEO_OSV_COMMANDS (newline-sep).
973
+ if [[ -n "${CEO_OSV_COMMANDS:-}" ]]; then
974
+ while IFS= read -r cmd; do
975
+ [[ -n "$cmd" ]] && OSV_TARGET_COMMANDS+=("$cmd")
976
+ done <<< "${CEO_OSV_COMMANDS}"
977
+ fi
978
+
979
+ if [[ ${#OSV_TARGET_COMMANDS[@]} -eq 0 ]]; then
980
+ echo " (no install commands to scan — framework runtime is stdlib-only)"
981
+ return 0
982
+ fi
983
+
984
+ local blocked=0
985
+ for cmd in "${OSV_TARGET_COMMANDS[@]}"; do
986
+ rc=0
987
+ if [[ ${#TO[@]} -gt 0 ]]; then
988
+ CEO_OSV_GATE="$mode" "${TO[@]}" python3 "$checker" --command "$cmd" || rc=$?
989
+ else
990
+ CEO_OSV_GATE="$mode" python3 "$checker" --command "$cmd" || rc=$?
991
+ fi
992
+ # rc=124 → outer `timeout` fired (hung request) → fail-OPEN (advisory-skip).
993
+ if [[ "$rc" -eq 124 ]]; then
994
+ echo " TIMEOUT: OSV query exceeded ${outer_budget}s — fail-open (advisory-skip)" >&2
995
+ elif [[ "$rc" -eq 3 ]]; then
996
+ # block-mode MAL hit (osv_check returns 3).
997
+ echo " BLOCKED: malicious-package advisory for an install target" >&2
998
+ blocked=1
999
+ fi
1000
+ done
1001
+
1002
+ if [[ "$mode" == "block" && "$blocked" -eq 1 ]]; then
1003
+ return 4
1004
+ fi
1005
+ return 0
1006
+ }
1007
+
1008
+ # PLAN-014 Phase A.8 (ADJ-042) — policy-as-code bundle. Ships the YAML
1009
+ # policy files + fixtures + drift-manifest. settings.json keeps pointing
1010
+ # to the legacy .py hooks (ADJ-014 dual-path); adopters opt-in to the
1011
+ # YAML path by editing settings.json post-install after reviewing the
1012
+ # shadow-mode guide in docs/.
1013
+ install_policies_bundle() {
1014
+ if [[ ! -d "$SOURCE_DIR/.claude/policies" ]]; then
1015
+ return 0
1016
+ fi
1017
+ echo ""
1018
+ echo "==> Installing policy-as-code bundle (PLAN-014 Phase A)"
1019
+ install_one ".claude/policies"
1020
+ }
1021
+
1022
+ echo ""
1023
+ echo "==> Installing protocol enforcement"
1024
+ install_hooks_selective
1025
+ install_scripts_selective
1026
+ install_dispatcher # WS4-dispatcher-call
1027
+ install_tier_policy
1028
+ install_policies_bundle
1029
+ # PLAN-133 E2 — opt-in supply-chain advisory (default-OFF, never-hang).
1030
+ # In block mode a MAL hit returns rc=4; we surface it but never `exit` here so
1031
+ # the install of stdlib framework files (already on disk) is not half-rolled-
1032
+ # back. Adopters running squad/accelerator installs honor the rc themselves.
1033
+ osv_supply_chain_advisory || {
1034
+ _osv_rc=$?
1035
+ if [[ "$_osv_rc" -eq 4 ]]; then
1036
+ echo " WARNING: supply-chain advisory BLOCKED a target (CEO_OSV_GATE=block)." >&2
1037
+ echo " Review the breadcrumb above before running that install." >&2
1038
+ fi
1039
+ }
1040
+ install_one ".claude/commands"
1041
+ install_one ".claude/pitfalls-catalog.yaml"
1042
+ install_one ".claude/task-chains.yaml"
1043
+ install_one ".claude/agent-metrics.md"
1044
+
1045
+ # ---- 5b. Plan schemas + debate fixture (PLAN-003 Phase 0 I-1) ----
1046
+
1047
+ install_plan_schemas() {
1048
+ echo ""
1049
+ echo "==> Installing plan schemas + debate fixture"
1050
+ install_one ".claude/plans/README.md"
1051
+ install_one ".claude/plans/PLAN-SCHEMA.md"
1052
+ install_one ".claude/plans/AUDIT-LOG-SCHEMA.md"
1053
+ install_one ".claude/plans/DEBATE-SCHEMA.md"
1054
+ install_one ".claude/plans/examples/debate-round-1"
1055
+ }
1056
+
1057
+ install_plan_schemas
1058
+
1059
+ # ---- 5c. ADR template (PLAN-003 Phase 0 I-2) ----
1060
+
1061
+ install_adr_template() {
1062
+ echo ""
1063
+ echo "==> Installing ADR template"
1064
+ install_one ".claude/adr/README.md"
1065
+ }
1066
+
1067
+ install_adr_template
1068
+
1069
+ # ---- 5c-bis-1 SPEC v1 schemas (PLAN-087 B.1 — closes R-042 cluster) ----
1070
+
1071
+ install_spec_v1() {
1072
+ if [[ ! -d "$SOURCE_DIR/SPEC/v1" ]]; then
1073
+ echo " SKIP: SPEC/v1/ absent in source"
1074
+ return 0
1075
+ fi
1076
+ echo ""
1077
+ echo "==> Installing SPEC v1 schemas (~$(ls "$SOURCE_DIR"/SPEC/v1/*.md 2>/dev/null | wc -l | tr -d ' ') files)"
1078
+ install_one "SPEC/v1"
1079
+ }
1080
+
1081
+ if [[ "$CEREMONY" != "user" ]]; then install_spec_v1; fi # WS4-guard-spec
1082
+
1083
+ # ---- 5c-bis-2 VERSION manifest (PLAN-087 B.2 — closes R-042 cluster) ----
1084
+
1085
+ install_version() {
1086
+ if [[ ! -f "$SOURCE_DIR/VERSION" ]]; then
1087
+ echo " SKIP: VERSION file absent in source"
1088
+ return 0
1089
+ fi
1090
+ echo ""
1091
+ echo "==> Installing VERSION manifest ($(tr -d '\n' < "$SOURCE_DIR/VERSION"))"
1092
+ install_one "VERSION"
1093
+ }
1094
+
1095
+ if [[ "$CEREMONY" != "user" ]]; then install_version; fi # WS4-guard-version
1096
+
1097
+ # ---- 5c.bis Reference personas (PLAN-004 Phase 10) ----
1098
+
1099
+ install_reference_personas() {
1100
+ if [[ "$WITH_REFERENCE_PERSONAS" -eq 1 ]]; then
1101
+ echo ""
1102
+ echo "==> Installing reference personas (opt-in)"
1103
+ local src="$SOURCE_DIR/templates/team-personas-reference.md"
1104
+ local dst="$TARGET/.claude/team-personas-reference.md"
1105
+ if [[ "$DRY_RUN" -eq 1 ]]; then
1106
+ if [[ -e "$dst" ]]; then
1107
+ echo " (dry-run) KEEP (would exist): .claude/team-personas-reference.md"
1108
+ else
1109
+ echo " (dry-run) would COPY: .claude/team-personas-reference.md"
1110
+ fi
1111
+ return
1112
+ fi
1113
+ if [[ -f "$src" ]]; then
1114
+ if [[ -e "$dst" ]]; then
1115
+ echo " KEEP (exists): .claude/team-personas-reference.md"
1116
+ else
1117
+ mkdir -p "$( dirname "$dst" )"
1118
+ cp "$src" "$dst"
1119
+ echo " COPIED: .claude/team-personas-reference.md"
1120
+ fi
1121
+ fi
1122
+ fi
1123
+ }
1124
+
1125
+ install_reference_personas
1126
+
1127
+ # ---- 5d. docs/ templates (PLAN-003 Phase 0 I-3) ----
1128
+
1129
+ install_docs_template() {
1130
+ local src_rel="$1"
1131
+ local dst_rel="$2"
1132
+ local src="$SOURCE_DIR/$src_rel"
1133
+ local dst="$TARGET/$dst_rel"
1134
+
1135
+ if [[ ! -f "$src" ]]; then
1136
+ echo " SKIP (template missing): $src_rel"
1137
+ return
1138
+ fi
1139
+
1140
+ if [[ "$DRY_RUN" -eq 1 ]]; then
1141
+ if [[ -e "$dst" ]]; then
1142
+ echo " (dry-run) EXISTS (would skip): $dst_rel"
1143
+ else
1144
+ echo " (dry-run) would COPY: $src_rel -> $dst_rel"
1145
+ fi
1146
+ return
1147
+ fi
1148
+
1149
+ if [[ -e "$dst" ]]; then
1150
+ echo " EXISTS (skipping): $dst_rel"
1151
+ return
1152
+ fi
1153
+
1154
+ mkdir -p "$( dirname "$dst" )"
1155
+ cp "$src" "$dst"
1156
+ echo " COPIED: $src_rel -> $dst_rel"
1157
+ }
1158
+
1159
+ install_docs_templates() {
1160
+ echo ""
1161
+ echo "==> Installing docs/ templates"
1162
+ install_docs_template "templates/docs/BRANCH-PROTECTION.md" "docs/BRANCH-PROTECTION.md"
1163
+ install_docs_template "templates/docs/rotation-log.md" "docs/rotation-log.md"
1164
+ }
1165
+
1166
+ if [[ "$CEREMONY" != "user" ]]; then install_docs_templates; fi # WS4-guard-docs
1167
+
1168
+ # ---- 5e. .github/ templates (PLAN-003 Phase 0 I-3) ----
1169
+
1170
+ install_github_templates() {
1171
+ echo ""
1172
+ echo "==> Installing .github/ templates"
1173
+
1174
+ local codeowners_src="$SOURCE_DIR/templates/.github/CODEOWNERS.template"
1175
+ if [[ ! -f "$codeowners_src" ]]; then
1176
+ echo " SKIP (CODEOWNERS.template missing at $codeowners_src)"
1177
+ elif [[ -n "$GITHUB_OWNER" ]]; then
1178
+ local dst="$TARGET/.github/CODEOWNERS"
1179
+ if [[ "$DRY_RUN" -eq 1 ]]; then
1180
+ if [[ -e "$dst" ]]; then
1181
+ echo " (dry-run) EXISTS (would skip): .github/CODEOWNERS"
1182
+ else
1183
+ echo " (dry-run) would SUBSTITUTE + write: .github/CODEOWNERS (@$GITHUB_OWNER)"
1184
+ fi
1185
+ elif [[ -e "$dst" ]]; then
1186
+ echo " EXISTS (skipping): .github/CODEOWNERS"
1187
+ else
1188
+ mkdir -p "$TARGET/.github"
1189
+ sed "s/{{OWNER_HANDLE}}/$GITHUB_OWNER/g" "$codeowners_src" > "$dst"
1190
+ echo " SUBSTITUTED: .github/CODEOWNERS (@$GITHUB_OWNER)"
1191
+ fi
1192
+ else
1193
+ install_docs_template \
1194
+ "templates/.github/CODEOWNERS.template" \
1195
+ ".github/CODEOWNERS.template"
1196
+ fi
1197
+
1198
+ install_docs_template \
1199
+ "templates/.github/workflows/validate.yml.template" \
1200
+ ".github/workflows/validate.yml.template"
1201
+ install_docs_template \
1202
+ "templates/.github/workflows/benchmarks.yml.template" \
1203
+ ".github/workflows/benchmarks.yml.template"
1204
+ }
1205
+
1206
+ if [[ "$CEREMONY" != "user" ]]; then install_github_templates; fi # WS4-guard-github
1207
+
1208
+ # ---- 6. Settings.json from templates (base + optional stack merge) ----
1209
+
1210
+ echo ""
1211
+ echo "==> Building settings.json"
1212
+
1213
+ SETTINGS_DST="$TARGET/.claude/settings.json"
1214
+ BASE_SRC="$SOURCE_DIR/templates/settings/settings.base.json"
1215
+ if [[ "$CEREMONY" == "user" ]]; then # WS4-ceremony-settings
1216
+ BASE_SRC="$SOURCE_DIR/templates/settings/settings.user.json"
1217
+ fi
1218
+
1219
+ build_settings() {
1220
+ if [[ "$DRY_RUN" -eq 1 ]]; then
1221
+ if [[ -e "$SETTINGS_DST" ]]; then
1222
+ echo " (dry-run) EXISTS (would skip settings.json)"
1223
+ return 0
1224
+ fi
1225
+ if [[ "$STACK" == "none" ]]; then
1226
+ echo " (dry-run) would COPY settings.base.json -> .claude/settings.json (base only)"
1227
+ return 0
1228
+ fi
1229
+ local stack_src="$SOURCE_DIR/templates/settings/settings.stack.$STACK.json"
1230
+ if [[ ! -f "$stack_src" ]]; then
1231
+ echo " (dry-run) stack '$STACK' not found at $stack_src — would fall back to base only"
1232
+ return 0
1233
+ fi
1234
+ if command -v jq >/dev/null 2>&1; then
1235
+ echo " (dry-run) would MERGE settings.base.json + settings.stack.$STACK.json -> .claude/settings.json"
1236
+ else
1237
+ if [[ "$STACK_EXPLICIT" -eq 1 ]]; then
1238
+ echo " (dry-run) FATAL: jq not found and --stack $STACK was explicit — would exit rc=3"
1239
+ else
1240
+ echo " (dry-run) jq not found — would warn + base only"
1241
+ fi
1242
+ fi
1243
+ return 0
1244
+ fi
1245
+
1246
+ if [[ -e "$SETTINGS_DST" ]]; then
1247
+ echo " EXISTS (skipping settings.json — edit manually if you want to re-build)"
1248
+ return 0
1249
+ fi
1250
+ if [[ ! -f "$BASE_SRC" ]]; then
1251
+ echo " ERROR: base settings template missing at $BASE_SRC" >&2
1252
+ return 1
1253
+ fi
1254
+ if [[ "$STACK" == "none" ]]; then
1255
+ cp "$BASE_SRC" "$SETTINGS_DST"
1256
+ echo " COPIED: settings.base.json -> .claude/settings.json (base only, no stack hooks)"
1257
+ return 0
1258
+ fi
1259
+
1260
+ local stack_src="$SOURCE_DIR/templates/settings/settings.stack.$STACK.json"
1261
+ if [[ ! -f "$stack_src" ]]; then
1262
+ echo " WARNING: stack '$STACK' not found at $stack_src — falling back to base only" >&2
1263
+ cp "$BASE_SRC" "$SETTINGS_DST"
1264
+ return 0
1265
+ fi
1266
+
1267
+ if command -v jq >/dev/null 2>&1; then
1268
+ # S4a (PLAN-136 W4): the reducer must also pull the stack's TOP-LEVEL
1269
+ # sandbox keys, not just its hooks — otherwise `--stack sandbox` ships a
1270
+ # settings.json with the hook fragment but NO `.sandbox` /
1271
+ # `.autoAllowBashIfSandboxed`, leaving the OS-sandbox template inert.
1272
+ # Additive `// (base default)` precedence mirrors the hooks lines: the
1273
+ # key only materializes when the stack (or base) actually carries it, so
1274
+ # a base-only install (e.g. --stack node) stays byte-identical.
1275
+ jq -s '
1276
+ .[0] as $base | .[1] as $stack |
1277
+ $base
1278
+ | .hooks.PreToolUse = (($base.hooks.PreToolUse // []) + ($stack.hooks.PreToolUse // []))
1279
+ | .hooks.PostToolUse = (($base.hooks.PostToolUse // []) + ($stack.hooks.PostToolUse // []))
1280
+ | if ($stack.sandbox // $base.sandbox) != null
1281
+ then .sandbox = ($stack.sandbox // $base.sandbox) else . end
1282
+ | if ($stack.autoAllowBashIfSandboxed != null)
1283
+ then .autoAllowBashIfSandboxed = $stack.autoAllowBashIfSandboxed
1284
+ elif ($base.autoAllowBashIfSandboxed != null)
1285
+ then .autoAllowBashIfSandboxed = $base.autoAllowBashIfSandboxed
1286
+ else . end
1287
+ ' "$BASE_SRC" "$stack_src" > "$SETTINGS_DST"
1288
+ echo " MERGED: settings.base.json + settings.stack.$STACK.json -> .claude/settings.json"
1289
+ return 0
1290
+ fi
1291
+
1292
+ # jq missing: P2-2 — hard-fail when --stack was explicit; soft-warn otherwise.
1293
+ if [[ "$STACK_EXPLICIT" -eq 1 ]]; then
1294
+ echo "ERROR: jq is required to merge stack hooks for --stack $STACK, but jq was not found." >&2
1295
+ echo " Install jq (brew install jq / apt-get install jq) and re-run." >&2
1296
+ echo " Aborting install (rc=3) because the --stack flag was explicitly supplied." >&2
1297
+ return 3
1298
+ else
1299
+ echo " WARNING: jq not found — using base only. Install jq and re-run to merge stack hooks." >&2
1300
+ cp "$BASE_SRC" "$SETTINGS_DST"
1301
+ return 0
1302
+ fi
1303
+ }
1304
+
1305
+ # Capture build_settings rc correctly. `if ! cmd` negates $? to 0 when
1306
+ # the command failed, so we stash the original rc inside build_settings
1307
+ # via a dedicated variable. Running under `set -e`, a non-zero return
1308
+ # from a function would abort the shell mid-execution before we can
1309
+ # report; guard with `|| build_rc=$?`.
1310
+ build_rc=0
1311
+ build_settings || build_rc=$?
1312
+ if [[ "$build_rc" -ne 0 ]]; then
1313
+ exit "$build_rc"
1314
+ fi
1315
+
1316
+ # ---- 6b. P2-SEC-H (PLAN-019 Phase 3 Wave 3B): MCP secrets directory ----
1317
+ #
1318
+ # The MCP server authenticates clients via HMAC shared secrets stored at
1319
+ # $TARGET/state/mcp_client_secrets/<client_id>.key. auth.load_secret()
1320
+ # rejects any file whose perms are not exactly 0o600. If the containing
1321
+ # directory is world-traversable (0o755 default umask), it's possible
1322
+ # for a coexisting process to enumerate client_ids. Force 0o700 at
1323
+ # install time and emit a banner. Additionally, ensure target/.gitignore
1324
+ # excludes the secrets dir so keys never end up in VCS.
1325
+ install_mcp_secrets_dir() {
1326
+ local secrets_dir="$TARGET/state/mcp_client_secrets"
1327
+ local gitignore="$TARGET/.gitignore"
1328
+
1329
+ if [[ "$DRY_RUN" -eq 1 ]]; then
1330
+ echo ""
1331
+ echo "==> MCP secrets directory (P2-SEC-H)"
1332
+ if [[ -d "$secrets_dir" ]]; then
1333
+ echo " (dry-run) EXISTS: state/mcp_client_secrets (would chmod 700)"
1334
+ else
1335
+ echo " (dry-run) would CREATE: state/mcp_client_secrets (chmod 700)"
1336
+ fi
1337
+ echo " (dry-run) would ENSURE .gitignore excludes state/mcp_client_secrets/"
1338
+ return 0
1339
+ fi
1340
+
1341
+ echo ""
1342
+ echo "==> MCP secrets directory (P2-SEC-H)"
1343
+ mkdir -p "$secrets_dir"
1344
+ chmod 700 "$secrets_dir"
1345
+ echo " ENSURED: $secrets_dir (mode 0700)"
1346
+ echo ""
1347
+ echo " NOTE: this directory stores HMAC shared secrets for MCP clients."
1348
+ echo " File perms MUST be 0600; auth.load_secret() fail-closes otherwise."
1349
+ echo " DO NOT commit its contents to VCS."
1350
+
1351
+ # .gitignore entry — additive, idempotent.
1352
+ local ignore_line="state/mcp_client_secrets/"
1353
+ if [[ -f "$gitignore" ]]; then
1354
+ if ! grep -Fxq "$ignore_line" "$gitignore" 2>/dev/null; then
1355
+ {
1356
+ echo ""
1357
+ echo "# PLAN-019 P2-SEC-H: MCP shared-secret store (never commit)"
1358
+ echo "$ignore_line"
1359
+ } >> "$gitignore"
1360
+ echo " APPENDED to .gitignore: $ignore_line"
1361
+ else
1362
+ echo " .gitignore already excludes $ignore_line"
1363
+ fi
1364
+ else
1365
+ {
1366
+ echo "# PLAN-019 P2-SEC-H: MCP shared-secret store (never commit)"
1367
+ echo "$ignore_line"
1368
+ } > "$gitignore"
1369
+ echo " CREATED .gitignore with: $ignore_line"
1370
+ fi
1371
+ }
1372
+
1373
+ if [[ "$CEREMONY" != "user" ]]; then install_mcp_secrets_dir; fi # WS4-guard-mcp
1374
+
1375
+ # ---- 7. Project-local templates (CLAUDE.md, MEMORY.md, .mcp.json — never overwrite) ----
1376
+
1377
+ echo ""
1378
+ echo "==> Installing project templates"
1379
+ if [[ "$CEREMONY" != "user" ]]; then # WS4-guard-projtmpl
1380
+ install_template "templates/CLAUDE.md" "CLAUDE.md"
1381
+ install_template "templates/MEMORY.md" "MEMORY.md"
1382
+ # PLAN-135 W1 S5-lite: project-scope MCP registration for the Codex
1383
+ # pair-rail (the 'codex' server backs the mcp__codex__codex |
1384
+ # mcp__codex__codex-reply matchers in settings.json). install_template
1385
+ # is idempotent EXISTS->SKIP — an adopter's own .mcp.json is never
1386
+ # clobbered. Credentials via ${ENV} expansion only; no secrets on disk.
1387
+ # Root-level file => stays inside the WS4-guard-projtmpl maintainer
1388
+ # guard (user ceremony writes .claude/ only).
1389
+ install_template "templates/.mcp.json" ".mcp.json"
1390
+ fi # WS4-guard-projtmpl
1391
+
1392
+ # ---- 8. Drop a pointer to PROTOCOL.md (DevOps-P1-4: relative, not absolute) ----
1393
+
1394
+ install_protocol_pointer() {
1395
+ if [[ -e "$TARGET/PROTOCOL.md" ]]; then
1396
+ return 0
1397
+ fi
1398
+
1399
+ # Compute a relative path from $TARGET to $SOURCE_DIR when possible.
1400
+ # If the framework repo lives outside the target repo (common case),
1401
+ # we fall back to {{PROTOCOL_SOURCE}} which the user substitutes
1402
+ # manually. Absolute paths are NOT hardcoded — they break portability
1403
+ # across dev machines and CI runners.
1404
+ #
1405
+ # Relative-path heuristic: if $SOURCE_DIR starts with $TARGET, the
1406
+ # framework was copied INTO the target — use a relative pointer. In
1407
+ # ALL other cases (e.g. adopter clones framework elsewhere), we emit
1408
+ # the user-editable {{PROTOCOL_SOURCE}} marker and document next steps.
1409
+ local pointer_body
1410
+ case "$SOURCE_DIR" in
1411
+ "$TARGET"/*)
1412
+ local rel="${SOURCE_DIR#$TARGET/}"
1413
+ pointer_body="The full CEO orchestration protocol lives at:
1414
+ ./${rel}/PROTOCOL.md
1415
+
1416
+ To pull updates:
1417
+ ( cd ./${rel} && git pull )
1418
+ ./${rel}/scripts/upgrade.sh . --profile $PROFILE --stack $STACK"
1419
+ ;;
1420
+ *)
1421
+ pointer_body="The full CEO orchestration protocol lives at:
1422
+ {{PROTOCOL_SOURCE}}/PROTOCOL.md
1423
+
1424
+ Edit {{PROTOCOL_SOURCE}} to point at your ceo-orchestration checkout
1425
+ (e.g. ../ceo-orchestration or \$HOME/src/ceo-orchestration).
1426
+
1427
+ To pull updates:
1428
+ ( cd {{PROTOCOL_SOURCE}} && git pull )
1429
+ {{PROTOCOL_SOURCE}}/scripts/upgrade.sh $TARGET --profile $PROFILE --stack $STACK"
1430
+ ;;
1431
+ esac
1432
+
1433
+ if [[ "$DRY_RUN" -eq 1 ]]; then
1434
+ echo " (dry-run) would CREATE: PROTOCOL.md (pointer)"
1435
+ return 0
1436
+ fi
1437
+
1438
+ cat > "$TARGET/PROTOCOL.md" <<EOF
1439
+ # Protocol reference
1440
+
1441
+ $pointer_body
1442
+ EOF
1443
+ echo " CREATED: PROTOCOL.md (pointer)"
1444
+ }
1445
+
1446
+ if [[ "$CEREMONY" != "user" ]]; then install_protocol_pointer; fi # WS4-guard-proto
1447
+
1448
+ # ----------------------------------------------------------------------
1449
+ # P1-CR-3 / VP-F1: placeholder substitution pass
1450
+ # ----------------------------------------------------------------------
1451
+ # Iterate over a deterministic list of placeholder files (the ones
1452
+ # templates/ writes out) and apply `sed -i` substitutions for every
1453
+ # PH_* variable that is non-empty. Anything left as `{{...}}` after the
1454
+ # pass is reported with a stderr warning.
1455
+ #
1456
+ # We restrict the pass to files install.sh actually placed (the
1457
+ # templates/* files) to avoid touching user-authored content. If
1458
+ # CLAUDE.md / MEMORY.md already existed at target, we leave them alone
1459
+ # (install.sh never overwrites them).
1460
+
1461
+ # Portable sed -i for GNU + BSD (macOS): write to .tmp and mv.
1462
+ portable_sed_inplace() {
1463
+ # $1 = sed script, $2 = file
1464
+ local script="$1" file="$2"
1465
+ local tmp="${file}.ceo-sed-tmp"
1466
+ sed "$script" "$file" > "$tmp" && mv "$tmp" "$file"
1467
+ }
1468
+
1469
+ # Build the sed script iteratively. Each non-empty placeholder adds an
1470
+ # expression. We use `|` as the delimiter so slashes in values (paths)
1471
+ # don't break. Values with `|` are escaped.
1472
+ build_sed_script() {
1473
+ local script=""
1474
+ _add_sub() {
1475
+ local key="$1" val="$2"
1476
+ if [[ -n "$val" ]]; then
1477
+ # Escape | & \ in the replacement
1478
+ local esc
1479
+ esc="$(printf '%s' "$val" | sed 's/[|&\\]/\\&/g')"
1480
+ script="${script}s|{{${key}}}|${esc}|g;"
1481
+ fi
1482
+ }
1483
+ _add_sub "OWNER_NAME" "$PH_OWNER_NAME"
1484
+ _add_sub "OWNER_HANDLE" "$GITHUB_OWNER"
1485
+ _add_sub "PROJECT_NAME" "$PH_PROJECT_NAME"
1486
+ _add_sub "PROJECT_PATH" "$PH_PROJECT_PATH"
1487
+ _add_sub "STACK" "$PH_STACK"
1488
+ _add_sub "PROTOCOL_SOURCE" "$PH_PROTOCOL_SOURCE"
1489
+ _add_sub "DEPLOY_COMMAND" "$PH_DEPLOY_COMMAND"
1490
+ _add_sub "DEPLOY_PLATFORM" "$PH_DEPLOY_PLATFORM"
1491
+ _add_sub "DEPLOY_TARGET" "$PH_DEPLOY_TARGET"
1492
+ _add_sub "RUNTIME_NOTES" "$PH_RUNTIME_NOTES"
1493
+ _add_sub "DATABASE" "$PH_DATABASE"
1494
+ _add_sub "N_BACKEND" "$PH_N_BACKEND"
1495
+ _add_sub "N_FRONTEND" "$PH_N_FRONTEND"
1496
+ _add_sub "FRONTEND_STACK" "$PH_FRONTEND_STACK"
1497
+ _add_sub "FRONTEND_PATH" "$PH_FRONTEND_PATH"
1498
+ _add_sub "FRONTEND_REPO_PATH" "$PH_FRONTEND_REPO_PATH"
1499
+ _add_sub "UI_LIBRARY" "$PH_UI_LIBRARY"
1500
+ _add_sub "STATE_MANAGEMENT" "$PH_STATE_MANAGEMENT"
1501
+ _add_sub "REALTIME_TRANSPORT" "$PH_REALTIME_TRANSPORT"
1502
+ _add_sub "CHARTING_LIBRARY" "$PH_CHARTING_LIBRARY"
1503
+ _add_sub "AUTH_PROVIDER" "$PH_AUTH_PROVIDER"
1504
+ _add_sub "I18N_FRAMEWORK" "$PH_I18N_FRAMEWORK"
1505
+ _add_sub "TEST_FRAMEWORK" "$PH_TEST_FRAMEWORK"
1506
+ _add_sub "TEST_TOOL" "$PH_TEST_TOOL"
1507
+ _add_sub "TEST_COUNT" "$PH_TEST_COUNT"
1508
+ _add_sub "LINT_TOOL" "$PH_LINT_TOOL"
1509
+ _add_sub "CI_TOOL" "$PH_CI_TOOL"
1510
+ _add_sub "APP_NAME" "$PH_APP_NAME"
1511
+ _add_sub "SOURCE_FILE_COUNT" "$PH_SOURCE_FILE_COUNT"
1512
+ _add_sub "LINE_COUNT" "$PH_LINE_COUNT"
1513
+ _add_sub "LINES" "$PH_LINES"
1514
+ _add_sub "FILE_COUNT" "$PH_FILE_COUNT"
1515
+ _add_sub "PAGE_COUNT" "$PH_PAGE_COUNT"
1516
+ _add_sub "COMPONENT_COUNT" "$PH_COMPONENT_COUNT"
1517
+ _add_sub "HOOK_COUNT" "$PH_HOOK_COUNT"
1518
+ _add_sub "BUNDLE_SIZE" "$PH_BUNDLE_SIZE"
1519
+ _add_sub "CITY" "$PH_CITY"
1520
+ _add_sub "COUNTRY" "$PH_COUNTRY"
1521
+ _add_sub "DOMAIN" "$PH_DOMAIN"
1522
+ _add_sub "FOUNDER_NAME" "${PH_FOUNDER_NAME:-$PH_OWNER_NAME}"
1523
+ _add_sub "LEGAL_ID" "$PH_LEGAL_ID"
1524
+ _add_sub "PRODUCTION_URL" "$PH_PRODUCTION_URL"
1525
+ printf '%s' "$script"
1526
+ }
1527
+
1528
+ apply_placeholder_substitutions() {
1529
+ local sed_script
1530
+ sed_script="$(build_sed_script)"
1531
+
1532
+ if [[ -z "$sed_script" ]]; then
1533
+ echo ""
1534
+ echo "==> Placeholder substitution: no values supplied (use --owner / --project / env vars)"
1535
+ echo " Template files ship as-is. Edit them manually or re-run install.sh with flags."
1536
+ return 0
1537
+ fi
1538
+
1539
+ echo ""
1540
+ echo "==> Applying placeholder substitutions"
1541
+
1542
+ # Files we are allowed to rewrite — strictly the template-sourced files
1543
+ # that install.sh just placed. We check existence first.
1544
+ #
1545
+ # We intentionally do NOT touch:
1546
+ # - .claude/settings.json (user-edited hook registry)
1547
+ # - .claude/plans/PLAN-*.md (user's own plans)
1548
+ # - .claude/adr/ADR-*.md (user's own ADRs)
1549
+ # - .claude/scripts/* (executable code; placeholders
1550
+ # inside .py docstrings are instructional, not install-time)
1551
+ # - .claude/hooks/* (same reason)
1552
+ # WS4-explicit-files-partition: maintainer rewrites root + docs/ +
1553
+ # .claude/ template files; user ceremony rewrites ONLY .claude/ files so
1554
+ # a real adopter repo's own root/docs files are never touched.
1555
+ local explicit_files=(
1556
+ "$TARGET/.claude/team.md"
1557
+ "$TARGET/.claude/frontend-team.md"
1558
+ "$TARGET/.claude/agent-metrics.md"
1559
+ )
1560
+ if [[ "$CEREMONY" != "user" ]]; then
1561
+ explicit_files=(
1562
+ "$TARGET/CLAUDE.md"
1563
+ "$TARGET/MEMORY.md"
1564
+ "$TARGET/PROTOCOL.md"
1565
+ "$TARGET/docs/BRANCH-PROTECTION.md"
1566
+ "$TARGET/docs/rotation-log.md"
1567
+ "$TARGET/.claude/team.md"
1568
+ "$TARGET/.claude/frontend-team.md"
1569
+ "$TARGET/.claude/agent-metrics.md"
1570
+ )
1571
+ fi
1572
+
1573
+ local f
1574
+ for f in "${explicit_files[@]}"; do
1575
+ [[ -f "$f" ]] || continue
1576
+ if [[ "$DRY_RUN" -eq 1 ]]; then
1577
+ echo " (dry-run) would SUBSTITUTE placeholders in: ${f#$TARGET/}"
1578
+ continue
1579
+ fi
1580
+ portable_sed_inplace "$sed_script" "$f"
1581
+ echo " SUBSTITUTED: ${f#$TARGET/}"
1582
+ done
1583
+
1584
+ # Skills/**/SKILL*.md and skills/**/team-personas.md + pitfalls.yaml —
1585
+ # these are canonical content that ships {{PROJECT_NAME}}, {{OWNER_NAME}},
1586
+ # {{DEPLOY_COMMAND}}, {{FRONTEND_REPO_PATH}}, {{APP_NAME}},
1587
+ # {{PRODUCTION_URL}}, etc. as installer-time substitutions (not
1588
+ # instructional placeholders). Recurse into the skills tree.
1589
+ local skills_root="$TARGET/.claude/skills"
1590
+ if [[ -d "$skills_root" ]]; then
1591
+ while IFS= read -r f; do
1592
+ [[ -n "$f" && -f "$f" ]] || continue
1593
+ if [[ "$DRY_RUN" -eq 1 ]]; then
1594
+ echo " (dry-run) would SUBSTITUTE placeholders in: ${f#$TARGET/}"
1595
+ continue
1596
+ fi
1597
+ portable_sed_inplace "$sed_script" "$f"
1598
+ echo " SUBSTITUTED: ${f#$TARGET/}"
1599
+ done < <(find "$skills_root" \
1600
+ \( -name 'SKILL.md' -o -name 'SKILL-*.md' \
1601
+ -o -name 'team-personas.md' -o -name 'pitfalls.yaml' \) \
1602
+ -type f 2>/dev/null)
1603
+ fi
1604
+ }
1605
+
1606
+ apply_placeholder_substitutions
1607
+
1608
+ # ----------------------------------------------------------------------
1609
+ # Done — mark success so trap doesn't roll back, then print summary
1610
+ # ----------------------------------------------------------------------
1611
+
1612
+
1613
+ # ----------------------------------------------------------------------
1614
+ # audit-v2 C4-P0-03: post-install placeholder validator
1615
+ # ----------------------------------------------------------------------
1616
+ # Scan installed `.py` and `.md` files for unrendered {{X}} patterns.
1617
+ # Default: warn + continue. --strict-placeholders (or
1618
+ # CEO_INSTALL_STRICT_PH=1) → exit 4 if any found.
1619
+ # ----------------------------------------------------------------------
1620
+
1621
+ validate_no_unrendered_placeholders() {
1622
+ local strict="${STRICT_PLACEHOLDERS:-${CEO_INSTALL_STRICT_PH:-0}}"
1623
+ local found=0
1624
+ local report_file
1625
+ report_file="$(mktemp -t ceo-install-ph-report-XXXXXX)"
1626
+
1627
+ echo ""
1628
+ echo "==> Scanning for unrendered placeholders ({{X}} patterns)"
1629
+
1630
+ local scan_roots=(
1631
+ "$TARGET/CLAUDE.md"
1632
+ "$TARGET/PROTOCOL.md"
1633
+ "$TARGET/MEMORY.md"
1634
+ "$TARGET/.claude/team.md"
1635
+ "$TARGET/.claude/frontend-team.md"
1636
+ "$TARGET/.claude/agent-metrics.md"
1637
+ "$TARGET/.claude/skills"
1638
+ "$TARGET/.claude/scripts"
1639
+ "$TARGET/.claude/hooks"
1640
+ "$TARGET/docs"
1641
+ )
1642
+
1643
+ local root
1644
+ for root in "${scan_roots[@]}"; do
1645
+ [[ -e "$root" ]] || continue
1646
+ if [[ -d "$root" ]]; then
1647
+ while IFS= read -r f; do
1648
+ [[ -n "$f" && -f "$f" ]] || continue
1649
+ if grep -E -n '\{\{[A-Z_]+\}\}' "$f" >/dev/null 2>&1; then
1650
+ grep -E -Hn '\{\{[A-Z_]+\}\}' "$f" >> "$report_file"
1651
+ fi
1652
+ done < <(find "$root" \( -name '*.md' -o -name '*.py' \) -type f 2>/dev/null)
1653
+ elif [[ -f "$root" ]]; then
1654
+ if grep -E -n '\{\{[A-Z_]+\}\}' "$root" >/dev/null 2>&1; then
1655
+ grep -E -Hn '\{\{[A-Z_]+\}\}' "$root" >> "$report_file"
1656
+ fi
1657
+ fi
1658
+ done
1659
+
1660
+ if [[ -s "$report_file" ]]; then
1661
+ found=$(wc -l < "$report_file" | tr -d ' ')
1662
+ echo ""
1663
+ echo " UNRENDERED placeholders found ($found occurrences):"
1664
+ head -25 "$report_file" | sed 's|^| |'
1665
+ if [[ "$found" -gt 25 ]]; then
1666
+ echo " ... (and $((found - 25)) more — see $report_file)"
1667
+ fi
1668
+ echo ""
1669
+ if [[ "$strict" == "1" ]]; then
1670
+ echo " STRICT mode (--strict-placeholders) — failing install." >&2
1671
+ rm -f "$report_file"
1672
+ exit 4
1673
+ else
1674
+ echo " WARN: install continues. Re-run with --strict-placeholders" >&2
1675
+ echo " to fail-closed on unrendered placeholders." >&2
1676
+ fi
1677
+ else
1678
+ echo " OK: no unrendered placeholders detected."
1679
+ fi
1680
+
1681
+ rm -f "$report_file"
1682
+ }
1683
+
1684
+ validate_no_unrendered_placeholders
1685
+
1686
+ # ----------------------------------------------------------------------
1687
+ # Session 75 Codex Finding 5 closure: --verify post-install integrity.
1688
+ # Re-checksums installed skill SHAs against the source manifest if one
1689
+ # is shipped at .claude/skill-manifest.sha256. Advisory-only when the
1690
+ # manifest is absent (don't break adopters who didn't ship it).
1691
+ # Sigstore backend is OUT OF SCOPE per Owner D2 lock.
1692
+ # ----------------------------------------------------------------------
1693
+ if [[ "${VERIFY:-0}" -eq 1 ]]; then
1694
+ echo ""
1695
+ echo "==> Verifying installed skill checksums (--verify)"
1696
+ manifest="$TARGET/.claude/skill-manifest.sha256"
1697
+ if [[ ! -f "$manifest" ]]; then
1698
+ echo " NOTE: no skill-manifest.sha256 present — skipping verify"
1699
+ echo " (advisory only; manifest is shipped by tarball releases)"
1700
+ else
1701
+ # PLAN-138 Wave C (ADR-155): portable verify via _hash_lib.sh
1702
+ # (shasum||sha256sum probe) instead of a bare `shasum -a 256 -c` — Linux
1703
+ # hosts may ship only sha256sum. Falls back to the legacy bare form if the
1704
+ # helper was not sourced (partial checkout), preserving today's behavior.
1705
+ if ( cd "$TARGET" && { if command -v _hash_verify_c >/dev/null 2>&1; then _hash_verify_c "$manifest"; else shasum -a 256 -c "$manifest"; fi; } >/dev/null 2>&1 ); then
1706
+ echo " OK: all installed skills match source manifest"
1707
+ else
1708
+ echo " ERROR: skill checksums do not match manifest" >&2
1709
+ ( cd "$TARGET" && { if command -v _hash_verify_c >/dev/null 2>&1; then _hash_verify_c "$manifest"; else shasum -a 256 -c "$manifest"; fi; } 2>&1 | grep -v ': OK$' | head -20 ) >&2
1710
+ exit 5
1711
+ fi
1712
+ fi
1713
+ fi
1714
+
1715
+ # WS4-postinstall-guard: user ceremony must not CREATE or MODIFY anything
1716
+ # outside $TARGET/.claude/. Pre-existing adopter files (package.json,
1717
+ # README.md, the adopter's own CLAUDE.md, docs/, ...) must be byte-stable.
1718
+ if [[ "$CEREMONY" == "user" ]]; then
1719
+ _ws4_bad=""
1720
+ for _ws4_e in "$TARGET"/* "$TARGET"/.[!.]* "$TARGET"/..?*; do
1721
+ [[ -e "$_ws4_e" ]] || continue
1722
+ _ws4_b="$(basename "$_ws4_e")"
1723
+ case "$_ws4_b" in
1724
+ .claude|.git) continue ;;
1725
+ esac
1726
+ # Look up this entry in the pre-snapshot (match on leading "name<TAB>").
1727
+ _ws4_pre=""
1728
+ if [[ -f "$_WS4_PRESNAP" ]]; then
1729
+ _ws4_pre="$(grep -F -- "$(printf '%s\t' "$_ws4_b")" "$_WS4_PRESNAP" 2>/dev/null | head -1 || true)"
1730
+ fi
1731
+ if [[ -z "$_ws4_pre" ]]; then
1732
+ # No pre-snapshot row => this entry was CREATED by install.
1733
+ _ws4_bad="$_ws4_bad created:$_ws4_b"
1734
+ continue
1735
+ fi
1736
+ # Pre-existed. If it is a file, compare size + mtime.
1737
+ if [[ -f "$_ws4_e" ]]; then
1738
+ _ws4_now_sz="$(wc -c < "$_ws4_e" 2>/dev/null | tr -d ' ')"
1739
+ _ws4_now_mt="$(detect_mtime "$_ws4_e" 2>/dev/null || echo 0)"
1740
+ _ws4_pre_sz="$(printf '%s' "$_ws4_pre" | cut -f2)"
1741
+ _ws4_pre_mt="$(printf '%s' "$_ws4_pre" | cut -f3)"
1742
+ if [[ "$_ws4_now_sz" != "$_ws4_pre_sz" || "$_ws4_now_mt" != "$_ws4_pre_mt" ]]; then
1743
+ _ws4_bad="$_ws4_bad modified:$_ws4_b"
1744
+ fi
1745
+ fi
1746
+ done
1747
+ if [[ -n "$_ws4_bad" ]]; then
1748
+ echo "ERROR: --ceremony user touched paths outside .claude/:$_ws4_bad" >&2
1749
+ rm -f "$_WS4_PRESNAP"
1750
+ exit 3
1751
+ fi
1752
+ rm -f "$_WS4_PRESNAP"
1753
+ fi
1754
+
1755
+ # ----------------------------------------------------------------------
1756
+ # PLAN-138 Wave C (ADR-155) — write the baseline SHA-256 manifest.
1757
+ #
1758
+ # Records, per framework-owned file, a baseline digest so a later upgrade can
1759
+ # tell "the framework changed this" apart from "the adopter changed this" and
1760
+ # PRESERVE/REFUSE customizations instead of clobbering them (incl. the root
1761
+ # PROTOCOL.md — the verified S238 driver). The enumeration is the SINGLE shared
1762
+ # set from _framework_manifest_set.sh, so the manifest writer (here) and the
1763
+ # upgrade classifier walk an identical list.
1764
+ #
1765
+ # Manifest grammar (two record kinds):
1766
+ # <64hex> <relpath> — content hash of a copied file
1767
+ # LINK <relpath> <target> — a --mode link symlink (content == source,
1768
+ # so a content hash is meaningless; the
1769
+ # upgrade classifier short-circuits LINK)
1770
+ #
1771
+ # Written to $TARGET/.claude/.install-manifest.sha256 (distinct from the
1772
+ # release skill-manifest.sha256). EXCLUDES the manifest itself + .claude.bak/.
1773
+ # Fail-open: any missing helper / unreadable file is skipped with a NOTE; the
1774
+ # install never fails because the manifest could not be fully written.
1775
+ # ----------------------------------------------------------------------
1776
+ write_install_manifest() {
1777
+ # Guarded by the caller for DRY_RUN; defensive re-check here.
1778
+ [[ "${DRY_RUN:-0}" -eq 0 ]] || return 0
1779
+
1780
+ if ! command -v _write_baseline_manifest >/dev/null 2>&1; then
1781
+ echo " NOTE: baseline manifest skipped — generator helper not sourced" >&2
1782
+ return 0
1783
+ fi
1784
+
1785
+ local manifest="$TARGET/.claude/.install-manifest.sha256"
1786
+ echo ""
1787
+ echo "==> Writing install baseline manifest (.claude/.install-manifest.sha256)"
1788
+
1789
+ # Profile-aware enumeration rooted at the installed target; the SINGLE shared
1790
+ # generator in _framework_manifest_set.sh does the walk + hashing + LINK
1791
+ # records (the SAME generator upgrade.sh calls after a successful upgrade).
1792
+ export FMS_ROOT="$TARGET"
1793
+ export FMS_PROFILE_PARTS="${PROFILE_PARTS[*]}"
1794
+ export FMS_MODE="$MODE"
1795
+ _write_baseline_manifest "$manifest"
1796
+ unset FMS_ROOT FMS_PROFILE_PARTS FMS_MODE
1797
+ return 0
1798
+ }
1799
+
1800
+ if [[ "$DRY_RUN" -eq 0 ]]; then
1801
+ write_install_manifest
1802
+ fi
1803
+ INSTALL_SUCCEEDED=1
1804
+
1805
+ # ----------------------------------------------------------------------
1806
+ # PLAN-097 Wave C.2 — LARGE-profile RAG sidecar install prompt
1807
+ # ----------------------------------------------------------------------
1808
+ # After core install succeeds, detect target repo size class. If LARGE
1809
+ # (>= 200k LoC) AND interactive AND C2 sidecar not already installed,
1810
+ # offer the optional Tier-C RAG sidecar install.
1811
+ #
1812
+ # Skipped silently when:
1813
+ # - not a TTY (non-interactive)
1814
+ # - CEO_RAG_INSTALL_PROMPT=0 explicitly set
1815
+ # - $TARGET/.claude/rag/.install.lock already present (already installed)
1816
+
1817
+ if [[ "${DRY_RUN:-0}" -ne 1 ]] && [[ -t 0 ]] && [[ "${CEO_RAG_INSTALL_PROMPT:-1}" != "0" ]]; then
1818
+ RAG_LOCK="$TARGET/.claude/rag/.install.lock"
1819
+ if [[ ! -f "$RAG_LOCK" ]]; then
1820
+ DETECT_SCRIPT="$TARGET/.claude/scripts/detect-repo-profile.py"
1821
+ if [[ -f "$DETECT_SCRIPT" ]]; then
1822
+ SIZE_JSON="$(python3 "$DETECT_SCRIPT" detect --target "$TARGET" --json 2>/dev/null || true)"
1823
+ SIZE_CLASS="$(printf '%s' "$SIZE_JSON" | python3 -c "import sys,json; d=json.loads(sys.stdin.read() or '{}'); print(d.get('size_class','SMALL'))" 2>/dev/null || echo SMALL)"
1824
+ if [[ "$SIZE_CLASS" = "LARGE" ]]; then
1825
+ echo ""
1826
+ echo "==> LARGE repo detected (>= 200k LoC)."
1827
+ echo " The optional RAG sidecar (Tier-C — Owner consent required) can route"
1828
+ echo " retrieval queries to a local LightRAG instance."
1829
+ echo ""
1830
+ echo " Install footprint: ~90 MiB model + 500 MiB-1 GiB disk + 1-2 GiB RAM peak"
1831
+ echo " See .claude/sidecars/c2-vector-memory/lightrag-mvp/README.md"
1832
+ echo ""
1833
+ printf " Install RAG sidecar now? [y/N] (10s timeout) "
1834
+ REPLY=""
1835
+ if read -r -t 10 REPLY 2>/dev/null; then :; else REPLY="N"; fi
1836
+ case "${REPLY}" in
1837
+ [Yy]|[Yy][Ee][Ss])
1838
+ echo "==> Invoking sidecar installer..."
1839
+ (cd "$TARGET" && bash .claude/rag/install-sidecar.sh) || {
1840
+ echo "==> Sidecar install failed (exit $?). Retry manually:" >&2
1841
+ echo " bash $TARGET/.claude/rag/install-sidecar.sh" >&2
1842
+ }
1843
+ ;;
1844
+ *)
1845
+ echo "==> Skipped sidecar install. Routing uses CAG fallback when LARGE."
1846
+ ;;
1847
+ esac
1848
+ fi
1849
+ fi
1850
+ fi
1851
+ fi
1852
+
1853
+
1854
+ if [[ "$DRY_RUN" -eq 1 ]]; then
1855
+ echo ""
1856
+ echo "==> Dry-run complete. No files were modified."
1857
+ echo " To install for real: drop --dry-run and re-run."
1858
+ exit 0
1859
+ fi
1860
+
1861
+ echo ""
1862
+ echo "==> Install complete."
1863
+ echo ""
1864
+ echo "==> Placeholders remaining (fill in manually):"
1865
+ echo ""
1866
+
1867
+ # Grep for unsubstituted placeholders. Count + list files, then list
1868
+ # the unique placeholder names per file. Emit a top-level warning if
1869
+ # any remain (not an error — adopter may want to fill in gradually).
1870
+ PLACEHOLDER_COUNT=0
1871
+ PLACEHOLDER_ROOTS=(
1872
+ "$TARGET/.claude"
1873
+ "$TARGET/CLAUDE.md"
1874
+ "$TARGET/MEMORY.md"
1875
+ "$TARGET/PROTOCOL.md"
1876
+ "$TARGET/docs"
1877
+ )
1878
+ REMAINING_FILES=""
1879
+ for root in "${PLACEHOLDER_ROOTS[@]}"; do
1880
+ [[ -e "$root" ]] || continue
1881
+ # Portable approach: use grep -l; harmless if no matches.
1882
+ while IFS= read -r f; do
1883
+ [[ -n "$f" ]] || continue
1884
+ REMAINING_FILES="${REMAINING_FILES}${f}"$'\n'
1885
+ PLACEHOLDER_COUNT=$((PLACEHOLDER_COUNT + 1))
1886
+ done < <(grep -RIl '{{[A-Z_][A-Z0-9_]*}}' "$root" 2>/dev/null || true)
1887
+ done
1888
+
1889
+ if [[ $PLACEHOLDER_COUNT -eq 0 ]]; then
1890
+ echo " (none — all substituted)"
1891
+ else
1892
+ printf '%s' "$REMAINING_FILES" | sort -u | while IFS= read -r f; do
1893
+ [[ -n "$f" ]] || continue
1894
+ echo " $f"
1895
+ grep -ho '{{[A-Z_][A-Z0-9_]*}}' "$f" 2>/dev/null | sort -u | sed 's/^/ /'
1896
+ done
1897
+ echo ""
1898
+ echo " WARNING: $PLACEHOLDER_COUNT file(s) still contain {{PLACEHOLDER}} markers." >&2
1899
+ echo " Re-run install.sh with more flags (e.g. --deploy-command ..)" >&2
1900
+ echo " or edit the files manually." >&2
1901
+ fi
1902
+
1903
+ echo ""
1904
+ echo "==> Next steps:"
1905
+ echo " 1. Edit CLAUDE.md to fill in your project context."
1906
+ echo " 2. Edit .claude/team.md to add your personas (or start with archetypes)."
1907
+ echo " 3. Start a Claude Code session and ask: 'Activate the CEO protocol and load the team.'"
1908
+ # PLAN-135 W5 O12: close the install ceremony with a harness-native sanity
1909
+ # check. /doctor validates settings.json / hooks / MCP wiring from inside the
1910
+ # real Claude Code harness — it catches a malformed settings file BEFORE the
1911
+ # framework's own gates run against it (the S217/S228 silent-hook class, where
1912
+ # a settings-skip or exec-bit left a governance rail silently disengaged).
1913
+ # Advisory + harness-side; install.sh prints it, it does not run claude.
1914
+ echo " 4. Run \`claude\` and type \`/doctor\` once: confirm settings.json parses,"
1915
+ echo " hooks are registered, and no rail is silently skipped before you rely"
1916
+ echo " on the governance gates (catches malformed settings the framework"
1917
+ echo " would otherwise fail-open past). Then optionally run"
1918
+ echo " \`python3 .claude/scripts/ceo-info.py --check --hooks-diff\` for the"
1919
+ echo " framework-side mirror (registered-vs-effective hook count)."
1920
+ if has_profile "fintech"; then
1921
+ echo ""
1922
+ echo "==> Fintech domain installed:"
1923
+ echo " - 12 fintech skills in .claude/skills/domains/fintech/skills/"
1924
+ echo " - FIN-*/EX-* pitfalls in .claude/skills/domains/fintech/pitfalls.yaml"
1925
+ echo " - Reference personas in .claude/skills/domains/fintech/team-personas.md"
1926
+ echo " - Additional commands in .claude/skills/domains/fintech/commands/"
1927
+ fi
1928
+
1929
+ # Release workflow (.github/workflows/release.yml) replaces the
1930
+ # PLACEHOLDER_RELEASE_FILL value below with the sha256 of everything
1931
+ # above this trailer line at tag cut. DO NOT EDIT MANUALLY.
1932
+ # CEO-INSTALL-SHA256: 4fb1dfe824a9d04b106aabcd410bfd9f26e5df41f7082740192ea755e4f7d53a