@raishin/vanguard-frontier-agentic 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +25 -1
- package/.cursor-plugin/plugin.json +25 -1
- package/.github/plugin/marketplace.json +1 -1
- package/README.md +26 -7
- package/agents/marketing/README.md +44 -0
- package/agents/marketing/ai-advertising-targeting-fairness-review-agent/AGENT.md +53 -0
- package/agents/marketing/ai-advertising-targeting-fairness-review-agent/harnesses/claude-code.agent.md +36 -0
- package/agents/marketing/ai-advertising-targeting-fairness-review-agent/harnesses/codex.toml +33 -0
- package/agents/marketing/ai-advertising-targeting-fairness-review-agent/harnesses/copilot.agent.md +36 -0
- package/agents/marketing/ai-advertising-targeting-fairness-review-agent/harnesses/cursor.agent.md +36 -0
- package/agents/marketing/ai-advertising-targeting-fairness-review-agent/harnesses/gemini.agent.md +36 -0
- package/agents/marketing/ai-advertising-targeting-fairness-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/ai-advertising-targeting-fairness-review-agent/harnesses/kiro-ide.agent.md +36 -0
- package/agents/marketing/ai-advertising-targeting-fairness-review-agent/metadata.json +31 -0
- package/agents/marketing/analytics-data-minimization-review-agent/AGENT.md +51 -0
- package/agents/marketing/analytics-data-minimization-review-agent/harnesses/claude-code.agent.md +34 -0
- package/agents/marketing/analytics-data-minimization-review-agent/harnesses/codex.toml +33 -0
- package/agents/marketing/analytics-data-minimization-review-agent/harnesses/copilot.agent.md +34 -0
- package/agents/marketing/analytics-data-minimization-review-agent/harnesses/cursor.agent.md +34 -0
- package/agents/marketing/analytics-data-minimization-review-agent/harnesses/gemini.agent.md +34 -0
- package/agents/marketing/analytics-data-minimization-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/analytics-data-minimization-review-agent/harnesses/kiro-ide.agent.md +34 -0
- package/agents/marketing/analytics-data-minimization-review-agent/metadata.json +31 -0
- package/agents/marketing/email-sender-authentication-review-agent/AGENT.md +50 -0
- package/agents/marketing/email-sender-authentication-review-agent/harnesses/claude-code.agent.md +33 -0
- package/agents/marketing/email-sender-authentication-review-agent/harnesses/codex.toml +32 -0
- package/agents/marketing/email-sender-authentication-review-agent/harnesses/copilot.agent.md +33 -0
- package/agents/marketing/email-sender-authentication-review-agent/harnesses/cursor.agent.md +33 -0
- package/agents/marketing/email-sender-authentication-review-agent/harnesses/gemini.agent.md +33 -0
- package/agents/marketing/email-sender-authentication-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/email-sender-authentication-review-agent/harnesses/kiro-ide.agent.md +33 -0
- package/agents/marketing/email-sender-authentication-review-agent/metadata.json +31 -0
- package/agents/marketing/eu-ai-act-marketing-system-review-agent/AGENT.md +54 -0
- package/agents/marketing/eu-ai-act-marketing-system-review-agent/harnesses/claude-code.agent.md +37 -0
- package/agents/marketing/eu-ai-act-marketing-system-review-agent/harnesses/codex.toml +33 -0
- package/agents/marketing/eu-ai-act-marketing-system-review-agent/harnesses/copilot.agent.md +37 -0
- package/agents/marketing/eu-ai-act-marketing-system-review-agent/harnesses/cursor.agent.md +37 -0
- package/agents/marketing/eu-ai-act-marketing-system-review-agent/harnesses/gemini.agent.md +37 -0
- package/agents/marketing/eu-ai-act-marketing-system-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/eu-ai-act-marketing-system-review-agent/harnesses/kiro-ide.agent.md +37 -0
- package/agents/marketing/eu-ai-act-marketing-system-review-agent/metadata.json +31 -0
- package/agents/marketing/influencer-disclosure-compliance-review-agent/AGENT.md +52 -0
- package/agents/marketing/influencer-disclosure-compliance-review-agent/harnesses/claude-code.agent.md +35 -0
- package/agents/marketing/influencer-disclosure-compliance-review-agent/harnesses/codex.toml +33 -0
- package/agents/marketing/influencer-disclosure-compliance-review-agent/harnesses/copilot.agent.md +35 -0
- package/agents/marketing/influencer-disclosure-compliance-review-agent/harnesses/cursor.agent.md +35 -0
- package/agents/marketing/influencer-disclosure-compliance-review-agent/harnesses/gemini.agent.md +35 -0
- package/agents/marketing/influencer-disclosure-compliance-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/influencer-disclosure-compliance-review-agent/harnesses/kiro-ide.agent.md +35 -0
- package/agents/marketing/influencer-disclosure-compliance-review-agent/metadata.json +31 -0
- package/agents/marketing/lookalike-audience-upload-compliance-review-agent/AGENT.md +54 -0
- package/agents/marketing/lookalike-audience-upload-compliance-review-agent/harnesses/claude-code.agent.md +37 -0
- package/agents/marketing/lookalike-audience-upload-compliance-review-agent/harnesses/codex.toml +34 -0
- package/agents/marketing/lookalike-audience-upload-compliance-review-agent/harnesses/copilot.agent.md +37 -0
- package/agents/marketing/lookalike-audience-upload-compliance-review-agent/harnesses/cursor.agent.md +37 -0
- package/agents/marketing/lookalike-audience-upload-compliance-review-agent/harnesses/gemini.agent.md +37 -0
- package/agents/marketing/lookalike-audience-upload-compliance-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/lookalike-audience-upload-compliance-review-agent/harnesses/kiro-ide.agent.md +37 -0
- package/agents/marketing/lookalike-audience-upload-compliance-review-agent/metadata.json +31 -0
- package/agents/marketing/marketing-consent-data-collection-review-agent/AGENT.md +51 -0
- package/agents/marketing/marketing-consent-data-collection-review-agent/harnesses/claude-code.agent.md +34 -0
- package/agents/marketing/marketing-consent-data-collection-review-agent/harnesses/codex.toml +33 -0
- package/agents/marketing/marketing-consent-data-collection-review-agent/harnesses/copilot.agent.md +34 -0
- package/agents/marketing/marketing-consent-data-collection-review-agent/harnesses/cursor.agent.md +34 -0
- package/agents/marketing/marketing-consent-data-collection-review-agent/harnesses/gemini.agent.md +34 -0
- package/agents/marketing/marketing-consent-data-collection-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/marketing-consent-data-collection-review-agent/harnesses/kiro-ide.agent.md +34 -0
- package/agents/marketing/marketing-consent-data-collection-review-agent/metadata.json +31 -0
- package/agents/marketing/marketing-conversion-flow-dark-pattern-review-agent/AGENT.md +51 -0
- package/agents/marketing/marketing-conversion-flow-dark-pattern-review-agent/harnesses/claude-code.agent.md +34 -0
- package/agents/marketing/marketing-conversion-flow-dark-pattern-review-agent/harnesses/codex.toml +33 -0
- package/agents/marketing/marketing-conversion-flow-dark-pattern-review-agent/harnesses/copilot.agent.md +34 -0
- package/agents/marketing/marketing-conversion-flow-dark-pattern-review-agent/harnesses/cursor.agent.md +34 -0
- package/agents/marketing/marketing-conversion-flow-dark-pattern-review-agent/harnesses/gemini.agent.md +34 -0
- package/agents/marketing/marketing-conversion-flow-dark-pattern-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/marketing-conversion-flow-dark-pattern-review-agent/harnesses/kiro-ide.agent.md +34 -0
- package/agents/marketing/marketing-conversion-flow-dark-pattern-review-agent/metadata.json +31 -0
- package/agents/marketing/marketing-email-list-retention-review-agent/AGENT.md +50 -0
- package/agents/marketing/marketing-email-list-retention-review-agent/harnesses/claude-code.agent.md +33 -0
- package/agents/marketing/marketing-email-list-retention-review-agent/harnesses/codex.toml +32 -0
- package/agents/marketing/marketing-email-list-retention-review-agent/harnesses/copilot.agent.md +33 -0
- package/agents/marketing/marketing-email-list-retention-review-agent/harnesses/cursor.agent.md +33 -0
- package/agents/marketing/marketing-email-list-retention-review-agent/harnesses/gemini.agent.md +33 -0
- package/agents/marketing/marketing-email-list-retention-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/marketing-email-list-retention-review-agent/harnesses/kiro-ide.agent.md +33 -0
- package/agents/marketing/marketing-email-list-retention-review-agent/metadata.json +31 -0
- package/agents/marketing/marketing-gpc-signal-honoring-review-agent/AGENT.md +50 -0
- package/agents/marketing/marketing-gpc-signal-honoring-review-agent/harnesses/claude-code.agent.md +33 -0
- package/agents/marketing/marketing-gpc-signal-honoring-review-agent/harnesses/codex.toml +32 -0
- package/agents/marketing/marketing-gpc-signal-honoring-review-agent/harnesses/copilot.agent.md +33 -0
- package/agents/marketing/marketing-gpc-signal-honoring-review-agent/harnesses/cursor.agent.md +33 -0
- package/agents/marketing/marketing-gpc-signal-honoring-review-agent/harnesses/gemini.agent.md +33 -0
- package/agents/marketing/marketing-gpc-signal-honoring-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/marketing-gpc-signal-honoring-review-agent/harnesses/kiro-ide.agent.md +33 -0
- package/agents/marketing/marketing-gpc-signal-honoring-review-agent/metadata.json +31 -0
- package/agents/marketing/marketing-maestro-agent/AGENT.md +62 -0
- package/agents/marketing/marketing-maestro-agent/PERMISSIONS.md +75 -0
- package/agents/marketing/marketing-maestro-agent/README.md +62 -0
- package/agents/marketing/marketing-maestro-agent/harnesses/claude-code.agent.md +43 -0
- package/agents/marketing/marketing-maestro-agent/harnesses/codex.toml +35 -0
- package/agents/marketing/marketing-maestro-agent/harnesses/copilot.agent.md +43 -0
- package/agents/marketing/marketing-maestro-agent/harnesses/cursor.agent.md +43 -0
- package/agents/marketing/marketing-maestro-agent/harnesses/gemini.agent.md +43 -0
- package/agents/marketing/marketing-maestro-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/marketing-maestro-agent/harnesses/kiro-ide.agent.md +43 -0
- package/agents/marketing/marketing-maestro-agent/metadata.json +38 -0
- package/agents/marketing/marketing-pixel-data-leakage-review-agent/AGENT.md +50 -0
- package/agents/marketing/marketing-pixel-data-leakage-review-agent/harnesses/claude-code.agent.md +33 -0
- package/agents/marketing/marketing-pixel-data-leakage-review-agent/harnesses/codex.toml +32 -0
- package/agents/marketing/marketing-pixel-data-leakage-review-agent/harnesses/copilot.agent.md +33 -0
- package/agents/marketing/marketing-pixel-data-leakage-review-agent/harnesses/cursor.agent.md +33 -0
- package/agents/marketing/marketing-pixel-data-leakage-review-agent/harnesses/gemini.agent.md +33 -0
- package/agents/marketing/marketing-pixel-data-leakage-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/marketing-pixel-data-leakage-review-agent/harnesses/kiro-ide.agent.md +33 -0
- package/agents/marketing/marketing-pixel-data-leakage-review-agent/metadata.json +31 -0
- package/agents/marketing/martech-access-governance-review-agent/AGENT.md +51 -0
- package/agents/marketing/martech-access-governance-review-agent/harnesses/claude-code.agent.md +34 -0
- package/agents/marketing/martech-access-governance-review-agent/harnesses/codex.toml +33 -0
- package/agents/marketing/martech-access-governance-review-agent/harnesses/copilot.agent.md +34 -0
- package/agents/marketing/martech-access-governance-review-agent/harnesses/cursor.agent.md +34 -0
- package/agents/marketing/martech-access-governance-review-agent/harnesses/gemini.agent.md +34 -0
- package/agents/marketing/martech-access-governance-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/martech-access-governance-review-agent/harnesses/kiro-ide.agent.md +34 -0
- package/agents/marketing/martech-access-governance-review-agent/metadata.json +31 -0
- package/agents/marketing/programmatic-supply-chain-integrity-review-agent/AGENT.md +50 -0
- package/agents/marketing/programmatic-supply-chain-integrity-review-agent/harnesses/claude-code.agent.md +33 -0
- package/agents/marketing/programmatic-supply-chain-integrity-review-agent/harnesses/codex.toml +32 -0
- package/agents/marketing/programmatic-supply-chain-integrity-review-agent/harnesses/copilot.agent.md +33 -0
- package/agents/marketing/programmatic-supply-chain-integrity-review-agent/harnesses/cursor.agent.md +33 -0
- package/agents/marketing/programmatic-supply-chain-integrity-review-agent/harnesses/gemini.agent.md +33 -0
- package/agents/marketing/programmatic-supply-chain-integrity-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/marketing/programmatic-supply-chain-integrity-review-agent/harnesses/kiro-ide.agent.md +33 -0
- package/agents/marketing/programmatic-supply-chain-integrity-review-agent/metadata.json +31 -0
- package/agents/qa/README.md +51 -0
- package/agents/qa/ci-test-pipeline-review-agent/AGENT.md +51 -0
- package/agents/qa/ci-test-pipeline-review-agent/harnesses/claude-code.agent.md +35 -0
- package/agents/qa/ci-test-pipeline-review-agent/harnesses/codex.toml +34 -0
- package/agents/qa/ci-test-pipeline-review-agent/harnesses/copilot.agent.md +35 -0
- package/agents/qa/ci-test-pipeline-review-agent/harnesses/cursor.agent.md +35 -0
- package/agents/qa/ci-test-pipeline-review-agent/harnesses/gemini.agent.md +35 -0
- package/agents/qa/ci-test-pipeline-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/qa/ci-test-pipeline-review-agent/harnesses/kiro-ide.agent.md +35 -0
- package/agents/qa/ci-test-pipeline-review-agent/metadata.json +33 -0
- package/agents/qa/helm-chart-quality-review-agent/AGENT.md +56 -0
- package/agents/qa/helm-chart-quality-review-agent/harnesses/claude-code.agent.md +40 -0
- package/agents/qa/helm-chart-quality-review-agent/harnesses/codex.toml +39 -0
- package/agents/qa/helm-chart-quality-review-agent/harnesses/copilot.agent.md +40 -0
- package/agents/qa/helm-chart-quality-review-agent/harnesses/cursor.agent.md +40 -0
- package/agents/qa/helm-chart-quality-review-agent/harnesses/gemini.agent.md +40 -0
- package/agents/qa/helm-chart-quality-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/qa/helm-chart-quality-review-agent/harnesses/kiro-ide.agent.md +40 -0
- package/agents/qa/helm-chart-quality-review-agent/metadata.json +35 -0
- package/agents/qa/kubernetes-manifest-quality-review-agent/AGENT.md +55 -0
- package/agents/qa/kubernetes-manifest-quality-review-agent/harnesses/claude-code.agent.md +32 -0
- package/agents/qa/kubernetes-manifest-quality-review-agent/harnesses/codex.toml +38 -0
- package/agents/qa/kubernetes-manifest-quality-review-agent/harnesses/copilot.agent.md +32 -0
- package/agents/qa/kubernetes-manifest-quality-review-agent/harnesses/cursor.agent.md +32 -0
- package/agents/qa/kubernetes-manifest-quality-review-agent/harnesses/gemini.agent.md +32 -0
- package/agents/qa/kubernetes-manifest-quality-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/qa/kubernetes-manifest-quality-review-agent/harnesses/kiro-ide.agent.md +32 -0
- package/agents/qa/kubernetes-manifest-quality-review-agent/metadata.json +35 -0
- package/agents/qa/llm-ai-pipeline-test-review-agent/AGENT.md +52 -0
- package/agents/qa/llm-ai-pipeline-test-review-agent/harnesses/claude-code.agent.md +36 -0
- package/agents/qa/llm-ai-pipeline-test-review-agent/harnesses/codex.toml +36 -0
- package/agents/qa/llm-ai-pipeline-test-review-agent/harnesses/copilot.agent.md +36 -0
- package/agents/qa/llm-ai-pipeline-test-review-agent/harnesses/cursor.agent.md +36 -0
- package/agents/qa/llm-ai-pipeline-test-review-agent/harnesses/gemini.agent.md +36 -0
- package/agents/qa/llm-ai-pipeline-test-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/qa/llm-ai-pipeline-test-review-agent/harnesses/kiro-ide.agent.md +36 -0
- package/agents/qa/llm-ai-pipeline-test-review-agent/metadata.json +35 -0
- package/agents/qa/playwright-e2e-execution-run-agent/AGENT.md +50 -0
- package/agents/qa/playwright-e2e-execution-run-agent/harnesses/claude-code.agent.md +39 -0
- package/agents/qa/playwright-e2e-execution-run-agent/harnesses/cursor.agent.md +39 -0
- package/agents/qa/playwright-e2e-execution-run-agent/metadata.json +28 -0
- package/agents/qa/playwright-e2e-suite-review-agent/AGENT.md +51 -0
- package/agents/qa/playwright-e2e-suite-review-agent/harnesses/claude-code.agent.md +35 -0
- package/agents/qa/playwright-e2e-suite-review-agent/harnesses/codex.toml +34 -0
- package/agents/qa/playwright-e2e-suite-review-agent/harnesses/copilot.agent.md +35 -0
- package/agents/qa/playwright-e2e-suite-review-agent/harnesses/cursor.agent.md +35 -0
- package/agents/qa/playwright-e2e-suite-review-agent/harnesses/gemini.agent.md +35 -0
- package/agents/qa/playwright-e2e-suite-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/qa/playwright-e2e-suite-review-agent/harnesses/kiro-ide.agent.md +35 -0
- package/agents/qa/playwright-e2e-suite-review-agent/metadata.json +35 -0
- package/agents/qa/plc-control-logic-safety-review-agent/AGENT.md +53 -0
- package/agents/qa/plc-control-logic-safety-review-agent/harnesses/claude-code.agent.md +37 -0
- package/agents/qa/plc-control-logic-safety-review-agent/harnesses/codex.toml +36 -0
- package/agents/qa/plc-control-logic-safety-review-agent/harnesses/copilot.agent.md +37 -0
- package/agents/qa/plc-control-logic-safety-review-agent/harnesses/cursor.agent.md +37 -0
- package/agents/qa/plc-control-logic-safety-review-agent/harnesses/gemini.agent.md +37 -0
- package/agents/qa/plc-control-logic-safety-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/qa/plc-control-logic-safety-review-agent/harnesses/kiro-ide.agent.md +37 -0
- package/agents/qa/plc-control-logic-safety-review-agent/metadata.json +33 -0
- package/agents/qa/rpa-workflow-resilience-review-agent/AGENT.md +52 -0
- package/agents/qa/rpa-workflow-resilience-review-agent/harnesses/claude-code.agent.md +36 -0
- package/agents/qa/rpa-workflow-resilience-review-agent/harnesses/codex.toml +35 -0
- package/agents/qa/rpa-workflow-resilience-review-agent/harnesses/copilot.agent.md +36 -0
- package/agents/qa/rpa-workflow-resilience-review-agent/harnesses/cursor.agent.md +36 -0
- package/agents/qa/rpa-workflow-resilience-review-agent/harnesses/gemini.agent.md +36 -0
- package/agents/qa/rpa-workflow-resilience-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/qa/rpa-workflow-resilience-review-agent/harnesses/kiro-ide.agent.md +36 -0
- package/agents/qa/rpa-workflow-resilience-review-agent/metadata.json +34 -0
- package/agents/qa/test-coverage-quality-review-agent/AGENT.md +50 -0
- package/agents/qa/test-coverage-quality-review-agent/harnesses/claude-code.agent.md +34 -0
- package/agents/qa/test-coverage-quality-review-agent/harnesses/codex.toml +33 -0
- package/agents/qa/test-coverage-quality-review-agent/harnesses/copilot.agent.md +34 -0
- package/agents/qa/test-coverage-quality-review-agent/harnesses/cursor.agent.md +34 -0
- package/agents/qa/test-coverage-quality-review-agent/harnesses/gemini.agent.md +34 -0
- package/agents/qa/test-coverage-quality-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/qa/test-coverage-quality-review-agent/harnesses/kiro-ide.agent.md +34 -0
- package/agents/qa/test-coverage-quality-review-agent/metadata.json +33 -0
- package/agents/qa/test-flakiness-triage-agent/AGENT.md +52 -0
- package/agents/qa/test-flakiness-triage-agent/harnesses/claude-code.agent.md +36 -0
- package/agents/qa/test-flakiness-triage-agent/harnesses/codex.toml +33 -0
- package/agents/qa/test-flakiness-triage-agent/harnesses/copilot.agent.md +36 -0
- package/agents/qa/test-flakiness-triage-agent/harnesses/cursor.agent.md +36 -0
- package/agents/qa/test-flakiness-triage-agent/harnesses/gemini.agent.md +36 -0
- package/agents/qa/test-flakiness-triage-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/qa/test-flakiness-triage-agent/harnesses/kiro-ide.agent.md +36 -0
- package/agents/qa/test-flakiness-triage-agent/metadata.json +33 -0
- package/catalog/agents.json +1047 -197
- package/catalog/asset-integrity.json +2950 -1675
- package/catalog/install-roles.json +65 -1
- package/catalog/skill-manifest.json +538 -0
- package/catalog/skills.json +685 -0
- package/package.json +5 -2
- package/plugins/vanguard-frontier-agentic/.codex-plugin/plugin.json +1 -1
- package/scripts/generate-readme-counts.mjs +162 -0
- package/skills/marketing/ai-advertising-targeting-fairness-review/SKILL.md +43 -0
- package/skills/marketing/ai-advertising-targeting-fairness-review/metadata.json +21 -0
- package/skills/marketing/ai-advertising-targeting-fairness-review/references/workflow-and-output.md +150 -0
- package/skills/marketing/analytics-data-minimization-review/SKILL.md +44 -0
- package/skills/marketing/analytics-data-minimization-review/metadata.json +22 -0
- package/skills/marketing/analytics-data-minimization-review/references/workflow-and-output.md +187 -0
- package/skills/marketing/email-sender-authentication-review/SKILL.md +43 -0
- package/skills/marketing/email-sender-authentication-review/metadata.json +22 -0
- package/skills/marketing/email-sender-authentication-review/references/workflow-and-output.md +152 -0
- package/skills/marketing/eu-ai-act-marketing-system-review/SKILL.md +43 -0
- package/skills/marketing/eu-ai-act-marketing-system-review/metadata.json +21 -0
- package/skills/marketing/eu-ai-act-marketing-system-review/references/workflow-and-output.md +176 -0
- package/skills/marketing/influencer-disclosure-compliance-review/SKILL.md +43 -0
- package/skills/marketing/influencer-disclosure-compliance-review/metadata.json +22 -0
- package/skills/marketing/influencer-disclosure-compliance-review/references/workflow-and-output.md +156 -0
- package/skills/marketing/lookalike-audience-upload-compliance-review/SKILL.md +44 -0
- package/skills/marketing/lookalike-audience-upload-compliance-review/metadata.json +21 -0
- package/skills/marketing/lookalike-audience-upload-compliance-review/references/workflow-and-output.md +203 -0
- package/skills/marketing/marketing-consent-data-collection-review/SKILL.md +44 -0
- package/skills/marketing/marketing-consent-data-collection-review/metadata.json +21 -0
- package/skills/marketing/marketing-consent-data-collection-review/references/workflow-and-output.md +139 -0
- package/skills/marketing/marketing-conversion-flow-dark-pattern-review/SKILL.md +45 -0
- package/skills/marketing/marketing-conversion-flow-dark-pattern-review/metadata.json +22 -0
- package/skills/marketing/marketing-conversion-flow-dark-pattern-review/references/workflow-and-output.md +160 -0
- package/skills/marketing/marketing-email-list-retention-review/SKILL.md +43 -0
- package/skills/marketing/marketing-email-list-retention-review/metadata.json +22 -0
- package/skills/marketing/marketing-email-list-retention-review/references/workflow-and-output.md +144 -0
- package/skills/marketing/marketing-gpc-signal-honoring-review/SKILL.md +42 -0
- package/skills/marketing/marketing-gpc-signal-honoring-review/metadata.json +22 -0
- package/skills/marketing/marketing-gpc-signal-honoring-review/references/workflow-and-output.md +145 -0
- package/skills/marketing/marketing-maestro/README.md +37 -0
- package/skills/marketing/marketing-maestro/SKILL.md +49 -0
- package/skills/marketing/marketing-maestro/metadata.json +26 -0
- package/skills/marketing/marketing-maestro/references/safety-checklist.md +67 -0
- package/skills/marketing/marketing-maestro/references/workflow-and-output.md +110 -0
- package/skills/marketing/marketing-pixel-data-leakage-review/SKILL.md +43 -0
- package/skills/marketing/marketing-pixel-data-leakage-review/metadata.json +21 -0
- package/skills/marketing/marketing-pixel-data-leakage-review/references/workflow-and-output.md +129 -0
- package/skills/marketing/martech-access-governance-review/SKILL.md +45 -0
- package/skills/marketing/martech-access-governance-review/metadata.json +21 -0
- package/skills/marketing/martech-access-governance-review/references/workflow-and-output.md +116 -0
- package/skills/marketing/programmatic-supply-chain-integrity-review/SKILL.md +43 -0
- package/skills/marketing/programmatic-supply-chain-integrity-review/metadata.json +22 -0
- package/skills/marketing/programmatic-supply-chain-integrity-review/references/workflow-and-output.md +164 -0
- package/skills/qa/ci-test-pipeline-review/SKILL.md +45 -0
- package/skills/qa/ci-test-pipeline-review/metadata.json +21 -0
- package/skills/qa/ci-test-pipeline-review/references/workflow-and-output.md +124 -0
- package/skills/qa/helm-chart-quality-review/SKILL.md +61 -0
- package/skills/qa/helm-chart-quality-review/metadata.json +23 -0
- package/skills/qa/helm-chart-quality-review/references/workflow-and-output.md +174 -0
- package/skills/qa/kubernetes-manifest-quality-review/SKILL.md +92 -0
- package/skills/qa/kubernetes-manifest-quality-review/metadata.json +23 -0
- package/skills/qa/kubernetes-manifest-quality-review/references/workflow-and-output.md +246 -0
- package/skills/qa/llm-ai-pipeline-test-review/SKILL.md +52 -0
- package/skills/qa/llm-ai-pipeline-test-review/metadata.json +23 -0
- package/skills/qa/llm-ai-pipeline-test-review/references/workflow-and-output.md +221 -0
- package/skills/qa/playwright-e2e-execution-run/SKILL.md +54 -0
- package/skills/qa/playwright-e2e-execution-run/metadata.json +24 -0
- package/skills/qa/playwright-e2e-execution-run/references/workflow-and-output.md +133 -0
- package/skills/qa/playwright-e2e-suite-review/SKILL.md +44 -0
- package/skills/qa/playwright-e2e-suite-review/metadata.json +23 -0
- package/skills/qa/playwright-e2e-suite-review/references/workflow-and-output.md +176 -0
- package/skills/qa/plc-control-logic-safety-review/SKILL.md +47 -0
- package/skills/qa/plc-control-logic-safety-review/metadata.json +21 -0
- package/skills/qa/plc-control-logic-safety-review/references/workflow-and-output.md +231 -0
- package/skills/qa/rpa-workflow-resilience-review/SKILL.md +47 -0
- package/skills/qa/rpa-workflow-resilience-review/metadata.json +22 -0
- package/skills/qa/rpa-workflow-resilience-review/references/workflow-and-output.md +210 -0
- package/skills/qa/test-coverage-quality-review/SKILL.md +44 -0
- package/skills/qa/test-coverage-quality-review/metadata.json +21 -0
- package/skills/qa/test-coverage-quality-review/references/workflow-and-output.md +139 -0
- package/skills/qa/test-flakiness-triage/SKILL.md +43 -0
- package/skills/qa/test-flakiness-triage/metadata.json +21 -0
- package/skills/qa/test-flakiness-triage/references/workflow-and-output.md +114 -0
- package/tests/eval-qa-cluster.mjs +111 -0
- package/tests/fixtures/marketing-maestro-routing/expected/001-happy-ai-advertising-targeting-fairness-review.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/002-happy-analytics-data-minimization-review.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/003-happy-consent-data-collection-review.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/004-happy-conversion-flow-dark-pattern-review.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/005-happy-email-list-retention-review.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/006-happy-email-sender-authentication-review.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/007-happy-eu-ai-act-marketing-system-review.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/008-happy-gpc-signal-honoring-review.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/009-happy-influencer-disclosure-compliance-review.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/010-happy-lookalike-audience-upload-compliance-review.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/011-happy-martech-access-governance-review.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/012-happy-pixel-data-leakage-review.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/013-happy-programmatic-supply-chain-integrity-review.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/marketing-maestro-routing/expected/adv-instruction-injection.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/expected/adv-live-guard-gate.json +4 -0
- package/tests/fixtures/marketing-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/marketing-maestro-routing/expected/adv-secrets-bait.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/001-happy-ai-advertising-targeting-fairness-review.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/002-happy-analytics-data-minimization-review.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/003-happy-consent-data-collection-review.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/004-happy-conversion-flow-dark-pattern-review.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/005-happy-email-list-retention-review.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/006-happy-email-sender-authentication-review.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/007-happy-eu-ai-act-marketing-system-review.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/008-happy-gpc-signal-honoring-review.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/009-happy-influencer-disclosure-compliance-review.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/010-happy-lookalike-audience-upload-compliance-review.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/011-happy-martech-access-governance-review.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/012-happy-pixel-data-leakage-review.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/013-happy-programmatic-supply-chain-integrity-review.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/adv-live-guard-gate.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/marketing-maestro-routing/taxonomy.json +183 -0
- package/tests/validate-catalog.py +1 -0
- package/tests/validate-maestro-routing.py +4 -0
- package/tests/validate-readme-counts.mjs +179 -0
package/skills/marketing/marketing-pixel-data-leakage-review/references/workflow-and-output.md
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# Workflow and Output Contract
|
|
2
|
+
|
|
3
|
+
## Workflow
|
|
4
|
+
|
|
5
|
+
### Step 1 — Collect inputs
|
|
6
|
+
|
|
7
|
+
Ask the user to provide one or more of the following as sanitized exports (replace real values with placeholders; no real visitor data, no ad-platform credentials):
|
|
8
|
+
- Tag manager container export showing pixels, triggers, and the variables they read
|
|
9
|
+
- Pixel snippets (Meta Pixel, TikTok Pixel, Google Ads / floodlight, LinkedIn Insight Tag, etc.)
|
|
10
|
+
- A representative conversion or page-view event payload (the parameters actually sent)
|
|
11
|
+
- The `dataLayer` specification or a sample `dataLayer` push
|
|
12
|
+
- The list of page types the pixels load on, especially any sensitive-context pages
|
|
13
|
+
- Whether advanced/automatic matching is enabled on any pixel
|
|
14
|
+
|
|
15
|
+
If the user provides only a partial set, note which sections are absent and scope findings accordingly.
|
|
16
|
+
|
|
17
|
+
### Step 2 — Page-context classification
|
|
18
|
+
|
|
19
|
+
Classify the pages each pixel loads on before inspecting payloads. Context alone can be the leak:
|
|
20
|
+
- **Special-category context**: health/medical, mental health, reproductive, financial hardship, loan/credit, legal, sexual orientation, religious, immigration.
|
|
21
|
+
- **Authenticated context**: post-login account, transaction, order-history, or profile pages.
|
|
22
|
+
- **General marketing context**: homepage, blog, top-of-funnel landing pages.
|
|
23
|
+
|
|
24
|
+
Any advertising or social pixel firing in a special-category or authenticated context is HIGH on context alone — the URL, referrer, and page title reveal the person's circumstances regardless of payload contents.
|
|
25
|
+
|
|
26
|
+
### Step 3 — Payload PII audit
|
|
27
|
+
|
|
28
|
+
Inspect every parameter the pixel transmits. Flag direct identifiers and quasi-identifiers:
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
# HIGH — raw email in the page URL, forwarded into the pixel page-view event
|
|
32
|
+
https://example.com/welcome?email=jane.doe@example.com
|
|
33
|
+
Meta Pixel: track('PageView') # pixel reads location.href → email leaves the page
|
|
34
|
+
|
|
35
|
+
# HIGH — PII pushed into dataLayer and mapped to event parameters
|
|
36
|
+
dataLayer.push({ event: 'signup', user_email: 'jane.doe@example.com', phone: '+15551234567' });
|
|
37
|
+
|
|
38
|
+
# CORRECT — only a non-identifying conversion signal
|
|
39
|
+
dataLayer.push({ event: 'signup', signup_tier: 'free' });
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Check for: email, phone, full name, postal address, date of birth, government IDs, account numbers, precise geolocation, and free-text fields that may contain any of the above.
|
|
43
|
+
|
|
44
|
+
### Step 4 — Form-field auto-capture audit
|
|
45
|
+
|
|
46
|
+
Identify any feature that captures form input without an explicit field allowlist:
|
|
47
|
+
- Meta Pixel **Advanced Matching** (automatic) — scrapes form fields on the page.
|
|
48
|
+
- Google **enhanced conversions** with auto-detection rather than a defined selector.
|
|
49
|
+
- Tag-manager **form-submit** triggers with a variable capturing all field values.
|
|
50
|
+
- Generic input/keystroke listeners.
|
|
51
|
+
|
|
52
|
+
```text
|
|
53
|
+
# HIGH — automatic advanced matching scrapes every form field on the page
|
|
54
|
+
fbq('init', 'PIXEL_ID', {}, { autoConfig: true });
|
|
55
|
+
|
|
56
|
+
# LOWER RISK — matching restricted to explicitly chosen, hashed fields
|
|
57
|
+
fbq('init', 'PIXEL_ID');
|
|
58
|
+
fbq('track', 'Lead'); # no automatic field scraping; identifiers handled server-side if needed
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Auto-capture is HIGH because it collects whatever the visitor typed, including fields the marketer never intended to send.
|
|
62
|
+
|
|
63
|
+
### Step 5 — Identifier-handling audit
|
|
64
|
+
|
|
65
|
+
For any identifier intentionally sent for matching:
|
|
66
|
+
- Confirm SHA-256 hashing where the ad platform's API requires it, and confirm hashing happens before transmission, not by the ad network on receipt.
|
|
67
|
+
- Note that hashing is pseudonymization, not anonymization — it still constitutes disclosure of personal data and still requires a lawful basis and consent scope.
|
|
68
|
+
- Confirm a redaction or allowlist layer strips PII from URLs and referrers before any pixel reads `location`.
|
|
69
|
+
|
|
70
|
+
Missing hashing where required is HIGH. Missing a redaction layer is MEDIUM.
|
|
71
|
+
|
|
72
|
+
### Step 6 — Payload minimization audit
|
|
73
|
+
|
|
74
|
+
Conversion events should send the minimum signal needed for measurement:
|
|
75
|
+
- A conversion flag and a coarse category are usually sufficient.
|
|
76
|
+
- Precise revenue, full order line items, account balances, or SKU-level health/financial detail sent to an ad network is MEDIUM — it is more than measurement requires.
|
|
77
|
+
|
|
78
|
+
### Step 7 — Consent-load ordering check
|
|
79
|
+
|
|
80
|
+
Note whether pixels load before the consent signal. Flag as MEDIUM and explicitly defer the full consent-gating analysis to the `marketing-consent-data-collection-review` skill — do not duplicate that analysis here.
|
|
81
|
+
|
|
82
|
+
### Step 8 — Produce the output
|
|
83
|
+
|
|
84
|
+
Format findings using the Output section below.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Output
|
|
89
|
+
|
|
90
|
+
Return findings in this structure:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
## Verdict
|
|
94
|
+
<one sentence: pass / needs work / critical issues found>
|
|
95
|
+
|
|
96
|
+
## Evidence level
|
|
97
|
+
<payload provided | container provided | documentation-based | inference>
|
|
98
|
+
|
|
99
|
+
## Findings
|
|
100
|
+
|
|
101
|
+
### CRITICAL
|
|
102
|
+
- [C1] <finding title>: <description> — <remediation>
|
|
103
|
+
|
|
104
|
+
### HIGH
|
|
105
|
+
- [H1] <finding title>: <description> — <remediation>
|
|
106
|
+
|
|
107
|
+
### MEDIUM
|
|
108
|
+
- [M1] <finding title>: <description> — <remediation>
|
|
109
|
+
|
|
110
|
+
### LOW
|
|
111
|
+
- [L1] <finding title>: <description> — <remediation>
|
|
112
|
+
|
|
113
|
+
## Safe next actions
|
|
114
|
+
1. <action>
|
|
115
|
+
2. <action>
|
|
116
|
+
|
|
117
|
+
## Open questions
|
|
118
|
+
- <question requiring user clarification>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Security and scope notes
|
|
124
|
+
|
|
125
|
+
- This is a static review. Never request real visitor data, real conversion logs, or ad-platform credentials. Work from sanitized payloads with placeholder values.
|
|
126
|
+
- A leak found here may be a reportable breach under HIPAA, the FTC Health Breach Notification Rule, or state law — flag that possibility and route the determination to qualified counsel and the incident-response process. Do not make the breach-notification call yourself.
|
|
127
|
+
- Never recommend a fix that keeps PII flowing to the ad network "but hashed" as a complete remedy — hashing is mitigation, not elimination.
|
|
128
|
+
- Never recommend removing a pixel without naming the conversion measurement lost and a server-side or consent-scoped alternative.
|
|
129
|
+
- When evidence is partial, scope each finding to what was provided and state the assumption explicitly.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: martech-access-governance-review
|
|
3
|
+
description: Use this skill when reviewing access governance across a marketing technology stack — OAuth grants and connected apps, API keys and tokens, CRM and marketing-automation role assignments, and integration scopes. Trigger when a user provides an OAuth connected-app inventory, an integration scope list, a CRM/MAP role matrix, an API-key inventory, or asks whether their martech integrations are over-permissioned, whether stale connectors still hold live tokens, or how to apply least privilege to their marketing stack.
|
|
4
|
+
allowed-tools: Read Grep Glob
|
|
5
|
+
metadata:
|
|
6
|
+
author: "github: Raishin"
|
|
7
|
+
version: "0.1.0"
|
|
8
|
+
updated: "2026-05-17"
|
|
9
|
+
category: security
|
|
10
|
+
lifecycle: experimental
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Martech Access Governance Review
|
|
14
|
+
|
|
15
|
+
## Purpose
|
|
16
|
+
This skill reviews identity and access governance across a marketing technology stack — the CRM, marketing automation platform, CDP, analytics, and the long tail of connected SaaS apps. Marketing operations accumulate OAuth grants, API keys, and seat permissions faster than any other business function, and rarely deprovision them. The result is a stack where third-party connectors hold full-CRM scopes, a single shared admin key authenticates a dozen tools, and a contractor's connected app still has a live refresh token a year after the engagement ended. This is one of the most exploited SaaS breach paths: the marketing stack holds the entire customer database and is governed loosely. The review catches over-broad OAuth scopes, shared and non-rotating credentials, stale grants, missing token expiry, and absent ownership before they become an incident.
|
|
17
|
+
|
|
18
|
+
## Lean operating rules
|
|
19
|
+
- Treat any third-party connected app granted a full-read or read-write scope over the entire CRM contact/lead database when its function needs a narrow scope as HIGH — over-broad scope is the blast radius if that vendor is breached.
|
|
20
|
+
- Treat a single API key or service account shared across multiple tools or integrations as HIGH — it cannot be rotated or revoked without an outage, and a leak compromises every consumer.
|
|
21
|
+
- Treat any long-lived API key or OAuth grant with no rotation schedule and no expiry as HIGH — a leaked non-expiring credential is valid until someone notices.
|
|
22
|
+
- Treat a connected app, integration, or token tied to a departed employee, ended vendor engagement, or decommissioned tool that still holds a live grant as HIGH — stale credentials are unattended attack surface.
|
|
23
|
+
- Treat a CRM or marketing-automation integration credentialed with an admin or owner role when an API-only or limited integration role exists as HIGH — privilege beyond function violates least privilege.
|
|
24
|
+
- Treat a connected app or API key with no named human or team owner as HIGH — unowned credentials are never reviewed and never revoked.
|
|
25
|
+
- Flag marketing user seats holding bulk-export or full-database-export permission beyond the few who need it as MEDIUM — bulk export is the exfiltration path.
|
|
26
|
+
- Flag the absence of a recurring access-review cadence for connected apps and integration credentials as MEDIUM.
|
|
27
|
+
- Flag OAuth grants that include offline-access / refresh-token scope where only short-lived interactive access is needed as MEDIUM.
|
|
28
|
+
- Flag credentials transmitted or stored in plaintext (in tag managers, spreadsheets, shared docs, or automation tools) as HIGH.
|
|
29
|
+
- Do not recommend revoking a grant without naming the integration it powers and the marketing workflow that breaks.
|
|
30
|
+
- Label every finding with evidence basis: inventory provided, role matrix provided, documentation-based, or inference from missing config.
|
|
31
|
+
|
|
32
|
+
## References
|
|
33
|
+
Load these only when needed:
|
|
34
|
+
- [Workflow and output contract](references/workflow-and-output.md) — use when executing the full review or formatting the final answer.
|
|
35
|
+
|
|
36
|
+
## Response minimum
|
|
37
|
+
Return, at minimum:
|
|
38
|
+
- OAuth scope blast-radius findings (connected apps over-scoped vs function)
|
|
39
|
+
- Shared / non-rotating credential findings
|
|
40
|
+
- Stale grant findings (departed users, ended vendors, dead tools)
|
|
41
|
+
- Integration role assessment (admin used where limited role exists)
|
|
42
|
+
- Ownership and access-review cadence gaps
|
|
43
|
+
- Bulk-export permission distribution assessment
|
|
44
|
+
- Severity-labelled finding list (critical / high / medium / low)
|
|
45
|
+
- Safe next actions
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "martech-access-governance-review",
|
|
3
|
+
"name": "Martech Access Governance Review",
|
|
4
|
+
"type": "skill",
|
|
5
|
+
"provider": "marketing",
|
|
6
|
+
"harnesses": ["codex", "claude-code", "cursor", "gemini", "kiro", "other"],
|
|
7
|
+
"summary": "Review access governance across a marketing technology stack — OAuth connected apps, API keys, CRM and marketing-automation roles, and integration scopes — for least-privilege violations, shared and stale credentials, and missing ownership.",
|
|
8
|
+
"source_type": "original",
|
|
9
|
+
"official_docs": [
|
|
10
|
+
"https://datatracker.ietf.org/doc/html/rfc6749",
|
|
11
|
+
"https://oauth.net/2/scope/",
|
|
12
|
+
"https://csrc.nist.gov/glossary/term/least_privilege",
|
|
13
|
+
"https://owasp.org/www-project-top-ten/",
|
|
14
|
+
"https://csrc.nist.gov/pubs/sp/800/207/final"
|
|
15
|
+
],
|
|
16
|
+
"security_notes": "A marketing technology stack holds the full customer database and accumulates OAuth grants, API keys, and seats faster than it deprovisions them. Over-broad connector scopes, shared non-rotating credentials, and stale grants from departed staff or ended vendors are a heavily exploited SaaS breach path. Review works from sanitized inventories only; never request, collect, or echo credential values, tokens, or secrets.",
|
|
17
|
+
"last_verified": "2026-05-17",
|
|
18
|
+
"path": "skills/marketing/martech-access-governance-review",
|
|
19
|
+
"author": "github: Raishin",
|
|
20
|
+
"version": "0.1.0"
|
|
21
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Workflow and Output Contract
|
|
2
|
+
|
|
3
|
+
## Workflow
|
|
4
|
+
|
|
5
|
+
### Step 1 — Collect inputs
|
|
6
|
+
|
|
7
|
+
Ask the user to provide one or more of the following as sanitized inventories (redact every credential value — names and scopes only, never the secret itself):
|
|
8
|
+
- Connected-app / OAuth grant inventory for the CRM and marketing automation platform (app name, scopes granted, grant date, owner)
|
|
9
|
+
- API-key inventory (key name/label, the tool it authenticates, scope, rotation history — never the key value)
|
|
10
|
+
- CRM and marketing-automation role matrix (roles, permissions, which integrations and users hold each)
|
|
11
|
+
- The list of marketing tools in the stack and how each authenticates
|
|
12
|
+
- Offboarding process for departed employees and ended vendor engagements, if documented
|
|
13
|
+
|
|
14
|
+
If the user provides only a partial set, note which sections are absent and scope findings accordingly. If a user pastes an actual credential value, stop, tell them not to, and ask them to treat it as compromised and rotate it.
|
|
15
|
+
|
|
16
|
+
### Step 2 — Build the integration map
|
|
17
|
+
|
|
18
|
+
For each integration, record: what it is, what marketing function it performs, what data it touches, and the minimum scope that function requires. This "needed scope" baseline is what every granted scope is measured against.
|
|
19
|
+
|
|
20
|
+
### Step 3 — OAuth scope blast-radius audit
|
|
21
|
+
|
|
22
|
+
For every connected app, compare granted scope to needed scope.
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
# HIGH — a form/survey tool granted full read-write over all CRM contacts
|
|
26
|
+
App: SurveyTool
|
|
27
|
+
Granted: crm.objects.contacts.read, crm.objects.contacts.write, crm.objects.deals.read
|
|
28
|
+
Needed: crm.objects.contacts.write (it only creates contacts from form fills)
|
|
29
|
+
|
|
30
|
+
# CORRECT — scope matches function
|
|
31
|
+
App: SurveyTool
|
|
32
|
+
Granted: crm.objects.contacts.write
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Flag every scope granted beyond function as HIGH. The blast radius of any connected app is the data its scope can reach if that vendor is breached — and SaaS supply-chain breaches routinely pivot through exactly these grants.
|
|
36
|
+
|
|
37
|
+
### Step 4 — Credential-sharing and rotation audit
|
|
38
|
+
|
|
39
|
+
- A single API key or service account used by more than one tool or integration is HIGH — it cannot be rotated or revoked for one consumer without breaking the others, and a single leak compromises all of them.
|
|
40
|
+
- Any key or grant with no rotation schedule and no expiry is HIGH.
|
|
41
|
+
- A "personal" API key issued under an individual employee's account, rather than a dedicated integration identity, is MEDIUM — it breaks when they leave and carries their full personal permissions.
|
|
42
|
+
|
|
43
|
+
### Step 5 — Stale-grant audit
|
|
44
|
+
|
|
45
|
+
Identify grants that should no longer exist:
|
|
46
|
+
- Connected apps or tokens owned by departed employees.
|
|
47
|
+
- Grants from vendor engagements or trials that have ended.
|
|
48
|
+
- Credentials for tools that were decommissioned but never disconnected.
|
|
49
|
+
- OAuth refresh tokens that are still valid because nothing ever revoked them.
|
|
50
|
+
|
|
51
|
+
Every live stale grant is HIGH — it is access nobody is watching.
|
|
52
|
+
|
|
53
|
+
### Step 6 — Integration role audit
|
|
54
|
+
|
|
55
|
+
Check the role each integration authenticates with:
|
|
56
|
+
- An integration using an admin or owner role when an API-only or limited integration role exists is HIGH.
|
|
57
|
+
- An integration that can change other users' permissions, billing, or security settings, when it only needs to read or write records, is HIGH.
|
|
58
|
+
|
|
59
|
+
### Step 7 — Ownership and review-cadence audit
|
|
60
|
+
|
|
61
|
+
- Every connected app and integration credential must have a named human or team owner. Unowned credentials are HIGH — nobody will ever review or revoke them.
|
|
62
|
+
- There must be a recurring access-review cadence (for example, quarterly) covering connected apps and integration credentials. Its absence is MEDIUM.
|
|
63
|
+
|
|
64
|
+
### Step 8 — Bulk-export and credential-storage audit
|
|
65
|
+
|
|
66
|
+
- Identify which marketing seats hold full-database or bulk-export permission. This is the exfiltration path; it should be held by the few who need it. Broad distribution is MEDIUM.
|
|
67
|
+
- Identify where credentials are stored. Credentials in spreadsheets, shared docs, tag-manager variables, or automation-tool fields in plaintext are HIGH. They belong in a secrets manager.
|
|
68
|
+
|
|
69
|
+
### Step 9 — Produce the output
|
|
70
|
+
|
|
71
|
+
Format findings using the Output section below.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Output
|
|
76
|
+
|
|
77
|
+
Return findings in this structure:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
## Verdict
|
|
81
|
+
<one sentence: pass / needs work / critical issues found>
|
|
82
|
+
|
|
83
|
+
## Evidence level
|
|
84
|
+
<inventory provided | role matrix provided | documentation-based | inference>
|
|
85
|
+
|
|
86
|
+
## Findings
|
|
87
|
+
|
|
88
|
+
### CRITICAL
|
|
89
|
+
- [C1] <finding title>: <description> — <remediation>
|
|
90
|
+
|
|
91
|
+
### HIGH
|
|
92
|
+
- [H1] <finding title>: <description> — <remediation>
|
|
93
|
+
|
|
94
|
+
### MEDIUM
|
|
95
|
+
- [M1] <finding title>: <description> — <remediation>
|
|
96
|
+
|
|
97
|
+
### LOW
|
|
98
|
+
- [L1] <finding title>: <description> — <remediation>
|
|
99
|
+
|
|
100
|
+
## Safe next actions
|
|
101
|
+
1. <action>
|
|
102
|
+
2. <action>
|
|
103
|
+
|
|
104
|
+
## Open questions
|
|
105
|
+
- <question requiring user clarification>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Security and scope notes
|
|
111
|
+
|
|
112
|
+
- This is a static review. Never request, collect, store, or echo credential values, API keys, tokens, or secrets. Work from inventories of names and scopes only.
|
|
113
|
+
- If the user pastes a real credential, treat it as compromised: tell them, and recommend immediate rotation.
|
|
114
|
+
- Apply least privilege and zero-trust assumptions: every integration should hold the narrowest scope, the shortest-lived token, and a named owner.
|
|
115
|
+
- Never recommend revoking a grant without naming the integration it powers and the marketing workflow that breaks — propose the scoped-down replacement grant alongside the revocation.
|
|
116
|
+
- When evidence is partial, scope each finding to what was provided and state the assumption explicitly.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: programmatic-supply-chain-integrity-review
|
|
3
|
+
description: Use this skill when reviewing ads.txt, app-ads.txt, and sellers.json files for a publisher or advertiser's programmatic supply chain to detect unauthorized resellers, domain-spoofing exposure, and SupplyChain Object gaps. Trigger when a user provides an ads.txt file, an app-ads.txt file, a sellers.json endpoint response, or asks whether their programmatic supply chain has unauthorized intermediaries, IVT exposure, domain-spoofing risk, or whether their supply chain declaration satisfies IAB Tech Lab, MRC, or DSP procurement requirements.
|
|
4
|
+
allowed-tools: Read Grep Glob
|
|
5
|
+
metadata:
|
|
6
|
+
author: "github: Raishin"
|
|
7
|
+
version: "0.1.0"
|
|
8
|
+
updated: "2026-05-17"
|
|
9
|
+
category: finops
|
|
10
|
+
lifecycle: experimental
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Programmatic Supply Chain Integrity Review
|
|
14
|
+
|
|
15
|
+
## Purpose
|
|
16
|
+
This skill reviews ads.txt, app-ads.txt, and sellers.json declarations for a publisher's or advertiser's programmatic supply chain to detect unauthorized resellers, domain-spoofing exposure, SupplyChain Object gaps, and IVT-exposure vectors. Ads.txt (IAB Tech Lab v1.1) and app-ads.txt are the publisher's machine-readable authorization of which exchanges and resellers may sell their inventory; sellers.json (IAB Tech Lab v1.0) is the exchange's machine-readable disclosure of which sellers it represents. When these files are inconsistent — an ads.txt RESELLER entry that no exchange discloses in sellers.json, a DIRECT entry that resolves as `is_confidential:1`, or a whitelisted domain whose ads.txt is absent — the supply chain is opaque to buyers, exposing them to unauthorized intermediary fees and exposing publishers to domain spoofing. The SupplyChain Object (OpenRTB extension) enables bid-time audit of the complete reseller path; gaps in the declared path are treated as invalid traffic by MRC-compliant measurement vendors and many DSP procurement teams. The review works from the raw text of the artifact files pasted as input and produces severity-labelled findings with remediation.
|
|
17
|
+
|
|
18
|
+
## Lean operating rules
|
|
19
|
+
- Treat ads.txt RESELLER entries for exchange accounts that do not appear in any sellers.json file for that exchange as HIGH — these are undisclosed intermediaries whose presence in the resale chain cannot be verified by buyers, constituting unauthorized supply path opacity under IAB Tech Lab ads.txt 1.1.
|
|
20
|
+
- Treat a whitelisted publisher domain whose ads.txt file is entirely absent as HIGH — the absence means buyers cannot verify any authorized seller relationship; the domain is categorically IVT-exposed per MRC Invalid Traffic Detection guidelines and most DSP whitelisting criteria.
|
|
21
|
+
- Treat a DIRECT entry in ads.txt where the corresponding seller account in sellers.json carries `is_confidential:1` as HIGH — a DIRECT relationship by definition requires transparent publisher identity; confidential resolution contradicts the DIRECT classification and is a domain-spoofing risk vector.
|
|
22
|
+
- Treat ads.txt entries that reference exchange account IDs not present in the exchange's sellers.json at all (orphaned account IDs) as HIGH — the account cannot be verified as a legitimate seller, which is a signal of domain spoofing or stale declarations.
|
|
23
|
+
- Treat a `seller_type: INTERMEDIARY` entry in sellers.json that has no corresponding ads.txt RESELLER entry on the publisher domain as MEDIUM — the intermediary is declared by the exchange but not authorized by the publisher, creating a supply path discrepancy.
|
|
24
|
+
- Treat SupplyChain Object declarations with incomplete node chains (missing `asi`, `sid`, or `rid` fields in intermediate nodes) as MEDIUM — incomplete chains reduce bid-time auditability and may cause DSP procurement filters to reject the bid.
|
|
25
|
+
- Flag MEDIUM when the ads.txt file has not been updated within twelve months and active exchange relationships are known to have changed — stale declarations expose revenue to unauthorized resellers who retain old account relationships.
|
|
26
|
+
- Flag the absence of app-ads.txt for a mobile app publisher as MEDIUM when the publisher's ads.txt covers only web inventory — app inventory without app-ads.txt is unprotected by IAB Tech Lab supply-chain controls.
|
|
27
|
+
- Do not recommend removing a RESELLER entry without first confirming whether it represents a legitimate revenue path that can be replaced with a DIRECT relationship or a disclosed intermediary.
|
|
28
|
+
- Label every finding with evidence basis: ads.txt provided, sellers.json provided, documentation-based, or inference from absent file.
|
|
29
|
+
|
|
30
|
+
## References
|
|
31
|
+
Load these only when needed:
|
|
32
|
+
- [Workflow and output contract](references/workflow-and-output.md) — use when executing the full review or formatting the final answer.
|
|
33
|
+
|
|
34
|
+
## Response minimum
|
|
35
|
+
Return, at minimum:
|
|
36
|
+
- RESELLER-to-sellers.json consistency assessment (unauthorized intermediaries)
|
|
37
|
+
- DIRECT-entry confidentiality conflict assessment (domain-spoofing risk)
|
|
38
|
+
- Orphaned account ID assessment (account IDs in ads.txt not in sellers.json)
|
|
39
|
+
- Absent ads.txt / app-ads.txt assessment for whitelisted domains
|
|
40
|
+
- SupplyChain Object completeness assessment
|
|
41
|
+
- Stale declaration assessment
|
|
42
|
+
- Severity-labelled finding list (critical / high / medium / low)
|
|
43
|
+
- Safe next actions
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "programmatic-supply-chain-integrity-review",
|
|
3
|
+
"name": "Programmatic Supply Chain Integrity Review",
|
|
4
|
+
"type": "skill",
|
|
5
|
+
"provider": "marketing",
|
|
6
|
+
"harnesses": ["codex", "claude-code", "cursor", "gemini", "kiro", "other"],
|
|
7
|
+
"summary": "Review ads.txt, app-ads.txt, and sellers.json files for a publisher or advertiser's programmatic supply chain to detect unauthorized resellers, domain-spoofing exposure, and SupplyChain Object gaps.",
|
|
8
|
+
"source_type": "original",
|
|
9
|
+
"official_docs": [
|
|
10
|
+
"https://iabtechlab.com/ads-txt/",
|
|
11
|
+
"https://iabtechlab.com/sellers-json/",
|
|
12
|
+
"https://iabtechlab.com/supplychain-object/",
|
|
13
|
+
"https://mediaratingcouncil.org/sites/default/files/Standards/MRC%20Invalid%20Traffic%20Detection%20and%20Filtration%20Guidelines%20Addendum.pdf",
|
|
14
|
+
"https://iabtechlab.com/app-ads-txt/"
|
|
15
|
+
],
|
|
16
|
+
"security_notes": "Supply chain integrity reviews work from the raw text of ads.txt, app-ads.txt, and sellers.json files pasted as input. Never request DSP credentials, exchange account tokens, or bid-stream logs. ads.txt and sellers.json are publicly resolvable files; the artifact is the publisher's or exchange's own exported text, not a live crawl of production endpoints.",
|
|
17
|
+
"last_verified": "2026-05-17",
|
|
18
|
+
"path": "skills/marketing/programmatic-supply-chain-integrity-review",
|
|
19
|
+
"author": "github: Raishin",
|
|
20
|
+
"version": "0.1.0",
|
|
21
|
+
"lifecycle": "experimental"
|
|
22
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Workflow and Output Contract
|
|
2
|
+
|
|
3
|
+
## Workflow
|
|
4
|
+
|
|
5
|
+
### Step 1 — Collect inputs
|
|
6
|
+
|
|
7
|
+
Ask the user to provide the following as raw pasted text (these are public files; no credentials required):
|
|
8
|
+
- The full content of `ads.txt` from the publisher domain root (e.g., `example.com/ads.txt`)
|
|
9
|
+
- The full content of `app-ads.txt` if the publisher has mobile app inventory
|
|
10
|
+
- The relevant excerpt or full content of the exchange's `sellers.json` endpoint response — at minimum the entries corresponding to the publisher's account IDs
|
|
11
|
+
- The list of exchanges and resellers the publisher has active relationships with, to identify stale or missing entries
|
|
12
|
+
- SupplyChain Object node declarations if the user has access to bid-stream samples or SSP configuration exports
|
|
13
|
+
|
|
14
|
+
If only ads.txt is provided without sellers.json, note that RESELLER-to-sellers.json consistency findings are inference only.
|
|
15
|
+
|
|
16
|
+
### Step 2 — ads.txt structural audit
|
|
17
|
+
|
|
18
|
+
Parse each line of the ads.txt file. Each valid entry has the format:
|
|
19
|
+
```
|
|
20
|
+
<exchange domain>, <publisher account ID>, <relationship>, <certification authority ID>
|
|
21
|
+
```
|
|
22
|
+
Where `<relationship>` is `DIRECT` or `RESELLER`.
|
|
23
|
+
|
|
24
|
+
Check for:
|
|
25
|
+
- Malformed lines (missing fields, incorrect field count, invalid relationship value).
|
|
26
|
+
- Duplicate entries (same exchange domain + account ID combination appearing more than once).
|
|
27
|
+
- Entries using IP addresses instead of domain names (not permitted by the spec).
|
|
28
|
+
- Entries missing the certification authority ID (optional per spec, but flag absence as informational).
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
# MALFORMED — missing account ID field
|
|
32
|
+
openx.com, RESELLER
|
|
33
|
+
|
|
34
|
+
# DUPLICATE — same entry appears twice
|
|
35
|
+
appnexus.com, 12345, DIRECT, f08c47fec0942fa0
|
|
36
|
+
appnexus.com, 12345, DIRECT, f08c47fec0942fa0
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Step 3 — RESELLER-to-sellers.json consistency audit
|
|
40
|
+
|
|
41
|
+
For every RESELLER entry in ads.txt, cross-reference with the corresponding exchange's sellers.json:
|
|
42
|
+
- Does the account ID appear in the exchange's sellers.json?
|
|
43
|
+
- If present, does the `seller_type` match the expected value (PUBLISHER, INTERMEDIARY, or BOTH)?
|
|
44
|
+
- Is the seller domain in sellers.json consistent with the publisher's domain?
|
|
45
|
+
|
|
46
|
+
```text
|
|
47
|
+
# HIGH — RESELLER entry with no sellers.json disclosure
|
|
48
|
+
ads.txt: rubicon.com, 98765, RESELLER, 0bfd66d529a55807
|
|
49
|
+
sellers.json (rubicon.com): account ID 98765 — not found
|
|
50
|
+
→ unauthorized intermediary; buyer cannot verify the resale relationship
|
|
51
|
+
|
|
52
|
+
# CORRECT — RESELLER disclosed in sellers.json
|
|
53
|
+
ads.txt: rubicon.com, 11111, RESELLER, 0bfd66d529a55807
|
|
54
|
+
sellers.json: { "seller_id": "11111", "name": "Example Publisher", "seller_type": "PUBLISHER", "domain": "example.com" }
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Each RESELLER entry absent from sellers.json is a separate HIGH finding with the exchange domain and account ID as the finding identifier.
|
|
58
|
+
|
|
59
|
+
### Step 4 — DIRECT entry confidentiality conflict audit
|
|
60
|
+
|
|
61
|
+
For every DIRECT entry in ads.txt, cross-reference with sellers.json:
|
|
62
|
+
- Is the account ID present in sellers.json?
|
|
63
|
+
- Does the entry carry `is_confidential: 1`?
|
|
64
|
+
|
|
65
|
+
A DIRECT entry by definition declares that the exchange sells the publisher's inventory with no intermediary. A `is_confidential: 1` flag in sellers.json means the exchange is hiding the seller's identity from buyers. This is contradictory and constitutes a domain-spoofing risk vector.
|
|
66
|
+
|
|
67
|
+
```text
|
|
68
|
+
# HIGH — DIRECT entry resolves as confidential in sellers.json
|
|
69
|
+
ads.txt: exchange.com, 55555, DIRECT, abc123
|
|
70
|
+
sellers.json: { "seller_id": "55555", "is_confidential": 1 }
|
|
71
|
+
→ DIRECT relationship cannot be verified; domain-spoofing risk
|
|
72
|
+
|
|
73
|
+
# CORRECT — DIRECT entry with transparent seller identity
|
|
74
|
+
ads.txt: exchange.com, 55555, DIRECT, abc123
|
|
75
|
+
sellers.json: { "seller_id": "55555", "name": "Example Publisher", "domain": "example.com", "is_confidential": 0 }
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Step 5 — Orphaned account ID audit
|
|
79
|
+
|
|
80
|
+
Identify ads.txt entries where the account ID does not appear in the exchange's sellers.json at all (neither disclosed nor confidential):
|
|
81
|
+
- This may indicate stale entries from a terminated exchange relationship.
|
|
82
|
+
- It may also indicate domain spoofing: a bad actor adds a publisher's domain to their own exchange account without authorization.
|
|
83
|
+
- Flag as HIGH; request the user confirm whether the exchange relationship is active.
|
|
84
|
+
|
|
85
|
+
### Step 6 — Absent ads.txt audit for whitelisted domains
|
|
86
|
+
|
|
87
|
+
If the user provides a list of domains they have whitelisted for programmatic buying:
|
|
88
|
+
- For each domain, confirm whether ads.txt is present.
|
|
89
|
+
- A whitelisted domain with no ads.txt is categorically IVT-exposed: the domain has not declared any authorized seller, meaning all inventory sourced from that domain bypasses supply-chain controls.
|
|
90
|
+
- Flag each absent ads.txt as HIGH with the domain name.
|
|
91
|
+
|
|
92
|
+
```text
|
|
93
|
+
# HIGH — whitelisted domain with no ads.txt
|
|
94
|
+
Domain: news-publisher.example.com
|
|
95
|
+
ads.txt: not found (HTTP 404 / file absent)
|
|
96
|
+
→ all inventory from this domain is unverifiable; IVT-exposed per MRC guidelines
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Step 7 — SupplyChain Object completeness audit
|
|
100
|
+
|
|
101
|
+
If the user provides SupplyChain Object node declarations from bid-stream samples or SSP configuration:
|
|
102
|
+
- Verify `complete: 1` is set — a value of 0 means the chain is declared incomplete, which MRC and most DSPs treat as an IVT signal.
|
|
103
|
+
- For each intermediate node, verify `asi` (SSP domain), `sid` (account ID at that SSP), and `rid` (request ID, recommended) are present.
|
|
104
|
+
- Flag missing required fields in intermediate nodes as MEDIUM.
|
|
105
|
+
- Flag `complete: 0` as HIGH when it is set intentionally — it effectively declares the supply chain is unverifiable.
|
|
106
|
+
|
|
107
|
+
### Step 8 — Stale declaration assessment
|
|
108
|
+
|
|
109
|
+
Without a dated changelog, stale detection is inference:
|
|
110
|
+
- If the user discloses that exchange relationships have changed in the past twelve months, flag stale declaration as MEDIUM.
|
|
111
|
+
- Note that stale RESELLER entries may retain account IDs from terminated relationships that could be reused by unauthorized parties.
|
|
112
|
+
|
|
113
|
+
### Step 9 — app-ads.txt coverage gap
|
|
114
|
+
|
|
115
|
+
If the publisher has mobile app inventory:
|
|
116
|
+
- Confirm app-ads.txt is present at the developer domain (as declared in the app store listing).
|
|
117
|
+
- Absence is MEDIUM — mobile app inventory without app-ads.txt is outside IAB Tech Lab supply-chain protection.
|
|
118
|
+
|
|
119
|
+
### Step 10 — Produce the output
|
|
120
|
+
|
|
121
|
+
Format findings using the Output format section below.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Output format
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
## Verdict
|
|
129
|
+
<one sentence: pass / needs work / critical issues found>
|
|
130
|
+
|
|
131
|
+
## Evidence level
|
|
132
|
+
<ads.txt provided | sellers.json provided | app-ads.txt provided | documentation-based | inference from absent file>
|
|
133
|
+
|
|
134
|
+
## Findings
|
|
135
|
+
|
|
136
|
+
### CRITICAL
|
|
137
|
+
- [C1] <finding title>: <description> — <remediation>
|
|
138
|
+
|
|
139
|
+
### HIGH
|
|
140
|
+
- [H1] <finding title>: <description> — <remediation>
|
|
141
|
+
|
|
142
|
+
### MEDIUM
|
|
143
|
+
- [M1] <finding title>: <description> — <remediation>
|
|
144
|
+
|
|
145
|
+
### LOW
|
|
146
|
+
- [L1] <finding title>: <description> — <remediation>
|
|
147
|
+
|
|
148
|
+
## Safe next actions
|
|
149
|
+
1. <action>
|
|
150
|
+
2. <action>
|
|
151
|
+
|
|
152
|
+
## Open questions
|
|
153
|
+
- <question requiring user clarification>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Security and scope notes
|
|
159
|
+
|
|
160
|
+
- This is a static review. ads.txt, app-ads.txt, and sellers.json are public files. Never request DSP credentials, exchange account tokens, bid-stream logs, or revenue reports containing publisher financial data.
|
|
161
|
+
- An unauthorized RESELLER entry may represent a legitimate old relationship that was not removed when the exchange contract ended, or it may represent an active unauthorized intermediary taking arbitrage margin. The distinction requires the publisher to confirm the exchange relationship status — do not assume malicious intent, but flag the opacity clearly.
|
|
162
|
+
- Domain spoofing via DIRECT-to-confidential conflicts is a known fraud vector documented in MRC Invalid Traffic Detection guidelines. Surface the risk explicitly without overstating certainty about active fraud.
|
|
163
|
+
- When evidence is partial (e.g., ads.txt provided but no sellers.json), scope findings to inference and state the assumption explicitly.
|
|
164
|
+
- Do not recommend removing a RESELLER entry without first confirming whether it represents a legitimate revenue path that can be replaced with a DIRECT relationship or a disclosed intermediary — revenue loss from removing legitimate paths is a real operational risk.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ci-test-pipeline-review
|
|
3
|
+
description: Use this skill when reviewing how a CI pipeline runs tests — gating, sharding, parallelism, fail-fast behavior, artifact retention, and flaky-test quarantine wiring. Trigger when a user provides a CI workflow file (GitHub Actions, GitLab CI, CircleCI, Jenkins), asks why CI is slow or unreliable as a merge gate, or wants to know whether their test pipeline actually blocks bad merges. This skill reviews CI configuration statically; it does not trigger or run pipelines.
|
|
4
|
+
allowed-tools: Read Grep Glob
|
|
5
|
+
metadata:
|
|
6
|
+
author: "github: Raishin"
|
|
7
|
+
version: "0.1.0"
|
|
8
|
+
updated: "2026-05-17"
|
|
9
|
+
category: delivery
|
|
10
|
+
lifecycle: experimental
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# CI Test Pipeline Review
|
|
14
|
+
|
|
15
|
+
## Purpose
|
|
16
|
+
This skill reviews how a CI pipeline runs tests — not the tests themselves, but the pipeline that decides whether they block a merge. A test suite only protects the main branch if the pipeline runs it, runs it on the merge gate, fails the build when it fails, and finishes fast enough that developers do not route around it. The review catches non-blocking test steps, soft-failure escape hatches, missing required-check enforcement, un-sharded slow suites, fail-fast that hides parallel failures, missing artifacts, and quarantine lanes wired so that quarantined tests silently never run again.
|
|
17
|
+
|
|
18
|
+
## Lean operating rules
|
|
19
|
+
- Treat a test step that cannot fail the build — `|| true`, `continue-on-error: true`, `set +e`, an exit code swallowed, a non-blocking/optional check — as CRITICAL: the suite exists but gates nothing, and every "green" merge is unverified.
|
|
20
|
+
- Treat tests that run only post-merge (on `push` to main, nightly) and not on the pull-request merge gate as HIGH — regressions are caught after they are already on the main branch.
|
|
21
|
+
- Treat the test job not being a required status check for branch protection as HIGH — the run is advisory and a merge can proceed red. (Flag as inference if branch-protection config is not provided.)
|
|
22
|
+
- Treat `fail-fast: true` on a test matrix as MEDIUM — it cancels sibling shards on the first failure, hiding how many shards actually failed and forcing repeated partial runs.
|
|
23
|
+
- Treat a large suite in a single un-sharded job as HIGH when wall-clock time blocks merges — recommend a shard matrix sized to the suite.
|
|
24
|
+
- Treat the absence of test-result and failure-artifact upload (JUnit XML, traces, screenshots, logs) as HIGH — a CI-only failure is then undebuggable and engineers re-run blindly.
|
|
25
|
+
- Treat caching of dependencies/build but not keyed correctly (stale cache, no lockfile in the key) as MEDIUM — stale caches cause non-reproducible passes and failures.
|
|
26
|
+
- Treat a quarantine lane that excludes flaky tests from gating with no scheduled non-blocking run and no tracking as HIGH — quarantined tests then never run again and the coverage is silently lost.
|
|
27
|
+
- Treat secrets exposed to test jobs triggered by `pull_request_target` or to fork PRs as CRITICAL security exposure — flag and stop.
|
|
28
|
+
- Treat a missing concurrency/cancel-in-progress group on PR test runs as LOW — wasted runners, not a correctness issue.
|
|
29
|
+
- Do not recommend disabling or making a flaky check non-blocking as the fix — recommend quarantine with a scheduled run and an owner.
|
|
30
|
+
- Label every finding with evidence basis: CI config provided, branch-protection config provided, documentation-based, or inference.
|
|
31
|
+
|
|
32
|
+
## References
|
|
33
|
+
Load these only when needed:
|
|
34
|
+
- [Workflow and output contract](references/workflow-and-output.md) — use when executing the full review or formatting the final answer.
|
|
35
|
+
|
|
36
|
+
## Response minimum
|
|
37
|
+
Return, at minimum:
|
|
38
|
+
- Gating findings (non-blocking steps, soft-failure escape hatches, required-check enforcement)
|
|
39
|
+
- Merge-gate timing findings (PR vs. post-merge, sharding, parallelism)
|
|
40
|
+
- Fail-fast and matrix configuration findings
|
|
41
|
+
- Artifact and observability findings (test results, failure artifacts)
|
|
42
|
+
- Quarantine-lane wiring findings
|
|
43
|
+
- Security findings (secret exposure to test jobs)
|
|
44
|
+
- Severity-labelled finding list (critical / high / medium / low)
|
|
45
|
+
- Safe next actions
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "ci-test-pipeline-review",
|
|
3
|
+
"name": "CI Test Pipeline Review",
|
|
4
|
+
"type": "skill",
|
|
5
|
+
"provider": "generic",
|
|
6
|
+
"harnesses": ["codex", "claude-code", "cursor", "gemini", "kiro", "other"],
|
|
7
|
+
"summary": "Review how a CI pipeline runs tests — gating, sharding, parallelism, fail-fast, artifact retention, quarantine wiring, and secret exposure — to verify the test suite actually blocks bad merges. Static review only.",
|
|
8
|
+
"source_type": "original",
|
|
9
|
+
"official_docs": [
|
|
10
|
+
"https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-jobs",
|
|
11
|
+
"https://docs.github.com/en/repositories/configuring-branches-and-merges/about-protected-branches",
|
|
12
|
+
"https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions",
|
|
13
|
+
"https://docs.gitlab.com/ee/ci/yaml/",
|
|
14
|
+
"https://playwright.dev/docs/test-sharding"
|
|
15
|
+
],
|
|
16
|
+
"security_notes": "Static review only — reads CI workflow and branch-protection configuration, never triggers or runs pipelines. Flags secret exposure to test jobs on pull_request_target or fork PRs. Never request or accept CI secrets, deploy keys, or registry tokens; ask for sanitized workflow files.",
|
|
17
|
+
"last_verified": "2026-05-17",
|
|
18
|
+
"path": "skills/qa/ci-test-pipeline-review",
|
|
19
|
+
"author": "github: Raishin",
|
|
20
|
+
"version": "0.1.0"
|
|
21
|
+
}
|