@soleur/opencode 0.0.0-stage → 3.354.2

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 (832) hide show
  1. package/.claude-plugin/agents.manifest.json +476 -0
  2. package/.claude-plugin/plugin.json +42 -0
  3. package/README.md +44 -2
  4. package/agents/community/.gitkeep +0 -0
  5. package/agents/engineering/cto.md +87 -0
  6. package/agents/engineering/design/ddd-architect.md +95 -0
  7. package/agents/engineering/discovery/agent-finder.md +214 -0
  8. package/agents/engineering/discovery/functional-discovery.md +182 -0
  9. package/agents/engineering/infra/infra-security.md +151 -0
  10. package/agents/engineering/infra/platform-strategist.md +109 -0
  11. package/agents/engineering/infra/terraform-architect.md +171 -0
  12. package/agents/engineering/prompt-engineer.md +37 -0
  13. package/agents/engineering/research/best-practices-researcher.md +115 -0
  14. package/agents/engineering/research/framework-docs-researcher.md +93 -0
  15. package/agents/engineering/research/git-history-analyzer.md +53 -0
  16. package/agents/engineering/research/learnings-researcher.md +285 -0
  17. package/agents/engineering/research/repo-research-analyst.md +118 -0
  18. package/agents/engineering/review/agent-native-reviewer.md +279 -0
  19. package/agents/engineering/review/architecture-strategist.md +61 -0
  20. package/agents/engineering/review/code-quality-analyst.md +92 -0
  21. package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
  22. package/agents/engineering/review/data-integrity-guardian.md +82 -0
  23. package/agents/engineering/review/data-migration-expert.md +98 -0
  24. package/agents/engineering/review/deployment-verification-agent.md +183 -0
  25. package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
  26. package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
  27. package/agents/engineering/review/legacy-code-expert.md +55 -0
  28. package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
  29. package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
  30. package/agents/engineering/review/performance-oracle.md +130 -0
  31. package/agents/engineering/review/security-sentinel.md +167 -0
  32. package/agents/engineering/review/semgrep-sast.md +36 -0
  33. package/agents/engineering/review/test-design-reviewer.md +150 -0
  34. package/agents/engineering/review/user-impact-reviewer.md +70 -0
  35. package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
  36. package/agents/finance/budget-analyst.md +29 -0
  37. package/agents/finance/cfo.md +44 -0
  38. package/agents/finance/financial-reporter.md +30 -0
  39. package/agents/finance/revenue-analyst.md +30 -0
  40. package/agents/legal/clo.md +115 -0
  41. package/agents/legal/legal-compliance-auditor.md +110 -0
  42. package/agents/legal/legal-document-generator.md +134 -0
  43. package/agents/marketing/analytics-analyst.md +25 -0
  44. package/agents/marketing/brand-architect.md +181 -0
  45. package/agents/marketing/cmo.md +76 -0
  46. package/agents/marketing/conversion-optimizer.md +19 -0
  47. package/agents/marketing/copywriter.md +20 -0
  48. package/agents/marketing/fact-checker.md +70 -0
  49. package/agents/marketing/growth-strategist.md +145 -0
  50. package/agents/marketing/paid-media-strategist.md +28 -0
  51. package/agents/marketing/pricing-strategist.md +17 -0
  52. package/agents/marketing/programmatic-seo-specialist.md +25 -0
  53. package/agents/marketing/retention-strategist.md +23 -0
  54. package/agents/marketing/seo-aeo-analyst.md +164 -0
  55. package/agents/operations/coo.md +50 -0
  56. package/agents/operations/ops-advisor.md +78 -0
  57. package/agents/operations/ops-provisioner.md +101 -0
  58. package/agents/operations/ops-research.md +52 -0
  59. package/agents/operations/service-automator.md +278 -0
  60. package/agents/product/business-validator.md +206 -0
  61. package/agents/product/competitive-intelligence.md +89 -0
  62. package/agents/product/cpo.md +63 -0
  63. package/agents/product/design/ux-design-lead.md +209 -0
  64. package/agents/product/spec-flow-analyzer.md +122 -0
  65. package/agents/sales/cro.md +44 -0
  66. package/agents/sales/deal-architect.md +29 -0
  67. package/agents/sales/outbound-strategist.md +29 -0
  68. package/agents/sales/pipeline-analyst.md +29 -0
  69. package/agents/support/cco.md +48 -0
  70. package/agents/support/community-manager.md +570 -0
  71. package/agents/support/ticket-triage.md +70 -0
  72. package/bin/soleur-opencode.js +29 -0
  73. package/commands/go.md +660 -0
  74. package/commands/help.md +273 -0
  75. package/commands/sync.md +977 -0
  76. package/commands/version.md +103 -0
  77. package/hooks/antigravity-hooks.json +84 -0
  78. package/hooks/antigravity-session-start.sh +15 -0
  79. package/hooks/bare-root-cwd-guard.sh +131 -0
  80. package/hooks/browser-snapshot-credential-guard.sh +200 -0
  81. package/hooks/codex-session-start.sh +9 -0
  82. package/hooks/compaction-state.sh +525 -0
  83. package/hooks/destructive-command-guard.sh +1387 -0
  84. package/hooks/devin-session-start.sh +90 -0
  85. package/hooks/ext-filter-detect.sh +171 -0
  86. package/hooks/hooks.json +133 -0
  87. package/hooks/lib/hook-tool-kind.sh +24 -0
  88. package/hooks/lib/log-rotation.sh +176 -0
  89. package/hooks/lib/shell-argv.pl +576 -0
  90. package/hooks/memory-backstop.sh +1114 -0
  91. package/hooks/operator-stage-approval.sh +391 -0
  92. package/hooks/stop-hook.sh +367 -0
  93. package/hooks/unkept-promise-hook.sh +383 -0
  94. package/hooks/version-banner.sh +127 -0
  95. package/hooks/welcome-hook.sh +50 -0
  96. package/install.js +29 -0
  97. package/lib/agent-registry.ts +154 -0
  98. package/lib/c4-canonical-cli.mjs +34 -0
  99. package/lib/c4-canonical.mjs +46 -0
  100. package/lib/c4-from-components.ts +554 -0
  101. package/lib/go-routing.ts +81 -0
  102. package/lib/grok-inspect-contract.ts +311 -0
  103. package/lib/harness-model-map.ts +101 -0
  104. package/lib/harness-parity.ts +726 -0
  105. package/lib/harness-tool-map.ts +180 -0
  106. package/lib/harness.ts +716 -0
  107. package/lib/heartbeat-live-reconcile.ts +1153 -0
  108. package/lib/heartbeat-manifest.ts +361 -0
  109. package/lib/kb-coverage.ts +252 -0
  110. package/lib/pr-merge-poll.ts +103 -0
  111. package/lib/workflow-fidelity.ts +388 -0
  112. package/opencode/INSTRUCTIONS.md +171 -0
  113. package/opencode/agents/engineering/cto.md +10 -0
  114. package/opencode/agents/engineering/design/ddd-architect.md +10 -0
  115. package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
  116. package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
  117. package/opencode/agents/engineering/infra/infra-security.md +10 -0
  118. package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
  119. package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
  120. package/opencode/agents/engineering/prompt-engineer.md +10 -0
  121. package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
  122. package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
  123. package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
  124. package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
  125. package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
  126. package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
  127. package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
  128. package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
  129. package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
  130. package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
  131. package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
  132. package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
  133. package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
  134. package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
  135. package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
  136. package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
  137. package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
  138. package/opencode/agents/engineering/review/performance-oracle.md +10 -0
  139. package/opencode/agents/engineering/review/security-sentinel.md +10 -0
  140. package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
  141. package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
  142. package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
  143. package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
  144. package/opencode/agents/finance/budget-analyst.md +10 -0
  145. package/opencode/agents/finance/cfo.md +10 -0
  146. package/opencode/agents/finance/financial-reporter.md +10 -0
  147. package/opencode/agents/finance/revenue-analyst.md +10 -0
  148. package/opencode/agents/legal/clo.md +10 -0
  149. package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
  150. package/opencode/agents/legal/legal-document-generator.md +10 -0
  151. package/opencode/agents/marketing/analytics-analyst.md +10 -0
  152. package/opencode/agents/marketing/brand-architect.md +10 -0
  153. package/opencode/agents/marketing/cmo.md +10 -0
  154. package/opencode/agents/marketing/conversion-optimizer.md +10 -0
  155. package/opencode/agents/marketing/copywriter.md +10 -0
  156. package/opencode/agents/marketing/fact-checker.md +10 -0
  157. package/opencode/agents/marketing/growth-strategist.md +10 -0
  158. package/opencode/agents/marketing/paid-media-strategist.md +10 -0
  159. package/opencode/agents/marketing/pricing-strategist.md +10 -0
  160. package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
  161. package/opencode/agents/marketing/retention-strategist.md +10 -0
  162. package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
  163. package/opencode/agents/operations/coo.md +10 -0
  164. package/opencode/agents/operations/ops-advisor.md +10 -0
  165. package/opencode/agents/operations/ops-provisioner.md +10 -0
  166. package/opencode/agents/operations/ops-research.md +10 -0
  167. package/opencode/agents/operations/service-automator.md +10 -0
  168. package/opencode/agents/product/business-validator.md +10 -0
  169. package/opencode/agents/product/competitive-intelligence.md +10 -0
  170. package/opencode/agents/product/cpo.md +10 -0
  171. package/opencode/agents/product/design/ux-design-lead.md +10 -0
  172. package/opencode/agents/product/spec-flow-analyzer.md +10 -0
  173. package/opencode/agents/sales/cro.md +10 -0
  174. package/opencode/agents/sales/deal-architect.md +10 -0
  175. package/opencode/agents/sales/outbound-strategist.md +10 -0
  176. package/opencode/agents/sales/pipeline-analyst.md +10 -0
  177. package/opencode/agents/support/cco.md +10 -0
  178. package/opencode/agents/support/community-manager.md +10 -0
  179. package/opencode/agents/support/ticket-triage.md +10 -0
  180. package/opencode/commands/go.md +10 -0
  181. package/opencode/commands/help.md +10 -0
  182. package/opencode/commands/sync.md +10 -0
  183. package/opencode/commands/version.md +11 -0
  184. package/opencode/opencode.json +8 -0
  185. package/opencode/plugin.ts +818 -0
  186. package/package.json +36 -4
  187. package/scripts/admin-merge-ready.sh +545 -0
  188. package/scripts/admin-merge-ready.test.sh +753 -0
  189. package/scripts/affected-tests.sh +908 -0
  190. package/scripts/affected-tests.test.sh +1797 -0
  191. package/scripts/alpha-metrics.sh +78 -0
  192. package/scripts/alpha-metrics.test.sh +115 -0
  193. package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
  194. package/scripts/audit-flag-flip.sh +107 -0
  195. package/scripts/check-red-on-main.sh +316 -0
  196. package/scripts/ci-head-verdict.sh +411 -0
  197. package/scripts/cloud-detect.sh +193 -0
  198. package/scripts/delegation-verify.sh +657 -0
  199. package/scripts/delegation-verify.test.sh +1424 -0
  200. package/scripts/deploy-arm.sh +475 -0
  201. package/scripts/domain-model-drift.sh +419 -0
  202. package/scripts/emit-decision.sh +144 -0
  203. package/scripts/emit-decision.test.sh +144 -0
  204. package/scripts/ext-filter-divergence-corpus.txt +15 -0
  205. package/scripts/ext-filter-divergence.sh +189 -0
  206. package/scripts/generate-c4-from-components.ts +442 -0
  207. package/scripts/grok-fidelity-gate.sh +68 -0
  208. package/scripts/grok-pre-push-gate.sh +232 -0
  209. package/scripts/harness-discovery-smoke.ts +906 -0
  210. package/scripts/harness-parity-census.ts +92 -0
  211. package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
  212. package/scripts/install-opencode-adapter.ts +509 -0
  213. package/scripts/lib/affected-tests/common.sh +365 -0
  214. package/scripts/lib/affected-tests/go.sh +157 -0
  215. package/scripts/lib/affected-tests/js.sh +188 -0
  216. package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
  217. package/scripts/lib/affected-tests/python.sh +185 -0
  218. package/scripts/lib/context-sanitize.sh +49 -0
  219. package/scripts/lib/domain-model-lib.sh +180 -0
  220. package/scripts/lib/ext-filter-grammar.tsv +34 -0
  221. package/scripts/lib/operator-script.sh +1236 -0
  222. package/scripts/lib/proc.sh +580 -0
  223. package/scripts/lib/session-state.sh +748 -0
  224. package/scripts/lib/tmp-classify.sh +843 -0
  225. package/scripts/lib/wrapper-boundary.sh +47 -0
  226. package/scripts/lint-ratchet.py +1547 -0
  227. package/scripts/monitor-pr-checks.sh +441 -0
  228. package/scripts/pipeline-tally.sh +756 -0
  229. package/scripts/pipeline-tally.test.sh +740 -0
  230. package/scripts/plugin-version.sh +528 -0
  231. package/scripts/precommit-guard.sh +115 -0
  232. package/scripts/precommit-guard.test.sh +254 -0
  233. package/scripts/reconcile-live-heartbeats.ts +705 -0
  234. package/scripts/render-c4-model.sh +217 -0
  235. package/scripts/resolve-git-root.sh +55 -0
  236. package/scripts/resolve-regenerable-conflicts.sh +363 -0
  237. package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
  238. package/scripts/ruff-requirements.txt +22 -0
  239. package/scripts/run-in-pid-namespace.sh +98 -0
  240. package/scripts/run-in-pid-namespace.test.sh +290 -0
  241. package/scripts/scan-ancestor-signal-helpers.py +556 -0
  242. package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
  243. package/scripts/setup-ralph-loop.sh +238 -0
  244. package/scripts/sync-cursor-name-map.ts +316 -0
  245. package/scripts/sync-grok-agent-compat.ts +188 -0
  246. package/scripts/sync-npm-package.ts +165 -0
  247. package/scripts/sync-opencode-adapter.ts +498 -0
  248. package/scripts/sync-pr-behind.sh +647 -0
  249. package/scripts/sync-pr-behind.test.sh +252 -0
  250. package/scripts/taste-profile-update.sh +180 -0
  251. package/scripts/taste-profile-update.test.sh +167 -0
  252. package/scripts/write-budget-marker.sh +23 -0
  253. package/scripts/write-kb-coverage.ts +113 -0
  254. package/skills/admin-ip-refresh/SKILL.md +81 -0
  255. package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
  256. package/skills/agent-browser/SKILL.md +698 -0
  257. package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
  258. package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
  259. package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
  260. package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
  261. package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
  262. package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
  263. package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
  264. package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
  265. package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
  266. package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
  267. package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
  268. package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
  269. package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
  270. package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
  271. package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
  272. package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
  273. package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
  274. package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
  275. package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
  276. package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
  277. package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
  278. package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
  279. package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
  280. package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
  281. package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
  282. package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
  283. package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
  284. package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
  285. package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
  286. package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
  287. package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
  288. package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
  289. package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
  290. package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
  291. package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
  292. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
  293. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
  294. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
  295. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
  296. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
  297. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
  298. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
  299. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
  300. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
  301. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
  302. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
  303. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
  304. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
  305. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
  306. package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
  307. package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
  308. package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
  309. package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
  310. package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
  311. package/skills/agent-native-architecture/SKILL.md +479 -0
  312. package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
  313. package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
  314. package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
  315. package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
  316. package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
  317. package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
  318. package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
  319. package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
  320. package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
  321. package/skills/agent-native-architecture/references/product-implications.md +478 -0
  322. package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
  323. package/skills/agent-native-architecture/references/self-modification.md +294 -0
  324. package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
  325. package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
  326. package/skills/agent-native-audit/SKILL.md +300 -0
  327. package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
  328. package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
  329. package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
  330. package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
  331. package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
  332. package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
  333. package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
  334. package/skills/architecture/SKILL.md +436 -0
  335. package/skills/architecture/references/adr-template.md +154 -0
  336. package/skills/architecture/references/likec4-reference.md +136 -0
  337. package/skills/architecture/references/nfr-reference.md +126 -0
  338. package/skills/archive-kb/SKILL.md +86 -0
  339. package/skills/archive-kb/scripts/archive-kb.sh +300 -0
  340. package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
  341. package/skills/atdd-developer/SKILL.md +65 -0
  342. package/skills/brainstorm/SKILL.md +701 -0
  343. package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
  344. package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
  345. package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
  346. package/skills/brainstorm/references/ui-surface-terms.md +42 -0
  347. package/skills/brainstorm-techniques/SKILL.md +231 -0
  348. package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
  349. package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
  350. package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
  351. package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
  352. package/skills/campaign-calendar/SKILL.md +145 -0
  353. package/skills/cf-token-scope/SKILL.md +164 -0
  354. package/skills/cf-token-scope/references/widen-playbook.md +114 -0
  355. package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
  356. package/skills/changelog/SKILL.md +142 -0
  357. package/skills/code-to-prd/SKILL.md +66 -0
  358. package/skills/code-to-prd/references/banner-template.md +12 -0
  359. package/skills/code-to-prd/references/prd-template.md +41 -0
  360. package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
  361. package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
  362. package/skills/code-to-prd/test/fixture/.env.example +7 -0
  363. package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
  364. package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
  365. package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
  366. package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
  367. package/skills/code-to-prd/test/fixture/package.json +6 -0
  368. package/skills/cohort-status/SKILL.md +62 -0
  369. package/skills/community/SKILL.md +210 -0
  370. package/skills/community/scripts/bsky-community.sh +644 -0
  371. package/skills/community/scripts/bsky-setup.sh +631 -0
  372. package/skills/community/scripts/community-router.sh +93 -0
  373. package/skills/community/scripts/discord-community.sh +487 -0
  374. package/skills/community/scripts/discord-setup.sh +784 -0
  375. package/skills/community/scripts/github-community.sh +706 -0
  376. package/skills/community/scripts/hn-community.sh +233 -0
  377. package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
  378. package/skills/community/scripts/linkedin-community.sh +750 -0
  379. package/skills/community/scripts/linkedin-setup.sh +758 -0
  380. package/skills/community/scripts/x-community.sh +890 -0
  381. package/skills/community/scripts/x-setup.sh +713 -0
  382. package/skills/community/test/community-argv.test.sh +2922 -0
  383. package/skills/community/test/github-community.test.sh +981 -0
  384. package/skills/competitive-analysis/SKILL.md +69 -0
  385. package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
  386. package/skills/compound/SKILL.md +673 -0
  387. package/skills/compound/scripts/token-efficiency-report.sh +334 -0
  388. package/skills/compound/test/phase-16.test.sh +379 -0
  389. package/skills/compound-capture/SKILL.md +791 -0
  390. package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
  391. package/skills/compound-capture/assets/resolution-template.md +116 -0
  392. package/skills/compound-capture/references/yaml-schema.md +67 -0
  393. package/skills/compound-capture/schema.yaml +181 -0
  394. package/skills/constraint-scaffold/SKILL.md +175 -0
  395. package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
  396. package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
  397. package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
  398. package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
  399. package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
  400. package/skills/constraint-scaffold/references/shared-runner.template +135 -0
  401. package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
  402. package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
  403. package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
  404. package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
  405. package/skills/constraint-scaffold/test/generator.test.sh +93 -0
  406. package/skills/constraint-scaffold/test/parity.test.sh +285 -0
  407. package/skills/content-writer/SKILL.md +242 -0
  408. package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
  409. package/skills/cron-delete/SKILL.md +56 -0
  410. package/skills/cron-list/SKILL.md +54 -0
  411. package/skills/deepen-plan/SKILL.md +937 -0
  412. package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
  413. package/skills/deploy/SKILL.md +115 -0
  414. package/skills/deploy/references/hetzner-setup.md +67 -0
  415. package/skills/deploy/scripts/deploy.sh +37 -0
  416. package/skills/deploy-docs/SKILL.md +95 -0
  417. package/skills/dhh-rails-style/SKILL.md +203 -0
  418. package/skills/dhh-rails-style/references/architecture.md +717 -0
  419. package/skills/dhh-rails-style/references/controllers.md +323 -0
  420. package/skills/dhh-rails-style/references/frontend.md +556 -0
  421. package/skills/dhh-rails-style/references/gems.md +316 -0
  422. package/skills/dhh-rails-style/references/models.md +388 -0
  423. package/skills/dhh-rails-style/references/testing.md +354 -0
  424. package/skills/discord-content/SKILL.md +126 -0
  425. package/skills/docs-site/SKILL.md +214 -0
  426. package/skills/drain-labeled-backlog/SKILL.md +203 -0
  427. package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
  428. package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
  429. package/skills/drain-prs/SKILL.md +143 -0
  430. package/skills/drain-prs/scripts/triage-prs.sh +192 -0
  431. package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
  432. package/skills/dspy-ruby/SKILL.md +634 -0
  433. package/skills/dspy-ruby/assets/config-template.rb +359 -0
  434. package/skills/dspy-ruby/assets/module-template.rb +326 -0
  435. package/skills/dspy-ruby/assets/signature-template.rb +143 -0
  436. package/skills/dspy-ruby/references/core-concepts.md +268 -0
  437. package/skills/dspy-ruby/references/optimization.md +623 -0
  438. package/skills/dspy-ruby/references/providers.md +335 -0
  439. package/skills/eval-harness/README.md +194 -0
  440. package/skills/eval-harness/SKILL.md +157 -0
  441. package/skills/eval-harness/enums/go-routes.json +13 -0
  442. package/skills/eval-harness/enums/incident-threshold.json +5 -0
  443. package/skills/eval-harness/enums/lane.json +5 -0
  444. package/skills/eval-harness/enums/tool-selection.json +20 -0
  445. package/skills/eval-harness/enums/triage-levels.json +5 -0
  446. package/skills/eval-harness/gated-skills.json +34 -0
  447. package/skills/eval-harness/models.generated.json +5 -0
  448. package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
  449. package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
  450. package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
  451. package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
  452. package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
  453. package/skills/eval-harness/prompts/go-baseline.txt +6 -0
  454. package/skills/eval-harness/prompts/go-skill.txt +21 -0
  455. package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
  456. package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
  457. package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
  458. package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
  459. package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
  460. package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
  461. package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
  462. package/skills/eval-harness/prompts/triage-skill.txt +10 -0
  463. package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
  464. package/skills/eval-harness/scripts/extract-block.cjs +87 -0
  465. package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
  466. package/skills/eval-harness/scripts/gen-models.sh +41 -0
  467. package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
  468. package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
  469. package/skills/eval-harness/scripts/parse-label.cjs +93 -0
  470. package/skills/eval-harness/scripts/verdict.cjs +132 -0
  471. package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
  472. package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
  473. package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
  474. package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
  475. package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
  476. package/skills/eval-harness/test/eval-gate.test.sh +132 -0
  477. package/skills/eval-harness/test/extract-block.test.sh +87 -0
  478. package/skills/eval-harness/test/gate-classification.test.sh +77 -0
  479. package/skills/eval-harness/test/gen-models.test.sh +75 -0
  480. package/skills/eval-harness/test/measure-classification.test.sh +74 -0
  481. package/skills/eval-harness/test/parse-label.test.sh +129 -0
  482. package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
  483. package/skills/eval-harness/test/verdict.test.sh +123 -0
  484. package/skills/every-style-editor/SKILL.md +142 -0
  485. package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
  486. package/skills/feature-tweet/SKILL.md +199 -0
  487. package/skills/feature-video/SKILL.md +412 -0
  488. package/skills/feature-video/scripts/check_deps.sh +281 -0
  489. package/skills/file-todos/SKILL.md +267 -0
  490. package/skills/file-todos/assets/todo-template.md +166 -0
  491. package/skills/fix-issue/SKILL.md +278 -0
  492. package/skills/fix-issue/references/agent-authored-exclusion.md +120 -0
  493. package/skills/fix-issue/references/exclude-label-jq-snippet.md +97 -0
  494. package/skills/flag-bootstrap/SETUP.md +142 -0
  495. package/skills/flag-create/SKILL.md +145 -0
  496. package/skills/flag-create/scripts/create.sh +273 -0
  497. package/skills/flag-delete/SKILL.md +167 -0
  498. package/skills/flag-delete/scripts/delete.sh +288 -0
  499. package/skills/flag-list/SKILL.md +99 -0
  500. package/skills/flag-list/scripts/list.sh +275 -0
  501. package/skills/flag-set-role/SKILL.md +229 -0
  502. package/skills/flag-set-role/scripts/flip.sh +774 -0
  503. package/skills/frontend-anti-slop/SKILL.md +106 -0
  504. package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
  505. package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
  506. package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
  507. package/skills/frontend-design/SKILL.md +77 -0
  508. package/skills/gdpr-gate/NOTICE +136 -0
  509. package/skills/gdpr-gate/SKILL.md +341 -0
  510. package/skills/gdpr-gate/references/fields.md +160 -0
  511. package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
  512. package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
  513. package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
  514. package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
  515. package/skills/gdpr-gate/references/layers/frontend.md +249 -0
  516. package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
  517. package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
  518. package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
  519. package/skills/gdpr-gate/references/legal-consent.md +140 -0
  520. package/skills/gdpr-gate/references/non-negotiables.md +60 -0
  521. package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
  522. package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
  523. package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
  524. package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
  525. package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
  526. package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
  527. package/skills/gemini-imagegen/SKILL.md +283 -0
  528. package/skills/gemini-imagegen/requirements.txt +5 -0
  529. package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
  530. package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
  531. package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
  532. package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
  533. package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
  534. package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
  535. package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
  536. package/skills/git-worktree/SKILL.md +534 -0
  537. package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
  538. package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
  539. package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
  540. package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
  541. package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
  542. package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
  543. package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
  544. package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
  545. package/skills/go/SKILL.md +54 -0
  546. package/skills/growth/SKILL.md +164 -0
  547. package/skills/harvest-debt/SKILL.md +78 -0
  548. package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
  549. package/skills/heal-skill/SKILL.md +173 -0
  550. package/skills/help/SKILL.md +46 -0
  551. package/skills/incident/NOTICE +39 -0
  552. package/skills/incident/SKILL.md +395 -0
  553. package/skills/incident/scripts/dry-run.sh +448 -0
  554. package/skills/incident/scripts/redact-engine.py +412 -0
  555. package/skills/incident/scripts/redact-sentinel.sh +44 -0
  556. package/skills/incident/templates/pir.md +139 -0
  557. package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
  558. package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
  559. package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
  560. package/skills/incident/test/fixtures/positive-corpus.md +87 -0
  561. package/skills/incident/test/redact-sentinel.test.sh +1420 -0
  562. package/skills/invoice/SKILL.md +206 -0
  563. package/skills/kb-glossary/SKILL.md +71 -0
  564. package/skills/kb-glossary/references/glossary-format.md +111 -0
  565. package/skills/kb-glossary/references/rejected-request-register.md +115 -0
  566. package/skills/kb-search/SKILL.md +276 -0
  567. package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
  568. package/skills/legal-audit/SKILL.md +161 -0
  569. package/skills/legal-generate/NOTICE +242 -0
  570. package/skills/legal-generate/SKILL.md +244 -0
  571. package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
  572. package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
  573. package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
  574. package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
  575. package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
  576. package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
  577. package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
  578. package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
  579. package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
  580. package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
  581. package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
  582. package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
  583. package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
  584. package/skills/linear-fetch/SKILL.md +247 -0
  585. package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
  586. package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
  587. package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
  588. package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
  589. package/skills/linear-fetch/test/parity.test.sh +112 -0
  590. package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
  591. package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
  592. package/skills/merge-pr/SKILL.md +670 -0
  593. package/skills/model-launch-review/SKILL.md +255 -0
  594. package/skills/model-launch-review/scripts/audit-models.sh +501 -0
  595. package/skills/one-shot/SKILL.md +316 -0
  596. package/skills/one-shot/references/token-discipline.md +74 -0
  597. package/skills/operator-bootstrap/SKILL.md +412 -0
  598. package/skills/operator-bootstrap/template.sh +439 -0
  599. package/skills/operator-digest/SKILL.md +287 -0
  600. package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
  601. package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
  602. package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
  603. package/skills/operator-rephrase/SKILL.md +98 -0
  604. package/skills/pencil-setup/SKILL.md +201 -0
  605. package/skills/pencil-setup/scripts/check_deps.sh +556 -0
  606. package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
  607. package/skills/pencil-setup/scripts/package-lock.json +1172 -0
  608. package/skills/pencil-setup/scripts/package.json +14 -0
  609. package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
  610. package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
  611. package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
  612. package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
  613. package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
  614. package/skills/plan/SKILL.md +1140 -0
  615. package/skills/plan/references/differential-migration-testing.md +185 -0
  616. package/skills/plan/references/plan-community-discovery.md +42 -0
  617. package/skills/plan/references/plan-founder-check.md +137 -0
  618. package/skills/plan/references/plan-functional-overlap.md +25 -0
  619. package/skills/plan/references/plan-host-fanout.md +51 -0
  620. package/skills/plan/references/plan-issue-templates.md +779 -0
  621. package/skills/plan/references/plan-network-outage-checklist.md +131 -0
  622. package/skills/plan/references/plan-scope-check.md +126 -0
  623. package/skills/plan/references/plan-sharp-edges.md +331 -0
  624. package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
  625. package/skills/plan/references/webapp-cwv-observability.md +143 -0
  626. package/skills/plan-review/SKILL.md +91 -0
  627. package/skills/plan-review/lib/named-panel.mjs +58 -0
  628. package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
  629. package/skills/postmerge/SKILL.md +642 -0
  630. package/skills/postmerge/references/deploy-status-debugging.md +141 -0
  631. package/skills/postmerge/references/graceful-degradation.md +20 -0
  632. package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
  633. package/skills/preflight/SKILL.md +1553 -0
  634. package/skills/preflight/references/check-13-founder-check.md +286 -0
  635. package/skills/preflight/scripts/founder-check.py +1640 -0
  636. package/skills/preflight/scripts/parse-form-a.awk +107 -0
  637. package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
  638. package/skills/product-roadmap/SKILL.md +357 -0
  639. package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
  640. package/skills/provision-cloudflare/SKILL.md +67 -0
  641. package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
  642. package/skills/provision-doppler/SKILL.md +58 -0
  643. package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
  644. package/skills/provision-github/SKILL.md +59 -0
  645. package/skills/provision-github/scripts/provision-github.sh +300 -0
  646. package/skills/provision-hetzner/SKILL.md +76 -0
  647. package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
  648. package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
  649. package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
  650. package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
  651. package/skills/qa/SKILL.md +263 -0
  652. package/skills/qa/references/browser-preflight.md +22 -0
  653. package/skills/questionnaire-generate/SKILL.md +328 -0
  654. package/skills/questionnaire-generate/references/questionnaire.template +60 -0
  655. package/skills/rclone/SKILL.md +162 -0
  656. package/skills/rclone/scripts/check_setup.sh +63 -0
  657. package/skills/release-announce/SKILL.md +65 -0
  658. package/skills/release-docs/SKILL.md +92 -0
  659. package/skills/reproduce-bug/SKILL.md +358 -0
  660. package/skills/resolve-debt/SKILL.md +85 -0
  661. package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
  662. package/skills/resolve-parallel/SKILL.md +45 -0
  663. package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
  664. package/skills/resolve-pr-parallel/SKILL.md +68 -0
  665. package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
  666. package/skills/resolve-todo-parallel/SKILL.md +57 -0
  667. package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
  668. package/skills/review/SKILL.md +1620 -0
  669. package/skills/review/references/anti-slop-scanner-hook.md +40 -0
  670. package/skills/review/references/defect-classes-migrations.md +9 -0
  671. package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
  672. package/skills/review/references/review-e2e-testing.md +116 -0
  673. package/skills/review/references/review-evidence-comment.md +36 -0
  674. package/skills/review/references/review-todo-structure.md +165 -0
  675. package/skills/review/references/risk-tier-and-fix-rounds.md +97 -0
  676. package/skills/review/references/semgrep-custom-rules.yaml +174 -0
  677. package/skills/review/references/ultrathink-phases.md +98 -0
  678. package/skills/review/references/wfs.md +6 -0
  679. package/skills/review/scripts/emit-review-trailer.sh +499 -0
  680. package/skills/review/scripts/ensure-semgrep.sh +99 -0
  681. package/skills/review/scripts/fix-round-seats.sh +197 -0
  682. package/skills/review/test/emit-review-trailer.test.sh +387 -0
  683. package/skills/review/test/ensure-semgrep.test.sh +111 -0
  684. package/skills/review/test/fix-round-seats.test.sh +237 -0
  685. package/skills/review/workflows/README.md +147 -0
  686. package/skills/review/workflows/review.workflow.js +667 -0
  687. package/skills/schedule/SKILL.md +796 -0
  688. package/skills/seo-aeo/SKILL.md +139 -0
  689. package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
  690. package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
  691. package/skills/ship/SKILL.md +3023 -0
  692. package/skills/ship/references/adr-ordinal-collision.md +47 -0
  693. package/skills/ship/references/affected-gate-contract.md +115 -0
  694. package/skills/ship/references/ci-run-diagnosis.md +29 -0
  695. package/skills/ship/references/ci-workflow-authoring.md +68 -0
  696. package/skills/ship/references/cleanup-merged-archival.md +39 -0
  697. package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
  698. package/skills/ship/references/cto-ruling-armed-push.md +5 -0
  699. package/skills/ship/references/decision-challenges-render.md +71 -0
  700. package/skills/ship/references/delegated-act-authoring-form.md +7 -0
  701. package/skills/ship/references/detached-battery-verdict.md +13 -0
  702. package/skills/ship/references/epic-close-sweep.md +62 -0
  703. package/skills/ship/references/feature-tweet-draft.md +42 -0
  704. package/skills/ship/references/followthrough-issue-body-template.md +47 -0
  705. package/skills/ship/references/followthrough-stub-template.sh +92 -0
  706. package/skills/ship/references/merge-queue-dequeue.md +39 -0
  707. package/skills/ship/references/operator-holds.md +179 -0
  708. package/skills/ship/references/pipeline-tally-render.md +43 -0
  709. package/skills/ship/references/pr-overlap.md +153 -0
  710. package/skills/ship/references/queue-mode.md +7 -0
  711. package/skills/ship/references/ready-run-wait.md +36 -0
  712. package/skills/ship/references/red-on-main-quarantine.md +110 -0
  713. package/skills/ship/references/register-update-pr-pattern.md +88 -0
  714. package/skills/ship/references/settle-then-admin-merge.md +130 -0
  715. package/skills/ship/references/supabase-column-probe.md +13 -0
  716. package/skills/ship/scripts/auto-close-scan.sh +76 -0
  717. package/skills/ship/scripts/battery-owed.sh +403 -0
  718. package/skills/ship/scripts/hold-gate-eval.sh +410 -0
  719. package/skills/ship/scripts/net-issue-flow.sh +665 -0
  720. package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
  721. package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
  722. package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
  723. package/skills/skill-creator/SKILL.md +299 -0
  724. package/skills/skill-creator/references/api-security.md +248 -0
  725. package/skills/skill-creator/references/authoring-levers.md +110 -0
  726. package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
  727. package/skills/skill-creator/references/best-practices.md +431 -0
  728. package/skills/skill-creator/references/common-patterns.md +639 -0
  729. package/skills/skill-creator/references/core-principles.md +193 -0
  730. package/skills/skill-creator/references/executable-code.md +188 -0
  731. package/skills/skill-creator/references/iteration-and-testing.md +509 -0
  732. package/skills/skill-creator/references/official-spec.md +193 -0
  733. package/skills/skill-creator/references/recommended-structure.md +180 -0
  734. package/skills/skill-creator/references/skill-structure.md +396 -0
  735. package/skills/skill-creator/references/using-scripts.md +122 -0
  736. package/skills/skill-creator/references/using-templates.md +120 -0
  737. package/skills/skill-creator/references/workflows-and-validation.md +541 -0
  738. package/skills/skill-creator/scripts/init_skill.py +322 -0
  739. package/skills/skill-creator/scripts/package_skill.py +110 -0
  740. package/skills/skill-creator/scripts/quick_validate.py +64 -0
  741. package/skills/skill-creator/templates/router-skill.md +73 -0
  742. package/skills/skill-creator/templates/simple-skill.md +34 -0
  743. package/skills/skill-creator/workflows/add-reference.md +96 -0
  744. package/skills/skill-creator/workflows/add-script.md +104 -0
  745. package/skills/skill-creator/workflows/add-template.md +83 -0
  746. package/skills/skill-creator/workflows/add-workflow.md +128 -0
  747. package/skills/skill-creator/workflows/audit-skill.md +159 -0
  748. package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
  749. package/skills/skill-creator/workflows/create-new-skill.md +207 -0
  750. package/skills/skill-creator/workflows/get-guidance.md +134 -0
  751. package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
  752. package/skills/skill-creator/workflows/verify-skill.md +226 -0
  753. package/skills/skill-security-scan/SKILL.md +145 -0
  754. package/skills/skill-security-scan/references/disclaimer.md +21 -0
  755. package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
  756. package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
  757. package/skills/skill-security-scan/references/override-mechanism.md +171 -0
  758. package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
  759. package/skills/skill-security-scan/references/regex-patterns.md +136 -0
  760. package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
  761. package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
  762. package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
  763. package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
  764. package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
  765. package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
  766. package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
  767. package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
  768. package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
  769. package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
  770. package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
  771. package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
  772. package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
  773. package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
  774. package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
  775. package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
  776. package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
  777. package/skills/skill-security-scan/scripts/lib.sh +197 -0
  778. package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
  779. package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
  780. package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
  781. package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
  782. package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
  783. package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
  784. package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
  785. package/skills/social-distribute/SKILL.md +485 -0
  786. package/skills/spec-templates/SKILL.md +274 -0
  787. package/skills/sync/SKILL.md +49 -0
  788. package/skills/test-browser/SKILL.md +464 -0
  789. package/skills/test-browser/references/feature-map.md +161 -0
  790. package/skills/test-fix-loop/SKILL.md +159 -0
  791. package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
  792. package/skills/triage/SKILL.md +402 -0
  793. package/skills/trigger-cron/SKILL.md +136 -0
  794. package/skills/trigger-cron/scripts/trigger.sh +198 -0
  795. package/skills/user-set-role/SKILL.md +147 -0
  796. package/skills/user-set-role/scripts/set-role.sh +218 -0
  797. package/skills/user-story-writer/SKILL.md +77 -0
  798. package/skills/ux-audit/SKILL.md +251 -0
  799. package/skills/ux-audit/references/finding.schema.json +62 -0
  800. package/skills/ux-audit/references/route-list.yaml +95 -0
  801. package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
  802. package/skills/ux-audit/scripts/bot-signin.ts +135 -0
  803. package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
  804. package/skills/verification-scaffold/SKILL.md +73 -0
  805. package/skills/verification-scaffold/references/gitleaks.toml.template +13 -0
  806. package/skills/verification-scaffold/references/guardrail-audit.md +156 -0
  807. package/skills/verification-scaffold/references/guards/block-stash-hook.sh.template +72 -0
  808. package/skills/verification-scaffold/references/guards/commit-on-main-hook.sh.template +82 -0
  809. package/skills/verification-scaffold/references/guards/orphan-test-check.sh.template +102 -0
  810. package/skills/verification-scaffold/references/guards/precommit-guard.sh.template +115 -0
  811. package/skills/verification-scaffold/references/guards/secret-scan-hook.sh.template +176 -0
  812. package/skills/verification-scaffold/references/guards/verification-gates.yml.template +49 -0
  813. package/skills/verification-scaffold/references/guards/wrapper-boundary.sh.template +47 -0
  814. package/skills/verification-scaffold/references/guards.tsv +21 -0
  815. package/skills/verification-scaffold/references/verification-readme.template +55 -0
  816. package/skills/verification-scaffold/scripts/verification-scaffold.sh +785 -0
  817. package/skills/verification-scaffold/test/bite-proof.test.sh +159 -0
  818. package/skills/verification-scaffold/test/generator.test.sh +319 -0
  819. package/skills/verification-scaffold/test/manifest.test.sh +144 -0
  820. package/skills/work/SKILL.md +1480 -0
  821. package/skills/work/references/end-of-work-resume.md +7 -0
  822. package/skills/work/references/hook-test-main-cwd.md +24 -0
  823. package/skills/work/references/key-principles.md +83 -0
  824. package/skills/work/references/property-testing.md +122 -0
  825. package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
  826. package/skills/work/references/work-agent-teams.md +97 -0
  827. package/skills/work/references/work-lifecycle-parallel.md +147 -0
  828. package/skills/work/references/work-lockfile-bumps.md +97 -0
  829. package/skills/work/references/work-scratch-sandboxes.md +212 -0
  830. package/skills/work/references/work-subagent-fanout.md +61 -0
  831. package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
  832. package/skills/xcode-test/SKILL.md +360 -0
@@ -0,0 +1,287 @@
1
+ ---
2
+ name: operator-digest
3
+ description: "This skill should be used when generating the operator's weekly private comprehension digest: reading merged PRs, expenses, resolved incidents, and open action-required issues, then writing a plain-language digest.md without posting."
4
+ ---
5
+
6
+ <!-- soleur-cloud-mode:start -->
7
+ **Cloud Mode (Devin):** before pipeline work run `bash "${CLAUDE_PLUGIN_ROOT}/scripts/cloud-detect.sh"`. If `CLAUDE_PLUGIN_ROOT` is unset (cloud exec shells do not export it), resolve the root by IDENTITY, never by script basename: for `d` in `"$HOME/.local/share/devin/cli/plugins/cache"` and `/opt/.devin/plugins`, skip unless `[ -d "$d" ]`, then `MANIFEST="$(find "$d" -path '*/.claude-plugin/plugin.json' -exec grep -l '"name"[[:space:]]*:[[:space:]]*"soleur"' {} + 2>/dev/null | head -1)"`, `ROOT="${MANIFEST%/.claude-plugin/plugin.json}"` — one resolution, two consumers: `$ROOT/scripts/cloud-detect.sh` and `$ROOT/scripts/precommit-guard.sh`. (Shape check, not authentication: a planted `{"name":"soleur"}` dir passes — ADR-179 A11.) `local` or `not-local:no-devin-env` proceeds normally; any other `not-local:<reason>` applies `<plugin-root>/devin/INSTRUCTIONS.md` §Cloud Mode: emit the `--banner`, fan out sequentially with `Reviewed-Coverage: sequential-fallback` disclosure (never claim an independent review ran), `message_user` ack before any secrets read or production mutation, and run `precommit-guard.sh` before any `git commit` — hooks do not fire in cloud.
8
+ <!-- soleur-cloud-mode:end -->
9
+
10
+ <!-- grok-harness-invoke:start -->
11
+ **Grok Build (`plugins/soleur/lib/harness.ts` `invokeSkill()`):** Read this SKILL.md in this process and run it to completion. A one-segment `soleur:<name>` in this document names a SKILL — on Grok Build, Read `plugins/soleur/skills/<name>/SKILL.md` in this process; it is not a nested tool_use. A multi-segment id such as `soleur:<domain>:<name>` names an AGENT: spawn it, never Read it, and on Grok Build spawn_subagent takes the id with its colons replaced by hyphens (`agentIdToGrokSubagentType`). **Claude Code:** Skill tool for a skill (`soleur:<name>`), Task tool with `subagent_type` for an agent. Forbidden is executing a subset, not the Read.
12
+ <!-- grok-harness-invoke:end -->
13
+
14
+ # Operator Weekly Comprehension Digest
15
+
16
+ Write a calm, plain-language weekly digest that tells the non-technical operator **what their
17
+ company actually did this week** — what got built, what it cost, what broke (and whether it is
18
+ fixed), and what now needs their attention. Autonomous loops ship features, move money, and resolve
19
+ incidents faster than a solo owner can track; this digest is the antidote to that comprehension debt.
20
+
21
+ This skill runs **headless inside `claude-code-action`** in the private `jikig-ai/operator-digest`
22
+ repo, with the **public** `jikig-ai/soleur` repo checked out at `$GITHUB_WORKSPACE`. It reads five
23
+ sources, synthesizes five sections of prose, and writes `$GITHUB_WORKSPACE/digest.md`. It then
24
+ **STOPS**. A deterministic workflow post-step scrubs that file (fail-closed) and is the only thing
25
+ that posts the issue — this skill itself must never post the digest (it writes the file and STOPS).
26
+
27
+ ## Register (how to write)
28
+
29
+ Write as a trusted chief of staff briefing a busy owner — calm, candid, concrete. **Every line states
30
+ a business consequence or an action the owner can take, or it is cut.** No vanity metrics, no PR
31
+ numbers, no file paths, no jargon, no hype. Prefer "We made checkout faster" over "Merged #1234
32
+ refactoring the Stripe webhook handler." Money in plain figures. Incidents in plain "what broke / is
33
+ it fixed" terms.
34
+
35
+ **In-the-moment sibling.** `soleur:operator-rephrase` applies this same register to a **single
36
+ message, synchronously**, when something just said did not land. It is not bound by the
37
+ business-consequence rule above — that rule is a digest rule. Use the digest weekly; use
38
+ `soleur:operator-rephrase` in the turn.
39
+
40
+ **Vocabulary (stop-list).** `knowledge-base/project/glossary.md` lists the internal words that must NOT reach the founder; each entry — or each sense of a multi-sense one — opens with the plain clause to translate into, and its path is for the agent only. The instruction is stated once in [glossary-format.md](../kb-glossary/references/glossary-format.md) §The consumer pointer.
41
+
42
+ ## Date window
43
+
44
+ The digest covers the **last 7 days**. Anchor to the checkout root and compute the window once at the start:
45
+
46
+ ```bash
47
+ cd "$GITHUB_WORKSPACE" # the filesystem sources below (§2 git log, §3 ls) are relative to the soleur checkout
48
+ SINCE="$(date -u -d '7 days ago' +%Y-%m-%d)"
49
+ ```
50
+
51
+ Use `$SINCE` for every source below.
52
+
53
+ ## Read-failure handling (never render a failure as a quiet week)
54
+
55
+ Each source command can FAIL — a cross-repo auth denial, a missing checkout, a transient error —
56
+ returning a non-zero exit and/or empty output. **A failed read is NOT a quiet week.** This is the
57
+ most important comprehension guardrail: the operator must never read "Nothing shipped" and believe a
58
+ busy week was quiet because a `gh` call silently 403'd.
59
+
60
+ For each section: if its source command exits **non-zero**, do NOT emit the section's "Nothing …"
61
+ fallback. Instead emit a clearly-labelled warning line for that section:
62
+
63
+ > ⚠️ Could not read \<source\> this week — a read FAILED (this is NOT a quiet week). See the run log.
64
+
65
+ Only emit the "Nothing …" fallback when the command **succeeded** and genuinely returned no rows.
66
+
67
+ ## Scope guardrails (load-bearing — do not weaken)
68
+
69
+ - **L1 — path scope.** Read ONLY the five named sources below. Any other file path is out of scope.
70
+ Do not wander the repository.
71
+ - **L2 — summaries only (the named-PII + customer-email control).** A regex cannot catch "Jane Doe".
72
+ - Incidents: build the section from each post-mortem's **frontmatter, title, and status ONLY —
73
+ never the post-mortem body.** The body contains customer names, raw logs, and trace detail that
74
+ must never reach the digest. If a **title or frontmatter** itself names a person, customer, or
75
+ company, summarize it generically ("an incident affecting a customer") rather than echoing the
76
+ name — title/frontmatter is author-controlled, so the named-PII control applies to it too.
77
+ - Money: emit **amounts and vendor names only.** Never echo the ledger's Notes column (it carries
78
+ contact emails, IPs, and account detail).
79
+ - Never copy a raw record, email address, IP, token, or log line into the digest. Summarize.
80
+ - **L3 — velocity metrics are aggregate-only (the shipping-cadence and cost-trend metrics below).**
81
+ Report **company-aggregate** figures only — one merge-pace band, one rounded run-rate figure. One
82
+ operator plus autonomous agents means a per-contributor or per-author breakdown is meaningless noise,
83
+ so **never add an `author` field to the §1 `gh pr list --json` list.** Both metrics suppress to a
84
+ neutral hedge on any read doubt, and both are stated as a business consequence — never a raw count, a
85
+ percentage, or an up/down arrow as the signal.
86
+
87
+ ## The five sections
88
+
89
+ ### 1. What your company built
90
+
91
+ Source: merged pull requests in the window.
92
+
93
+ ```bash
94
+ # Use the List API (NOT --search): --search routes to GitHub's Search API, which returns
95
+ # EMPTY for a cross-repo query under the in-action App-installation token (#3403 class) — it
96
+ # would silently render "Nothing shipped" every week. The List API works cross-repo (same path
97
+ # as the action-required read below). Filter by mergedAt >= $SINCE in your synthesis.
98
+ gh pr list -R jikig-ai/soleur --state merged --limit 300 \
99
+ --json title,labels,mergedAt,number,url
100
+ ```
101
+
102
+ (`number,url` are used ONLY by §5's substantiation links — never surface a PR
103
+ number in §1's prose; still no `author` field per L3.)
104
+
105
+ Keep only PRs whose `mergedAt` is on or after `$SINCE`. Rewrite each meaningful change into its
106
+ **business consequence** in plain language. Group related work. Drop pure chores/dependency bumps
107
+ unless they matter to the owner. No PR numbers, no paths.
108
+
109
+ **Shipping cadence (aggregate, comparison-framed).** Alongside the summary, judge how much your
110
+ company shipped **this week** against **recent weeks (roughly the last month)** using the same
111
+ `mergedAt` data — count only the *meaningful* merges (the same set you kept above; still drop pure
112
+ chore/dependency bumps), a merge count and never a code-size measure. Fold one qualitative band into
113
+ the prose — *clearly quieter than usual* / *about as much as a normal week* / *clearly busier than
114
+ usual* — stated as a consequence ("Your company shipped about as much as a normal week."). **When in
115
+ doubt, say "about the same."** Judge the band; never pin an exact ratio, a percentage, or an up/down
116
+ arrow, and never use the words "velocity", "throughput", or "cadence" in the output.
117
+
118
+ Degrade gracefully, and never alarm off a bad read:
119
+
120
+ - With fewer than a few weeks of history, default to "about the same" (or a plain "still getting
121
+ started" line) — never a confident band.
122
+ - If the §1 read FAILED (the ⚠️ warning above fired), OR the PR list hit the `--limit 300` cap across
123
+ the comparison window (a truncated read undercounts the prior weeks), OR this week reads suspiciously
124
+ empty, do **not** emit a definite band, and **never** emit the downward "quieter" band off a doubtful
125
+ read — render "about the same" or a one-line hedge instead. A silent undercount must never surface as
126
+ a confident "quieter than usual".
127
+
128
+ ### 2. Money & vendors
129
+
130
+ Source: changes to the expense ledger in the window.
131
+
132
+ ```bash
133
+ git log --since="$SINCE" -p -- knowledge-base/operations/expenses.md
134
+ ```
135
+
136
+ Report **new costs, cost changes, and vendor changes** as amounts + vendor names only. "Sentry went
137
+ from $29 to ~$40/mo." "No new vendors this week." Never reproduce the Notes column.
138
+
139
+ **Cost trend (this week's direction + a coarse run-rate).** After the raw changes above, add framing:
140
+
141
+ - **Direction (the primary, always-honest signal)** from the `git log -p` diff window: the real added
142
+ or changed *active* costs this week ("up ~$Y a month — added Resend Pro") or "no cost changes — spend
143
+ is holding steady." A row merely **recorded** in the diff at a non-active status (`deferred`,
144
+ `approved-not-billing`) is **not** a cost increase — do not report it as "cost up."
145
+ - **Coarse run-rate anchor (only when the ledger reads cleanly).** `Read` the current
146
+ `knowledge-base/operations/expenses.md` and sum the **Recurring** table's Amount,
147
+ counting **only** rows whose `status` is `active` (and `accruing` only when it carries a real
148
+ actual). This is a **fail-safe allowlist, not a denylist** — the rule is the catch-all, not a list
149
+ to maintain: any status that is not `active`/`accruing`-with-actual (`deferred` and
150
+ `approved-not-billing` are the common ones, but a future/unknown status counts too) is invisible to
151
+ the run-rate; an unrecognized status is excluded, never summed. Normalize known non-monthly rows (a
152
+ 2-year `.ai` registration, annual-billed rows) to a monthly figure. **Suppress the anchor entirely**
153
+ if any counted row's billing cadence is ambiguous — a mis-read annual row is a 12–24× error, the
154
+ exact false alarm this digest exists to prevent. When clean, hard-round to one coarse aggregate
155
+ figure: "recurring spend is roughly $X a month, mostly hosting and tooling." Emit **one aggregate
156
+ figure only** — never a per-row Notes value; read the **Recurring** table only (the One-Time table's
157
+ registration and credit rows must never enter the run-rate).
158
+ - If the `Read` of `expenses.md` **errors** (distinct from an empty ledger), suppress the anchor behind
159
+ the ⚠️ warning line — a failed read is NOT "spend holding steady."
160
+ - **First run:** an empty ledger read → "first reading — no cost trend yet," mirroring the
161
+ first-digest continuity pattern.
162
+
163
+ ### 3. What broke & whether it's fixed
164
+
165
+ Source: post-mortems (incident reports) dated in the window.
166
+
167
+ ```bash
168
+ ls knowledge-base/engineering/operations/post-mortems/*.md
169
+ ```
170
+
171
+ For each post-mortem whose **filename date** falls in the window, read **only its frontmatter +
172
+ title** (`title`, `date`, `status`). Emit one plain line per incident: what broke, and whether
173
+ `status` says it is `resolved`/`closed` or still open. **Never read or quote the post-mortem body.**
174
+
175
+ ### 4. Action needed from you
176
+
177
+ Source: open issues labelled `action-required` — but **triaged and de-polluted**, not a flat dump.
178
+ A flat list makes a 131-day chore look identical to a P0, and buries the genuine asks under
179
+ informational noise (#6836). Fetch age + labels so both become signals:
180
+
181
+ ```bash
182
+ gh issue list -R jikig-ai/soleur --label action-required --state open \
183
+ --json number,title,url,createdAt,labels --limit 100
184
+ ```
185
+
186
+ **Build the action list (de-pollute).** From the result, **EXCLUDE** any issue whose `labels`
187
+ include `decision-challenge`, `content-publisher`, or (`meta/machinery` **without** `action-required`) — the first two are
188
+ informational or structurally-dead per-piece chores that drown the genuine asks, and
189
+ `meta/machinery` is a finding about Soleur's own verification machinery rather than about
190
+ anything you receive. Excluding it is what makes the genuine product asks visible at all:
191
+ a 1,000-issue sample carried 626 `domain/engineering` against 39 `domain/product`.
192
+ **The `action-required` carve-out is load-bearing and matches the sweeper's precedence.**
193
+ `cron-stale-deferred-scope-outs.ts` treats `action-required` as never-auto-close, so an issue
194
+ carrying BOTH labels is preserved forever; excluding it here unconditionally would make it
195
+ preserved *and* invisible on your only comprehension surface — a permanent silent open issue.
196
+ The two consumers of one label must order it the same way. **Do NOT exclude the bare `content` label** — a human
197
+ (or another workflow) can attach `content` to a genuine ops emergency (e.g. a content-*pipeline*
198
+ outage), and excluding it would hide that emergency from your only comprehension surface while the
199
+ SLA cron correctly keeps it open and escalates it (it classifies bare `content` as an ops ask, never
200
+ a dead chore). **KEEP** `content-starvation` (a real standing "distribution pipeline empty" signal).
201
+ The survivors are the true "only you can do this" asks (expiring tokens, saturating disks, TLS/cert
202
+ state, infra capacity, stale CLA).
203
+
204
+ **Sort and surface age.** Sort survivors by priority (`priority/p0-critical` > `priority/p1-high` >
205
+ `priority/p2-medium` > `priority/p3-low` > none), then oldest-first. Compute each issue's **age in
206
+ days** from `createdAt`. Lead with a bold "🔴 Open longest / needs your attention" line naming the
207
+ 1–3 oldest survivors with their age (e.g. "#4375 — 58 days"). Then recap each remaining survivor as
208
+ a plain "what needs you to act" line with its age and link. **Cap the action list at 8**; if more
209
+ remain, end with "+N more open — see the `action-required` label." Read-only recap — do **not**
210
+ mutate, close, or comment on any issue.
211
+
212
+ **Decisions flagged for your awareness (separate block, not the action list).** SEPARATELY, list
213
+ open issues labelled `decision-challenge` under a distinct sub-heading **"Decisions flagged for
214
+ your awareness (informational, not blocking)"** — capped at 5 with "+N more" — so they stay visible
215
+ without diluting the action list above.
216
+
217
+ **Automatic recoveries (same separate block).** Also list open issues labelled
218
+ `infra-config-recovery-notice` there. These record a production write the system made on its own
219
+ and then verified — no action is needed, which is exactly why they must NOT carry
220
+ `action-required`: labelling a self-heal as an ask spends the P1 channel's credibility on a
221
+ success. But an unattended write to the server's sole remote-repair channel is worth the founder
222
+ knowing about, and without this line the digest — their only comprehension surface — never
223
+ mentions it at all. One line each, naming how many times it has recurred.
224
+
225
+ ### 5. What got smarter this week
226
+
227
+ Source: the self-improvements Soleur's compounding loop **completed** in the window — the promotion
228
+ PRs it merged into how your agents work. **Reuse §1's already-fetched merged-PR list — do NOT run
229
+ another `gh` call, and NEVER `--search`** (the Search API returns empty cross-repo under the
230
+ in-action App token, exactly as noted in §1; a `--search` here would silently render "nothing got
231
+ smarter" every week). From §1's list, keep only PRs whose `labels` contains `self-healing/auto`
232
+ **and** whose `mergedAt` is on or after `$SINCE`. Production shape: title
233
+ `self-healing(auto): promote cluster <hash> <date>`, label `self-healing/auto`.
234
+
235
+ Render as a **platform-level outcome, framed for the operator** — the improvement is to the shared
236
+ Soleur harness (the rules and skills every workspace runs on), not to any one workspace's data:
237
+ "Soleur got sharper this week — N improvements shipped to the shared brain your agents run on."
238
+ Add a compact `Details:` line linking each kept PR (its `url`) as substantiation. Do **not** invent
239
+ a per-item description from the cluster-hash title — it carries no human summary, and reading a PR
240
+ body to synthesize one would violate L2 (summaries only). The count plus the links is the honest
241
+ claim; the link is the drill-in path.
242
+
243
+ **Never write "your workspace got smarter"** — that phrasing implies a per-tenant benefit the loop
244
+ does not produce (improvements are global harness edits). Because §5 reuses §1's read, a §1 read
245
+ FAILURE (the ⚠️ warning) suppresses §5 too — do not render a "nothing" line off a failed read.
246
+
247
+ ## Deterministic fallback (never blank)
248
+
249
+ A quiet week is itself information. **Even an all-empty week still posts.** If a source yields nothing
250
+ in the window, write the section's labelled fallback line — **never leave a section blank**:
251
+
252
+ - Section 1 → "Nothing shipped this week."
253
+ - Section 2 → "No money or vendor changes this week."
254
+ - Section 3 → "Nothing broke this week."
255
+ - Section 4 → "Nothing needs your attention this week."
256
+ - Section 5 → "Nothing was promoted to the shared harness this week."
257
+
258
+ Every section must contain at least one full sentence. A blank or byte-for-byte command-dump section
259
+ is a failure.
260
+
261
+ ## Prior-week continuity
262
+
263
+ Find the most recent prior digest issue and reference it so a skipped week is visible:
264
+
265
+ ```bash
266
+ # List API, NOT --search (same Search-API-empty-under-App-token reason as section 1): list this
267
+ # repo's recent issues and pick the most recent whose title starts with "Digest:". A false-empty
268
+ # from --search would break the liveness loop — every week would falsely read "first digest".
269
+ gh issue list -R jikig-ai/operator-digest --state all \
270
+ --json number,title --limit 20
271
+ ```
272
+
273
+ From that list, take the highest-numbered issue whose title begins with `Digest:` (ignore the
274
+ withheld-notice issues) and add a final line to the digest: **"Last week: #N"**. If no prior digest
275
+ issue exists, write "Last week: (this is the first digest)." A missing prior-week back-reference is
276
+ the operator-visible signal that a week was skipped.
277
+
278
+ ## Output
279
+
280
+ Write the assembled digest to `$GITHUB_WORKSPACE/digest.md`:
281
+
282
+ - A short title line: `# Weekly digest: <ISO week or date range>`.
283
+ - The five `##` sections above, in order, each with prose (or its fallback line).
284
+ - The final `Last week: #N` continuity line.
285
+
286
+ Then **STOP**. Do not open, post, or create any issue — the gated workflow post-step owns publishing.
287
+ Writing `digest.md` and stopping is the entire job of this skill.
@@ -0,0 +1,175 @@
1
+ # Operator weekly comprehension digest — workflow asset (#5085).
2
+ #
3
+ # THIS FILE IS INERT IN soleur. It is committed here (in the PUBLIC repo) so the
4
+ # brand-critical workflow gets multi-agent review, but it MUST NOT be placed under
5
+ # soleur's own .github/workflows/ — that would run it in PUBLIC Actions logs and leak
6
+ # the operator's private data. The provisioning script installs it into the PRIVATE
7
+ # jikig-ai/operator-digest repo, where both the logs and the digest issues stay private.
8
+ #
9
+ # Containment boundary (do not weaken — see plan §User-Brand Impact L1-L4):
10
+ # - The agent reads public soleur, synthesizes prose, writes $GITHUB_WORKSPACE/digest.md, STOPS.
11
+ # - The agent's allowlist has NO `gh issue create` — a prompt-injection in any read source
12
+ # cannot make the model post. Only the deterministic post-step posts.
13
+ # - The scrub gate (digest-scrub.sh) runs as a GHA run: step OUTSIDE the action — an in-prompt
14
+ # `exit 1` is swallowed (conclusion still reads success), so the gate must live here.
15
+ # - On a scrub abort the post-step posts a CONTENT-FREE withheld notice (a withhold is visible,
16
+ # not a silent absence), then removes the plaintext digest.
17
+
18
+ name: "Operator weekly digest"
19
+
20
+ on:
21
+ schedule:
22
+ # Fridays 13:00 UTC. GitHub Actions cron has ~15-minute variance.
23
+ - cron: '0 13 * * 5'
24
+ workflow_dispatch: {}
25
+
26
+ concurrency:
27
+ group: operator-digest
28
+ cancel-in-progress: false
29
+
30
+ # Least-privilege: the data source (public soleur) needs no grant; we only write issues
31
+ # to this private repo. id-token: write is required by claude-code-action's OIDC handshake.
32
+ permissions:
33
+ contents: read
34
+ issues: write
35
+ id-token: write
36
+
37
+ jobs:
38
+ digest:
39
+ runs-on: ubuntu-latest
40
+ timeout-minutes: 20
41
+ steps:
42
+ - name: Checkout public soleur (data source)
43
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
44
+ with:
45
+ repository: jikig-ai/soleur
46
+ fetch-depth: 0
47
+ # The data source is PUBLIC — no token needed. Do not persist the workflow's
48
+ # own credentials into the checkout (it is not soleur's repo).
49
+ persist-credentials: false
50
+
51
+ # show_full_output is deliberately OFF (absent). The flag leaks ALL tool execution
52
+ # results — which here include private financial/incident data — into the run logs.
53
+ - name: Synthesize digest
54
+ uses: anthropics/claude-code-action@ab8b1e6471c519c585ba17e8ecaccc9d83043541 # v1.0.101
55
+ env:
56
+ # Align both token contexts so the in-action cross-repo `gh` read does not
57
+ # silently 403/return-empty under the App-installation token (#3403).
58
+ GH_TOKEN: ${{ github.token }}
59
+ with:
60
+ anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
61
+ github_token: ${{ secrets.GITHUB_TOKEN }}
62
+ plugin_marketplaces: 'https://github.com/jikig-ai/soleur-marketplace.git'
63
+ plugins: 'soleur@soleur-marketplace'
64
+ # The allowlist deliberately OMITS `gh issue create`: the agent CANNOT post.
65
+ # It may read PRs/issues and git log, and write files (digest.md) only.
66
+ claude_args: >-
67
+ --max-turns 30
68
+ --allowedTools Write,Read,Glob,Grep,Bash(date:*),Bash(ls:*),Bash(gh pr list:*),Bash(gh issue list:*),Bash(git log:*)
69
+ prompt: |
70
+ Run /soleur:operator-digest on the checked-out jikig-ai/soleur repository.
71
+ Read the five sources, synthesize the five plain-language sections, and write the
72
+ digest to $GITHUB_WORKSPACE/digest.md. STOP after writing the file — do not post,
73
+ open, or create any issue. The workflow's post-step owns publishing.
74
+
75
+ - name: Scrub gate (fail-closed) then post
76
+ env:
77
+ GH_TOKEN: ${{ github.token }}
78
+ GH_RUN_ID: ${{ github.run_id }}
79
+ OPERATOR_GH_LOGIN: ${{ vars.OPERATOR_GH_LOGIN }}
80
+ run: |
81
+ set -uo pipefail
82
+ DIGEST="$GITHUB_WORKSPACE/digest.md"
83
+ SCRUB="$GITHUB_WORKSPACE/plugins/soleur/skills/operator-digest/scripts/digest-scrub.sh"
84
+ ISO_WEEK="$(date -u +%G-W%V)"
85
+
86
+ if [[ ! -f "$DIGEST" ]]; then
87
+ echo "the digest file was not produced by the synthesis step — failing the run" >&2
88
+ exit 1
89
+ fi
90
+
91
+ # Delivery, not production, was the failure mode. This workflow ran
92
+ # correctly for months (active cron, 7/8 successful runs, correct
93
+ # query, the action-required backlog surfaced >=5 consecutive weeks)
94
+ # and nobody saw it: the digest posts to a PRIVATE repo with ZERO
95
+ # subscribers, so an issue create notifies no one. That is why 130
96
+ # days of action-required accumulation never surfaced through the
97
+ # very section built to surface it.
98
+ #
99
+ # --assignee is the fix: assignment notifies unconditionally and does
100
+ # not depend on watch state. The repo-subscription API is NOT used —
101
+ # this token lacks the `notifications` scope (measured, not assumed).
102
+ #
103
+ # Fail LOUD if the variable is unset. A digest that silently posts to
104
+ # nobody is the exact defect being repaired; degrading quietly back
105
+ # into it would make this change a no-op that looks like a fix.
106
+ if [[ -z "${OPERATOR_GH_LOGIN:-}" ]]; then
107
+ echo "OPERATOR_GH_LOGIN repo variable is unset — the digest would post to nobody." >&2
108
+ echo "Set it with: gh variable set OPERATOR_GH_LOGIN -R jikig-ai/operator-digest --body '<login>'" >&2
109
+ exit 1
110
+ fi
111
+
112
+ # The scrub is a deterministic post-step OUTSIDE the action. A non-zero exit means a
113
+ # secret / foreign email / grep error was found: post a CONTENT-FREE withheld notice
114
+ # (zero source-derived content) so the withhold is operator-visible, not silent.
115
+ if bash "$SCRUB" "$DIGEST"; then
116
+ gh issue create -R jikig-ai/operator-digest \
117
+ --assignee "${OPERATOR_GH_LOGIN}" \
118
+ --title "Digest: ${ISO_WEEK}" \
119
+ --body-file "$DIGEST"
120
+ else
121
+ gh issue create -R jikig-ai/operator-digest \
122
+ --assignee "${OPERATOR_GH_LOGIN}" \
123
+ --title "Digest withheld: ${ISO_WEEK}" \
124
+ --body "This week's digest was withheld by the safety scrub; a value matched a safety pattern (a secret, a foreign email, or a scan error). No data is shown. See run ${GH_RUN_ID}."
125
+ fi
126
+
127
+ # No durable plaintext copy: remove the file regardless of which branch posted.
128
+ rm -f "$DIGEST"
129
+
130
+ # A SUCCESSFUL run auto-resolves any standing "digest FAILED" self-report (below),
131
+ # mirroring the content-starvation auto-file/auto-close pattern.
132
+ - name: Resolve prior failure self-report on success
133
+ if: success()
134
+ env:
135
+ GH_TOKEN: ${{ github.token }}
136
+ run: |
137
+ set -uo pipefail
138
+ FAIL_TITLE="⚠️ Weekly digest run FAILED — you did not get a digest this week"
139
+ EXISTING="$(gh issue list -R jikig-ai/operator-digest --state open \
140
+ --json number,title --limit 30 \
141
+ --jq "[.[] | select(.title == \"${FAIL_TITLE}\")][0].number // empty")"
142
+ if [[ -n "$EXISTING" ]]; then
143
+ gh issue close "$EXISTING" -R jikig-ai/operator-digest \
144
+ --comment "The weekly digest ran successfully again — auto-resolving this failure notice."
145
+ fi
146
+
147
+ # A FAILED run is itself a SILENT ABSENCE: the operator simply gets no digest that week
148
+ # and never learns the pipeline broke (the 2026-06-26 and 2026-07-20 runs failed with
149
+ # nobody notified). Self-report — loud, assigned — so a broken digest is visible, exactly
150
+ # like the delivery fix above. Idempotent: one standing open issue, commented on re-fail.
151
+ - name: Self-report on digest failure
152
+ if: failure()
153
+ env:
154
+ GH_TOKEN: ${{ github.token }}
155
+ GH_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
156
+ OPERATOR_GH_LOGIN: ${{ vars.OPERATOR_GH_LOGIN }}
157
+ run: |
158
+ set -uo pipefail
159
+ FAIL_TITLE="⚠️ Weekly digest run FAILED — you did not get a digest this week"
160
+ EXISTING="$(gh issue list -R jikig-ai/operator-digest --state open \
161
+ --json number,title --limit 30 \
162
+ --jq "[.[] | select(.title == \"${FAIL_TITLE}\")][0].number // empty")"
163
+ if [[ -n "$EXISTING" ]]; then
164
+ gh issue comment "$EXISTING" -R jikig-ai/operator-digest \
165
+ --body "The weekly digest run FAILED again — still no digest this week. Run: ${GH_RUN_URL}"
166
+ else
167
+ # Tolerate an unset OPERATOR_GH_LOGIN here: filing UNASSIGNED still beats a silent
168
+ # absence (the whole point of this step). Assign when the variable is present.
169
+ ASSIGN=()
170
+ [[ -n "${OPERATOR_GH_LOGIN:-}" ]] && ASSIGN=(--assignee "${OPERATOR_GH_LOGIN}")
171
+ gh issue create -R jikig-ai/operator-digest \
172
+ "${ASSIGN[@]}" \
173
+ --title "$FAIL_TITLE" \
174
+ --body "The Operator weekly digest workflow FAILED — no digest was produced or posted this week. This is a self-report so the failure is not a silent absence. See run ${GH_RUN_URL}. Auto-resolves on the next successful run."
175
+ fi
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env bash
2
+ # Tuned fail-closed scrub gate for the operator weekly digest (#5085, plan §L3).
3
+ #
4
+ # Runs as a deterministic GitHub Actions post-step on the rendered digest.md,
5
+ # BEFORE the issue is posted. It is DISTINCT from incident/redact-sentinel.sh:
6
+ # that gate is tuned for human-reviewed PIRs and aborts on email/UUID/IPv4 — which
7
+ # would silently kill a business digest on benign first-party content (ops@jikigai.com
8
+ # is in the ledger) while still missing named PII. This gate is tuned for the
9
+ # digest's content profile: abort on true secrets, abort on a FOREIGN email
10
+ # (the customer-email leak class), but only WARN on UUID/IPv4 (legitimate in prose).
11
+ # Named PII ("Jane Doe") cannot be caught by a regex — that control is upstream
12
+ # (the skill emits incident SUMMARIES from PIR frontmatter/title only, never bodies).
13
+ #
14
+ # Exit codes:
15
+ # 0 = clean — no abort-class match (UUID/IPv4/first-party-email warns are allowed)
16
+ # 1 = abort — a secret, a foreign email, OR a grep error (real fail-closed)
17
+ # 2 = invalid arguments — missing or unreadable file
18
+ #
19
+ # Output is meta-redacted (never the full token), mirroring redact-sentinel.sh.
20
+ set -uo pipefail
21
+
22
+ if [[ $# -ne 1 ]]; then
23
+ echo "usage: digest-scrub.sh <path-to-digest.md>" >&2
24
+ exit 2
25
+ fi
26
+ FILE="$1"
27
+ if [[ ! -r "${FILE}" ]]; then
28
+ echo "digest-scrub: file not readable: ${FILE}" >&2
29
+ exit 2
30
+ fi
31
+
32
+ # First-party email domains: a digest summarizing the operator's own ledger legitimately
33
+ # names the operator's own contact address. A foreign domain in the digest is the
34
+ # customer-email leak class and MUST abort.
35
+ FIRST_PARTY_DOMAINS=(jikigai.com soleur.ai)
36
+
37
+ # Secret classes — any match ABORTS. Class-name set + bodies synced with redact-engine.py
38
+ # 2026-07-06 (#6045); NAME-level parity is CI-enforced by plugins/soleur/test/redact-class-parity.test.sh.
39
+ # Regex-BODY parity is a named non-goal (ERE here vs Python `re` in the engine — not cheaply
40
+ # comparable); bodies below are a superset of the engine's shared classes as of the sync date and
41
+ # pattern edits get manual cross-review. The engine's email/UUID/IPv4 classes are handled OUTSIDE
42
+ # this map (email via first-party domain logic below; UUID/IPv4 as WARN-only), so the parity guard
43
+ # allowlists them.
44
+ declare -A SECRET=(
45
+ [JWT]='eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}'
46
+ [stripe_key]='\b(sk|pk|rk)_(live|test)_[A-Za-z0-9]{16,}\b'
47
+ [stripe_whsec]='\bwhsec_[A-Za-z0-9]{16,}\b'
48
+ [stripe_acct]='\bacct_[A-Za-z0-9]{16,}\b'
49
+ [stripe_cust_pi_seti_sub_in]='\b(cus|pi|seti|sub|in)_[A-Za-z0-9]{14,}\b'
50
+ [env_var]='\b(DOPPLER|SENTRY|STRIPE|SUPABASE|OPENAI|ANTHROPIC|GITHUB|VERCEL|CLOUDFLARE|HETZNER|FLAGSMITH|RESEND|TAILSCALE)_[A-Z_]+=[^[:space:]]+'
51
+ [github_token]='\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9._~+/=-]{30,}|\bgithub_pat_[A-Za-z0-9._~+/=-]{20,}'
52
+ [anthropic_key]='\bsk-ant-[A-Za-z0-9_-]{32,}\b'
53
+ [openai_key]='\bsk-(proj-)?[A-Za-z0-9_-]{20,}\b'
54
+ [supabase_pat]='\bsbp_[a-z0-9]{20,}\b|\b(sb_secret|sb_publishable)_[A-Za-z0-9]{20,}\b'
55
+ [pem_private_key]='-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----'
56
+ [doppler_token]='\bdp\.(st|pt|ct|sa|scim|audit)\.[A-Za-z0-9._-]{16,}'
57
+ [slack_token]='\bxox[baprsce]-[A-Za-z0-9-]{10,}'
58
+ )
59
+ SECRET_ORDER=(JWT stripe_key stripe_whsec stripe_acct stripe_cust_pi_seti_sub_in env_var github_token anthropic_key openai_key supabase_pat pem_private_key doppler_token slack_token)
60
+
61
+ EMAIL_RE='\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b'
62
+ UUID_RE='\b[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\b'
63
+ IPV4_RE='\b(([0-9]{1,3})\.){3}[0-9]{1,3}\b'
64
+
65
+ abort=0
66
+
67
+ emit() { printf 'digest-scrub %s: %s\n' "$1" "$2" >&2; }
68
+
69
+ # scan_secret <class> <pattern> — abort on any match; abort on grep error (fail-closed).
70
+ scan_secret() {
71
+ local class="$1" pattern="$2" out
72
+ # INVARIANT: `local rc=$?` MUST be the statement immediately after the grep assignment.
73
+ # Anything between them (even another `local`) resets $? to that statement's exit (0) and
74
+ # silently defeats the grep-error fail-closed path. Do not insert code here.
75
+ out="$(grep -oE -e "$pattern" "$FILE")"
76
+ local rc=$?
77
+ if (( rc >= 2 )); then
78
+ emit ABORT "grep error (rc=$rc) scanning ${class} — fail-closed"
79
+ abort=1
80
+ return
81
+ fi
82
+ if (( rc == 0 )) && [[ -n "$out" ]]; then
83
+ emit ABORT "secret-class ${class} matched (post withheld)"
84
+ abort=1
85
+ fi
86
+ }
87
+
88
+ for class in "${SECRET_ORDER[@]}"; do
89
+ scan_secret "$class" "${SECRET[$class]}"
90
+ done
91
+
92
+ # Email: abort on a FOREIGN domain; warn (allow) on first-party.
93
+ emails="$(grep -oE -e "$EMAIL_RE" "$FILE")"; erc=$?
94
+ if (( erc >= 2 )); then
95
+ emit ABORT "grep error (rc=$erc) scanning email — fail-closed"; abort=1
96
+ elif (( erc == 0 )); then
97
+ while IFS= read -r addr; do
98
+ [[ -z "$addr" ]] && continue
99
+ domain="${addr##*@}"; domain="${domain,,}"
100
+ first_party=0
101
+ for d in "${FIRST_PARTY_DOMAINS[@]}"; do [[ "$domain" == "$d" ]] && first_party=1 && break; done
102
+ if (( first_party )); then
103
+ emit WARN "first-party email (${domain}) — allowed"
104
+ else
105
+ emit ABORT "foreign email domain (${domain}) — possible customer PII"
106
+ abort=1
107
+ fi
108
+ done <<< "$emails"
109
+ fi
110
+
111
+ # UUID / IPv4: WARN only (legitimate in incident/build prose). grep error still aborts.
112
+ for pair in "UUID:${UUID_RE}" "IPv4:${IPV4_RE}"; do
113
+ cls="${pair%%:*}"; pat="${pair#*:}"
114
+ out="$(grep -oE -e "$pat" "$FILE")"; rc=$?
115
+ if (( rc >= 2 )); then emit ABORT "grep error (rc=$rc) scanning ${cls} — fail-closed"; abort=1
116
+ elif (( rc == 0 )) && [[ -n "$out" ]]; then emit WARN "${cls} present in prose — allowed (not a secret)"; fi
117
+ done
118
+
119
+ exit "$abort"