@harness-engineering/cli 1.13.0 → 1.14.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/dist/agents/skills/claude-code/add-harness-component/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/align-documentation/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/check-mechanical-constraints/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/cleanup-dead-code/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/detect-doc-drift/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-api-design/SKILL.md +304 -0
- package/dist/agents/skills/claude-code/harness-api-design/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-architecture-advisor/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-auth/SKILL.md +279 -0
- package/dist/agents/skills/claude-code/harness-auth/skill.yaml +81 -0
- package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +39 -0
- package/dist/agents/skills/claude-code/harness-brainstorming/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-caching/SKILL.md +309 -0
- package/dist/agents/skills/claude-code/harness-caching/skill.yaml +73 -0
- package/dist/agents/skills/claude-code/harness-chaos/SKILL.md +295 -0
- package/dist/agents/skills/claude-code/harness-chaos/skill.yaml +72 -0
- package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +44 -0
- package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-compliance/SKILL.md +303 -0
- package/dist/agents/skills/claude-code/harness-compliance/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-containerization/SKILL.md +284 -0
- package/dist/agents/skills/claude-code/harness-containerization/skill.yaml +80 -0
- package/dist/agents/skills/claude-code/harness-data-pipeline/SKILL.md +274 -0
- package/dist/agents/skills/claude-code/harness-data-pipeline/skill.yaml +81 -0
- package/dist/agents/skills/claude-code/harness-data-validation/SKILL.md +343 -0
- package/dist/agents/skills/claude-code/harness-data-validation/skill.yaml +75 -0
- package/dist/agents/skills/claude-code/harness-database/SKILL.md +258 -0
- package/dist/agents/skills/claude-code/harness-database/skill.yaml +80 -0
- package/dist/agents/skills/claude-code/harness-debugging/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-dependency-health/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-deployment/SKILL.md +255 -0
- package/dist/agents/skills/claude-code/harness-deployment/skill.yaml +77 -0
- package/dist/agents/skills/claude-code/harness-design/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-mobile/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-system/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-design-web/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-diagnostics/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-docs-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-dx/SKILL.md +276 -0
- package/dist/agents/skills/claude-code/harness-dx/skill.yaml +76 -0
- package/dist/agents/skills/claude-code/harness-e2e/SKILL.md +245 -0
- package/dist/agents/skills/claude-code/harness-e2e/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-event-driven/SKILL.md +280 -0
- package/dist/agents/skills/claude-code/harness-event-driven/skill.yaml +77 -0
- package/dist/agents/skills/claude-code/harness-execution/SKILL.md +44 -0
- package/dist/agents/skills/claude-code/harness-execution/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-feature-flags/SKILL.md +287 -0
- package/dist/agents/skills/claude-code/harness-feature-flags/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-git-workflow/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-hotspot-detector/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n-process/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-i18n-workflow/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-impact-analysis/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-incident-response/SKILL.md +223 -0
- package/dist/agents/skills/claude-code/harness-incident-response/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-infrastructure-as-code/SKILL.md +279 -0
- package/dist/agents/skills/claude-code/harness-infrastructure-as-code/skill.yaml +80 -0
- package/dist/agents/skills/claude-code/harness-integration-test/SKILL.md +271 -0
- package/dist/agents/skills/claude-code/harness-integration-test/skill.yaml +73 -0
- package/dist/agents/skills/claude-code/harness-integrity/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-knowledge-mapper/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-load-testing/SKILL.md +274 -0
- package/dist/agents/skills/claude-code/harness-load-testing/skill.yaml +79 -0
- package/dist/agents/skills/claude-code/harness-ml-ops/SKILL.md +341 -0
- package/dist/agents/skills/claude-code/harness-ml-ops/skill.yaml +79 -0
- package/dist/agents/skills/claude-code/harness-mobile-patterns/SKILL.md +326 -0
- package/dist/agents/skills/claude-code/harness-mobile-patterns/skill.yaml +82 -0
- package/dist/agents/skills/claude-code/harness-mutation-test/SKILL.md +251 -0
- package/dist/agents/skills/claude-code/harness-mutation-test/skill.yaml +70 -0
- package/dist/agents/skills/claude-code/harness-observability/SKILL.md +283 -0
- package/dist/agents/skills/claude-code/harness-observability/skill.yaml +78 -0
- package/dist/agents/skills/claude-code/harness-onboarding/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-parallel-agents/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-perf/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-perf-tdd/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-planning/SKILL.md +39 -0
- package/dist/agents/skills/claude-code/harness-planning/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-pre-commit-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-product-spec/SKILL.md +285 -0
- package/dist/agents/skills/claude-code/harness-product-spec/skill.yaml +72 -0
- package/dist/agents/skills/claude-code/harness-property-test/SKILL.md +281 -0
- package/dist/agents/skills/claude-code/harness-property-test/skill.yaml +71 -0
- package/dist/agents/skills/claude-code/harness-refactoring/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-release-readiness/SKILL.md +3 -3
- package/dist/agents/skills/claude-code/harness-release-readiness/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-resilience/SKILL.md +255 -0
- package/dist/agents/skills/claude-code/harness-resilience/skill.yaml +76 -0
- package/dist/agents/skills/claude-code/harness-roadmap/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-secrets/SKILL.md +293 -0
- package/dist/agents/skills/claude-code/harness-secrets/skill.yaml +76 -0
- package/dist/agents/skills/claude-code/harness-security-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-security-scan/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-skill-authoring/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-sql-review/SKILL.md +315 -0
- package/dist/agents/skills/claude-code/harness-sql-review/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-state-management/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-tdd/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-test-advisor/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-test-data/SKILL.md +268 -0
- package/dist/agents/skills/claude-code/harness-test-data/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/harness-ux-copy/SKILL.md +271 -0
- package/dist/agents/skills/claude-code/harness-ux-copy/skill.yaml +77 -0
- package/dist/agents/skills/claude-code/harness-verification/SKILL.md +35 -0
- package/dist/agents/skills/claude-code/harness-verification/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-verify/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-visual-regression/SKILL.md +257 -0
- package/dist/agents/skills/claude-code/harness-visual-regression/skill.yaml +74 -0
- package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +11 -3
- package/dist/agents/skills/claude-code/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/validate-context-engineering/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/add-harness-component/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/align-documentation/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/check-mechanical-constraints/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/cleanup-dead-code/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/detect-doc-drift/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/enforce-architecture/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-accessibility/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-api-design/SKILL.md +304 -0
- package/dist/agents/skills/gemini-cli/harness-api-design/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-architecture-advisor/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-auth/SKILL.md +279 -0
- package/dist/agents/skills/gemini-cli/harness-auth/skill.yaml +81 -0
- package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +39 -0
- package/dist/agents/skills/gemini-cli/harness-brainstorming/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-caching/SKILL.md +309 -0
- package/dist/agents/skills/gemini-cli/harness-caching/skill.yaml +73 -0
- package/dist/agents/skills/gemini-cli/harness-chaos/SKILL.md +295 -0
- package/dist/agents/skills/gemini-cli/harness-chaos/skill.yaml +72 -0
- package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +44 -0
- package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-compliance/SKILL.md +303 -0
- package/dist/agents/skills/gemini-cli/harness-compliance/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-containerization/SKILL.md +284 -0
- package/dist/agents/skills/gemini-cli/harness-containerization/skill.yaml +80 -0
- package/dist/agents/skills/gemini-cli/harness-data-pipeline/SKILL.md +274 -0
- package/dist/agents/skills/gemini-cli/harness-data-pipeline/skill.yaml +81 -0
- package/dist/agents/skills/gemini-cli/harness-data-validation/SKILL.md +343 -0
- package/dist/agents/skills/gemini-cli/harness-data-validation/skill.yaml +75 -0
- package/dist/agents/skills/gemini-cli/harness-database/SKILL.md +258 -0
- package/dist/agents/skills/gemini-cli/harness-database/skill.yaml +80 -0
- package/dist/agents/skills/gemini-cli/harness-debugging/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-deployment/SKILL.md +255 -0
- package/dist/agents/skills/gemini-cli/harness-deployment/skill.yaml +77 -0
- package/dist/agents/skills/gemini-cli/harness-design/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-mobile/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-system/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-design-web/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-diagnostics/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-docs-pipeline/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-dx/SKILL.md +276 -0
- package/dist/agents/skills/gemini-cli/harness-dx/skill.yaml +76 -0
- package/dist/agents/skills/gemini-cli/harness-e2e/SKILL.md +245 -0
- package/dist/agents/skills/gemini-cli/harness-e2e/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-event-driven/SKILL.md +280 -0
- package/dist/agents/skills/gemini-cli/harness-event-driven/skill.yaml +77 -0
- package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +44 -0
- package/dist/agents/skills/gemini-cli/harness-execution/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-feature-flags/SKILL.md +287 -0
- package/dist/agents/skills/gemini-cli/harness-feature-flags/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-git-workflow/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-process/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-workflow/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-impact-analysis/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-incident-response/SKILL.md +223 -0
- package/dist/agents/skills/gemini-cli/harness-incident-response/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/SKILL.md +279 -0
- package/dist/agents/skills/gemini-cli/harness-infrastructure-as-code/skill.yaml +80 -0
- package/dist/agents/skills/gemini-cli/harness-integration-test/SKILL.md +271 -0
- package/dist/agents/skills/gemini-cli/harness-integration-test/skill.yaml +73 -0
- package/dist/agents/skills/gemini-cli/harness-integrity/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-load-testing/SKILL.md +274 -0
- package/dist/agents/skills/gemini-cli/harness-load-testing/skill.yaml +79 -0
- package/dist/agents/skills/gemini-cli/harness-ml-ops/SKILL.md +341 -0
- package/dist/agents/skills/gemini-cli/harness-ml-ops/skill.yaml +79 -0
- package/dist/agents/skills/gemini-cli/harness-mobile-patterns/SKILL.md +326 -0
- package/dist/agents/skills/gemini-cli/harness-mobile-patterns/skill.yaml +82 -0
- package/dist/agents/skills/gemini-cli/harness-mutation-test/SKILL.md +251 -0
- package/dist/agents/skills/gemini-cli/harness-mutation-test/skill.yaml +70 -0
- package/dist/agents/skills/gemini-cli/harness-observability/SKILL.md +283 -0
- package/dist/agents/skills/gemini-cli/harness-observability/skill.yaml +78 -0
- package/dist/agents/skills/gemini-cli/harness-onboarding/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-parallel-agents/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-perf-tdd/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +39 -0
- package/dist/agents/skills/gemini-cli/harness-planning/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-pre-commit-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-product-spec/SKILL.md +285 -0
- package/dist/agents/skills/gemini-cli/harness-product-spec/skill.yaml +72 -0
- package/dist/agents/skills/gemini-cli/harness-property-test/SKILL.md +281 -0
- package/dist/agents/skills/gemini-cli/harness-property-test/skill.yaml +71 -0
- package/dist/agents/skills/gemini-cli/harness-refactoring/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-release-readiness/SKILL.md +3 -3
- package/dist/agents/skills/gemini-cli/harness-release-readiness/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-resilience/SKILL.md +255 -0
- package/dist/agents/skills/gemini-cli/harness-resilience/skill.yaml +76 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-secrets/SKILL.md +293 -0
- package/dist/agents/skills/gemini-cli/harness-secrets/skill.yaml +76 -0
- package/dist/agents/skills/gemini-cli/harness-security-review/SKILL.md +240 -0
- package/dist/agents/skills/gemini-cli/harness-security-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-security-scan/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-skill-authoring/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-sql-review/SKILL.md +315 -0
- package/dist/agents/skills/gemini-cli/harness-sql-review/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-state-management/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-tdd/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-test-advisor/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-test-data/SKILL.md +268 -0
- package/dist/agents/skills/gemini-cli/harness-test-data/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/harness-ux-copy/SKILL.md +271 -0
- package/dist/agents/skills/gemini-cli/harness-ux-copy/skill.yaml +77 -0
- package/dist/agents/skills/gemini-cli/harness-verification/SKILL.md +35 -0
- package/dist/agents/skills/gemini-cli/harness-verification/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-verify/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/harness-visual-regression/SKILL.md +257 -0
- package/dist/agents/skills/gemini-cli/harness-visual-regression/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/initialize-harness-project/SKILL.md +11 -3
- package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/validate-context-engineering/skill.yaml +1 -0
- package/dist/agents-md-YTYQDA3P.js +8 -0
- package/dist/{architecture-ESOOE26S.js → architecture-JQZYM4US.js} +4 -4
- package/dist/bin/harness-mcp.js +16 -15
- package/dist/bin/harness.js +31 -30
- package/dist/{check-phase-gate-S2MZKLFQ.js → check-phase-gate-L3RADYWO.js} +4 -3
- package/dist/{chunk-WPPDRIJL.js → chunk-3C2MLBPJ.js} +4 -4
- package/dist/chunk-6KTUUFRN.js +217 -0
- package/dist/{chunk-MI5XJQDY.js → chunk-7IP4JIFL.js} +24 -10
- package/dist/{chunk-C2ERUR3L.js → chunk-7MJAPE3Z.js} +165 -49
- package/dist/{chunk-KELT6K6M.js → chunk-ABQHQ6I5.js} +1861 -1418
- package/dist/{chunk-L2KLU56K.js → chunk-AOZRDOIP.js} +2 -2
- package/dist/{chunk-QPEH2QPG.js → chunk-DBSOCI3G.js} +53 -54
- package/dist/{chunk-MHBMTPW7.js → chunk-ERS5EVUZ.js} +9 -0
- package/dist/{chunk-JSTQ3AWB.js → chunk-FIAPHX37.js} +1 -1
- package/dist/{chunk-2YPZKGAG.js → chunk-FTMXDOR6.js} +1 -1
- package/dist/{chunk-72GHBOL2.js → chunk-GZKSBLQL.js} +1 -1
- package/dist/{chunk-K6XAPGML.js → chunk-H7Y5CKTM.js} +1 -1
- package/dist/{chunk-HD4IBGLA.js → chunk-N5G5QMS3.js} +24 -1
- package/dist/{chunk-LD3DKUK5.js → chunk-NLVUVUGD.js} +1 -1
- package/dist/{chunk-3KOLLWWE.js → chunk-O5OJVPL6.js} +26 -211
- package/dist/{chunk-NKDM3FMH.js → chunk-OD3S2NHN.js} +1 -1
- package/dist/{chunk-5VY23YK3.js → chunk-OSXBPAMK.js} +2 -2
- package/dist/{chunk-MACVXDZK.js → chunk-OXLLOSSR.js} +45 -47
- package/dist/{chunk-GNGELAXY.js → chunk-RCWZBSK5.js} +2 -2
- package/dist/{chunk-PSNN4LWX.js → chunk-S2FXOWOR.js} +3 -3
- package/dist/{chunk-VUCPTQ6G.js → chunk-SD3SQOZ2.js} +1 -1
- package/dist/{chunk-7PZWR4LI.js → chunk-TPOTOBR7.js} +9 -9
- package/dist/{chunk-RZSUJBZZ.js → chunk-XKECDXJS.js} +452 -353
- package/dist/{chunk-VRFZWGMS.js → chunk-XYLGHKG6.js} +5 -1
- package/dist/{chunk-6N4R6FVX.js → chunk-YBJ262QL.js} +1 -1
- package/dist/{chunk-2VU4MFM3.js → chunk-YPYGXRDR.js} +7 -7
- package/dist/{chunk-Q6AB7W5Z.js → chunk-YQ6KC6TE.js} +1 -1
- package/dist/{chunk-7KQSUZVG.js → chunk-YZD2MRNQ.js} +1528 -1010
- package/dist/ci-workflow-EQZFVX3P.js +8 -0
- package/dist/{create-skill-WPXHSLX2.js → create-skill-XSWHMSM5.js} +2 -2
- package/dist/{dist-M6BQODWC.js → dist-B26DFXMP.js} +573 -480
- package/dist/{dist-L7LAAQAS.js → dist-DZ63LLUD.js} +1 -1
- package/dist/{dist-WF4C7A4A.js → dist-HWXF2C3R.js} +18 -2
- package/dist/{dist-D4RYGUZE.js → dist-USY2C5JL.js} +3 -1
- package/dist/{docs-BPYCN2DR.js → docs-7ECGYMAV.js} +5 -3
- package/dist/engine-EG4EH4IX.js +8 -0
- package/dist/{entropy-4VDVV5CR.js → entropy-5USWKLVS.js} +3 -3
- package/dist/{feedback-63QB5RCA.js → feedback-UTBXZZHF.js} +1 -1
- package/dist/{generate-agent-definitions-QABOJG56.js → generate-agent-definitions-3PM5EU7V.js} +5 -5
- package/dist/{glob-helper-5OHBUQAI.js → glob-helper-R5FXNUPS.js} +1 -1
- package/dist/{graph-loader-KO4GJ5N2.js → graph-loader-2M2HXDQI.js} +1 -1
- package/dist/index.d.ts +183 -17
- package/dist/index.js +32 -30
- package/dist/loader-ZPALXIVR.js +10 -0
- package/dist/mcp-362EZHF4.js +35 -0
- package/dist/{performance-26BH47O4.js → performance-OQAFMJUD.js} +3 -3
- package/dist/{review-pipeline-GHR3WFBI.js → review-pipeline-C4GCFVGP.js} +1 -1
- package/dist/runtime-7YLVK453.js +9 -0
- package/dist/{security-UQFUZXEN.js → security-PZOX7AQS.js} +1 -1
- package/dist/skill-executor-XZLYZYAK.js +8 -0
- package/dist/templates/axum/Cargo.toml.hbs +8 -0
- package/dist/templates/axum/src/main.rs +12 -0
- package/dist/templates/axum/template.json +16 -0
- package/dist/templates/django/manage.py.hbs +19 -0
- package/dist/templates/django/requirements.txt.hbs +1 -0
- package/dist/templates/django/src/settings.py.hbs +44 -0
- package/dist/templates/django/src/urls.py +6 -0
- package/dist/templates/django/src/wsgi.py.hbs +9 -0
- package/dist/templates/django/template.json +21 -0
- package/dist/templates/express/package.json.hbs +15 -0
- package/dist/templates/express/src/app.ts +12 -0
- package/dist/templates/express/src/lib/.gitkeep +0 -0
- package/dist/templates/express/template.json +16 -0
- package/dist/templates/fastapi/requirements.txt.hbs +2 -0
- package/dist/templates/fastapi/src/main.py +8 -0
- package/dist/templates/fastapi/template.json +20 -0
- package/dist/templates/gin/go.mod.hbs +5 -0
- package/dist/templates/gin/main.go +15 -0
- package/dist/templates/gin/template.json +19 -0
- package/dist/templates/go-base/.golangci.yml +16 -0
- package/dist/templates/go-base/AGENTS.md.hbs +35 -0
- package/dist/templates/go-base/go.mod.hbs +3 -0
- package/dist/templates/go-base/harness.config.json.hbs +17 -0
- package/dist/templates/go-base/main.go +7 -0
- package/dist/templates/go-base/template.json +14 -0
- package/dist/templates/java-base/AGENTS.md.hbs +35 -0
- package/dist/templates/java-base/checkstyle.xml +20 -0
- package/dist/templates/java-base/harness.config.json.hbs +16 -0
- package/dist/templates/java-base/pom.xml.hbs +39 -0
- package/dist/templates/java-base/src/main/java/App.java.hbs +5 -0
- package/dist/templates/java-base/template.json +13 -0
- package/dist/templates/nestjs/nest-cli.json +5 -0
- package/dist/templates/nestjs/package.json.hbs +18 -0
- package/dist/templates/nestjs/src/app.module.ts +8 -0
- package/dist/templates/nestjs/src/lib/.gitkeep +0 -0
- package/dist/templates/nestjs/src/main.ts +11 -0
- package/dist/templates/nestjs/template.json +16 -0
- package/dist/templates/nextjs/template.json +15 -1
- package/dist/templates/python-base/.python-version +1 -0
- package/dist/templates/python-base/AGENTS.md.hbs +32 -0
- package/dist/templates/python-base/harness.config.json.hbs +16 -0
- package/dist/templates/python-base/pyproject.toml.hbs +18 -0
- package/dist/templates/python-base/ruff.toml +5 -0
- package/dist/templates/python-base/src/__init__.py +0 -0
- package/dist/templates/python-base/template.json +13 -0
- package/dist/templates/react-vite/index.html +12 -0
- package/dist/templates/react-vite/package.json.hbs +18 -0
- package/dist/templates/react-vite/src/App.tsx +7 -0
- package/dist/templates/react-vite/src/lib/.gitkeep +0 -0
- package/dist/templates/react-vite/src/main.tsx +9 -0
- package/dist/templates/react-vite/template.json +19 -0
- package/dist/templates/react-vite/vite.config.ts +6 -0
- package/dist/templates/rust-base/AGENTS.md.hbs +35 -0
- package/dist/templates/rust-base/Cargo.toml.hbs +6 -0
- package/dist/templates/rust-base/clippy.toml +2 -0
- package/dist/templates/rust-base/harness.config.json.hbs +17 -0
- package/dist/templates/rust-base/src/main.rs +3 -0
- package/dist/templates/rust-base/template.json +14 -0
- package/dist/templates/spring-boot/pom.xml.hbs +50 -0
- package/dist/templates/spring-boot/src/main/java/Application.java.hbs +19 -0
- package/dist/templates/spring-boot/template.json +15 -0
- package/dist/templates/vue/index.html +12 -0
- package/dist/templates/vue/package.json.hbs +16 -0
- package/dist/templates/vue/src/App.vue +7 -0
- package/dist/templates/vue/src/lib/.gitkeep +0 -0
- package/dist/templates/vue/src/main.ts +4 -0
- package/dist/templates/vue/template.json +19 -0
- package/dist/templates/vue/vite.config.ts +6 -0
- package/dist/{validate-N7QJOKFZ.js → validate-FD3Z6VJD.js} +4 -4
- package/dist/validate-cross-check-WNJM6H2D.js +8 -0
- package/package.json +6 -6
- package/dist/agents-md-P2RHSUV7.js +0 -8
- package/dist/ci-workflow-4NYBUG6R.js +0 -8
- package/dist/engine-LXLIWQQ3.js +0 -8
- package/dist/loader-Z2IT7QX3.js +0 -10
- package/dist/mcp-KQHEL5IF.js +0 -34
- package/dist/runtime-PDWD7UIK.js +0 -9
- package/dist/skill-executor-RG45LUO5.js +0 -8
- package/dist/validate-cross-check-EDQ5QGTM.js +0 -8
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# Harness Feature Flags
|
|
2
|
+
|
|
3
|
+
> Flag lifecycle management, A/B testing infrastructure, and gradual rollout design. Ship features safely with controlled exposure and clean retirement.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- When designing feature flag architecture for a new project or feature
|
|
8
|
+
- When auditing existing flags for staleness, test coverage, or hygiene
|
|
9
|
+
- When planning gradual rollout or A/B testing strategies
|
|
10
|
+
- NOT for deployment pipeline configuration (use harness-deployment)
|
|
11
|
+
- NOT for environment variable management (use harness-secrets)
|
|
12
|
+
- NOT for application performance testing under flag variants (use harness-perf)
|
|
13
|
+
|
|
14
|
+
## Process
|
|
15
|
+
|
|
16
|
+
### Phase 1: DETECT -- Discover Flag Definitions and Usage
|
|
17
|
+
|
|
18
|
+
1. **Identify flag provider.** Scan the project for feature flag infrastructure:
|
|
19
|
+
- **Third-party SDKs:** LaunchDarkly (`launchdarkly-node-server-sdk`), Unleash (`unleash-client`), Flagsmith (`flagsmith-nodejs`), Split (`@splitsoftware/splitio`)
|
|
20
|
+
- **Custom implementations:** Files matching `*feature-flag*`, `*toggle*`, `*flags*`
|
|
21
|
+
- **Configuration-based:** `flags.json`, `features.json`, `feature-flags.yaml`
|
|
22
|
+
- **Environment-based:** Feature flags controlled via environment variables (`FEATURE_*`, `FF_*`)
|
|
23
|
+
|
|
24
|
+
2. **Catalog all flag definitions.** For each flag found, record:
|
|
25
|
+
- Flag name/key
|
|
26
|
+
- Flag type (boolean, multivariate, percentage rollout)
|
|
27
|
+
- Default value (what happens when the flag service is unreachable)
|
|
28
|
+
- Where it is defined (provider dashboard, config file, code)
|
|
29
|
+
- Creation date or first appearance in git history
|
|
30
|
+
|
|
31
|
+
3. **Map flag usage in code.** For each flag, find all evaluation points:
|
|
32
|
+
- Source files that check the flag value
|
|
33
|
+
- Conditional branches gated by the flag
|
|
34
|
+
- Components that render differently based on flag state
|
|
35
|
+
- API endpoints with flag-dependent behavior
|
|
36
|
+
- Test files that exercise flag variants
|
|
37
|
+
|
|
38
|
+
4. **Detect flag categories.** Classify each flag:
|
|
39
|
+
- **Release flag:** Gates a new feature for gradual rollout (temporary)
|
|
40
|
+
- **Experiment flag:** Controls A/B test variants (temporary)
|
|
41
|
+
- **Ops flag:** Circuit breaker or kill switch (permanent)
|
|
42
|
+
- **Permission flag:** Controls access to premium features (permanent)
|
|
43
|
+
|
|
44
|
+
5. **Present detection summary:**
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Feature Flag Detection:
|
|
48
|
+
Provider: LaunchDarkly (SDK v7.x)
|
|
49
|
+
Flags defined: 23
|
|
50
|
+
Flags evaluated in code: 19 (4 defined but unused)
|
|
51
|
+
Categories: 12 release, 5 experiment, 4 ops, 2 permission
|
|
52
|
+
Stale candidates: 6 (release flags older than 90 days)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### Phase 2: DESIGN -- Recommend Flag Architecture and Rollout Strategy
|
|
58
|
+
|
|
59
|
+
1. **Evaluate flag naming convention.** Check for consistency:
|
|
60
|
+
- Recommended format: `{team}.{feature}.{variant}` (e.g., `payments.stripe-v2.enabled`)
|
|
61
|
+
- Flags should have descriptive names (not `flag_123` or `test_flag`)
|
|
62
|
+
- Naming should indicate category (prefix with `ops.` for operational flags)
|
|
63
|
+
- Temporary flags should include a target removal date in metadata
|
|
64
|
+
|
|
65
|
+
2. **Design flag evaluation architecture.** Recommend patterns for:
|
|
66
|
+
- **Server-side evaluation:** Flags evaluated on the backend, consistent behavior
|
|
67
|
+
- **Client-side evaluation:** Flags evaluated in the browser/app, real-time updates
|
|
68
|
+
- **Edge evaluation:** Flags evaluated at CDN layer for zero-latency decisions
|
|
69
|
+
- **Default values:** Every flag must have a safe default (feature off) for provider outages
|
|
70
|
+
|
|
71
|
+
3. **Design rollout strategy.** For release flags:
|
|
72
|
+
- **Percentage rollout:** Start at 1%, monitor metrics, increase to 5%, 25%, 50%, 100%
|
|
73
|
+
- **User segment targeting:** Internal users first, then beta users, then general availability
|
|
74
|
+
- **Geographic rollout:** Single region first, expand after validation
|
|
75
|
+
- **Time-based gates:** Enable during low-traffic periods for initial validation
|
|
76
|
+
- Define success criteria for each rollout stage (error rate, latency, conversion)
|
|
77
|
+
|
|
78
|
+
4. **Design A/B testing infrastructure.** For experiment flags:
|
|
79
|
+
- Consistent user assignment (same user always sees same variant)
|
|
80
|
+
- Statistical significance calculation before declaring a winner
|
|
81
|
+
- Event tracking integration for measuring experiment outcomes
|
|
82
|
+
- Guardrail metrics that auto-disable experiments if health degrades
|
|
83
|
+
- Experiment duration limits (no indefinite experiments)
|
|
84
|
+
|
|
85
|
+
5. **Design fallback behavior.** Ensure resilience:
|
|
86
|
+
- Provider SDK timeout configuration (fail fast, not block)
|
|
87
|
+
- Local cache for flag values (stale-while-revalidate)
|
|
88
|
+
- Default values that are safe (feature disabled, not enabled)
|
|
89
|
+
- Circuit breaker on flag evaluation errors
|
|
90
|
+
- Monitoring on flag evaluation latency and error rate
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
### Phase 3: VALIDATE -- Verify Flag Hygiene and Test Coverage
|
|
95
|
+
|
|
96
|
+
1. **Check test coverage per flag.** For each flag, verify:
|
|
97
|
+
- Tests exist for both the flag-on and flag-off code paths
|
|
98
|
+
- Integration tests cover the default value behavior (provider down scenario)
|
|
99
|
+
- No tests depend on a specific flag value being set in production
|
|
100
|
+
- Test utilities exist for overriding flag values in test context
|
|
101
|
+
|
|
102
|
+
2. **Validate flag consistency.** Check for common issues:
|
|
103
|
+
- Flags checked in code but not defined in the provider (will use defaults)
|
|
104
|
+
- Flags defined in the provider but never checked in code (dead flags)
|
|
105
|
+
- Same flag checked with different keys in different files (typos)
|
|
106
|
+
- Nested flag checks that create combinatorial complexity
|
|
107
|
+
|
|
108
|
+
3. **Check for flag coupling.** Identify problematic patterns:
|
|
109
|
+
- Flags that depend on other flags (if A and B, then C)
|
|
110
|
+
- Flags that must be enabled in a specific order
|
|
111
|
+
- Flags that share state or side effects
|
|
112
|
+
- Recommend decoupling or consolidating dependent flags
|
|
113
|
+
|
|
114
|
+
4. **Validate rollout configuration.** For active rollouts:
|
|
115
|
+
- Percentage values are within expected ranges
|
|
116
|
+
- Targeting rules are correctly configured
|
|
117
|
+
- Kill switch is functional (can disable the feature instantly)
|
|
118
|
+
- Rollback plan is documented
|
|
119
|
+
|
|
120
|
+
5. **Generate validation report:**
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
Flag Validation: [PASS/WARN/FAIL]
|
|
124
|
+
|
|
125
|
+
Test coverage: WARN (3 flags missing flag-off tests)
|
|
126
|
+
Consistency: PASS (all code references match definitions)
|
|
127
|
+
Coupling: WARN (2 flags have interdependencies)
|
|
128
|
+
Rollout config: PASS (active rollouts correctly configured)
|
|
129
|
+
|
|
130
|
+
Issues:
|
|
131
|
+
1. payments.stripe-v2 -- no test for flag-off fallback path
|
|
132
|
+
2. search.new-algorithm + search.reranking -- coupled flags
|
|
133
|
+
3. checkout.express -- missing kill switch test
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
### Phase 4: LIFECYCLE -- Audit Stale Flags and Plan Cleanup
|
|
139
|
+
|
|
140
|
+
1. **Identify stale flags.** Flag candidates for removal:
|
|
141
|
+
- Release flags that have been at 100% for more than 30 days
|
|
142
|
+
- Experiment flags past their declared end date
|
|
143
|
+
- Flags with no evaluation in the last 90 days (from provider analytics)
|
|
144
|
+
- Flags whose feature has been fully adopted (no rollback expected)
|
|
145
|
+
|
|
146
|
+
2. **Generate cleanup plan.** For each stale flag:
|
|
147
|
+
- List all code locations that reference the flag
|
|
148
|
+
- Identify which branch to keep (the flag-on path for graduated features)
|
|
149
|
+
- Estimate lines of code to remove (dead branch cleanup)
|
|
150
|
+
- Determine if any tests need updating after flag removal
|
|
151
|
+
- Assign a cleanup owner and deadline
|
|
152
|
+
|
|
153
|
+
3. **Assess technical debt.** Calculate flag burden:
|
|
154
|
+
- Total active flags per service (recommend under 20)
|
|
155
|
+
- Ratio of temporary to permanent flags
|
|
156
|
+
- Average flag age for temporary flags
|
|
157
|
+
- Code complexity added by flag branching (conditional paths)
|
|
158
|
+
- Estimate of test matrix growth due to flags
|
|
159
|
+
|
|
160
|
+
4. **Recommend lifecycle policies.** Design governance:
|
|
161
|
+
- Maximum lifetime for release flags (e.g., 90 days)
|
|
162
|
+
- Maximum lifetime for experiment flags (e.g., 30 days)
|
|
163
|
+
- Required metadata: owner, creation date, expiry date, cleanup ticket
|
|
164
|
+
- Automated alerting when flags exceed their lifetime
|
|
165
|
+
- Monthly flag review cadence with the team
|
|
166
|
+
|
|
167
|
+
5. **Generate lifecycle report:**
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
Flag Lifecycle Report:
|
|
171
|
+
|
|
172
|
+
Active flags: 23
|
|
173
|
+
Stale flags: 6 (candidates for removal)
|
|
174
|
+
Technical debt: ~340 lines of dead code across 6 stale flags
|
|
175
|
+
|
|
176
|
+
Cleanup plan:
|
|
177
|
+
1. payments.old-checkout -- at 100% for 45 days, 4 files, ~80 LOC to remove
|
|
178
|
+
2. search.v1-algorithm -- experiment ended 60 days ago, 2 files, ~40 LOC
|
|
179
|
+
3. onboarding.legacy-flow -- at 100% for 90 days, 6 files, ~120 LOC
|
|
180
|
+
4. notifications.email-v1 -- unused for 120 days, 3 files, ~50 LOC
|
|
181
|
+
5. dashboard.old-charts -- at 100% for 35 days, 2 files, ~30 LOC
|
|
182
|
+
6. auth.password-reset-v1 -- at 100% for 60 days, 1 file, ~20 LOC
|
|
183
|
+
|
|
184
|
+
Recommendations:
|
|
185
|
+
- Adopt 90-day maximum lifetime policy for release flags
|
|
186
|
+
- Add flag expiry dates to LaunchDarkly metadata
|
|
187
|
+
- Schedule monthly flag cleanup sprint
|
|
188
|
+
- Target: reduce active flag count from 23 to 17
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Harness Integration
|
|
194
|
+
|
|
195
|
+
- **`harness skill run harness-feature-flags`** -- Primary invocation for flag analysis and lifecycle management.
|
|
196
|
+
- **`harness validate`** -- Run after flag cleanup to verify project health.
|
|
197
|
+
- **`harness check-deps`** -- Verify flag provider SDK dependencies are installed.
|
|
198
|
+
- **`emit_interaction`** -- Present lifecycle report and gather decisions on cleanup priorities.
|
|
199
|
+
|
|
200
|
+
## Success Criteria
|
|
201
|
+
|
|
202
|
+
- All feature flags in the project are discovered and cataloged
|
|
203
|
+
- Flags are categorized by type (release, experiment, ops, permission)
|
|
204
|
+
- Stale flags are identified with specific cleanup plans
|
|
205
|
+
- Test coverage for both flag-on and flag-off paths is verified
|
|
206
|
+
- Rollout configuration is validated for active flags
|
|
207
|
+
- Lifecycle policies are recommended with enforcement mechanisms
|
|
208
|
+
|
|
209
|
+
## Examples
|
|
210
|
+
|
|
211
|
+
### Example: React SPA with LaunchDarkly
|
|
212
|
+
|
|
213
|
+
```
|
|
214
|
+
Phase 1: DETECT
|
|
215
|
+
Provider: LaunchDarkly (React SDK v3.x)
|
|
216
|
+
Flags defined: 15 (in LaunchDarkly dashboard)
|
|
217
|
+
Flags in code: 13 (2 unused in dashboard)
|
|
218
|
+
Categories: 8 release, 3 experiment, 2 ops
|
|
219
|
+
|
|
220
|
+
Phase 2: DESIGN
|
|
221
|
+
Naming: WARN -- inconsistent (mix of camelCase and kebab-case)
|
|
222
|
+
Recommended convention: team.feature.variant (kebab-case)
|
|
223
|
+
Evaluation: Client-side (React SDK), 200ms init timeout
|
|
224
|
+
Default values: WARN -- 2 flags default to true (should default to false)
|
|
225
|
+
Rollout: checkout.express-pay at 25% (targeting premium users)
|
|
226
|
+
|
|
227
|
+
Phase 3: VALIDATE
|
|
228
|
+
Test coverage: WARN -- 4 flags missing useFlags mock in component tests
|
|
229
|
+
Consistency: PASS
|
|
230
|
+
Coupling: PASS (no interdependent flags)
|
|
231
|
+
Kill switch: PASS (all release flags can be instantly disabled)
|
|
232
|
+
|
|
233
|
+
Phase 4: LIFECYCLE
|
|
234
|
+
Stale: 3 flags at 100% for 30+ days
|
|
235
|
+
Cleanup estimate: 180 LOC across 8 files
|
|
236
|
+
Recommendation: Remove search.v2-results (at 100% for 65 days, 3 components)
|
|
237
|
+
Result: WARN -- 3 stale flags, 4 missing tests, 2 unsafe defaults
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Example: Spring Boot API with Custom Flag System
|
|
241
|
+
|
|
242
|
+
```
|
|
243
|
+
Phase 1: DETECT
|
|
244
|
+
Provider: Custom implementation (FeatureFlagService.java)
|
|
245
|
+
Flag store: PostgreSQL table (feature_flags)
|
|
246
|
+
Flags defined: 28
|
|
247
|
+
Flags in code: 24 (4 in database but unreferenced)
|
|
248
|
+
Categories: 15 release, 6 experiment, 5 ops, 2 permission
|
|
249
|
+
|
|
250
|
+
Phase 2: DESIGN
|
|
251
|
+
Architecture: Server-side evaluation with 60s cache refresh
|
|
252
|
+
Concern: No SDK resilience -- database outage disables all flags
|
|
253
|
+
Recommend: Add in-memory cache with stale-while-revalidate pattern
|
|
254
|
+
Recommend: Add health check endpoint for flag service status
|
|
255
|
+
Rollout: Using percentage field in database -- no segment targeting
|
|
256
|
+
Recommend: Add user segment support for targeted rollouts
|
|
257
|
+
|
|
258
|
+
Phase 3: VALIDATE
|
|
259
|
+
Test coverage: WARN -- @FeatureFlag annotation used but no test helper
|
|
260
|
+
to toggle flags in test context (tests rely on database state)
|
|
261
|
+
Consistency: WARN -- 4 database entries have no code references
|
|
262
|
+
Coupling: FAIL -- 3 flags form a dependency chain
|
|
263
|
+
(billing.new-pricing requires billing.tax-calc-v2 requires billing.currency-v3)
|
|
264
|
+
Recommend: Consolidate into single billing.pricing-v3 flag
|
|
265
|
+
|
|
266
|
+
Phase 4: LIFECYCLE
|
|
267
|
+
Stale: 8 flags enabled for all users for 60+ days
|
|
268
|
+
Technical debt: ~520 LOC of dead code
|
|
269
|
+
Flag count: 28 (above recommended 20 per service)
|
|
270
|
+
Recommendation: Immediate cleanup sprint targeting 8 stale flags
|
|
271
|
+
Recommendation: Enforce 60-day lifetime policy going forward
|
|
272
|
+
Result: FAIL -- flag coupling detected, high stale flag count
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Gates
|
|
276
|
+
|
|
277
|
+
- **No flags without default values.** Every flag evaluation must specify a default value for provider outage scenarios. Missing defaults are blocking findings.
|
|
278
|
+
- **No stale release flags beyond policy limit.** Release flags that exceed their maximum lifetime (default 90 days at 100%) are blocking warnings. They must be cleaned up or have an explicit extension with documented justification.
|
|
279
|
+
- **No coupled flag dependencies.** Flags that require other flags to be in a specific state create combinatorial complexity and are fragile. Flag coupling is a blocking finding that requires consolidation.
|
|
280
|
+
- **No flags without test coverage for both paths.** Feature flags that lack tests for the off-path leave the fallback behavior unverified. Both paths must be tested.
|
|
281
|
+
|
|
282
|
+
## Escalation
|
|
283
|
+
|
|
284
|
+
- **When flag count exceeds 30 per service:** The flag system is becoming a maintenance burden. Recommend a flag audit sprint with a target of reducing to under 20. Prioritize removing the oldest release flags first.
|
|
285
|
+
- **When a flag provider outage affects production:** If the application does not handle provider unavailability gracefully, this is an architectural issue. Recommend implementing local caching, safe defaults, and a circuit breaker pattern before adding more flags.
|
|
286
|
+
- **When experiment results are inconclusive:** Do not extend the experiment indefinitely. Recommend increasing sample size (broader targeting), simplifying the variants, or declaring the experiment inconclusive and removing it.
|
|
287
|
+
- **When flag cleanup requires database migration:** Removing flags that are stored in a database may require migration scripts. Coordinate cleanup with a release cycle and ensure rollback is possible if the migration fails.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
name: harness-feature-flags
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
description: Flag lifecycle management, A/B testing infrastructure, and gradual rollouts
|
|
4
|
+
cognitive_mode: advisory-guide
|
|
5
|
+
tier: 3
|
|
6
|
+
internal: false
|
|
7
|
+
keywords:
|
|
8
|
+
- feature flags
|
|
9
|
+
- feature toggles
|
|
10
|
+
- LaunchDarkly
|
|
11
|
+
- Unleash
|
|
12
|
+
- Flagsmith
|
|
13
|
+
- A/B testing
|
|
14
|
+
- canary
|
|
15
|
+
- gradual rollout
|
|
16
|
+
- kill switch
|
|
17
|
+
- experiment
|
|
18
|
+
stack_signals:
|
|
19
|
+
- "src/**/flags/**"
|
|
20
|
+
- "src/**/features/**"
|
|
21
|
+
- "src/**/*feature-flag*"
|
|
22
|
+
- "src/**/*toggle*"
|
|
23
|
+
- "flags.json"
|
|
24
|
+
- "features.json"
|
|
25
|
+
triggers:
|
|
26
|
+
- manual
|
|
27
|
+
- on_new_feature
|
|
28
|
+
platforms:
|
|
29
|
+
- claude-code
|
|
30
|
+
- gemini-cli
|
|
31
|
+
tools:
|
|
32
|
+
- Bash
|
|
33
|
+
- Read
|
|
34
|
+
- Write
|
|
35
|
+
- Edit
|
|
36
|
+
- Glob
|
|
37
|
+
- Grep
|
|
38
|
+
- emit_interaction
|
|
39
|
+
cli:
|
|
40
|
+
command: harness skill run harness-feature-flags
|
|
41
|
+
args:
|
|
42
|
+
- name: path
|
|
43
|
+
description: Project root path
|
|
44
|
+
required: false
|
|
45
|
+
- name: audit
|
|
46
|
+
description: Run stale flag audit to find flags past their expiry
|
|
47
|
+
type: boolean
|
|
48
|
+
required: false
|
|
49
|
+
- name: provider
|
|
50
|
+
description: Flag provider context (launchdarkly, unleash, flagsmith, custom)
|
|
51
|
+
required: false
|
|
52
|
+
mcp:
|
|
53
|
+
tool: run_skill
|
|
54
|
+
input:
|
|
55
|
+
skill: harness-feature-flags
|
|
56
|
+
path: string
|
|
57
|
+
type: rigid
|
|
58
|
+
phases:
|
|
59
|
+
- name: detect
|
|
60
|
+
description: Discover flag definitions, providers, and usage patterns
|
|
61
|
+
required: true
|
|
62
|
+
- name: design
|
|
63
|
+
description: Recommend flag architecture, naming, and rollout strategies
|
|
64
|
+
required: true
|
|
65
|
+
- name: validate
|
|
66
|
+
description: Verify flag hygiene, test coverage, and fallback behavior
|
|
67
|
+
required: true
|
|
68
|
+
- name: lifecycle
|
|
69
|
+
description: Audit stale flags and recommend cleanup or graduation
|
|
70
|
+
required: true
|
|
71
|
+
state:
|
|
72
|
+
persistent: false
|
|
73
|
+
files: []
|
|
74
|
+
depends_on: []
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# Harness Incident Response
|
|
2
|
+
|
|
3
|
+
> Runbook generation, postmortem analysis, and SLO/SLA tracking. Diagnoses incidents by tracing symptoms through services, produces structured postmortems, and maintains error budget accounting.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- After a production incident to generate a structured postmortem with timeline and action items
|
|
8
|
+
- To create or audit runbooks for critical services and failure scenarios
|
|
9
|
+
- To define, track, or adjust SLOs/SLAs and monitor error budget consumption
|
|
10
|
+
- NOT for real-time incident coordination (use PagerDuty, OpsGenie, or incident.io for live response)
|
|
11
|
+
- NOT for infrastructure provisioning or remediation (use harness-infrastructure-as-code)
|
|
12
|
+
- NOT for performance benchmarking (use harness-load-testing for capacity planning)
|
|
13
|
+
|
|
14
|
+
## Process
|
|
15
|
+
|
|
16
|
+
### Phase 1: ASSESS -- Determine Scope and Severity
|
|
17
|
+
|
|
18
|
+
1. **Identify the incident signal.** Scan available evidence to determine what triggered the investigation:
|
|
19
|
+
- Check for existing incident reports in `docs/incidents/` or `docs/postmortems/`
|
|
20
|
+
- Look for recent error spikes in log files, monitoring configs, or alerting rules
|
|
21
|
+
- Review recent deployments via `git log --oneline --since="48 hours ago"` for correlated changes
|
|
22
|
+
|
|
23
|
+
2. **Map affected services.** Trace the blast radius from the incident signal:
|
|
24
|
+
- Identify the originating service from error messages or alert metadata
|
|
25
|
+
- Walk dependency chains using import graphs or service manifests (`docker-compose.yml`, `kubernetes/`, service mesh configs)
|
|
26
|
+
- List all downstream services that depend on the affected component
|
|
27
|
+
|
|
28
|
+
3. **Classify severity.** Apply the project's severity matrix if one exists in `docs/runbooks/severity-matrix.md`. Otherwise, use standard classification:
|
|
29
|
+
- **SEV1:** Complete service outage, data loss, or security breach affecting all users
|
|
30
|
+
- **SEV2:** Major feature degradation affecting a significant subset of users
|
|
31
|
+
- **SEV3:** Minor feature degradation with workaround available
|
|
32
|
+
- **SEV4:** Cosmetic issue or internal tooling degradation
|
|
33
|
+
|
|
34
|
+
4. **Establish timeline boundaries.** Determine:
|
|
35
|
+
- When the incident started (first error, first alert, or first user report)
|
|
36
|
+
- When it was detected (MTTD -- Mean Time to Detect)
|
|
37
|
+
- When mitigation began
|
|
38
|
+
- When the incident was resolved (MTTR -- Mean Time to Recover)
|
|
39
|
+
|
|
40
|
+
5. **Check for existing runbooks.** Search `docs/runbooks/` and `runbooks/` for procedures matching the affected service or failure mode. If a runbook exists, evaluate whether it was followed and whether it was effective.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
### Phase 2: INVESTIGATE -- Trace Root Cause
|
|
45
|
+
|
|
46
|
+
1. **Correlate with recent changes.** Run `git log --oneline --since="7 days ago"` and cross-reference commits with the incident timeline. Flag commits that touched affected services or their dependencies.
|
|
47
|
+
|
|
48
|
+
2. **Analyze error patterns.** Search the codebase for error handling related to the failure:
|
|
49
|
+
- Grep for error messages, exception types, or error codes mentioned in the incident
|
|
50
|
+
- Check retry logic, timeout configurations, and circuit breaker states
|
|
51
|
+
- Identify whether the failure was transient (timeout, network) or persistent (logic error, data corruption)
|
|
52
|
+
|
|
53
|
+
3. **Trace data flow.** Map the request path from entry point to failure point:
|
|
54
|
+
- Identify API endpoints, message queues, or cron jobs involved
|
|
55
|
+
- Check database queries and external API calls along the path
|
|
56
|
+
- Look for missing validation, unhandled edge cases, or race conditions
|
|
57
|
+
|
|
58
|
+
4. **Identify contributing factors.** Distinguish between root cause and contributing factors:
|
|
59
|
+
- Root cause: the single change or condition that directly caused the failure
|
|
60
|
+
- Contributing factors: conditions that allowed the failure to reach production (missing tests, inadequate monitoring, deployment without canary)
|
|
61
|
+
|
|
62
|
+
5. **Validate the hypothesis.** Confirm the root cause by checking:
|
|
63
|
+
- Does reverting the identified change (or simulating the revert) resolve the issue?
|
|
64
|
+
- Does the failure reproduce under the identified conditions?
|
|
65
|
+
- Are there other incidents with the same root cause pattern?
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
### Phase 3: DOCUMENT -- Generate Artifacts
|
|
70
|
+
|
|
71
|
+
1. **Generate the postmortem report.** Create a structured document in `docs/postmortems/YYYY-MM-DD-<slug>.md` with these sections:
|
|
72
|
+
- **Summary:** One-paragraph description of what happened, impact, and duration
|
|
73
|
+
- **Timeline:** Chronological list of events from first signal to resolution
|
|
74
|
+
- **Root Cause:** Clear statement of what went wrong and why
|
|
75
|
+
- **Contributing Factors:** Conditions that enabled the failure
|
|
76
|
+
- **Impact:** User-facing impact, data impact, SLO impact, revenue impact if applicable
|
|
77
|
+
- **Detection:** How the incident was detected and time to detection
|
|
78
|
+
- **Mitigation:** Steps taken to resolve the incident
|
|
79
|
+
- **Action Items:** Numbered list with owner, priority, and due date
|
|
80
|
+
|
|
81
|
+
2. **Create or update runbooks.** For each failure mode identified:
|
|
82
|
+
- If no runbook exists, create one in `docs/runbooks/<service>-<failure-mode>.md`
|
|
83
|
+
- Structure: Symptoms, Diagnosis Steps, Mitigation Steps, Escalation Path, Recovery Verification
|
|
84
|
+
- Include concrete commands (kubectl, database queries, API calls) not just prose descriptions
|
|
85
|
+
- Reference monitoring dashboards and alert names
|
|
86
|
+
|
|
87
|
+
3. **Update the incident log.** If `docs/incidents/index.md` exists, append the new incident with date, severity, MTTR, and link to the postmortem.
|
|
88
|
+
|
|
89
|
+
4. **Tag related code.** Add or update `// INCIDENT-YYYY-MM-DD: <description>` comments at the code locations involved in the root cause. This creates a searchable history of incident-prone code.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
### Phase 4: IMPROVE -- SLO Adjustments and Prevention
|
|
94
|
+
|
|
95
|
+
1. **Calculate SLO impact.** If `slo.yaml` or equivalent SLO definitions exist:
|
|
96
|
+
- Determine how much error budget the incident consumed
|
|
97
|
+
- Calculate remaining error budget for the current window
|
|
98
|
+
- If error budget is exhausted, flag that feature development should pause for reliability work
|
|
99
|
+
|
|
100
|
+
2. **Evaluate alerting effectiveness.** For each alert that fired (or should have fired):
|
|
101
|
+
- Was the alert timely? Compare alert time to incident start time
|
|
102
|
+
- Was the alert actionable? Did it point to the right service and include enough context?
|
|
103
|
+
- Were there false negatives? Identify monitoring gaps that should have caught the issue earlier
|
|
104
|
+
|
|
105
|
+
3. **Propose SLO adjustments.** Based on the incident analysis:
|
|
106
|
+
- If the SLO was violated but the impact was acceptable, the SLO may be too tight
|
|
107
|
+
- If the SLO was not violated but users were impacted, the SLO may be too loose
|
|
108
|
+
- Recommend specific SLI (Service Level Indicator) thresholds with justification
|
|
109
|
+
|
|
110
|
+
4. **Generate preventive action items.** Categorize actions by type:
|
|
111
|
+
- **Code fixes:** Specific bugs or missing validations to address
|
|
112
|
+
- **Testing gaps:** Missing integration tests, chaos tests, or load tests to add
|
|
113
|
+
- **Monitoring improvements:** New alerts, dashboards, or SLIs to implement
|
|
114
|
+
- **Process improvements:** Deployment safeguards, runbook updates, or on-call training
|
|
115
|
+
- **Architecture changes:** Circuit breakers, bulkheads, or redundancy to add
|
|
116
|
+
|
|
117
|
+
5. **Produce the improvement summary.** Output a prioritized action list with effort estimates and expected impact on MTTD and MTTR.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Harness Integration
|
|
122
|
+
|
|
123
|
+
- **`harness skill run harness-incident-response`** -- Primary CLI entry point. Runs all four phases.
|
|
124
|
+
- **`harness validate`** -- Run after generating documents to ensure project structure is intact.
|
|
125
|
+
- **`harness check-deps`** -- Verify service dependency declarations match the incident trace.
|
|
126
|
+
- **`emit_interaction`** -- Used at severity classification (checkpoint:decision) to confirm severity with the operator before proceeding.
|
|
127
|
+
- **`Glob`** -- Discover existing runbooks, postmortems, and SLO definitions.
|
|
128
|
+
- **`Grep`** -- Search for error patterns, alert configurations, and incident-related code comments.
|
|
129
|
+
- **`Write`** -- Generate postmortem reports and runbook documents.
|
|
130
|
+
- **`Edit`** -- Update existing runbooks and incident indexes.
|
|
131
|
+
|
|
132
|
+
## Success Criteria
|
|
133
|
+
|
|
134
|
+
- Postmortem document is complete with all required sections (summary, timeline, root cause, action items)
|
|
135
|
+
- Timeline includes MTTD and MTTR calculations with specific timestamps
|
|
136
|
+
- Root cause is a specific, falsifiable statement (not "the system failed")
|
|
137
|
+
- Action items have owners, priorities, and due dates
|
|
138
|
+
- Runbooks contain concrete commands, not just descriptive prose
|
|
139
|
+
- SLO impact is quantified against the error budget when SLO definitions exist
|
|
140
|
+
|
|
141
|
+
## Examples
|
|
142
|
+
|
|
143
|
+
### Example: Node.js API Timeout Incident with Datadog Alerts
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
Phase 1: ASSESS
|
|
147
|
+
Signal: Datadog alert "api-gateway p99 latency > 2000ms" fired at 14:32 UTC
|
|
148
|
+
Affected: api-gateway -> user-service -> PostgreSQL
|
|
149
|
+
Severity: SEV2 (major degradation, 40% of requests timing out)
|
|
150
|
+
MTTD: 4 minutes (alert fired 4 min after first error)
|
|
151
|
+
MTTR: 47 minutes (resolved at 15:19 UTC)
|
|
152
|
+
|
|
153
|
+
Phase 2: INVESTIGATE
|
|
154
|
+
Correlated change: commit abc123 "add user preferences join" deployed at 14:25 UTC
|
|
155
|
+
Root cause: N+1 query in GET /api/users/:id/preferences — new LEFT JOIN
|
|
156
|
+
on unindexed column `preferences.user_id` caused full table scan
|
|
157
|
+
Contributing factors:
|
|
158
|
+
- No query performance test for the preferences endpoint
|
|
159
|
+
- Missing database index on preferences.user_id
|
|
160
|
+
- No circuit breaker between api-gateway and user-service
|
|
161
|
+
|
|
162
|
+
Phase 3: DOCUMENT
|
|
163
|
+
Created: docs/postmortems/2026-03-15-user-service-timeout.md
|
|
164
|
+
Created: docs/runbooks/user-service-database-slow-query.md
|
|
165
|
+
Updated: docs/incidents/index.md
|
|
166
|
+
|
|
167
|
+
Phase 4: IMPROVE
|
|
168
|
+
SLO impact: Consumed 12% of monthly error budget (88% remaining)
|
|
169
|
+
Action items:
|
|
170
|
+
1. [P0] Add index on preferences.user_id (owner: @backend, due: 2026-03-16)
|
|
171
|
+
2. [P1] Add query execution time assertions to integration tests (owner: @backend, due: 2026-03-22)
|
|
172
|
+
3. [P1] Add circuit breaker on api-gateway -> user-service (owner: @platform, due: 2026-03-22)
|
|
173
|
+
4. [P2] Add Datadog query performance monitor for user-service (owner: @sre, due: 2026-03-29)
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Example: Kubernetes Pod CrashLoopBackOff with PagerDuty Escalation
|
|
177
|
+
|
|
178
|
+
```
|
|
179
|
+
Phase 1: ASSESS
|
|
180
|
+
Signal: PagerDuty incident #4521 — payment-service pods in CrashLoopBackOff
|
|
181
|
+
Affected: payment-service -> Stripe API -> order-service (downstream)
|
|
182
|
+
Severity: SEV1 (payment processing completely down)
|
|
183
|
+
MTTD: 2 minutes (PagerDuty auto-detected from Kubernetes health checks)
|
|
184
|
+
MTTR: 23 minutes
|
|
185
|
+
|
|
186
|
+
Phase 2: INVESTIGATE
|
|
187
|
+
Root cause: Environment variable STRIPE_WEBHOOK_SECRET rotated in Vault
|
|
188
|
+
but payment-service pods were not restarted to pick up new value.
|
|
189
|
+
Stripe signature verification failed on all incoming webhooks, causing
|
|
190
|
+
panic in the webhook handler (no error recovery).
|
|
191
|
+
Contributing factors:
|
|
192
|
+
- Vault secret rotation did not trigger pod restart
|
|
193
|
+
- Webhook handler used panic instead of returning error
|
|
194
|
+
- No runbook for secret rotation procedures
|
|
195
|
+
|
|
196
|
+
Phase 3: DOCUMENT
|
|
197
|
+
Created: docs/postmortems/2026-03-20-payment-service-crashloop.md
|
|
198
|
+
Created: docs/runbooks/payment-service-secret-rotation.md
|
|
199
|
+
Created: docs/runbooks/payment-service-stripe-webhook-failure.md
|
|
200
|
+
Updated: docs/incidents/index.md
|
|
201
|
+
|
|
202
|
+
Phase 4: IMPROVE
|
|
203
|
+
SLO impact: Consumed 100% of weekly error budget. Feature freeze recommended.
|
|
204
|
+
Action items:
|
|
205
|
+
1. [P0] Add Vault agent sidecar with auto-restart on secret change (owner: @platform)
|
|
206
|
+
2. [P0] Replace panic with error return in webhook handler (owner: @payments)
|
|
207
|
+
3. [P1] Add synthetic Stripe webhook test to canary suite (owner: @payments)
|
|
208
|
+
4. [P2] Create secret rotation runbook for all services (owner: @sre)
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## Gates
|
|
212
|
+
|
|
213
|
+
- **No postmortem without a root cause statement.** A postmortem that says "cause unknown" is incomplete. If the root cause cannot be determined, the postmortem must document what was investigated, what was ruled out, and what additional data is needed. Do not close the investigation.
|
|
214
|
+
- **No action items without owners.** Every action item must have an assigned owner and a due date. Unowned action items are never completed. If no owner can be identified, escalate to the team lead.
|
|
215
|
+
- **No severity downgrade without justification.** If a severity is reclassified during investigation, the reason must be documented in the postmortem timeline. Severity downgrades without evidence indicate pressure to minimize, not genuine reassessment.
|
|
216
|
+
- **No skipping the improvement phase.** Documentation without follow-through produces shelf-ware. The improvement phase must produce at least one concrete, actionable item per contributing factor identified.
|
|
217
|
+
|
|
218
|
+
## Escalation
|
|
219
|
+
|
|
220
|
+
- **When root cause cannot be determined from code alone:** The incident may require production logs, metrics, or traces that are not available in the codebase. Report: "Root cause analysis requires access to [specific observability data]. Recommend reviewing [Datadog/Grafana/CloudWatch] dashboards for the incident window."
|
|
221
|
+
- **When the incident reveals a systemic architecture issue:** A single postmortem action item is insufficient. Report: "This incident pattern indicates a systemic issue with [description]. Recommend a dedicated architecture review using harness-architecture-advisor."
|
|
222
|
+
- **When SLO definitions do not exist:** Error budget calculation is impossible without SLOs. Report: "No SLO definitions found. Recommend establishing baseline SLOs before the next incident review. See the SLO starter template in docs/runbooks/slo-template.yaml."
|
|
223
|
+
- **When multiple teams are involved in the blast radius:** A single postmortem owner may not have visibility into all contributing factors. Report: "This incident spans [N] services owned by [teams]. Recommend a joint postmortem review with representatives from each team."
|