@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.
- package/.claude-plugin/agents.manifest.json +476 -0
- package/.claude-plugin/plugin.json +42 -0
- package/README.md +44 -2
- package/agents/community/.gitkeep +0 -0
- package/agents/engineering/cto.md +87 -0
- package/agents/engineering/design/ddd-architect.md +95 -0
- package/agents/engineering/discovery/agent-finder.md +214 -0
- package/agents/engineering/discovery/functional-discovery.md +182 -0
- package/agents/engineering/infra/infra-security.md +151 -0
- package/agents/engineering/infra/platform-strategist.md +109 -0
- package/agents/engineering/infra/terraform-architect.md +171 -0
- package/agents/engineering/prompt-engineer.md +37 -0
- package/agents/engineering/research/best-practices-researcher.md +115 -0
- package/agents/engineering/research/framework-docs-researcher.md +93 -0
- package/agents/engineering/research/git-history-analyzer.md +53 -0
- package/agents/engineering/research/learnings-researcher.md +285 -0
- package/agents/engineering/research/repo-research-analyst.md +118 -0
- package/agents/engineering/review/agent-native-reviewer.md +279 -0
- package/agents/engineering/review/architecture-strategist.md +61 -0
- package/agents/engineering/review/code-quality-analyst.md +92 -0
- package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
- package/agents/engineering/review/data-integrity-guardian.md +82 -0
- package/agents/engineering/review/data-migration-expert.md +98 -0
- package/agents/engineering/review/deployment-verification-agent.md +183 -0
- package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
- package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
- package/agents/engineering/review/legacy-code-expert.md +55 -0
- package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
- package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
- package/agents/engineering/review/performance-oracle.md +130 -0
- package/agents/engineering/review/security-sentinel.md +167 -0
- package/agents/engineering/review/semgrep-sast.md +36 -0
- package/agents/engineering/review/test-design-reviewer.md +150 -0
- package/agents/engineering/review/user-impact-reviewer.md +70 -0
- package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
- package/agents/finance/budget-analyst.md +29 -0
- package/agents/finance/cfo.md +44 -0
- package/agents/finance/financial-reporter.md +30 -0
- package/agents/finance/revenue-analyst.md +30 -0
- package/agents/legal/clo.md +115 -0
- package/agents/legal/legal-compliance-auditor.md +110 -0
- package/agents/legal/legal-document-generator.md +134 -0
- package/agents/marketing/analytics-analyst.md +25 -0
- package/agents/marketing/brand-architect.md +181 -0
- package/agents/marketing/cmo.md +76 -0
- package/agents/marketing/conversion-optimizer.md +19 -0
- package/agents/marketing/copywriter.md +20 -0
- package/agents/marketing/fact-checker.md +70 -0
- package/agents/marketing/growth-strategist.md +145 -0
- package/agents/marketing/paid-media-strategist.md +28 -0
- package/agents/marketing/pricing-strategist.md +17 -0
- package/agents/marketing/programmatic-seo-specialist.md +25 -0
- package/agents/marketing/retention-strategist.md +23 -0
- package/agents/marketing/seo-aeo-analyst.md +164 -0
- package/agents/operations/coo.md +50 -0
- package/agents/operations/ops-advisor.md +78 -0
- package/agents/operations/ops-provisioner.md +101 -0
- package/agents/operations/ops-research.md +52 -0
- package/agents/operations/service-automator.md +278 -0
- package/agents/product/business-validator.md +206 -0
- package/agents/product/competitive-intelligence.md +89 -0
- package/agents/product/cpo.md +63 -0
- package/agents/product/design/ux-design-lead.md +209 -0
- package/agents/product/spec-flow-analyzer.md +122 -0
- package/agents/sales/cro.md +44 -0
- package/agents/sales/deal-architect.md +29 -0
- package/agents/sales/outbound-strategist.md +29 -0
- package/agents/sales/pipeline-analyst.md +29 -0
- package/agents/support/cco.md +48 -0
- package/agents/support/community-manager.md +570 -0
- package/agents/support/ticket-triage.md +70 -0
- package/bin/soleur-opencode.js +29 -0
- package/commands/go.md +660 -0
- package/commands/help.md +273 -0
- package/commands/sync.md +977 -0
- package/commands/version.md +103 -0
- package/hooks/antigravity-hooks.json +84 -0
- package/hooks/antigravity-session-start.sh +15 -0
- package/hooks/bare-root-cwd-guard.sh +131 -0
- package/hooks/browser-snapshot-credential-guard.sh +200 -0
- package/hooks/codex-session-start.sh +9 -0
- package/hooks/compaction-state.sh +525 -0
- package/hooks/destructive-command-guard.sh +1387 -0
- package/hooks/devin-session-start.sh +90 -0
- package/hooks/ext-filter-detect.sh +171 -0
- package/hooks/hooks.json +133 -0
- package/hooks/lib/hook-tool-kind.sh +24 -0
- package/hooks/lib/log-rotation.sh +176 -0
- package/hooks/lib/shell-argv.pl +576 -0
- package/hooks/memory-backstop.sh +1114 -0
- package/hooks/operator-stage-approval.sh +391 -0
- package/hooks/stop-hook.sh +367 -0
- package/hooks/unkept-promise-hook.sh +383 -0
- package/hooks/version-banner.sh +127 -0
- package/hooks/welcome-hook.sh +50 -0
- package/install.js +29 -0
- package/lib/agent-registry.ts +154 -0
- package/lib/c4-canonical-cli.mjs +34 -0
- package/lib/c4-canonical.mjs +46 -0
- package/lib/c4-from-components.ts +554 -0
- package/lib/go-routing.ts +81 -0
- package/lib/grok-inspect-contract.ts +311 -0
- package/lib/harness-model-map.ts +101 -0
- package/lib/harness-parity.ts +726 -0
- package/lib/harness-tool-map.ts +180 -0
- package/lib/harness.ts +716 -0
- package/lib/heartbeat-live-reconcile.ts +1153 -0
- package/lib/heartbeat-manifest.ts +361 -0
- package/lib/kb-coverage.ts +252 -0
- package/lib/pr-merge-poll.ts +103 -0
- package/lib/workflow-fidelity.ts +388 -0
- package/opencode/INSTRUCTIONS.md +171 -0
- package/opencode/agents/engineering/cto.md +10 -0
- package/opencode/agents/engineering/design/ddd-architect.md +10 -0
- package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
- package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
- package/opencode/agents/engineering/infra/infra-security.md +10 -0
- package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
- package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
- package/opencode/agents/engineering/prompt-engineer.md +10 -0
- package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
- package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
- package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
- package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
- package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
- package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
- package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
- package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
- package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
- package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
- package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
- package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
- package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
- package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
- package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
- package/opencode/agents/engineering/review/performance-oracle.md +10 -0
- package/opencode/agents/engineering/review/security-sentinel.md +10 -0
- package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
- package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
- package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
- package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
- package/opencode/agents/finance/budget-analyst.md +10 -0
- package/opencode/agents/finance/cfo.md +10 -0
- package/opencode/agents/finance/financial-reporter.md +10 -0
- package/opencode/agents/finance/revenue-analyst.md +10 -0
- package/opencode/agents/legal/clo.md +10 -0
- package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
- package/opencode/agents/legal/legal-document-generator.md +10 -0
- package/opencode/agents/marketing/analytics-analyst.md +10 -0
- package/opencode/agents/marketing/brand-architect.md +10 -0
- package/opencode/agents/marketing/cmo.md +10 -0
- package/opencode/agents/marketing/conversion-optimizer.md +10 -0
- package/opencode/agents/marketing/copywriter.md +10 -0
- package/opencode/agents/marketing/fact-checker.md +10 -0
- package/opencode/agents/marketing/growth-strategist.md +10 -0
- package/opencode/agents/marketing/paid-media-strategist.md +10 -0
- package/opencode/agents/marketing/pricing-strategist.md +10 -0
- package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
- package/opencode/agents/marketing/retention-strategist.md +10 -0
- package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
- package/opencode/agents/operations/coo.md +10 -0
- package/opencode/agents/operations/ops-advisor.md +10 -0
- package/opencode/agents/operations/ops-provisioner.md +10 -0
- package/opencode/agents/operations/ops-research.md +10 -0
- package/opencode/agents/operations/service-automator.md +10 -0
- package/opencode/agents/product/business-validator.md +10 -0
- package/opencode/agents/product/competitive-intelligence.md +10 -0
- package/opencode/agents/product/cpo.md +10 -0
- package/opencode/agents/product/design/ux-design-lead.md +10 -0
- package/opencode/agents/product/spec-flow-analyzer.md +10 -0
- package/opencode/agents/sales/cro.md +10 -0
- package/opencode/agents/sales/deal-architect.md +10 -0
- package/opencode/agents/sales/outbound-strategist.md +10 -0
- package/opencode/agents/sales/pipeline-analyst.md +10 -0
- package/opencode/agents/support/cco.md +10 -0
- package/opencode/agents/support/community-manager.md +10 -0
- package/opencode/agents/support/ticket-triage.md +10 -0
- package/opencode/commands/go.md +10 -0
- package/opencode/commands/help.md +10 -0
- package/opencode/commands/sync.md +10 -0
- package/opencode/commands/version.md +11 -0
- package/opencode/opencode.json +8 -0
- package/opencode/plugin.ts +818 -0
- package/package.json +36 -4
- package/scripts/admin-merge-ready.sh +545 -0
- package/scripts/admin-merge-ready.test.sh +753 -0
- package/scripts/affected-tests.sh +908 -0
- package/scripts/affected-tests.test.sh +1797 -0
- package/scripts/alpha-metrics.sh +78 -0
- package/scripts/alpha-metrics.test.sh +115 -0
- package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
- package/scripts/audit-flag-flip.sh +107 -0
- package/scripts/check-red-on-main.sh +316 -0
- package/scripts/ci-head-verdict.sh +411 -0
- package/scripts/cloud-detect.sh +193 -0
- package/scripts/delegation-verify.sh +657 -0
- package/scripts/delegation-verify.test.sh +1424 -0
- package/scripts/deploy-arm.sh +475 -0
- package/scripts/domain-model-drift.sh +419 -0
- package/scripts/emit-decision.sh +144 -0
- package/scripts/emit-decision.test.sh +144 -0
- package/scripts/ext-filter-divergence-corpus.txt +15 -0
- package/scripts/ext-filter-divergence.sh +189 -0
- package/scripts/generate-c4-from-components.ts +442 -0
- package/scripts/grok-fidelity-gate.sh +68 -0
- package/scripts/grok-pre-push-gate.sh +232 -0
- package/scripts/harness-discovery-smoke.ts +906 -0
- package/scripts/harness-parity-census.ts +92 -0
- package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
- package/scripts/install-opencode-adapter.ts +509 -0
- package/scripts/lib/affected-tests/common.sh +365 -0
- package/scripts/lib/affected-tests/go.sh +157 -0
- package/scripts/lib/affected-tests/js.sh +188 -0
- package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
- package/scripts/lib/affected-tests/python.sh +185 -0
- package/scripts/lib/context-sanitize.sh +49 -0
- package/scripts/lib/domain-model-lib.sh +180 -0
- package/scripts/lib/ext-filter-grammar.tsv +34 -0
- package/scripts/lib/operator-script.sh +1236 -0
- package/scripts/lib/proc.sh +580 -0
- package/scripts/lib/session-state.sh +748 -0
- package/scripts/lib/tmp-classify.sh +843 -0
- package/scripts/lib/wrapper-boundary.sh +47 -0
- package/scripts/lint-ratchet.py +1547 -0
- package/scripts/monitor-pr-checks.sh +441 -0
- package/scripts/pipeline-tally.sh +756 -0
- package/scripts/pipeline-tally.test.sh +740 -0
- package/scripts/plugin-version.sh +528 -0
- package/scripts/precommit-guard.sh +115 -0
- package/scripts/precommit-guard.test.sh +254 -0
- package/scripts/reconcile-live-heartbeats.ts +705 -0
- package/scripts/render-c4-model.sh +217 -0
- package/scripts/resolve-git-root.sh +55 -0
- package/scripts/resolve-regenerable-conflicts.sh +363 -0
- package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
- package/scripts/ruff-requirements.txt +22 -0
- package/scripts/run-in-pid-namespace.sh +98 -0
- package/scripts/run-in-pid-namespace.test.sh +290 -0
- package/scripts/scan-ancestor-signal-helpers.py +556 -0
- package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
- package/scripts/setup-ralph-loop.sh +238 -0
- package/scripts/sync-cursor-name-map.ts +316 -0
- package/scripts/sync-grok-agent-compat.ts +188 -0
- package/scripts/sync-npm-package.ts +165 -0
- package/scripts/sync-opencode-adapter.ts +498 -0
- package/scripts/sync-pr-behind.sh +647 -0
- package/scripts/sync-pr-behind.test.sh +252 -0
- package/scripts/taste-profile-update.sh +180 -0
- package/scripts/taste-profile-update.test.sh +167 -0
- package/scripts/write-budget-marker.sh +23 -0
- package/scripts/write-kb-coverage.ts +113 -0
- package/skills/admin-ip-refresh/SKILL.md +81 -0
- package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
- package/skills/agent-browser/SKILL.md +698 -0
- package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
- package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
- package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
- package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
- package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
- package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
- package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
- package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
- package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
- package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
- package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
- package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
- package/skills/agent-native-architecture/SKILL.md +479 -0
- package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
- package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
- package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
- package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
- package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
- package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
- package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
- package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
- package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
- package/skills/agent-native-architecture/references/product-implications.md +478 -0
- package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
- package/skills/agent-native-architecture/references/self-modification.md +294 -0
- package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
- package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
- package/skills/agent-native-audit/SKILL.md +300 -0
- package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
- package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
- package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
- package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
- package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
- package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
- package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
- package/skills/architecture/SKILL.md +436 -0
- package/skills/architecture/references/adr-template.md +154 -0
- package/skills/architecture/references/likec4-reference.md +136 -0
- package/skills/architecture/references/nfr-reference.md +126 -0
- package/skills/archive-kb/SKILL.md +86 -0
- package/skills/archive-kb/scripts/archive-kb.sh +300 -0
- package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
- package/skills/atdd-developer/SKILL.md +65 -0
- package/skills/brainstorm/SKILL.md +701 -0
- package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
- package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
- package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
- package/skills/brainstorm/references/ui-surface-terms.md +42 -0
- package/skills/brainstorm-techniques/SKILL.md +231 -0
- package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
- package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
- package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
- package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
- package/skills/campaign-calendar/SKILL.md +145 -0
- package/skills/cf-token-scope/SKILL.md +164 -0
- package/skills/cf-token-scope/references/widen-playbook.md +114 -0
- package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
- package/skills/changelog/SKILL.md +142 -0
- package/skills/code-to-prd/SKILL.md +66 -0
- package/skills/code-to-prd/references/banner-template.md +12 -0
- package/skills/code-to-prd/references/prd-template.md +41 -0
- package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
- package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
- package/skills/code-to-prd/test/fixture/.env.example +7 -0
- package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
- package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
- package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
- package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
- package/skills/code-to-prd/test/fixture/package.json +6 -0
- package/skills/cohort-status/SKILL.md +62 -0
- package/skills/community/SKILL.md +210 -0
- package/skills/community/scripts/bsky-community.sh +644 -0
- package/skills/community/scripts/bsky-setup.sh +631 -0
- package/skills/community/scripts/community-router.sh +93 -0
- package/skills/community/scripts/discord-community.sh +487 -0
- package/skills/community/scripts/discord-setup.sh +784 -0
- package/skills/community/scripts/github-community.sh +706 -0
- package/skills/community/scripts/hn-community.sh +233 -0
- package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
- package/skills/community/scripts/linkedin-community.sh +750 -0
- package/skills/community/scripts/linkedin-setup.sh +758 -0
- package/skills/community/scripts/x-community.sh +890 -0
- package/skills/community/scripts/x-setup.sh +713 -0
- package/skills/community/test/community-argv.test.sh +2922 -0
- package/skills/community/test/github-community.test.sh +981 -0
- package/skills/competitive-analysis/SKILL.md +69 -0
- package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
- package/skills/compound/SKILL.md +673 -0
- package/skills/compound/scripts/token-efficiency-report.sh +334 -0
- package/skills/compound/test/phase-16.test.sh +379 -0
- package/skills/compound-capture/SKILL.md +791 -0
- package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
- package/skills/compound-capture/assets/resolution-template.md +116 -0
- package/skills/compound-capture/references/yaml-schema.md +67 -0
- package/skills/compound-capture/schema.yaml +181 -0
- package/skills/constraint-scaffold/SKILL.md +175 -0
- package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
- package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
- package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
- package/skills/constraint-scaffold/references/shared-runner.template +135 -0
- package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
- package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
- package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
- package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
- package/skills/constraint-scaffold/test/generator.test.sh +93 -0
- package/skills/constraint-scaffold/test/parity.test.sh +285 -0
- package/skills/content-writer/SKILL.md +242 -0
- package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
- package/skills/cron-delete/SKILL.md +56 -0
- package/skills/cron-list/SKILL.md +54 -0
- package/skills/deepen-plan/SKILL.md +937 -0
- package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
- package/skills/deploy/SKILL.md +115 -0
- package/skills/deploy/references/hetzner-setup.md +67 -0
- package/skills/deploy/scripts/deploy.sh +37 -0
- package/skills/deploy-docs/SKILL.md +95 -0
- package/skills/dhh-rails-style/SKILL.md +203 -0
- package/skills/dhh-rails-style/references/architecture.md +717 -0
- package/skills/dhh-rails-style/references/controllers.md +323 -0
- package/skills/dhh-rails-style/references/frontend.md +556 -0
- package/skills/dhh-rails-style/references/gems.md +316 -0
- package/skills/dhh-rails-style/references/models.md +388 -0
- package/skills/dhh-rails-style/references/testing.md +354 -0
- package/skills/discord-content/SKILL.md +126 -0
- package/skills/docs-site/SKILL.md +214 -0
- package/skills/drain-labeled-backlog/SKILL.md +203 -0
- package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
- package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
- package/skills/drain-prs/SKILL.md +143 -0
- package/skills/drain-prs/scripts/triage-prs.sh +192 -0
- package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
- package/skills/dspy-ruby/SKILL.md +634 -0
- package/skills/dspy-ruby/assets/config-template.rb +359 -0
- package/skills/dspy-ruby/assets/module-template.rb +326 -0
- package/skills/dspy-ruby/assets/signature-template.rb +143 -0
- package/skills/dspy-ruby/references/core-concepts.md +268 -0
- package/skills/dspy-ruby/references/optimization.md +623 -0
- package/skills/dspy-ruby/references/providers.md +335 -0
- package/skills/eval-harness/README.md +194 -0
- package/skills/eval-harness/SKILL.md +157 -0
- package/skills/eval-harness/enums/go-routes.json +13 -0
- package/skills/eval-harness/enums/incident-threshold.json +5 -0
- package/skills/eval-harness/enums/lane.json +5 -0
- package/skills/eval-harness/enums/tool-selection.json +20 -0
- package/skills/eval-harness/enums/triage-levels.json +5 -0
- package/skills/eval-harness/gated-skills.json +34 -0
- package/skills/eval-harness/models.generated.json +5 -0
- package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
- package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
- package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
- package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
- package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
- package/skills/eval-harness/prompts/go-baseline.txt +6 -0
- package/skills/eval-harness/prompts/go-skill.txt +21 -0
- package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
- package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
- package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
- package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
- package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
- package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
- package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
- package/skills/eval-harness/prompts/triage-skill.txt +10 -0
- package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
- package/skills/eval-harness/scripts/extract-block.cjs +87 -0
- package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
- package/skills/eval-harness/scripts/gen-models.sh +41 -0
- package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
- package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
- package/skills/eval-harness/scripts/parse-label.cjs +93 -0
- package/skills/eval-harness/scripts/verdict.cjs +132 -0
- package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
- package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
- package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
- package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
- package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
- package/skills/eval-harness/test/eval-gate.test.sh +132 -0
- package/skills/eval-harness/test/extract-block.test.sh +87 -0
- package/skills/eval-harness/test/gate-classification.test.sh +77 -0
- package/skills/eval-harness/test/gen-models.test.sh +75 -0
- package/skills/eval-harness/test/measure-classification.test.sh +74 -0
- package/skills/eval-harness/test/parse-label.test.sh +129 -0
- package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
- package/skills/eval-harness/test/verdict.test.sh +123 -0
- package/skills/every-style-editor/SKILL.md +142 -0
- package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
- package/skills/feature-tweet/SKILL.md +199 -0
- package/skills/feature-video/SKILL.md +412 -0
- package/skills/feature-video/scripts/check_deps.sh +281 -0
- package/skills/file-todos/SKILL.md +267 -0
- package/skills/file-todos/assets/todo-template.md +166 -0
- package/skills/fix-issue/SKILL.md +278 -0
- package/skills/fix-issue/references/agent-authored-exclusion.md +120 -0
- package/skills/fix-issue/references/exclude-label-jq-snippet.md +97 -0
- package/skills/flag-bootstrap/SETUP.md +142 -0
- package/skills/flag-create/SKILL.md +145 -0
- package/skills/flag-create/scripts/create.sh +273 -0
- package/skills/flag-delete/SKILL.md +167 -0
- package/skills/flag-delete/scripts/delete.sh +288 -0
- package/skills/flag-list/SKILL.md +99 -0
- package/skills/flag-list/scripts/list.sh +275 -0
- package/skills/flag-set-role/SKILL.md +229 -0
- package/skills/flag-set-role/scripts/flip.sh +774 -0
- package/skills/frontend-anti-slop/SKILL.md +106 -0
- package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
- package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
- package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
- package/skills/frontend-design/SKILL.md +77 -0
- package/skills/gdpr-gate/NOTICE +136 -0
- package/skills/gdpr-gate/SKILL.md +341 -0
- package/skills/gdpr-gate/references/fields.md +160 -0
- package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
- package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
- package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
- package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
- package/skills/gdpr-gate/references/layers/frontend.md +249 -0
- package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
- package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
- package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
- package/skills/gdpr-gate/references/legal-consent.md +140 -0
- package/skills/gdpr-gate/references/non-negotiables.md +60 -0
- package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
- package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
- package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
- package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
- package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
- package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
- package/skills/gemini-imagegen/SKILL.md +283 -0
- package/skills/gemini-imagegen/requirements.txt +5 -0
- package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
- package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
- package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
- package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
- package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
- package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
- package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
- package/skills/git-worktree/SKILL.md +534 -0
- package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
- package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
- package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
- package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
- package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
- package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
- package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
- package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
- package/skills/go/SKILL.md +54 -0
- package/skills/growth/SKILL.md +164 -0
- package/skills/harvest-debt/SKILL.md +78 -0
- package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
- package/skills/heal-skill/SKILL.md +173 -0
- package/skills/help/SKILL.md +46 -0
- package/skills/incident/NOTICE +39 -0
- package/skills/incident/SKILL.md +395 -0
- package/skills/incident/scripts/dry-run.sh +448 -0
- package/skills/incident/scripts/redact-engine.py +412 -0
- package/skills/incident/scripts/redact-sentinel.sh +44 -0
- package/skills/incident/templates/pir.md +139 -0
- package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
- package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
- package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
- package/skills/incident/test/fixtures/positive-corpus.md +87 -0
- package/skills/incident/test/redact-sentinel.test.sh +1420 -0
- package/skills/invoice/SKILL.md +206 -0
- package/skills/kb-glossary/SKILL.md +71 -0
- package/skills/kb-glossary/references/glossary-format.md +111 -0
- package/skills/kb-glossary/references/rejected-request-register.md +115 -0
- package/skills/kb-search/SKILL.md +276 -0
- package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
- package/skills/legal-audit/SKILL.md +161 -0
- package/skills/legal-generate/NOTICE +242 -0
- package/skills/legal-generate/SKILL.md +244 -0
- package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
- package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
- package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
- package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
- package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
- package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
- package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
- package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
- package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
- package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
- package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
- package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
- package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
- package/skills/linear-fetch/SKILL.md +247 -0
- package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
- package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
- package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
- package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
- package/skills/linear-fetch/test/parity.test.sh +112 -0
- package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
- package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
- package/skills/merge-pr/SKILL.md +670 -0
- package/skills/model-launch-review/SKILL.md +255 -0
- package/skills/model-launch-review/scripts/audit-models.sh +501 -0
- package/skills/one-shot/SKILL.md +316 -0
- package/skills/one-shot/references/token-discipline.md +74 -0
- package/skills/operator-bootstrap/SKILL.md +412 -0
- package/skills/operator-bootstrap/template.sh +439 -0
- package/skills/operator-digest/SKILL.md +287 -0
- package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
- package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
- package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
- package/skills/operator-rephrase/SKILL.md +98 -0
- package/skills/pencil-setup/SKILL.md +201 -0
- package/skills/pencil-setup/scripts/check_deps.sh +556 -0
- package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
- package/skills/pencil-setup/scripts/package-lock.json +1172 -0
- package/skills/pencil-setup/scripts/package.json +14 -0
- package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
- package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
- package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
- package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
- package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
- package/skills/plan/SKILL.md +1140 -0
- package/skills/plan/references/differential-migration-testing.md +185 -0
- package/skills/plan/references/plan-community-discovery.md +42 -0
- package/skills/plan/references/plan-founder-check.md +137 -0
- package/skills/plan/references/plan-functional-overlap.md +25 -0
- package/skills/plan/references/plan-host-fanout.md +51 -0
- package/skills/plan/references/plan-issue-templates.md +779 -0
- package/skills/plan/references/plan-network-outage-checklist.md +131 -0
- package/skills/plan/references/plan-scope-check.md +126 -0
- package/skills/plan/references/plan-sharp-edges.md +331 -0
- package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
- package/skills/plan/references/webapp-cwv-observability.md +143 -0
- package/skills/plan-review/SKILL.md +91 -0
- package/skills/plan-review/lib/named-panel.mjs +58 -0
- package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
- package/skills/postmerge/SKILL.md +642 -0
- package/skills/postmerge/references/deploy-status-debugging.md +141 -0
- package/skills/postmerge/references/graceful-degradation.md +20 -0
- package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
- package/skills/preflight/SKILL.md +1553 -0
- package/skills/preflight/references/check-13-founder-check.md +286 -0
- package/skills/preflight/scripts/founder-check.py +1640 -0
- package/skills/preflight/scripts/parse-form-a.awk +107 -0
- package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
- package/skills/product-roadmap/SKILL.md +357 -0
- package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
- package/skills/provision-cloudflare/SKILL.md +67 -0
- package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
- package/skills/provision-doppler/SKILL.md +58 -0
- package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
- package/skills/provision-github/SKILL.md +59 -0
- package/skills/provision-github/scripts/provision-github.sh +300 -0
- package/skills/provision-hetzner/SKILL.md +76 -0
- package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
- package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
- package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
- package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
- package/skills/qa/SKILL.md +263 -0
- package/skills/qa/references/browser-preflight.md +22 -0
- package/skills/questionnaire-generate/SKILL.md +328 -0
- package/skills/questionnaire-generate/references/questionnaire.template +60 -0
- package/skills/rclone/SKILL.md +162 -0
- package/skills/rclone/scripts/check_setup.sh +63 -0
- package/skills/release-announce/SKILL.md +65 -0
- package/skills/release-docs/SKILL.md +92 -0
- package/skills/reproduce-bug/SKILL.md +358 -0
- package/skills/resolve-debt/SKILL.md +85 -0
- package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
- package/skills/resolve-parallel/SKILL.md +45 -0
- package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
- package/skills/resolve-pr-parallel/SKILL.md +68 -0
- package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
- package/skills/resolve-todo-parallel/SKILL.md +57 -0
- package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
- package/skills/review/SKILL.md +1620 -0
- package/skills/review/references/anti-slop-scanner-hook.md +40 -0
- package/skills/review/references/defect-classes-migrations.md +9 -0
- package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
- package/skills/review/references/review-e2e-testing.md +116 -0
- package/skills/review/references/review-evidence-comment.md +36 -0
- package/skills/review/references/review-todo-structure.md +165 -0
- package/skills/review/references/risk-tier-and-fix-rounds.md +97 -0
- package/skills/review/references/semgrep-custom-rules.yaml +174 -0
- package/skills/review/references/ultrathink-phases.md +98 -0
- package/skills/review/references/wfs.md +6 -0
- package/skills/review/scripts/emit-review-trailer.sh +499 -0
- package/skills/review/scripts/ensure-semgrep.sh +99 -0
- package/skills/review/scripts/fix-round-seats.sh +197 -0
- package/skills/review/test/emit-review-trailer.test.sh +387 -0
- package/skills/review/test/ensure-semgrep.test.sh +111 -0
- package/skills/review/test/fix-round-seats.test.sh +237 -0
- package/skills/review/workflows/README.md +147 -0
- package/skills/review/workflows/review.workflow.js +667 -0
- package/skills/schedule/SKILL.md +796 -0
- package/skills/seo-aeo/SKILL.md +139 -0
- package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
- package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
- package/skills/ship/SKILL.md +3023 -0
- package/skills/ship/references/adr-ordinal-collision.md +47 -0
- package/skills/ship/references/affected-gate-contract.md +115 -0
- package/skills/ship/references/ci-run-diagnosis.md +29 -0
- package/skills/ship/references/ci-workflow-authoring.md +68 -0
- package/skills/ship/references/cleanup-merged-archival.md +39 -0
- package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
- package/skills/ship/references/cto-ruling-armed-push.md +5 -0
- package/skills/ship/references/decision-challenges-render.md +71 -0
- package/skills/ship/references/delegated-act-authoring-form.md +7 -0
- package/skills/ship/references/detached-battery-verdict.md +13 -0
- package/skills/ship/references/epic-close-sweep.md +62 -0
- package/skills/ship/references/feature-tweet-draft.md +42 -0
- package/skills/ship/references/followthrough-issue-body-template.md +47 -0
- package/skills/ship/references/followthrough-stub-template.sh +92 -0
- package/skills/ship/references/merge-queue-dequeue.md +39 -0
- package/skills/ship/references/operator-holds.md +179 -0
- package/skills/ship/references/pipeline-tally-render.md +43 -0
- package/skills/ship/references/pr-overlap.md +153 -0
- package/skills/ship/references/queue-mode.md +7 -0
- package/skills/ship/references/ready-run-wait.md +36 -0
- package/skills/ship/references/red-on-main-quarantine.md +110 -0
- package/skills/ship/references/register-update-pr-pattern.md +88 -0
- package/skills/ship/references/settle-then-admin-merge.md +130 -0
- package/skills/ship/references/supabase-column-probe.md +13 -0
- package/skills/ship/scripts/auto-close-scan.sh +76 -0
- package/skills/ship/scripts/battery-owed.sh +403 -0
- package/skills/ship/scripts/hold-gate-eval.sh +410 -0
- package/skills/ship/scripts/net-issue-flow.sh +665 -0
- package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
- package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
- package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
- package/skills/skill-creator/SKILL.md +299 -0
- package/skills/skill-creator/references/api-security.md +248 -0
- package/skills/skill-creator/references/authoring-levers.md +110 -0
- package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
- package/skills/skill-creator/references/best-practices.md +431 -0
- package/skills/skill-creator/references/common-patterns.md +639 -0
- package/skills/skill-creator/references/core-principles.md +193 -0
- package/skills/skill-creator/references/executable-code.md +188 -0
- package/skills/skill-creator/references/iteration-and-testing.md +509 -0
- package/skills/skill-creator/references/official-spec.md +193 -0
- package/skills/skill-creator/references/recommended-structure.md +180 -0
- package/skills/skill-creator/references/skill-structure.md +396 -0
- package/skills/skill-creator/references/using-scripts.md +122 -0
- package/skills/skill-creator/references/using-templates.md +120 -0
- package/skills/skill-creator/references/workflows-and-validation.md +541 -0
- package/skills/skill-creator/scripts/init_skill.py +322 -0
- package/skills/skill-creator/scripts/package_skill.py +110 -0
- package/skills/skill-creator/scripts/quick_validate.py +64 -0
- package/skills/skill-creator/templates/router-skill.md +73 -0
- package/skills/skill-creator/templates/simple-skill.md +34 -0
- package/skills/skill-creator/workflows/add-reference.md +96 -0
- package/skills/skill-creator/workflows/add-script.md +104 -0
- package/skills/skill-creator/workflows/add-template.md +83 -0
- package/skills/skill-creator/workflows/add-workflow.md +128 -0
- package/skills/skill-creator/workflows/audit-skill.md +159 -0
- package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
- package/skills/skill-creator/workflows/create-new-skill.md +207 -0
- package/skills/skill-creator/workflows/get-guidance.md +134 -0
- package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
- package/skills/skill-creator/workflows/verify-skill.md +226 -0
- package/skills/skill-security-scan/SKILL.md +145 -0
- package/skills/skill-security-scan/references/disclaimer.md +21 -0
- package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
- package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
- package/skills/skill-security-scan/references/override-mechanism.md +171 -0
- package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
- package/skills/skill-security-scan/references/regex-patterns.md +136 -0
- package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
- package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
- package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
- package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
- package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
- package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
- package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
- package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
- package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
- package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
- package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
- package/skills/skill-security-scan/scripts/lib.sh +197 -0
- package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
- package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
- package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
- package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
- package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
- package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
- package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
- package/skills/social-distribute/SKILL.md +485 -0
- package/skills/spec-templates/SKILL.md +274 -0
- package/skills/sync/SKILL.md +49 -0
- package/skills/test-browser/SKILL.md +464 -0
- package/skills/test-browser/references/feature-map.md +161 -0
- package/skills/test-fix-loop/SKILL.md +159 -0
- package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
- package/skills/triage/SKILL.md +402 -0
- package/skills/trigger-cron/SKILL.md +136 -0
- package/skills/trigger-cron/scripts/trigger.sh +198 -0
- package/skills/user-set-role/SKILL.md +147 -0
- package/skills/user-set-role/scripts/set-role.sh +218 -0
- package/skills/user-story-writer/SKILL.md +77 -0
- package/skills/ux-audit/SKILL.md +251 -0
- package/skills/ux-audit/references/finding.schema.json +62 -0
- package/skills/ux-audit/references/route-list.yaml +95 -0
- package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
- package/skills/ux-audit/scripts/bot-signin.ts +135 -0
- package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
- package/skills/verification-scaffold/SKILL.md +73 -0
- package/skills/verification-scaffold/references/gitleaks.toml.template +13 -0
- package/skills/verification-scaffold/references/guardrail-audit.md +156 -0
- package/skills/verification-scaffold/references/guards/block-stash-hook.sh.template +72 -0
- package/skills/verification-scaffold/references/guards/commit-on-main-hook.sh.template +82 -0
- package/skills/verification-scaffold/references/guards/orphan-test-check.sh.template +102 -0
- package/skills/verification-scaffold/references/guards/precommit-guard.sh.template +115 -0
- package/skills/verification-scaffold/references/guards/secret-scan-hook.sh.template +176 -0
- package/skills/verification-scaffold/references/guards/verification-gates.yml.template +49 -0
- package/skills/verification-scaffold/references/guards/wrapper-boundary.sh.template +47 -0
- package/skills/verification-scaffold/references/guards.tsv +21 -0
- package/skills/verification-scaffold/references/verification-readme.template +55 -0
- package/skills/verification-scaffold/scripts/verification-scaffold.sh +785 -0
- package/skills/verification-scaffold/test/bite-proof.test.sh +159 -0
- package/skills/verification-scaffold/test/generator.test.sh +319 -0
- package/skills/verification-scaffold/test/manifest.test.sh +144 -0
- package/skills/work/SKILL.md +1480 -0
- package/skills/work/references/end-of-work-resume.md +7 -0
- package/skills/work/references/hook-test-main-cwd.md +24 -0
- package/skills/work/references/key-principles.md +83 -0
- package/skills/work/references/property-testing.md +122 -0
- package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
- package/skills/work/references/work-agent-teams.md +97 -0
- package/skills/work/references/work-lifecycle-parallel.md +147 -0
- package/skills/work/references/work-lockfile-bumps.md +97 -0
- package/skills/work/references/work-scratch-sandboxes.md +212 -0
- package/skills/work/references/work-subagent-fanout.md +61 -0
- package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
- package/skills/xcode-test/SKILL.md +360 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
upstream: github.com/goSprinto/compliance-skills
|
|
3
|
+
license: MIT
|
|
4
|
+
pinned-commit: 7b58d68461cb1fc033a063e34cc9de63d0b4144b
|
|
5
|
+
last-verified: 2026-10-05
|
|
6
|
+
registry: knowledge-base/engineering/policies/content-vendoring.md
|
|
7
|
+
lifted-files:
|
|
8
|
+
# Each entry pins TWO blob SHAs:
|
|
9
|
+
# upstream-blob-sha — the file as it exists upstream at `pinned-commit`.
|
|
10
|
+
# Used by the drift workflow to detect upstream content changes.
|
|
11
|
+
# local-blob-sha — the file as it exists in this repo (after the
|
|
12
|
+
# attribution-header line and any documented Soleur extensions). Used
|
|
13
|
+
# by the lefthook `vendor-pin-integrity` gate to detect silent local
|
|
14
|
+
# edits. Computed via `git hash-object --no-filters`.
|
|
15
|
+
- path: references/fields.md
|
|
16
|
+
upstream-path: pii-detector/patterns/fields.md
|
|
17
|
+
upstream-blob-sha: c1bb748fe00a53b283efe66ec937fa39437d2efc
|
|
18
|
+
local-blob-sha: 68675dd747fcbc74bb84c99eaa14983c9c5a6b24
|
|
19
|
+
status: active-eu-extended
|
|
20
|
+
- path: references/leakage-vectors.md
|
|
21
|
+
upstream-path: pii-detector/rules/leakage-vectors.md
|
|
22
|
+
upstream-blob-sha: 15a46e529e789930149f4b9bce875bfe5c53e478
|
|
23
|
+
local-blob-sha: 8d1d7fc44183e866e128707c3e91e7b63ce835fd
|
|
24
|
+
status: active-verbatim
|
|
25
|
+
- path: references/layers/api-layer.md
|
|
26
|
+
upstream-path: pii-detector/layers/api-layer.md
|
|
27
|
+
upstream-blob-sha: 9d3202175c1d0225f60a912c489dbdacf4df491c
|
|
28
|
+
local-blob-sha: 802fc866e320bebeecae2f8e53658253853ab5f9
|
|
29
|
+
status: active-verbatim
|
|
30
|
+
- path: references/layers/data-in-transit.md
|
|
31
|
+
upstream-path: pii-detector/layers/data-in-transit.md
|
|
32
|
+
upstream-blob-sha: 6c9eeabf17d1f0ed5660f5eb54d91587c81214ef
|
|
33
|
+
local-blob-sha: 2ce203e9c041c1b1992ff9f7f636fdd63a667a44
|
|
34
|
+
status: active-eu-extended
|
|
35
|
+
- path: references/layers/data-lifecycle.md
|
|
36
|
+
upstream-path: pii-detector/layers/data-lifecycle.md
|
|
37
|
+
upstream-blob-sha: a073ef24a0527c2c3a6d738b65ea3ef9d6194abe
|
|
38
|
+
local-blob-sha: 29357a020bfa0e61f91dd529070fe3eb7cd251da
|
|
39
|
+
status: active-soleur-rewritten
|
|
40
|
+
- path: references/layers/auth-sessions.md
|
|
41
|
+
upstream-path: pii-detector/layers/auth-sessions.md
|
|
42
|
+
upstream-blob-sha: 71dd9d01fe55d3e58f8b35f1cf745d47ba5f0985
|
|
43
|
+
local-blob-sha: a2eac5e15c72b28a7f271f5ab98f376f4448f005
|
|
44
|
+
status: active-eu-extended
|
|
45
|
+
- path: references/layers/frontend.md
|
|
46
|
+
upstream-path: pii-detector/layers/frontend.md
|
|
47
|
+
upstream-blob-sha: 5f39e08fe2404759d7cbdbdea54a4f6210b91b8f
|
|
48
|
+
local-blob-sha: 7ab925695fb02151b0214ef171d92f10059b1d50
|
|
49
|
+
status: active-eu-extended
|
|
50
|
+
- path: references/layers/testing-seeding.md
|
|
51
|
+
upstream-path: pii-detector/layers/testing-seeding.md
|
|
52
|
+
upstream-blob-sha: a2f299418a5f85246fd2203475d89106936f7a72
|
|
53
|
+
local-blob-sha: 3dc230db21b657a9da31886d52abf982d7203f4b
|
|
54
|
+
status: active-eu-extended
|
|
55
|
+
soleur-authored:
|
|
56
|
+
# Reference files written from scratch for this plugin. Same record shape and
|
|
57
|
+
# same `local-blob-sha` tamper check as `lifted-files` above, but NO upstream
|
|
58
|
+
# provenance — these never appear in `upstream-files`, and a `lifted-files`
|
|
59
|
+
# row for one of them would attest goSprinto MIT provenance for Soleur's own
|
|
60
|
+
# writing. Pinning them here is what makes them editable through the normal
|
|
61
|
+
# update-the-pin flow: before #7710 they were rejected outright as "silent
|
|
62
|
+
# local addition", which blocked the documented v2->v3 lifecycle of
|
|
63
|
+
# `legal-consent.md` without `--no-verify`.
|
|
64
|
+
- path: references/non-negotiables.md
|
|
65
|
+
local-blob-sha: 09723b4b71b1ab95afba4b5d4aa1f882141b9cac
|
|
66
|
+
status: soleur-authored
|
|
67
|
+
- path: references/legal-consent.md
|
|
68
|
+
local-blob-sha: 8bb3d0888ff450867b34ed8b576ec382679588bf
|
|
69
|
+
status: soleur-authored
|
|
70
|
+
- path: references/legacy/legal-consent-v1-prose.md
|
|
71
|
+
local-blob-sha: 239bc26f02098f2bb59eb1e961f92ef128094c7b
|
|
72
|
+
status: soleur-authored-archived
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
# NOTICE
|
|
76
|
+
|
|
77
|
+
The frontmatter above is the canonical machine-readable form; the table below is the human-readable form. Drift between them is a bug.
|
|
78
|
+
|
|
79
|
+
`gdpr-gate` lifts eight reference files from [gosprinto/compliance-skills](https://github.com/goSprinto/compliance-skills) under the MIT license. The lifted files carry a per-file attribution header and are listed below with upstream blob SHAs pinned at commit `7b58d68461cb1fc033a063e34cc9de63d0b4144b` (verified 2026-05-10 for v1; re-verified 2026-05-10 for v2 — upstream `main` SHA unchanged since v1 lift).
|
|
80
|
+
|
|
81
|
+
The Soleur prose, GDPR-first framing, EU extensions (Art. 9 fields, Chapter V cross-border check, Art. 20 portability rewrite of DL-04, Art. 32(1)(b) confidentiality footer on auth-sessions, ePrivacy/TTDSG strict-opt-in footer on frontend, Art. 32 pseudonymization footer on testing-seeding), and the `non-negotiables.md` + `legal-consent.md` reference files are written from scratch for this plugin.
|
|
82
|
+
|
|
83
|
+
## gosprinto/compliance-skills (MIT)
|
|
84
|
+
|
|
85
|
+
Pinned commit: `7b58d68461cb1fc033a063e34cc9de63d0b4144b` (2026-05-08)
|
|
86
|
+
|
|
87
|
+
Upstream: <https://github.com/goSprinto/compliance-skills>
|
|
88
|
+
|
|
89
|
+
| Lifted file (Soleur) | Upstream path | Blob SHA | Status |
|
|
90
|
+
|---|---|---|---|
|
|
91
|
+
| `references/fields.md` | `pii-detector/patterns/fields.md` | `c1bb748fe00a53b283efe66ec937fa39437d2efc` | active (EU-extended with Art. 9) |
|
|
92
|
+
| `references/leakage-vectors.md` | `pii-detector/rules/leakage-vectors.md` | `15a46e529e789930149f4b9bce875bfe5c53e478` | active (verbatim) |
|
|
93
|
+
| `references/layers/api-layer.md` | `pii-detector/layers/api-layer.md` | `9d3202175c1d0225f60a912c489dbdacf4df491c` | active (verbatim) |
|
|
94
|
+
| `references/layers/data-in-transit.md` | `pii-detector/layers/data-in-transit.md` | `6c9eeabf17d1f0ed5660f5eb54d91587c81214ef` | active (EU-extended with Chapter V) |
|
|
95
|
+
| `references/layers/data-lifecycle.md` | `pii-detector/layers/data-lifecycle.md` | `a073ef24a0527c2c3a6d738b65ea3ef9d6194abe` | active (DL-04 rewritten for Art. 20 + CCPA) |
|
|
96
|
+
| `references/layers/auth-sessions.md` | `pii-detector/layers/auth-sessions.md` | `71dd9d01fe55d3e58f8b35f1cf745d47ba5f0985` | active (EU-extended with Art. 32(1)(b) confidentiality footer) |
|
|
97
|
+
| `references/layers/frontend.md` | `pii-detector/layers/frontend.md` | `5f39e08fe2404759d7cbdbdea54a4f6210b91b8f` | active (EU-extended with ePrivacy/TTDSG strict-opt-in footer) |
|
|
98
|
+
| `references/layers/testing-seeding.md` | `pii-detector/layers/testing-seeding.md` | `a2f299418a5f85246fd2203475d89106936f7a72` | active (EU-extended with Art. 32 pseudonymization footer) |
|
|
99
|
+
|
|
100
|
+
## Soleur-authored layers
|
|
101
|
+
|
|
102
|
+
The following reference files are written from scratch for this plugin and carry no upstream attribution header. `legal-consent.md` carries an explicit `<!-- Soleur-authored — see NOTICE -->` marker on line 1 and the archived v1 prose carries its own provenance note; `non-negotiables.md` opens directly on its title. Their integrity is pinned by the `soleur-authored` frontmatter block above rather than by the header line.
|
|
103
|
+
|
|
104
|
+
| File | Purpose |
|
|
105
|
+
|---|---|
|
|
106
|
+
| `references/non-negotiables.md` | GDPR-first regulatory framing for the plugin's scope. |
|
|
107
|
+
| `references/legal-consent.md` | Layer-shaped (LC-01..LC-05) ePrivacy + GDPR Art. 7 / 13 / 14 / 35 checks. **v2 promotion:** v1 prose-shaped version is preserved at `references/legacy/legal-consent-v1-prose.md` for one release cycle and removed at v3. |
|
|
108
|
+
| `references/legacy/legal-consent-v1-prose.md` | Archived v1 prose-shape of the above, retained for regulatory-citation provenance until v3. |
|
|
109
|
+
|
|
110
|
+
## License
|
|
111
|
+
|
|
112
|
+
Upstream MIT license terms (verbatim copy):
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
MIT License
|
|
116
|
+
|
|
117
|
+
Copyright (c) 2025 goSprinto
|
|
118
|
+
|
|
119
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
120
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
121
|
+
in the Software without restriction, including without limitation the rights
|
|
122
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
123
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
124
|
+
furnished to do so, subject to the following conditions:
|
|
125
|
+
|
|
126
|
+
The above copyright notice and this permission notice shall be included in all
|
|
127
|
+
copies or substantial portions of the Software.
|
|
128
|
+
|
|
129
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
130
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
131
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
132
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
133
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
134
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
135
|
+
SOFTWARE.
|
|
136
|
+
```
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gdpr-gate
|
|
3
|
+
description: "This skill should be used when auditing diffs or plans for GDPR/CCPA/HIPAA compliance gaps."
|
|
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
|
+
# GDPR / CCPA / HIPAA pre-generation gate
|
|
15
|
+
|
|
16
|
+
`gdpr-gate` is an **advisory** code-level gate that fires inline during `soleur:plan` Phase 2.7 and at `soleur:work` Phase 2 exit. It scans plan prose, schema migrations, and diffs for regulated-data gaps under GDPR (Articles 5/6/9/17/20/25/30/32/33/35), with secondary coverage for CCPA / CPRA and HIPAA. It never blocks. Critical findings (Article 9 special-category data) prompt operator acknowledgment + GitHub issue creation; the gate never auto-writes to `compliance-posture.md`.
|
|
17
|
+
|
|
18
|
+
This is **not legal review**. Output is a heuristic, machine-generated checklist meant to compress regulator-shaped surprises out of the normal feature-design loop. Consult the `soleur:legal:clo` agent and `soleur:legal:legal-compliance-auditor` before merging anything load-bearing.
|
|
19
|
+
|
|
20
|
+
## When to invoke
|
|
21
|
+
|
|
22
|
+
- **Plan time** — automatic at `soleur:plan` Phase 2.7 when the plan touches regulated-data surfaces (per `hr-gdpr-gate-on-regulated-data-surfaces` canonical regex).
|
|
23
|
+
- **Work time** — automatic at end of `soleur:work` Phase 2, single pass after all per-task RED/GREEN/REFACTOR loops complete (token budget ≤4k per invocation).
|
|
24
|
+
- **Manual** — `soleur:gdpr-gate "<scope>"` where `<scope>` is a file path, glob, or one-line description.
|
|
25
|
+
- **Manual repo-scan** — `soleur:gdpr-gate --repo-scan` runs the gate against the whole working tree (operator-initiated only). Defenses, batching, and output contract documented in `## --repo-scan mode` below.
|
|
26
|
+
- **Hook (advisory only)** — `lefthook.yml` `gdpr-gate-advisory` prints a stderr breadcrumb when staged paths match the canonical regex. The hook always exits 0 — it never blocks the commit. Blocking enforcement lives in `soleur:ship` Phase 5.5 (post-PR).
|
|
27
|
+
|
|
28
|
+
The gate is **read-only with respect to the canonical `soleur:plan` template**. It audits the plan; it never injects its own checklist into the plan body. Architectural invariant per ADR-026.
|
|
29
|
+
|
|
30
|
+
## Disclaimer (always first)
|
|
31
|
+
|
|
32
|
+
Every gate output begins, as the first non-blank line, with the literal:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
**This is not legal review. Findings are heuristic. Consult `soleur:legal:clo` + `soleur:legal:legal-compliance-auditor` before merging.**
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The disclaimer is hardcoded. A test in `plugins/soleur/test/gdpr-gate.test.ts` asserts the literal appears as the first non-blank line of every fixture output.
|
|
39
|
+
|
|
40
|
+
## --repo-scan mode
|
|
41
|
+
|
|
42
|
+
`soleur:gdpr-gate --repo-scan` runs the gate against the whole working tree. Operator-initiated only — never auto-fires from `soleur:plan`, `soleur:work`, or lefthook. Token budget remains ≤4k per Haiku call (ADR-026 TR3) via 25-files-per-batch fan-out.
|
|
43
|
+
|
|
44
|
+
**Sole-arg sentinel.** When invoked with `$ARGUMENTS`, trim leading/trailing whitespace (including `\t` and `\n`). If the trimmed value equals **exactly** `--repo-scan` (no spaces, no quotes, no additional tokens), enter repo-scan mode. Any other value — including `--repo-scan apps/web-platform`, `repo scan`, or `"--repo-scan section of the repo"` — falls through to the v1 scope-string mode and is forwarded verbatim to the prompt.
|
|
45
|
+
|
|
46
|
+
**File source.** `git ls-files -c -o --exclude-standard` (cached + untracked, respecting `.gitignore`). Submodules excluded; symlinks not followed. Pre-filtered through the canonical regex (see `## Path globs (canonical)` below) so only regulated-data paths enter the candidate pool.
|
|
47
|
+
|
|
48
|
+
**Deny-list (D1).** Single source of truth: [scripts/path-denylist.txt](./scripts/path-denylist.txt). Line-oriented file with extended-regex patterns (one per line; `#` for comments). Bash `[[ =~ ]]` semantics. Any candidate path matching at least one deny-list pattern is excluded from the scan corpus and a `# blocked: <path>` line is emitted to stderr (audit trail).
|
|
49
|
+
|
|
50
|
+
**Allow-list bypass (D3).** `GDPR_GATE_REPO_SCAN_ALLOW_PATHS=path1:path2:...` — colon-separated literal paths (no globs accepted; bash strict equality after split). Default unset → all deny-list patterns enforced. Each entry must satisfy two clauses or the script exits 1: (1) the path must match at least one deny pattern (otherwise the bypass is meaningless), and (2) the path must exist in `git ls-files -c -o --exclude-standard` (otherwise the operator probably typo'd the path; see Sharp edges).
|
|
51
|
+
|
|
52
|
+
**CI refusal (D3).** If both `$CI` and `$GDPR_GATE_REPO_SCAN_ALLOW_PATHS` are set, the script exits 1 with `allow-list bypass refused in CI environment`. Operator-only by construction — runbooks that set the bypass var get caught at the script boundary, not by docs alone.
|
|
53
|
+
|
|
54
|
+
**Batching.** 25 files per Haiku call. The dispatching agent collects per-batch outputs, dedups by `(check_id, path, line)`, and summarises inline.
|
|
55
|
+
|
|
56
|
+
**Inline-only output (D4).** Findings emitted to stdout / conversation only. The repo-scan walker NEVER writes to `compliance-posture.md`, `__goldens__/`, `test/fixtures/`, or any disk path under `~/.claude/`. The v1 critical-finding flow (operator-acknowledged write to `compliance-posture.md` Active Items + GitHub `compliance/critical` label) still applies for Art. 9 column-name matches discovered during repo-scan.
|
|
57
|
+
|
|
58
|
+
**Schema-only invariant (D5).** The repo-scan prompt template inherits v1's `DO NOT INCLUDE COLUMN VALUES` directive verbatim. The directive is the load-bearing assertion in `plugins/soleur/test/gdpr-gate.test.ts`.
|
|
59
|
+
|
|
60
|
+
**Canonical-regex source-of-truth.** [scripts/repo-scan.sh](./scripts/repo-scan.sh) extracts the canonical regex from this file's `## Path globs (canonical)` heading via `awk` at runtime — it does NOT redefine the regex. Editors of SKILL.md must keep that heading and the first fenced regex line stable; if extraction fails the script exits 1 with `canonical regex not found in SKILL.md`. Asserted by AC-PARITY-1 and `gdpr-gate-repo-scan.test.ts`.
|
|
61
|
+
|
|
62
|
+
## Path globs (canonical)
|
|
63
|
+
|
|
64
|
+
The single source of truth for "what counts as a regulated-data path" is the regex below. `lefthook.yml` mirrors it verbatim; `plugins/soleur/skills/review/scripts/fix-round-seats.sh` `GDPR_PATH_RE` mirrors it byte-identically (pinned by `plugins/soleur/test/review-tier-parity.test.ts`); the skill's prompt template references it; `AGENTS.md` `hr-gdpr-gate-on-regulated-data-surfaces` cites it.
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
^(apps/web-platform/supabase/migrations/|apps/web-platform/lib/auth/|apps/web-platform/server/.*auth.*\.(ts|tsx|js)|apps/web-platform/app/api/.*\.(ts|tsx)$|.*\.sql$)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Each component matches at least one file in the current repo (verified at plan time, 2026-05-10). `forms/**` and `**/*.prisma` from earlier drafts are dropped — both matched zero paths in this repo and a glob that matches nothing is a workflow violation per `hr-when-a-plan-specifies-relative-paths-e-g`.
|
|
71
|
+
|
|
72
|
+
## 5 mandatory v1 checks (FR4)
|
|
73
|
+
|
|
74
|
+
Each check has a stable `check_id` for cross-referencing in `compliance-posture.md` and GitHub issue labels.
|
|
75
|
+
|
|
76
|
+
| `check_id` | Article | Trigger | Default severity |
|
|
77
|
+
|---|---|---|---|
|
|
78
|
+
| `GDPR-Art-6` | Art. 6 lawful basis | New schema column without `-- LAWFUL_BASIS: <basis>` annotation | `Important` |
|
|
79
|
+
| `GDPR-Art-5e` | Art. 5(1)(e) retention | New PII table without retention metadata | `Important` |
|
|
80
|
+
| `GDPR-Art-17` | Art. 17 erasure | New FK to `users` without `ON DELETE CASCADE` or anonymisation migration | `Important` |
|
|
81
|
+
| `GDPR-Art-17-caller` | Art. 17 erasure (caller-site) | Diff adds an `ON DELETE RESTRICT` FK to `public.users` AND an `anonymise_*` RPC, AND `git grep -n '<rpc_name>'` returns zero matches outside `supabase/migrations/`, `knowledge-base/`, and plan files | `Important` (see [[2026-05-16-migration-mandates-must-have-wired-call-sites-in-same-pr]]) |
|
|
82
|
+
| `GDPR-Chapter-V` | Art. 44–49 cross-border | New non-EEA vendor env var / SDK without `compliance-posture.md` Vendor DPA row | `Important` |
|
|
83
|
+
| `GDPR-Art-9` | Art. 9 special-category | New column matching the Art. 9 list in [fields.md](./references/fields.md) | **`Critical`** |
|
|
84
|
+
|
|
85
|
+
**Critical is reserved for Art. 9 column-name matches in v1.** Demoting the other four to `Important` keeps the noise floor low and preserves `compliance/critical` issue labels as a load-bearing signal. See [non-negotiables.md](./references/non-negotiables.md) for the regulatory rationale.
|
|
86
|
+
|
|
87
|
+
Reference layers:
|
|
88
|
+
|
|
89
|
+
**Active layers (with `check_id` markers):**
|
|
90
|
+
|
|
91
|
+
- [layers/api-layer.md](./references/layers/api-layer.md) — 7 API-layer checks (AP-01..AP-07).
|
|
92
|
+
- [layers/data-in-transit.md](./references/layers/data-in-transit.md) — Transit checks T-01..T-06 + DT-EU-CB Chapter V cross-border.
|
|
93
|
+
- [layers/data-lifecycle.md](./references/layers/data-lifecycle.md) — Lifecycle checks DL-01..DL-06; DL-04 covers Art. 20 portability.
|
|
94
|
+
- [layers/auth-sessions.md](./references/layers/auth-sessions.md) — Auth & session checks A-01..A-07 + Art. 32(1)(b) confidentiality footer.
|
|
95
|
+
- [layers/frontend.md](./references/layers/frontend.md) — Frontend checks F-01..F-06 + ePrivacy/TTDSG strict-opt-in footer.
|
|
96
|
+
- [layers/testing-seeding.md](./references/layers/testing-seeding.md) — Test fixture + seed-data checks TS-01..TS-05 + Art. 32 pseudonymization footer.
|
|
97
|
+
- [legal-consent.md](./references/legal-consent.md) — Layer-shaped LC-01..LC-05 ePrivacy + GDPR Art. 7/13/14/35 (Soleur-authored — promoted from prose at v2; see NOTICE; v1 prose preserved at [legacy/legal-consent-v1-prose.md](./references/legacy/legal-consent-v1-prose.md) until v3).
|
|
98
|
+
|
|
99
|
+
**Reference catalogues (no `check_id` markers — consulted by other layers):**
|
|
100
|
+
|
|
101
|
+
- [fields.md](./references/fields.md) — PII field catalogue + Art. 9 special-category extension.
|
|
102
|
+
- [leakage-vectors.md](./references/leakage-vectors.md) — PII vector catalogue (verbatim from upstream).
|
|
103
|
+
- [non-negotiables.md](./references/non-negotiables.md) — GDPR-first regulatory framing.
|
|
104
|
+
|
|
105
|
+
The 5 mandatory v1 checks (FR4 above) fire on every gate invocation. `--repo-scan` (see `## --repo-scan mode` above) additionally fires every layer-id check across all 7 active layers.
|
|
106
|
+
|
|
107
|
+
## Output format
|
|
108
|
+
|
|
109
|
+
Each finding follows this schema:
|
|
110
|
+
|
|
111
|
+
```markdown
|
|
112
|
+
**This is not legal review. Findings are heuristic. Consult `soleur:legal:clo` + `soleur:legal:legal-compliance-auditor` before merging.**
|
|
113
|
+
|
|
114
|
+
### `<check_id>` — <one-line title>
|
|
115
|
+
|
|
116
|
+
**Severity:** <Critical | Important | Suggestion>
|
|
117
|
+
**Article:** <regulation citation>
|
|
118
|
+
**Location:** <file path:line range, or "plan section <header>">
|
|
119
|
+
**Pattern matched:** <verbatim regex/keyword that fired>
|
|
120
|
+
**Why this matters:** <one short paragraph>
|
|
121
|
+
**What to do:** <concrete next action — annotate, add migration, file vendor DPA row, etc.>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Severity levels:
|
|
125
|
+
|
|
126
|
+
- `Critical` — reserved for Art. 9 (special-category) column-name matches in v1. Triggers the operator-acknowledgment escalation flow.
|
|
127
|
+
- `Important` — Art. 6 / Art. 5(1)(e) / Art. 17 / Chapter V findings. Logs to console; operator may file a `compliance/improvement` issue at their discretion.
|
|
128
|
+
- `Suggestion` — DPIA reminder, Art. 7 consent UX hint, ePrivacy banner alignment, etc. Read-only.
|
|
129
|
+
|
|
130
|
+
## Critical-finding escalation flow (FR5)
|
|
131
|
+
|
|
132
|
+
When a `Critical` finding fires, the gate emits this block at the end of the report:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
─────────────────────────────────────────────────────────────────
|
|
136
|
+
CRITICAL FINDING — operator acknowledgment required
|
|
137
|
+
─────────────────────────────────────────────────────────────────
|
|
138
|
+
|
|
139
|
+
A `Critical` finding (`check_id: GDPR-Art-9`) requires an Active Items row in
|
|
140
|
+
`knowledge-base/legal/compliance-posture.md`. The gate does NOT auto-write the
|
|
141
|
+
row.
|
|
142
|
+
|
|
143
|
+
Run, in order:
|
|
144
|
+
|
|
145
|
+
1. gh issue create \
|
|
146
|
+
--title "<title summarising the finding>" \
|
|
147
|
+
--label compliance/critical,domain/legal \
|
|
148
|
+
--body "<finding text + link to PR>"
|
|
149
|
+
|
|
150
|
+
2. Edit knowledge-base/legal/compliance-posture.md and append a row to the
|
|
151
|
+
Active Compliance Items table. The canonical schema is:
|
|
152
|
+
|
|
153
|
+
| Item | Issue | Status | Deadline | Notes |
|
|
154
|
+
| <one-line summary> | #<issue> | OPEN | - | <check_id>; <date>; <context> |
|
|
155
|
+
|
|
156
|
+
`<check_id>` is the gdpr-gate finding identifier (e.g., GDPR-Art-9). Date
|
|
157
|
+
and remediation context belong in Notes — the table itself uses 5 fixed
|
|
158
|
+
columns.
|
|
159
|
+
|
|
160
|
+
3. git add knowledge-base/legal/compliance-posture.md
|
|
161
|
+
git commit -m "compliance: register Art. 9 finding for #<issue>"
|
|
162
|
+
|
|
163
|
+
The gate exits after printing this block. It never modifies disk for you.
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
This flow is operator-driven by design — the gate is `read-only` against `compliance-posture.md`. Auto-writing would silently aggregate compliance gaps into a single repo file, defeating the human-accountability rationale (CLO assessment).
|
|
167
|
+
|
|
168
|
+
## Prompt template — what the gate sends to the model
|
|
169
|
+
|
|
170
|
+
The gate's reasoning step receives the following system prompt structure. The schema-only invariant is **DO NOT INCLUDE COLUMN VALUES** — the gate sends column NAMES only, never row values.
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
You are gdpr-gate, an advisory compliance auditor.
|
|
174
|
+
|
|
175
|
+
Your input is:
|
|
176
|
+
1. A diff or plan excerpt (no row values).
|
|
177
|
+
2. The list of regulated-data paths (per the canonical regex above).
|
|
178
|
+
3. The five v1 check definitions below.
|
|
179
|
+
|
|
180
|
+
DO NOT INCLUDE COLUMN VALUES in the response. Send column NAMES only —
|
|
181
|
+
schema-shape data, never live row payload. The user's PII is the subject of
|
|
182
|
+
the audit; sending values would be a Chapter V transfer of the very data we
|
|
183
|
+
are auditing.
|
|
184
|
+
|
|
185
|
+
For each check:
|
|
186
|
+
- Identify pattern matches.
|
|
187
|
+
- Emit a finding using the Output format above.
|
|
188
|
+
- Reserve `Critical` for Art. 9 column-name matches.
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
The `DO NOT INCLUDE COLUMN VALUES` directive is a verbatim string assertion in `plugins/soleur/test/gdpr-gate.test.ts` — moving or paraphrasing it breaks the test by design.
|
|
192
|
+
|
|
193
|
+
## First-run on existing codebase
|
|
194
|
+
|
|
195
|
+
Existing migrations 001–040 in this repo do NOT use `-- LAWFUL_BASIS: <basis>` annotations. A backfill audit will fire `Important` (`GDPR-Art-6`) findings on every column that lacks one. **This is intentional** — backfill audits surface existing gaps, and the demotion of Art. 6 to `Important` keeps the noise from training operators to dismiss `Critical`. Operators may suppress backfill noise by scoping the gate to a specific diff (`soleur:gdpr-gate "git diff main...HEAD"`) rather than a full repo scan.
|
|
196
|
+
|
|
197
|
+
## Future severity changes
|
|
198
|
+
|
|
199
|
+
Findings carry a stable severity per the FR4 table. If a future version introduces a new severity (e.g., `Blocking`), three consumer patterns must be grepped per `cq-union-widening-grep-three-patterns`:
|
|
200
|
+
|
|
201
|
+
- `const _exhaustive: never` rails (safe — the build fails until the new variant is handled).
|
|
202
|
+
- `\.severity === "` if-ladders (silent drop).
|
|
203
|
+
- `\?\.severity === "` optional-chained ladders (silent drop).
|
|
204
|
+
|
|
205
|
+
Add new severities in this file's table FIRST, then run the three greps before writing implementation.
|
|
206
|
+
|
|
207
|
+
## Boundary with sibling agents
|
|
208
|
+
|
|
209
|
+
- **`soleur:engineering:review:data-integrity-guardian`** — migration safety + judgment-based PII review. The gate is deterministic pattern-matching; the guardian is judgment-based.
|
|
210
|
+
- **`soleur:engineering:review:security-sentinel`** — OWASP / CWE security-of-processing flaws. Art. 32 overlaps; sentinel handles the "how", gate handles the "what".
|
|
211
|
+
- **`soleur:legal:clo`** — reads `compliance-posture.md`; the gate produces the row contract the CLO consumes. The gate never writes; the operator does.
|
|
212
|
+
- **`legal-audit`** / **`legal-generate`** — document-layer skills (privacy policy, DPA, terms). The gate is code-layer.
|
|
213
|
+
|
|
214
|
+
Canonical disambiguation prose lives in `plugins/soleur/skills/review/SKILL.md` §boundaries.
|
|
215
|
+
|
|
216
|
+
## Corpus freshness
|
|
217
|
+
|
|
218
|
+
The detection rules this gate uses are partly lifted from upstream
|
|
219
|
+
`gosprinto/compliance-skills` and pinned in [NOTICE](./NOTICE). `last-verified`
|
|
220
|
+
records the last time the pinned corpus was compared against upstream.
|
|
221
|
+
|
|
222
|
+
- **> 30 days** — the gate prints a staleness banner to stdout. Output stays
|
|
223
|
+
advisory and the gate still exits 0, but a "no findings" result may be based
|
|
224
|
+
on rules that predate a recently-patched detection pattern.
|
|
225
|
+
- **> 90 days** — the gate additionally prints `POSTURE_FAIL:`. See the next
|
|
226
|
+
section.
|
|
227
|
+
|
|
228
|
+
Both thresholds are stable design parameters, not settings: they are not
|
|
229
|
+
relaxable without a published ADR.
|
|
230
|
+
|
|
231
|
+
`last-verified` is advanced by Soleur's weekly content-vendor-drift cron, and
|
|
232
|
+
only on a run that itself compared the complete upstream-derived registry and
|
|
233
|
+
found it clean against a healthy upstream. The conjuncts are stated canonically
|
|
234
|
+
in the content-vendoring policy (§6a) rather than restated here, because
|
|
235
|
+
restating them is how the two copies came to disagree. Two consequences are
|
|
236
|
+
worth having on this page:
|
|
237
|
+
|
|
238
|
+
- The scope is the **upstream-derived** records. Files written for this plugin
|
|
239
|
+
carry their own pins and are checked at commit time, not by the attestation.
|
|
240
|
+
- The cron skips a write while the field is recently advanced, so its value
|
|
241
|
+
moves in steps of roughly three weeks rather than weekly.
|
|
242
|
+
|
|
243
|
+
A missing NOTICE, an unparseable date, or a future date all resolve to `999`
|
|
244
|
+
days, which fires both banners; that is the fail-safe direction.
|
|
245
|
+
|
|
246
|
+
**Do not edit `last-verified` by hand.** An earlier version of this section
|
|
247
|
+
suggested exactly that, which is the one action the governing ADR (ADR-203)
|
|
248
|
+
explicitly rejects: a hand-written value asserts a comparison that no artifact
|
|
249
|
+
records, and on an installed plugin it is overwritten by the next update
|
|
250
|
+
anyway. If the banner is firing on an installed plugin, the corpus is refreshed
|
|
251
|
+
upstream and the fix is to update the plugin.
|
|
252
|
+
|
|
253
|
+
## POSTURE_FAIL operator chain
|
|
254
|
+
|
|
255
|
+
**If you are running an installed copy of this plugin** (you are not developing
|
|
256
|
+
Soleur itself), the short version is: the gate is advisory, it exits 0, and it
|
|
257
|
+
is telling you the detection corpus shipped with your copy is old. Nothing in
|
|
258
|
+
your repository is wrong and there is no action to take in it. Update the
|
|
259
|
+
plugin to pick up a refreshed corpus. The numbered chain below is for
|
|
260
|
+
contributors working in the Soleur repository — its steps reference registers
|
|
261
|
+
and internal endpoints that only exist there.
|
|
262
|
+
|
|
263
|
+
**In the Soleur repository**, when the gate emits a `POSTURE_FAIL:` line:
|
|
264
|
+
|
|
265
|
+
1. **Do not pause the current PR.** The gate is advisory and exits 0. The
|
|
266
|
+
staleness signal is a separate work cycle from whatever diff triggered it.
|
|
267
|
+
2. Open a tracking issue labelled `compliance/critical`, titled
|
|
268
|
+
`[gdpr-gate] >90d stale rules — N days since last-verified`.
|
|
269
|
+
3. Append a row to the compliance posture register's Active Compliance Items,
|
|
270
|
+
per that document's row schema. The gate never writes there itself: this is
|
|
271
|
+
an operator-acknowledged write only.
|
|
272
|
+
4. Commit the row with `compliance: register vendor-pin-staleness for #<issue>`.
|
|
273
|
+
5. Drive a re-vendor: ping the in-flight `ci/content-vendor-drift-*` PR if one
|
|
274
|
+
is open, or dispatch the cron manually via `soleur:trigger-cron` with
|
|
275
|
+
`cron/content-vendor-drift.manual-trigger`. `gh workflow run` cannot reach
|
|
276
|
+
it — the job is an Inngest cron, not a GitHub Actions workflow.
|
|
277
|
+
Print the dispatch as the active harness's operator-typed form per `formatSkillInvocation`
|
|
278
|
+
(`plugins/soleur/lib/harness.ts`); the operator types it, no agent reads it.
|
|
279
|
+
|
|
280
|
+
The regulated-data PR that surfaced the banner can ship; the staleness
|
|
281
|
+
follow-up gets its own review and merge.
|
|
282
|
+
|
|
283
|
+
## Sharp edges
|
|
284
|
+
|
|
285
|
+
- **Scan-completion line** (#7710): the gate prints
|
|
286
|
+
`gdpr-gate: path scan complete — N examined, M matched` to stdout on every
|
|
287
|
+
invocation, unconditionally and after the match loop. It exists because
|
|
288
|
+
"the scan ran and matched nothing" and "the scan never ran" were previously
|
|
289
|
+
byte-identical — both produced no output at all — so on a stale corpus the
|
|
290
|
+
gate printed two banners about its rule set and no evidence that any diff had
|
|
291
|
+
been examined. It carries **counts only, never path names**: this line
|
|
292
|
+
reaches a customer's terminal, and path structure is third-party-content
|
|
293
|
+
adjacent (`hr-third-party-content-grep-on-undertaking`). The stderr
|
|
294
|
+
breadcrumb still names paths for the local operator. The line deliberately
|
|
295
|
+
contains neither `days stale` nor `POSTURE_FAIL`, so the evidence that a scan
|
|
296
|
+
occurred is independent of the corpus's age.
|
|
297
|
+
- **The scan line cannot witness its own most likely failure.** If the
|
|
298
|
+
`gdpr-gate-advisory` glob in `lefthook.yml` stops matching, lefthook prints
|
|
299
|
+
`(skip)`, this script never executes, and no line of any kind is emitted —
|
|
300
|
+
every in-script assertion stays green. That half is covered from outside by
|
|
301
|
+
[gdpr-gate-glob-liveness.test.sh](../../test/gdpr-gate-glob-liveness.test.sh),
|
|
302
|
+
which drives the real lefthook binary over the real `lefthook.yml` with a
|
|
303
|
+
regulated path staged. This repo has shipped the dead-glob trap twice; gobwas
|
|
304
|
+
`**` matches 1+ intermediate directories, never 0+.
|
|
305
|
+
- **The `vendor-pin-integrity` glob's `*.md` entry under the references directory covers the whole
|
|
306
|
+
subtree**, because lefthook's gobwas `*` crosses `/`. Measured on lefthook
|
|
307
|
+
2.1.6: `refs/*.md` matches both depth-1 and depth-2; `refs/**/*.md` matches
|
|
308
|
+
depth-2 only (that is the `**` behaviour the repo's 2026-03-21 gobwas
|
|
309
|
+
learning describes, and it does not generalise to `*`). So the `layers/`
|
|
310
|
+
entry is redundant, and no per-subdirectory entry is needed. The
|
|
311
|
+
symmetric-difference walk in
|
|
312
|
+
[vendor-pin-integrity.test.sh](../../test/vendor-pin-integrity.test.sh) is
|
|
313
|
+
still the backstop for registry membership — it reads the disk, not the
|
|
314
|
+
glob — but it is not compensating for a coverage hole, because there is
|
|
315
|
+
none.
|
|
316
|
+
- **Two registries, opposite provenance** (#7710): NOTICE frontmatter carries
|
|
317
|
+
`lifted-files` (upstream-derived, MIT, pinned against goSprinto) and
|
|
318
|
+
`soleur-authored` (written for this plugin, no upstream). Both are
|
|
319
|
+
tamper-checked by `local-blob-sha`; only the former appears in
|
|
320
|
+
`upstream-files`. A file must appear in exactly one, and the attribution
|
|
321
|
+
header on line 1 is the oracle for which. Moving a file between them is a
|
|
322
|
+
provenance falsification, not a bookkeeping change.
|
|
323
|
+
- Hook layer is **advisory only** (`exit 0`). Operators expecting `lefthook` to block will be surprised — the blocking enforcement is at `soleur:ship` Phase 5.5, post-PR.
|
|
324
|
+
- The lefthook breadcrumb does NOT fire when lefthook itself is bypassed: `git commit --no-verify`, GitHub web-UI edits, fork PRs whose authors don't have lefthook installed, or agent commits on machines without `lefthook install`. In those paths the only enforcement is `soleur:ship` Phase 5.5's critical-finding-acknowledgment gate (post-PR). Plan Phase 2.7 + work Phase 2 exit gates run regardless of lefthook because they live inside the skill, not the hook layer.
|
|
325
|
+
- The `*auth*` regex match is intentionally broad — false-positives on `auth-error.ts` etc. are accepted because output is advisory and cheap.
|
|
326
|
+
- Lifted upstream files are pinned to commit `7b58d68461cb1fc033a063e34cc9de63d0b4144b`. Upstream drift is governed by the content-vendoring policy at `knowledge-base/engineering/policies/content-vendoring.md`, the weekly content-vendor-drift cron (an Inngest function, `apps/web-platform/server/inngest/functions/cron-content-vendor-drift.ts` — a GitHub Actions scheduled workflow until the TR9 Phase-2 migration; the Sentry monitor slug keeps the old name), and the lefthook `vendor-pin-integrity` gate (silent-edit detection). NOTICE frontmatter (`upstream`, `pinned-commit`, `last-verified`, `lifted-files[]` with both `upstream-blob-sha` and `local-blob-sha`) is the canonical machine-readable form.
|
|
327
|
+
- **Runtime staleness banner** (FR6 / AC6a-d): the hook subshell-execs [notice-frontmatter.sh](./scripts/notice-frontmatter.sh) `days-stale` on every invocation. Days since `last-verified` >30d → STDOUT banner. Days >90d → additional `POSTURE_FAIL:` STDOUT line; the operator follows the chain in the policy doc to append a row to `compliance-posture.md`. NOTICE deletion / parser failure / future-dated `last-verified` all resolve to `days_stale=999` → banner fires. STDOUT (not stderr) is load-bearing — agent runtimes (Claude Code skill harness, MCP servers) frequently swallow stderr. Gate exits 0 in all paths; the staleness signal is advisory.
|
|
328
|
+
- **Trust-binding via cron-run timestamp** (issue #3535; repointed by #7255). NOTICE `last-verified` is operator-controlled — a PR can rewrite it to today's date and suppress the 30d/90d banners. To defend against backdating, the gate also invokes `notice-frontmatter.sh cron-run-stale`, which asks `gh pr list --search head:ci/vendor-attest --state all --limit 10` for the newest creation date of the cron's self-merging attestation PR (the job is an Inngest cron with no GHA run to list — the attest PR is the artifact every completed run writes, per ADR-203); the staleness banner uses `MIN(notice-last-verified, cron-run-stale)`. A dead or moved artifact stream falls through to 999 and the gate degrades to operator-attested mode — fail-safe, but silent; the `TS-cron-argv` case in the notice-frontmatter suites pins the query shape so the next substrate move goes red.
|
|
329
|
+
- **GH_TOKEN auth contract**: in GitHub Actions the token is auto-injected via `secrets.GITHUB_TOKEN`; in local lefthook runs it is sourced from `gh auth token` if the operator has `gh` configured; in subagent contexts (`soleur:plan`, `soleur:work` shells) the token is typically absent and the gate degrades to operator-attested mode (see next bullet).
|
|
330
|
+
- **MIN precedence and operator-attested-mode banner**: precedence is (cron+notice non-999 → MIN wins; if cron > notice the binding still defends future regressions) > (cron == 999, notice != 999 → operator-attested-mode banner + fallback to notice) > (both == 999 → existing 30d/90d banners fire). When no token is available the gate emits `ℹ gdpr-gate: operator-attested mode (no GH_TOKEN available — cron-run timestamp unverified, falling back to NOTICE last-verified)` to STDOUT — the documented degraded state.
|
|
331
|
+
- **CODEOWNERS pin on NOTICE** (#3535 defense-in-depth): `/plugins/soleur/skills/gdpr-gate/NOTICE` requires `@deruelle` review. Load-bearing only when branch protection is enforced on `main` (an operator follow-up); the cron-run-timestamp binding is the load-bearing defense.
|
|
332
|
+
- **Substrate-move silent break — this already happened once (#7255)**: the original probe keyed liveness on a GHA *workflow filename*; when the job migrated to Inngest the query matched nothing and the binding went inert for months, invisible because the failure signal was its own safe default. The current binding keys on the job's *output artifact* (the attest PR's head-branch prefix), which survives substrate moves as long as ADR-203's write-back machinery keeps producing it — and the notice-frontmatter suites pin the query argv (`pr list` + `head:ci/vendor-attest`) so the next move reds instead of silently reverting to 999. The lesson stands for any future binding of this shape: a probe whose only failure signal is its own safe default will never announce that it stopped working.
|
|
333
|
+
- **Per-judgment advisory banners must gate on regulated-path match** (issue #3541 soleur:engineering:review:user-impact-reviewer P1). The operator-attested-mode banner fires only when `${#matched[@]} > 0` (a regulated-data path is being judged this commit). Otherwise it would spam every commit in subagent shells (no `GH_TOKEN`) and train operators to ignore the signal. Pre-existing 30d/90d staleness banners DO fire unconditionally — they signal gate-internal state ("rules are stale at any rate") rather than per-judgment state ("THIS regulated PR has a degraded gate"). When adding a new advisory banner, ask: does its meaning depend on what the gate is doing on THIS invocation, or on the gate's persistent state? Per-judgment banners must scope to relevance; persistent-state banners may fire unconditionally. See `knowledge-base/project/learnings/2026-05-11-runtime-advisory-banners-must-gate-on-judgment-relevance.md`.
|
|
334
|
+
- The gate transmits column NAMES to the model (Anthropic). This is itself a Chapter V transfer; it falls under Anthropic's existing DPA recorded in `compliance-posture.md` Vendor DPAs. Row values are never sent — see "Prompt template" above.
|
|
335
|
+
- AGENTS.md rule ID `hr-gdpr-gate-on-regulated-data-surfaces` is **immutable** per `cq-rule-ids-are-immutable`. v2 splits retire the ID via the retired-rule-ids ledger rather than reusing.
|
|
336
|
+
- `--repo-scan` against full repo history will surface Art. 9 (`Critical`) findings on pre-v1 migrations 001–040 (legacy columns matching the special-category list). The default disposition is **tracked-not-amended** — `compliance-posture.md` Active Items records the row, no amendment migration is issued, because schema rewrites against historical PII tables carry their own data-integrity risk that typically exceeds the disclosure-cure benefit. The row reads `OPEN | tracked, not amended`. Default disposition only applies when the column is **dormant or read-only with disclosure cure available**. Amendment is required and the operator MUST consult `soleur:legal:clo` before selecting a disposition when ANY of the following hold:
|
|
337
|
+
1. **Active processing for an undisclosed special-category purpose** — production code currently writes or reads the column for a purpose not disclosed in the privacy notice. Fix is disclosure-side (privacy notice + DPIA + Art. 6/9 lawful-basis annotation) plus, if no Art. 9(2) lawful basis applies, halting processing.
|
|
338
|
+
2. **Backfill with new special-category data** — schema is old but the *data* is new (placeholder/test rows replaced with real PII). This is operationally a new processing activity; Art. 35 DPIA may itself trigger.
|
|
339
|
+
3. **Cross-border transfer post-Schrems II** — the column is replicated to a non-EEA processor (analytics, support, vendor) without Chapter V safeguards (DPA + SCCs + transfer impact assessment). Disclosure cure is insufficient — fix the Chapter V gap.
|
|
340
|
+
4. **CCPA / CPRA "sensitive personal information" overlay** — California's SPI definition (Cal. Civ. Code §1798.140(ae)) overlaps but is not identical to Art. 9. A column that is Art. 9 in EU may also be SPI in California; the disposition must include a CCPA-side disclosure check, not just a GDPR-side one.
|
|
341
|
+
- `path-denylist.txt` patterns are bash `[[ =~ ]]` extended regex, **not shell globs**. Patterns that look like globs (e.g., `*.pem`) silently fail to match. `repo-scan.sh` sets `LC_ALL=POSIX` for locale-determinism, but contributors editing patterns should still verify on both Linux and macOS — character-class behaviour for non-ASCII bytes still differs between the two `bash` builds even with `POSIX` set.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
<!-- Adapted from gosprinto/compliance-skills (MIT) — see NOTICE -->
|
|
2
|
+
# PII Field Patterns
|
|
3
|
+
|
|
4
|
+
Scan all field names, types, and surrounding context against these.
|
|
5
|
+
Flag on exact match OR semantic approximation.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Critical Sensitivity — Always Flag, Always Fix
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
# Auth / Secrets
|
|
13
|
+
password, passwd, pwd, pass, passphrase
|
|
14
|
+
password_hash, hashed_password, encrypted_password
|
|
15
|
+
secret, client_secret, app_secret
|
|
16
|
+
api_key, api_secret, private_key, signing_key
|
|
17
|
+
token, auth_token, access_token, refresh_token, bearer_token
|
|
18
|
+
session_id, session_token
|
|
19
|
+
security_question, security_answer, hint
|
|
20
|
+
|
|
21
|
+
# Abbreviated / indirect — flag when on auth/user model
|
|
22
|
+
p, pw, cred, creds, credential, credentials
|
|
23
|
+
auth, auth_data, auth_info
|
|
24
|
+
key, k (if on user/auth model)
|
|
25
|
+
|
|
26
|
+
# Payment Card — PCI-DSS
|
|
27
|
+
card_number, card_num, credit_card, debit_card, pan
|
|
28
|
+
cvv, cvv2, cvc, cvc2, card_code, security_code
|
|
29
|
+
account_number, routing_number, bank_account, iban, swift
|
|
30
|
+
|
|
31
|
+
# Government IDs
|
|
32
|
+
ssn, social_security, social_security_number
|
|
33
|
+
tax_id, taxpayer_id, itin, ein
|
|
34
|
+
passport, passport_number, passport_no
|
|
35
|
+
drivers_license, license_number, dl_number, dl_num
|
|
36
|
+
national_id, national_id_number, id_number
|
|
37
|
+
|
|
38
|
+
# Health / Medical — HIPAA
|
|
39
|
+
diagnosis, condition, medical_condition
|
|
40
|
+
medication, prescription, rx
|
|
41
|
+
health_record, medical_record, medical_history, ehr, phi
|
|
42
|
+
insurance, insurance_id, insurance_number, policy_number
|
|
43
|
+
icd_code, cpt_code, npi
|
|
44
|
+
mental_health, psychiatric, therapy_notes
|
|
45
|
+
|
|
46
|
+
# Biometric — BIPA
|
|
47
|
+
fingerprint, fingerprint_data, biometric
|
|
48
|
+
face_id, face_data, facial_recognition, face_scan
|
|
49
|
+
retina, retina_scan, iris, iris_scan
|
|
50
|
+
voice_print, voice_data, voice_recognition
|
|
51
|
+
dna, genetic_data
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## High Sensitivity — Flag, Check Storage + Handling
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
# Identity
|
|
60
|
+
first_name, last_name, full_name, legal_name, maiden_name
|
|
61
|
+
middle_name, display_name
|
|
62
|
+
date_of_birth, dob, birth_date, birthdate, birthday
|
|
63
|
+
age (exact integer), gender, sex, race, ethnicity, nationality
|
|
64
|
+
photo, avatar, profile_picture, selfie
|
|
65
|
+
|
|
66
|
+
# Contact
|
|
67
|
+
email, email_address, email_addr
|
|
68
|
+
phone, phone_number, mobile, mobile_number, cell, telephone
|
|
69
|
+
address, street_address, street, addr
|
|
70
|
+
city, state, zip, zipcode, zip_code, postal_code
|
|
71
|
+
country, mailing_address, billing_address, shipping_address
|
|
72
|
+
|
|
73
|
+
# Financial (non-card)
|
|
74
|
+
salary, wage, income, compensation, pay_rate
|
|
75
|
+
balance, account_balance, net_worth
|
|
76
|
+
credit_score, fico, credit_rating
|
|
77
|
+
transaction_history, purchase_history, spending_data
|
|
78
|
+
|
|
79
|
+
# Location / Tracking
|
|
80
|
+
location, coordinates, lat, lng, latitude, longitude
|
|
81
|
+
gps, geo, geolocation
|
|
82
|
+
ip_address, ip_addr, ip, client_ip, remote_ip
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Lower Sensitivity — Flag in Context
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
# Behavioral
|
|
91
|
+
device_id, device_identifier, device_fingerprint
|
|
92
|
+
ad_id, idfa, gaid, advertising_id
|
|
93
|
+
browser_fingerprint, user_agent
|
|
94
|
+
search_history, browsing_history, click_history
|
|
95
|
+
session_data, activity_log
|
|
96
|
+
|
|
97
|
+
# Ambiguous — check what they actually store
|
|
98
|
+
notes, metadata, extra, data, info, details, misc, other
|
|
99
|
+
profile, profile_data, user_data, user_info, user_details
|
|
100
|
+
preferences, settings
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Indirect / Abbreviated Name Detection
|
|
106
|
+
|
|
107
|
+
Flag these based on context — they don't look like PII but frequently store it:
|
|
108
|
+
|
|
109
|
+
| Field | When to Flag | Risk |
|
|
110
|
+
|-------|-------------|------|
|
|
111
|
+
| `p`, `pw`, `k` | Any user/auth model | Almost always password or key |
|
|
112
|
+
| `creds`, `credential` | Anywhere | Auth credentials |
|
|
113
|
+
| `data`, `info`, `details` | User/customer models | PII blobs |
|
|
114
|
+
| `notes` | Patient/customer models | Unstructured PII |
|
|
115
|
+
| `metadata` | User models | Fingerprinting data |
|
|
116
|
+
| `token` | Anywhere | Raw auth tokens |
|
|
117
|
+
| `secret` | Anywhere | Should never be in DB |
|
|
118
|
+
| `code` | Auth/payment models | OTP, CVV, verification codes |
|
|
119
|
+
| `number` | User/payment models | Card, SSN, or phone |
|
|
120
|
+
| `value` | Sensitive models | Generic PII container |
|
|
121
|
+
| `raw`, `original` | Next to hashed fields | Plaintext alongside hash |
|
|
122
|
+
|
|
123
|
+
Rule: Ambiguous field name + user-facing/financial/health model = flag it.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## GDPR Article 9 — Special Categories of Personal Data
|
|
128
|
+
|
|
129
|
+
EU extension (not in upstream Sprinto). Article 9 prohibits processing of special-category data **without explicit consent or another lawful basis under Art. 9(2)**. Detection on column NAME alone is sufficient grounds for a `Critical` finding — the gate cannot verify whether Art. 9(2) basis is recorded, only that the column exists.
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
# Health data — Art. 9(1)
|
|
133
|
+
medical_history, medical_record, medical_condition, ehr, phi
|
|
134
|
+
diagnosis, condition, prescription, medication
|
|
135
|
+
mental_health, psychiatric, therapy_notes, therapy_session
|
|
136
|
+
|
|
137
|
+
# Genetic / biometric — Art. 9(1)
|
|
138
|
+
genetic_data, dna, genome, genetic_marker
|
|
139
|
+
biometric_id, fingerprint_data, retina_scan, iris_scan, face_data, voice_print
|
|
140
|
+
|
|
141
|
+
# Sex life / sexual orientation — Art. 9(1)
|
|
142
|
+
sexual_orientation, sex_life
|
|
143
|
+
|
|
144
|
+
# Trade-union — Art. 9(1)
|
|
145
|
+
union_member, union_membership, trade_union
|
|
146
|
+
|
|
147
|
+
# Religious / philosophical beliefs — Art. 9(1)
|
|
148
|
+
religion, religious_belief, religious_affiliation
|
|
149
|
+
philosophical_belief
|
|
150
|
+
|
|
151
|
+
# Political opinions — Art. 9(1)
|
|
152
|
+
political_opinion, political_affiliation, political_party
|
|
153
|
+
|
|
154
|
+
# Race / ethnic origin — Art. 9(1)
|
|
155
|
+
race, ethnic_origin, ethnicity, racial_data
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Rule:** Any column matching the above patterns triggers a `Critical` finding with `check_id: GDPR-Art-9`. The finding routes to the operator-acknowledgment flow (see SKILL.md "Critical-finding escalation"); it never auto-writes to `compliance-posture.md`.
|
|
159
|
+
|
|
160
|
+
**Why Art. 9 is the only `Critical` class:** Per the Kieran-review HIGH applied during plan review, lawful-basis / retention / DSAR / cross-border findings are demoted to `Important` — without that demotion, first-run noise on existing schemas would train operators to dismiss Critical, defeating the brand-survival rationale. Art. 9 column-name matches are the load-bearing Critical signal.
|