mandrel 1.93.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +59 -73
- package/.agents/agents/acceptance-critic.md +129 -0
- package/.agents/agents/story-worker.md +161 -0
- package/.agents/docs/SDLC.md +489 -1285
- package/.agents/docs/agentrc-reference.json +177 -67
- package/.agents/docs/configuration.md +108 -136
- package/.agents/docs/execution-reference.md +44 -22
- package/.agents/docs/quality-gates.md +13 -19
- package/.agents/docs/workflows.md +3 -3
- package/.agents/instructions.md +107 -108
- package/.agents/rules/ci-remediation.md +8 -12
- package/.agents/rules/git-conventions-reference.md +224 -0
- package/.agents/rules/git-conventions.md +42 -223
- package/.agents/rules/security-baseline.md +5 -0
- package/.agents/rules/testing-standards.md +106 -13
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +71 -201
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/risk-verdict.schema.json +0 -13
- package/.agents/scripts/acceptance-eval.js +62 -18
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/analyze-execution.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/check-context-budget.js +62 -5
- package/.agents/scripts/check-lifecycle-lint.js +6 -9
- package/.agents/scripts/check-prepush-recovery.js +1 -1
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- package/.agents/scripts/diagnose-friction.js +0 -6
- package/.agents/scripts/lib/Logger.js +6 -10
- package/.agents/scripts/lib/audit-suite/runner.js +2 -2
- package/.agents/scripts/lib/audit-suite/selector.js +5 -5
- package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
- package/.agents/scripts/lib/baselines/kernel.js +206 -18
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
- package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
- package/.agents/scripts/lib/checks/index.js +2 -1
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +16 -7
- package/.agents/scripts/lib/close-validation/gates.js +160 -22
- package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +103 -0
- package/.agents/scripts/lib/config/explain.js +57 -36
- package/.agents/scripts/lib/config/limits.js +17 -58
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +1 -1
- package/.agents/scripts/lib/config/runners.js +17 -50
- package/.agents/scripts/lib/config/temp-paths.js +19 -14
- package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
- package/.agents/scripts/lib/config-resolver.js +3 -8
- package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -14
- package/.agents/scripts/lib/config-settings-schema.js +52 -38
- package/.agents/scripts/lib/dependency-parser.js +3 -2
- package/.agents/scripts/lib/doc-tiers.js +39 -4
- package/.agents/scripts/lib/duplicate-search.js +211 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +5 -5
- package/.agents/scripts/lib/framework-version.js +2 -3
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
- package/.agents/scripts/lib/git-utils.js +32 -6
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/label-constants.js +10 -23
- package/.agents/scripts/lib/label-taxonomy.js +9 -43
- package/.agents/scripts/lib/observability/active-story-env.js +112 -3
- package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
- package/.agents/scripts/lib/observability/source-classifier.js +3 -3
- package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
- package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
- package/.agents/scripts/lib/orchestration/code-review.js +20 -268
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
- package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
- package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
- package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +14 -14
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
- package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
- package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
- package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
- package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
- package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
- package/.agents/scripts/lib/orchestration/ticket-validator.js +3 -8
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
- package/.agents/scripts/lib/planning-corpus.js +16 -11
- package/.agents/scripts/lib/preflight-runner.js +2 -2
- package/.agents/scripts/lib/provider-factory.js +1 -1
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/story-adjacency.js +11 -14
- package/.agents/scripts/lib/story-body/story-body.js +124 -70
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
- package/.agents/scripts/lib/validation-evidence.js +1 -1
- package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
- package/.agents/scripts/lint-issue-body.js +71 -40
- package/.agents/scripts/mandrel-update-preflight.js +1 -1
- package/.agents/scripts/notify.js +4 -3
- package/.agents/scripts/plan-context.js +64 -74
- package/.agents/scripts/plan-persist.js +121 -280
- package/.agents/scripts/plan-run-epilogue.js +97 -0
- package/.agents/scripts/post-structured-comment.js +38 -0
- package/.agents/scripts/providers/github/issues.js +17 -33
- package/.agents/scripts/providers/github/mappers.js +0 -12
- package/.agents/scripts/providers/github/tickets.js +2 -5
- package/.agents/scripts/resolve-plan-run.js +117 -0
- package/.agents/scripts/signals-view.js +24 -19
- package/.agents/scripts/single-story-close.js +11 -14
- package/.agents/scripts/single-story-confirm-merge.js +39 -23
- package/.agents/scripts/single-story-init.js +29 -20
- package/.agents/scripts/stories-wave-tick.js +6 -6
- package/.agents/scripts/story-plan.js +26 -47
- package/.agents/scripts/sync-claude-agents.js +165 -0
- package/.agents/scripts/update-ticket-state.js +37 -15
- package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
- package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
- package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
- package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
- package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
- package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
- package/.agents/skills/core/scope-triage/SKILL.md +28 -172
- package/.agents/skills/skills.index.json +8 -418
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +3 -3
- package/.agents/workflows/audit-clean-code.md +3 -3
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +5 -5
- package/.agents/workflows/audit-lighthouse.md +3 -3
- package/.agents/workflows/audit-navigability.md +3 -2
- package/.agents/workflows/audit-performance.md +3 -3
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +3 -3
- package/.agents/workflows/audit-security.md +3 -3
- package/.agents/workflows/audit-seo.md +3 -3
- package/.agents/workflows/audit-sre.md +3 -3
- package/.agents/workflows/audit-to-stories.md +20 -20
- package/.agents/workflows/audit-ux-ui.md +3 -3
- package/.agents/workflows/deliver.md +122 -131
- package/.agents/workflows/git-cleanup.md +3 -4
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +52 -40
- package/.agents/workflows/helpers/code-review.md +70 -193
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
- package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
- package/.agents/workflows/helpers/parallel-tooling.md +1 -1
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
- package/.agents/workflows/mandrel-update.md +3 -2
- package/.agents/workflows/plan.md +112 -145
- package/.agents/workflows/qa-assist.md +24 -30
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -2
- package/README.md +9 -8
- package/docs/CHANGELOG.md +46 -0
- package/lib/cli/registry.js +95 -0
- package/lib/migrations/index.js +6 -5
- package/package.json +5 -3
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer-mobile.md +0 -120
- package/.agents/personas/engineer-web.md +0 -111
- package/.agents/personas/engineer.md +0 -119
- package/.agents/personas/product.md +0 -94
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/refactorer.md +0 -113
- package/.agents/personas/security-engineer.md +0 -112
- package/.agents/personas/sre.md +0 -86
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/personas/ux-designer.md +0 -95
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/dispatcher.js +0 -295
- package/.agents/scripts/epic-audit-prepare.js +0 -497
- package/.agents/scripts/epic-audit-recheck.js +0 -274
- package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
- package/.agents/scripts/epic-deliver-preflight.js +0 -462
- package/.agents/scripts/epic-deliver-prepare.js +0 -590
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-decompose.js +0 -54
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- package/.agents/scripts/epic-plan-spec.js +0 -64
- package/.agents/scripts/epic-reconcile.js +0 -625
- package/.agents/scripts/lib/baseline-snapshot.js +0 -979
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
- package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
- package/.agents/scripts/lib/config/lifecycle.js +0 -40
- package/.agents/scripts/lib/config/preflight.js +0 -58
- package/.agents/scripts/lib/config/retro.js +0 -77
- package/.agents/scripts/lib/epic-merge-lock.js +0 -322
- package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
- package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -660
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -388
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
- package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -278
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
- package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
- package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
- package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
- package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
- package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
- package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
- package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
- package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
- package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -301
- package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
- package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
- package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
- package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
- package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
- package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
- package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
- package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
- package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
- package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
- package/.agents/scripts/lib/push-epic-retry.js +0 -209
- package/.agents/scripts/lib/spec/index.js +0 -36
- package/.agents/scripts/lib/spec/loader.js +0 -425
- package/.agents/scripts/lib/spec/state.js +0 -208
- package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
- package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
- package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
- package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
- package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
- package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
- package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
- package/.agents/scripts/lib/wave-runner/tick.js +0 -754
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
- package/.agents/scripts/lifecycle-emit.js +0 -510
- package/.agents/scripts/plan-critics.js +0 -199
- package/.agents/scripts/retro-run.js +0 -218
- package/.agents/scripts/standalone-feedback-rollup.js +0 -188
- package/.agents/scripts/story-close.js +0 -294
- package/.agents/scripts/story-init.js +0 -599
- package/.agents/scripts/story-phase.js +0 -369
- package/.agents/scripts/wave-tick.js +0 -335
- package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
- package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
- package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
- package/.agents/skills/core/code-simplification/SKILL.md +0 -389
- package/.agents/skills/core/context-engineering/SKILL.md +0 -309
- package/.agents/skills/core/context-engineering/examples.md +0 -58
- package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
- package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
- package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
- package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
- package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -413
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
- package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
- package/.agents/skills/core/idea-refinement/examples.md +0 -437
- package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
- package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
- package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
- package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
- package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
- package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
- package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
- package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
- package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
- package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
- package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
- package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
- package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
- package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
- package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
- package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
- package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
- package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
- package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
- package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
- package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
- package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
- package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
- package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
- package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
- package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
- package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
- package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
- package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
- package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
- package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
- package/.agents/workflows/helpers/deliver-epic.md +0 -955
- package/.agents/workflows/helpers/deliver-stories.md +0 -440
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
- package/.agents/workflows/helpers/epic-testing.md +0 -125
- package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
- package/.agents/workflows/helpers/plan-epic.md +0 -351
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: baseline-refresh
|
|
3
|
-
description: >-
|
|
4
|
-
Author a refresh commit for any of the unified-baseline snapshots (CRAP,
|
|
5
|
-
maintainability, dead-exports, lighthouse). Use whenever an intentional
|
|
6
|
-
code change resets a baseline key (rename, deliberate complexity bump,
|
|
7
|
-
perf regression with operator sign-off) and the close-validation chain
|
|
8
|
-
needs the refreshed snapshot to land on the same Story branch as the
|
|
9
|
-
triggering edit.
|
|
10
|
-
allowed_tools:
|
|
11
|
-
- Read
|
|
12
|
-
- Write
|
|
13
|
-
- Bash
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# baseline-refresh
|
|
17
|
-
|
|
18
|
-
## Policy Capsule
|
|
19
|
-
|
|
20
|
-
- Refresh only when the change is **deliberate** (rename, approved complexity bump, signed-off perf delta, intentional API surface change). Never refresh to paper over an unintentional regression — fix the regression instead.
|
|
21
|
-
- Run the kind-specific update command (`npm run crap:update` / `maintainability:update` / `dead-exports:update` / `lighthouse:update`) on the **Story branch**, not on `main`.
|
|
22
|
-
- Verify the resulting diff is scoped to the relevant `baselines/<kind>.json` (plus cosmetic `package-lock.json` churn only). If unrelated files appear, STOP — the refresh is contaminated.
|
|
23
|
-
- Stage baseline files **explicitly** (`git add baselines/<kind>.json`). Never `git add -A` in a refresh commit.
|
|
24
|
-
- Commit-subject contract: a **Conventional-Commits** subject of the form `chore(baselines): refresh <kind> snapshot for <reason>` — never an ad-hoc leading token like `baseline-refresh:` (commitlint and the planner validator reject it).
|
|
25
|
-
- The commit body is **mandatory** and non-empty: explain what changed, why the new floor is correct, and link the Story/Epic that triggered the refresh.
|
|
26
|
-
- Add the machine-readable trailer `baseline-refresh: true` (one per line, `Key: value` git-trailer style) to the body whenever observability classification matters.
|
|
27
|
-
- Include `Epic: #<epic-id>` as a body trailer.
|
|
28
|
-
- Never pass `--no-verify`. The `commit-msg` hook (commitlint) MUST run and pass.
|
|
29
|
-
- After the refresh lands, re-run `node .agents/scripts/check-baselines.js` to confirm the gate passes against the new snapshot; if it still fails, a sibling kind drifted — refresh that kind too.
|
|
30
|
-
|
|
31
|
-
## Role
|
|
32
|
-
|
|
33
|
-
Senior engineer authoring a deliberate, observable refresh of one of the
|
|
34
|
-
unified baseline snapshots that the close-validation chain enforces
|
|
35
|
-
(`baselines/crap.json`, `baselines/maintainability.json`,
|
|
36
|
-
`baselines/dead-exports.json`, `baselines/lighthouse.json`).
|
|
37
|
-
|
|
38
|
-
A refresh is **not** a regression entry — it tells the ratchet that the
|
|
39
|
-
new baseline key is intentional, so the gate compares future runs against
|
|
40
|
-
the refreshed snapshot rather than the prior one.
|
|
41
|
-
|
|
42
|
-
## When to use
|
|
43
|
-
|
|
44
|
-
- A file rename or move detached an MI/CRAP key from its prior baseline.
|
|
45
|
-
- A method rename inside a file produced a phantom new key + phantom
|
|
46
|
-
deleted key under escomplex's `<file>::<methodName>` keying.
|
|
47
|
-
- An operator-approved complexity bump or perf delta needs to be
|
|
48
|
-
enshrined as the new floor.
|
|
49
|
-
- A dead-export gate flagged a deliberate API surface change that has
|
|
50
|
-
been signed off.
|
|
51
|
-
|
|
52
|
-
If the underlying change is an **unintentional** regression, do not refresh
|
|
53
|
-
— remediate the regression first.
|
|
54
|
-
|
|
55
|
-
## Commit-subject contract (authoritative)
|
|
56
|
-
|
|
57
|
-
Refresh commits MUST use a **Conventional-Commits subject** and MUST NOT
|
|
58
|
-
use a legacy ad-hoc prefix as the leading token. The canonical shape is:
|
|
59
|
-
|
|
60
|
-
```text
|
|
61
|
-
chore(baselines): refresh <kind> snapshot for <reason>
|
|
62
|
-
|
|
63
|
-
<non-empty body explaining the refresh — what changed, why the new
|
|
64
|
-
baseline is the correct floor, and any operator sign-off reference>
|
|
65
|
-
|
|
66
|
-
baseline-refresh: true
|
|
67
|
-
Epic: #<epic-id>
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Why a Conventional-Commits subject
|
|
71
|
-
|
|
72
|
-
1. The local `commit-msg` hook (`.husky/commit-msg` → `commitlint`) rejects
|
|
73
|
-
any subject whose leading token is not one of
|
|
74
|
-
`feat|fix|chore|refactor|perf|docs|style|test|build|ci|revert`. Legacy
|
|
75
|
-
ad-hoc leading tokens fail this hook. `--no-verify` is forbidden by
|
|
76
|
-
[`.agents/rules/git-conventions.md`](../../../rules/git-conventions.md),
|
|
77
|
-
so the subject must conform.
|
|
78
|
-
2. `release-please` consumes Conventional-Commits subjects on `main` to
|
|
79
|
-
generate `docs/CHANGELOG.md` and bump `package.json`. A
|
|
80
|
-
non-conventional subject parses as "no changelog entry" and the
|
|
81
|
-
refresh disappears from the release record.
|
|
82
|
-
3. `chore(baselines):` keeps the refresh out of the user-facing changelog
|
|
83
|
-
(which is correct — a baseline refresh is internal hygiene, not a
|
|
84
|
-
feature or fix) while still being machine-parseable.
|
|
85
|
-
|
|
86
|
-
### Body trailer for machine-readable classification
|
|
87
|
-
|
|
88
|
-
When telemetry, the friction analyzer, or the baseline-refresh-rate
|
|
89
|
-
observability surface needs to detect a refresh commit, add the trailer
|
|
90
|
-
`baseline-refresh: true` to the commit **body** (one trailer per line,
|
|
91
|
-
following the `Key: value` git-trailer convention). The trailer is the
|
|
92
|
-
canonical machine-readable marker. Subject-level leading tokens are not
|
|
93
|
-
— and must not be — used for this purpose.
|
|
94
|
-
|
|
95
|
-
The trailer form is also what
|
|
96
|
-
[`.agents/scripts/lib/observability/baseline-refresh-rate.js`](../../../scripts/lib/observability/baseline-refresh-rate.js)
|
|
97
|
-
should classify against going forward; until that classifier is updated,
|
|
98
|
-
the historical subject-prefix detection remains in place as a
|
|
99
|
-
backwards-compatibility fallback but is not the prescribed shape for new
|
|
100
|
-
commits.
|
|
101
|
-
|
|
102
|
-
## Procedure
|
|
103
|
-
|
|
104
|
-
### Step 1 — Run the matching update command
|
|
105
|
-
|
|
106
|
-
Each baseline kind has a dedicated update script:
|
|
107
|
-
|
|
108
|
-
| Kind | Update command |
|
|
109
|
-
| --------------- | ------------------------------- |
|
|
110
|
-
| CRAP | `npm run crap:update` |
|
|
111
|
-
| Maintainability | `npm run maintainability:update`|
|
|
112
|
-
| Dead-exports | `npm run dead-exports:update` |
|
|
113
|
-
| Lighthouse | `npm run lighthouse:update` |
|
|
114
|
-
|
|
115
|
-
Run the command on the Story branch that triggered the refresh — the
|
|
116
|
-
worktree's HEAD must already be the Story branch, not `main`.
|
|
117
|
-
|
|
118
|
-
### Step 2 — Verify the diff is scoped to the baseline file
|
|
119
|
-
|
|
120
|
-
`git status` should show only the relevant `baselines/<kind>.json` (or
|
|
121
|
-
sibling per-kind files) and possibly `package-lock.json` cosmetic churn.
|
|
122
|
-
If unrelated files appear in the diff, **STOP** — the update script
|
|
123
|
-
picked up an unintentional regression and the refresh is contaminated.
|
|
124
|
-
|
|
125
|
-
### Step 3 — Author the commit
|
|
126
|
-
|
|
127
|
-
Stage the baseline file(s) explicitly (do not `git add -A`), then commit
|
|
128
|
-
with the Conventional-Commits subject + body trailer:
|
|
129
|
-
|
|
130
|
-
```bash
|
|
131
|
-
git add baselines/<kind>.json
|
|
132
|
-
git commit -m "$(cat <<'EOF'
|
|
133
|
-
chore(baselines): refresh <kind> snapshot for <reason>
|
|
134
|
-
|
|
135
|
-
<body explaining what changed, why the new floor is correct, and
|
|
136
|
-
linking the upstream Story/Epic that triggered the refresh.>
|
|
137
|
-
|
|
138
|
-
baseline-refresh: true
|
|
139
|
-
Epic: #<epic-id>
|
|
140
|
-
EOF
|
|
141
|
-
)"
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
Do NOT pass `--no-verify`. The `commit-msg` hook (commitlint) MUST run
|
|
145
|
-
and MUST pass.
|
|
146
|
-
|
|
147
|
-
### Step 4 — Re-run the gate
|
|
148
|
-
|
|
149
|
-
After the refresh commit lands on the Story branch, re-run
|
|
150
|
-
`node .agents/scripts/check-baselines.js` to confirm the gate now passes
|
|
151
|
-
against the refreshed snapshot. If it still fails, the refresh was
|
|
152
|
-
incomplete (a sibling kind also drifted) — repeat from Step 1 for the
|
|
153
|
-
remaining kind.
|
|
154
|
-
|
|
155
|
-
## Constraints
|
|
156
|
-
|
|
157
|
-
- **Never** use a legacy ad-hoc token as the leading Conventional-Commits
|
|
158
|
-
type in the commit subject. The allowed leading types are
|
|
159
|
-
`feat|fix|chore|refactor|perf|docs|style|test|build|ci|revert` — this
|
|
160
|
-
is enforced by commitlint locally and by the planning-time validator
|
|
161
|
-
(`ticket-validator.js` → `validateAcceptanceSubjectPrefix`) at
|
|
162
|
-
decompose time.
|
|
163
|
-
- **Always** include a non-empty body. Empty-body refreshes are
|
|
164
|
-
unreviewable and hide the operator decision behind a one-line subject.
|
|
165
|
-
- **Always** include the `baseline-refresh: true` trailer when telemetry
|
|
166
|
-
/ observability classification matters. The trailer is the
|
|
167
|
-
machine-readable marker going forward.
|
|
168
|
-
- **Always** stage the baseline file(s) explicitly. A refresh commit
|
|
169
|
-
whose diff also touches unrelated files is a contaminated refresh and
|
|
170
|
-
the gate's "this floor is correct" semantics no longer hold.
|
|
171
|
-
- **Never** refresh to paper over an unintentional regression. Refresh
|
|
172
|
-
is "this is the new correct floor"; if the change isn't a deliberate
|
|
173
|
-
one, fix the regression instead.
|
|
174
|
-
|
|
175
|
-
## Rationale anchor
|
|
176
|
-
|
|
177
|
-
Epic #2501 retired the legacy `baseline-refresh` ad-hoc leading-token
|
|
178
|
-
prescription in favor of the Conventional-Commits subject +
|
|
179
|
-
`baseline-refresh: true` body-trailer shape documented above. See that
|
|
180
|
-
Epic for the full migration history and the friction signals that
|
|
181
|
-
motivated the change.
|
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ci-cd-and-automation
|
|
3
|
-
description:
|
|
4
|
-
Automates CI/CD pipeline setup. Use when setting up or modifying build and
|
|
5
|
-
deployment pipelines. Use when you need to automate quality gates, configure
|
|
6
|
-
test runners in CI, or establish deployment strategies.
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# CI/CD and Automation
|
|
10
|
-
|
|
11
|
-
## Policy Capsule
|
|
12
|
-
|
|
13
|
-
- Every PR passes the same quality-gate pipeline before merge: **lint → typecheck → unit tests → build → integration tests → optional E2E → security audit → bundle-size**. Gates are ordered shift-left so cheap checks fail first.
|
|
14
|
-
- **No gate may be skipped.** Failing lint means fix lint, not disable the rule. Failing a test means fix the code, not delete or `.skip` the test.
|
|
15
|
-
- **Faster is safer.** Prefer many small, frequent releases over big-bang merges; one deploy of three changes is debuggable, one deploy of thirty is not.
|
|
16
|
-
- Cache aggressively (npm cache, build cache) and split lint / typecheck / test into parallel jobs to keep PR feedback under ~10 minutes.
|
|
17
|
-
- Use GitHub Secrets (or platform equivalent) for every credential — even in CI-only test databases. Never hardcode credentials in workflow YAML.
|
|
18
|
-
- Wire preview deployments for every PR so reviewers can exercise the change in a production-like environment before merge.
|
|
19
|
-
- Feed CI failure output verbatim back to the agent loop with the specific error and the directive to verify locally before re-pushing.
|
|
20
|
-
- Treat the security audit (`npm audit` or equivalent) as gating: critical and high vulnerabilities reachable in production code MUST be remediated before merge.
|
|
21
|
-
- Enforce a bundle-size budget in CI; a budget breach blocks the change just like a failing test.
|
|
22
|
-
|
|
23
|
-
## Overview
|
|
24
|
-
|
|
25
|
-
Automate quality gates so that no change reaches production without passing
|
|
26
|
-
tests, lint, type checking, and build. CI/CD is the enforcement mechanism for
|
|
27
|
-
every other skill — it catches what humans and agents miss, and it does so
|
|
28
|
-
consistently on every single change.
|
|
29
|
-
|
|
30
|
-
**Shift Left:** Catch problems as early in the pipeline as possible. A bug
|
|
31
|
-
caught in linting costs minutes; the same bug caught in production costs hours.
|
|
32
|
-
Move checks upstream — static analysis before tests, tests before staging,
|
|
33
|
-
staging before production.
|
|
34
|
-
|
|
35
|
-
**Faster is Safer:** Smaller batches and more frequent releases reduce risk, not
|
|
36
|
-
increase it. A deployment with 3 changes is easier to debug than one with 30.
|
|
37
|
-
Frequent releases build confidence in the release process itself.
|
|
38
|
-
|
|
39
|
-
## When to Use
|
|
40
|
-
|
|
41
|
-
- Setting up a new project's CI pipeline
|
|
42
|
-
- Adding or modifying automated checks
|
|
43
|
-
- Configuring deployment pipelines
|
|
44
|
-
- When a change should trigger automated verification
|
|
45
|
-
- Debugging CI failures
|
|
46
|
-
|
|
47
|
-
## The Quality Gate Pipeline
|
|
48
|
-
|
|
49
|
-
Every change goes through these gates before merge:
|
|
50
|
-
|
|
51
|
-
```text
|
|
52
|
-
Pull Request Opened
|
|
53
|
-
│
|
|
54
|
-
▼
|
|
55
|
-
┌─────────────────┐
|
|
56
|
-
│ LINT CHECK │ eslint, prettier
|
|
57
|
-
│ ↓ pass │
|
|
58
|
-
│ TYPE CHECK │ tsc --noEmit
|
|
59
|
-
│ ↓ pass │
|
|
60
|
-
│ UNIT TESTS │ jest/vitest
|
|
61
|
-
│ ↓ pass │
|
|
62
|
-
│ BUILD │ npm run build
|
|
63
|
-
│ ↓ pass │
|
|
64
|
-
│ INTEGRATION │ API/DB tests
|
|
65
|
-
│ ↓ pass │
|
|
66
|
-
│ E2E (optional) │ Playwright/Cypress
|
|
67
|
-
│ ↓ pass │
|
|
68
|
-
│ SECURITY AUDIT │ npm audit
|
|
69
|
-
│ ↓ pass │
|
|
70
|
-
│ BUNDLE SIZE │ bundlesize check
|
|
71
|
-
└─────────────────┘
|
|
72
|
-
│
|
|
73
|
-
▼
|
|
74
|
-
Ready for review
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
**No gate can be skipped.** If lint fails, fix lint — don't disable the rule. If
|
|
78
|
-
a test fails, fix the code — don't skip the test.
|
|
79
|
-
|
|
80
|
-
**Introducing a new gate that asserts on pre-existing state** (doc-drift,
|
|
81
|
-
lint-vocabulary, dependency-cycle, missing-test-coverage) has its own
|
|
82
|
-
hazard: the gate lands red because of latent findings nobody authored,
|
|
83
|
-
and every downstream PR is blocked until someone hotfixes the integration
|
|
84
|
-
branch. Before wiring such a gate into `requiredChecks`, read
|
|
85
|
-
[`core/introducing-a-baseline-gate`](../introducing-a-baseline-gate/SKILL.md) —
|
|
86
|
-
it covers the two landing shapes (advisory-first or
|
|
87
|
-
populate-the-baseline) that keep the gate green at merge.
|
|
88
|
-
|
|
89
|
-
## CI Configuration (GitHub Actions)
|
|
90
|
-
|
|
91
|
-
A representative pipeline for a Node project runs lint → type check → unit
|
|
92
|
-
tests → build → security audit on every PR and push to `main`. Add
|
|
93
|
-
integration jobs that spin up service containers (e.g. Postgres) and an E2E
|
|
94
|
-
job that installs Playwright and uploads the report on failure.
|
|
95
|
-
|
|
96
|
-
> See [`examples.md`](./examples.md) for full GitHub Actions YAML covering:
|
|
97
|
-
>
|
|
98
|
-
> - Basic CI pipeline (lint, types, tests, build, audit)
|
|
99
|
-
> - Integration tests with a Postgres service container + Prisma migrations
|
|
100
|
-
> - Playwright E2E with report artifacts
|
|
101
|
-
> - Caching and parallelism (split lint/typecheck/test into separate jobs)
|
|
102
|
-
>
|
|
103
|
-
> Use GitHub Secrets for credentials — even in CI-only test databases — to
|
|
104
|
-
> avoid normalizing hardcoded values that could leak into other contexts.
|
|
105
|
-
|
|
106
|
-
## Feeding CI Failures Back to Agents
|
|
107
|
-
|
|
108
|
-
The power of CI with AI agents is the feedback loop. When CI fails:
|
|
109
|
-
|
|
110
|
-
```text
|
|
111
|
-
CI fails
|
|
112
|
-
│
|
|
113
|
-
▼
|
|
114
|
-
Copy the failure output
|
|
115
|
-
│
|
|
116
|
-
▼
|
|
117
|
-
Feed it to the agent:
|
|
118
|
-
"The CI pipeline failed with this error:
|
|
119
|
-
[paste specific error]
|
|
120
|
-
Fix the issue and verify locally before pushing again."
|
|
121
|
-
│
|
|
122
|
-
▼
|
|
123
|
-
Agent fixes → pushes → CI runs again
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
**Key patterns:**
|
|
127
|
-
|
|
128
|
-
```text
|
|
129
|
-
Lint failure → Agent runs `npm run lint --fix` and commits
|
|
130
|
-
Type error → Agent reads the error location and fixes the type
|
|
131
|
-
Test failure → Agent follows debugging-and-error-recovery skill
|
|
132
|
-
Build error → Agent checks config and dependencies
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
## Deployment Strategies
|
|
136
|
-
|
|
137
|
-
### Preview Deployments
|
|
138
|
-
|
|
139
|
-
Every PR gets a preview deployment for manual testing — most platforms (Vercel,
|
|
140
|
-
Netlify, Cloudflare Pages) ship a one-step action you wire into the PR
|
|
141
|
-
workflow. See [`examples.md`](./examples.md) for a representative Vercel
|
|
142
|
-
preview-deploy job.
|
|
143
|
-
|
|
144
|
-
### Feature Flags
|
|
145
|
-
|
|
146
|
-
Feature flags decouple deployment from release. Deploy incomplete or risky
|
|
147
|
-
features behind flags so you can:
|
|
148
|
-
|
|
149
|
-
- **Ship code without enabling it.** Merge to main early, enable when ready.
|
|
150
|
-
- **Roll back without redeploying.** Disable the flag instead of reverting code.
|
|
151
|
-
- **Canary new features.** Enable for 1% of users, then 10%, then 100%.
|
|
152
|
-
- **Run A/B tests.** Compare behavior with and without the feature.
|
|
153
|
-
|
|
154
|
-
**Flag lifecycle:** Create → Enable for testing → Canary → Full rollout →
|
|
155
|
-
Remove the flag and dead code. Flags that live forever become technical debt —
|
|
156
|
-
set a cleanup date when you create them. See [`examples.md`](./examples.md)
|
|
157
|
-
for a minimal flag-check pattern.
|
|
158
|
-
|
|
159
|
-
### Staged Rollouts
|
|
160
|
-
|
|
161
|
-
```text
|
|
162
|
-
PR merged to main
|
|
163
|
-
│
|
|
164
|
-
▼
|
|
165
|
-
Staging deployment (auto)
|
|
166
|
-
│ Manual verification
|
|
167
|
-
▼
|
|
168
|
-
Production deployment (manual trigger or auto after staging)
|
|
169
|
-
│
|
|
170
|
-
▼
|
|
171
|
-
Monitor for errors (15-minute window)
|
|
172
|
-
│
|
|
173
|
-
├── Errors detected → Rollback
|
|
174
|
-
└── Clean → Done
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
### Rollback Plan
|
|
178
|
-
|
|
179
|
-
Every deployment should be reversible. Wire a `workflow_dispatch` job that
|
|
180
|
-
takes a target version as input and re-deploys it; see
|
|
181
|
-
[`examples.md`](./examples.md) for a representative manual-rollback workflow.
|
|
182
|
-
|
|
183
|
-
## Environment Management
|
|
184
|
-
|
|
185
|
-
```text
|
|
186
|
-
.env.example → Committed (template for developers)
|
|
187
|
-
.env → NOT committed (local development)
|
|
188
|
-
.env.test → Committed (test environment, no real secrets)
|
|
189
|
-
CI secrets → Stored in GitHub Secrets / vault
|
|
190
|
-
Production secrets → Stored in deployment platform / vault
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
CI should never have production secrets. Use separate secrets for CI testing.
|
|
194
|
-
|
|
195
|
-
## Automation Beyond CI
|
|
196
|
-
|
|
197
|
-
### Dependabot / Renovate
|
|
198
|
-
|
|
199
|
-
Schedule dependency updates so they show up as PRs you can triage in batches
|
|
200
|
-
rather than chasing security advisories ad hoc. A minimal `dependabot.yml` is
|
|
201
|
-
in [`examples.md`](./examples.md); Renovate's config covers the same shape
|
|
202
|
-
with more knobs.
|
|
203
|
-
|
|
204
|
-
### Build Cop Role
|
|
205
|
-
|
|
206
|
-
Designate someone responsible for keeping CI green. When the build breaks, the
|
|
207
|
-
Build Cop's job is to fix or revert — not the person whose change caused the
|
|
208
|
-
break. This prevents broken builds from accumulating while everyone assumes
|
|
209
|
-
someone else will fix it.
|
|
210
|
-
|
|
211
|
-
### PR Checks
|
|
212
|
-
|
|
213
|
-
- **Required reviews:** At least 1 approval before merge
|
|
214
|
-
- **Required status checks:** CI must pass before merge
|
|
215
|
-
- **Branch protection:** No force-pushes to main
|
|
216
|
-
- **Auto-merge:** If all checks pass and approved, merge automatically
|
|
217
|
-
|
|
218
|
-
## CI Optimization
|
|
219
|
-
|
|
220
|
-
When the pipeline exceeds 10 minutes, apply these strategies in order of impact:
|
|
221
|
-
|
|
222
|
-
```text
|
|
223
|
-
Slow CI pipeline?
|
|
224
|
-
├── Cache dependencies
|
|
225
|
-
│ └── Use actions/cache or setup-node cache option for node_modules
|
|
226
|
-
├── Run jobs in parallel
|
|
227
|
-
│ └── Split lint, typecheck, test, build into separate parallel jobs
|
|
228
|
-
├── Only run what changed
|
|
229
|
-
│ └── Use path filters to skip unrelated jobs (e.g., skip e2e for docs-only PRs)
|
|
230
|
-
├── Use matrix builds
|
|
231
|
-
│ └── Shard test suites across multiple runners
|
|
232
|
-
├── Optimize the test suite
|
|
233
|
-
│ └── Remove slow tests from the critical path, run them on a schedule instead
|
|
234
|
-
└── Use larger runners
|
|
235
|
-
└── GitHub-hosted larger runners or self-hosted for CPU-heavy builds
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
### Example: Caching and Parallelism
|
|
239
|
-
|
|
240
|
-
Split lint, typecheck, and test into separate jobs that each restore the npm
|
|
241
|
-
cache via `actions/setup-node`'s `cache: 'npm'` option. See
|
|
242
|
-
[`examples.md`](./examples.md) for a parallel three-job layout.
|
|
243
|
-
|
|
244
|
-
## Common Rationalizations
|
|
245
|
-
|
|
246
|
-
| Rationalization | Reality |
|
|
247
|
-
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
|
248
|
-
| "CI is too slow" | Optimize the pipeline (see CI Optimization below), don't skip it. A 5-minute pipeline prevents hours of debugging. |
|
|
249
|
-
| "This change is trivial, skip CI" | Trivial changes break builds. CI is fast for trivial changes anyway. |
|
|
250
|
-
| "The test is flaky, just re-run" | Flaky tests mask real bugs and waste everyone's time. Fix the flakiness. |
|
|
251
|
-
| "We'll add CI later" | Projects without CI accumulate broken states. Set it up on day one. |
|
|
252
|
-
| "Manual testing is enough" | Manual testing doesn't scale and isn't repeatable. Automate what you can. |
|
|
253
|
-
|
|
254
|
-
## Red Flags
|
|
255
|
-
|
|
256
|
-
- No CI pipeline in the project
|
|
257
|
-
- CI failures ignored or silenced
|
|
258
|
-
- Tests disabled in CI to make the pipeline pass
|
|
259
|
-
- Production deploys without staging verification
|
|
260
|
-
- No rollback mechanism
|
|
261
|
-
- Secrets stored in code or CI config files (not secrets manager)
|
|
262
|
-
- Long CI times with no optimization effort
|
|
263
|
-
|
|
264
|
-
## Verification
|
|
265
|
-
|
|
266
|
-
After setting up or modifying CI:
|
|
267
|
-
|
|
268
|
-
- [ ] All quality gates are present (lint, types, tests, build, audit)
|
|
269
|
-
- [ ] Pipeline runs on every PR and push to main
|
|
270
|
-
- [ ] Failures block merge (branch protection configured)
|
|
271
|
-
- [ ] CI results feed back into the development loop
|
|
272
|
-
- [ ] Secrets are stored in the secrets manager, not in code
|
|
273
|
-
- [ ] Deployment has a rollback mechanism
|
|
274
|
-
- [ ] Pipeline runs in under 10 minutes for the test suite
|
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
# CI/CD and Automation — Examples
|
|
2
|
-
|
|
3
|
-
Long stack-specific snippets extracted from `SKILL.md` so the skill stays
|
|
4
|
-
focused on policy and routing. The samples below assume GitHub Actions plus
|
|
5
|
-
Node 22 / npm; adapt to your project's runner, package manager, and language.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## GitHub Actions: Basic CI Pipeline
|
|
10
|
-
|
|
11
|
-
```yaml
|
|
12
|
-
# .github/workflows/ci.yml
|
|
13
|
-
name: CI
|
|
14
|
-
|
|
15
|
-
on:
|
|
16
|
-
pull_request:
|
|
17
|
-
branches: [main]
|
|
18
|
-
push:
|
|
19
|
-
branches: [main]
|
|
20
|
-
|
|
21
|
-
jobs:
|
|
22
|
-
quality:
|
|
23
|
-
runs-on: ubuntu-latest
|
|
24
|
-
steps:
|
|
25
|
-
- uses: actions/checkout@v4
|
|
26
|
-
|
|
27
|
-
- uses: actions/setup-node@v4
|
|
28
|
-
with:
|
|
29
|
-
node-version: '22'
|
|
30
|
-
cache: 'npm'
|
|
31
|
-
|
|
32
|
-
- name: Install dependencies
|
|
33
|
-
run: npm ci
|
|
34
|
-
|
|
35
|
-
- name: Lint
|
|
36
|
-
run: npm run lint
|
|
37
|
-
|
|
38
|
-
- name: Type check
|
|
39
|
-
run: npx tsc --noEmit
|
|
40
|
-
|
|
41
|
-
- name: Test
|
|
42
|
-
run: npm test -- --coverage
|
|
43
|
-
|
|
44
|
-
- name: Build
|
|
45
|
-
run: npm run build
|
|
46
|
-
|
|
47
|
-
- name: Security audit
|
|
48
|
-
run: npm audit --audit-level=high
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## GitHub Actions: With Database Integration Tests
|
|
52
|
-
|
|
53
|
-
```yaml
|
|
54
|
-
integration:
|
|
55
|
-
runs-on: ubuntu-latest
|
|
56
|
-
services:
|
|
57
|
-
postgres:
|
|
58
|
-
image: postgres:16
|
|
59
|
-
env:
|
|
60
|
-
POSTGRES_DB: testdb
|
|
61
|
-
POSTGRES_USER: ci_user
|
|
62
|
-
POSTGRES_PASSWORD: ${{ secrets.CI_DB_PASSWORD }}
|
|
63
|
-
ports:
|
|
64
|
-
- 5432:5432
|
|
65
|
-
options: >-
|
|
66
|
-
--health-cmd pg_isready --health-interval 10s --health-timeout 5s
|
|
67
|
-
--health-retries 5
|
|
68
|
-
|
|
69
|
-
steps:
|
|
70
|
-
- uses: actions/checkout@v4
|
|
71
|
-
- uses: actions/setup-node@v4
|
|
72
|
-
with:
|
|
73
|
-
node-version: '22'
|
|
74
|
-
cache: 'npm'
|
|
75
|
-
- run: npm ci
|
|
76
|
-
- name: Run migrations
|
|
77
|
-
run: npx prisma migrate deploy
|
|
78
|
-
env:
|
|
79
|
-
DATABASE_URL:
|
|
80
|
-
postgresql://ci_user:${{ secrets.CI_DB_PASSWORD
|
|
81
|
-
}}@localhost:5432/testdb
|
|
82
|
-
- name: Integration tests
|
|
83
|
-
run: npm run test:integration
|
|
84
|
-
env:
|
|
85
|
-
DATABASE_URL:
|
|
86
|
-
postgresql://ci_user:${{ secrets.CI_DB_PASSWORD
|
|
87
|
-
}}@localhost:5432/testdb
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
> **Note:** Even for CI-only test databases, use GitHub Secrets for credentials
|
|
91
|
-
> rather than hardcoding values. This builds good habits and prevents accidental
|
|
92
|
-
> reuse of test credentials in other contexts.
|
|
93
|
-
|
|
94
|
-
## GitHub Actions: E2E Tests
|
|
95
|
-
|
|
96
|
-
```yaml
|
|
97
|
-
e2e:
|
|
98
|
-
runs-on: ubuntu-latest
|
|
99
|
-
steps:
|
|
100
|
-
- uses: actions/checkout@v4
|
|
101
|
-
- uses: actions/setup-node@v4
|
|
102
|
-
with:
|
|
103
|
-
node-version: '22'
|
|
104
|
-
cache: 'npm'
|
|
105
|
-
- run: npm ci
|
|
106
|
-
- name: Install Playwright
|
|
107
|
-
run: npx playwright install --with-deps chromium
|
|
108
|
-
- name: Build
|
|
109
|
-
run: npm run build
|
|
110
|
-
- name: Run E2E tests
|
|
111
|
-
run: npx playwright test
|
|
112
|
-
- uses: actions/upload-artifact@v4
|
|
113
|
-
if: failure()
|
|
114
|
-
with:
|
|
115
|
-
name: playwright-report
|
|
116
|
-
path: playwright-report/
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## Deployment: Preview on PR
|
|
120
|
-
|
|
121
|
-
```yaml
|
|
122
|
-
# Deploy preview on PR (Vercel/Netlify/etc.)
|
|
123
|
-
deploy-preview:
|
|
124
|
-
runs-on: ubuntu-latest
|
|
125
|
-
if: github.event_name == 'pull_request'
|
|
126
|
-
steps:
|
|
127
|
-
- uses: actions/checkout@v4
|
|
128
|
-
- name: Deploy preview
|
|
129
|
-
run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
## Deployment: Manual Rollback Workflow
|
|
133
|
-
|
|
134
|
-
```yaml
|
|
135
|
-
# Manual rollback workflow
|
|
136
|
-
name: Rollback
|
|
137
|
-
on:
|
|
138
|
-
workflow_dispatch:
|
|
139
|
-
inputs:
|
|
140
|
-
version:
|
|
141
|
-
description: 'Version to rollback to'
|
|
142
|
-
required: true
|
|
143
|
-
|
|
144
|
-
jobs:
|
|
145
|
-
rollback:
|
|
146
|
-
runs-on: ubuntu-latest
|
|
147
|
-
steps:
|
|
148
|
-
- name: Rollback deployment
|
|
149
|
-
run: |
|
|
150
|
-
# Deploy the specified previous version
|
|
151
|
-
npx vercel rollback ${{ inputs.version }}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## Caching and Parallelism
|
|
155
|
-
|
|
156
|
-
```yaml
|
|
157
|
-
jobs:
|
|
158
|
-
lint:
|
|
159
|
-
runs-on: ubuntu-latest
|
|
160
|
-
steps:
|
|
161
|
-
- uses: actions/checkout@v4
|
|
162
|
-
- uses: actions/setup-node@v4
|
|
163
|
-
with: { node-version: '22', cache: 'npm' }
|
|
164
|
-
- run: npm ci
|
|
165
|
-
- run: npm run lint
|
|
166
|
-
|
|
167
|
-
typecheck:
|
|
168
|
-
runs-on: ubuntu-latest
|
|
169
|
-
steps:
|
|
170
|
-
- uses: actions/checkout@v4
|
|
171
|
-
- uses: actions/setup-node@v4
|
|
172
|
-
with: { node-version: '22', cache: 'npm' }
|
|
173
|
-
- run: npm ci
|
|
174
|
-
- run: npx tsc --noEmit
|
|
175
|
-
|
|
176
|
-
test:
|
|
177
|
-
runs-on: ubuntu-latest
|
|
178
|
-
steps:
|
|
179
|
-
- uses: actions/checkout@v4
|
|
180
|
-
- uses: actions/setup-node@v4
|
|
181
|
-
with: { node-version: '22', cache: 'npm' }
|
|
182
|
-
- run: npm ci
|
|
183
|
-
- run: npm test -- --coverage
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
## Dependency Updates: Dependabot
|
|
187
|
-
|
|
188
|
-
```yaml
|
|
189
|
-
# .github/dependabot.yml
|
|
190
|
-
version: 2
|
|
191
|
-
updates:
|
|
192
|
-
- package-ecosystem: npm
|
|
193
|
-
directory: /
|
|
194
|
-
schedule:
|
|
195
|
-
interval: weekly
|
|
196
|
-
open-pull-requests-limit: 5
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
## Feature Flag Pattern
|
|
200
|
-
|
|
201
|
-
```typescript
|
|
202
|
-
// Simple feature flag pattern
|
|
203
|
-
if (featureFlags.isEnabled('new-checkout-flow', { userId })) {
|
|
204
|
-
return renderNewCheckout();
|
|
205
|
-
}
|
|
206
|
-
return renderLegacyCheckout();
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
**Flag lifecycle:** Create → Enable for testing → Canary → Full rollout →
|
|
210
|
-
Remove the flag and dead code. Flags that live forever become technical debt —
|
|
211
|
-
set a cleanup date when you create them.
|