mandrel 1.94.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +116 -99
- package/.agents/agents/acceptance-critic.md +9 -7
- package/.agents/agents/story-worker.md +45 -51
- package/.agents/audit-checklists/performance.md +1 -1
- package/.agents/docs/SDLC.md +498 -1287
- package/.agents/docs/agentrc-reference.json +185 -80
- package/.agents/docs/configuration.md +132 -190
- package/.agents/docs/execution-reference.md +51 -25
- package/.agents/docs/quality-gates.md +25 -33
- package/.agents/docs/workflows.md +8 -8
- package/.agents/instructions.md +113 -139
- package/.agents/rules/ci-remediation.md +11 -15
- package/.agents/rules/git-conventions-reference.md +48 -58
- package/.agents/rules/git-conventions.md +16 -22
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +83 -254
- package/.agents/schemas/audit-rules.json +59 -1
- package/.agents/schemas/audit-rules.schema.json +33 -1
- package/.agents/schemas/lifecycle/README.md +1 -2
- package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
- package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
- package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
- package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
- package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
- package/.agents/schemas/signal-event.schema.json +3 -3
- package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
- package/.agents/schemas/validation-evidence.schema.json +1 -1
- package/.agents/scripts/acceptance-eval.js +22 -66
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/audit-to-stories.js +7 -7
- package/.agents/scripts/boot-sweep.js +1 -1
- package/.agents/scripts/bootstrap.js +3 -3
- package/.agents/scripts/check-dead-exports.js +43 -104
- package/.agents/scripts/check-doc-links.js +2 -2
- package/.agents/scripts/check-lifecycle-lint.js +7 -10
- package/.agents/scripts/check-workflow-cli-lint.js +91 -0
- package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
- package/.agents/scripts/deliver-recover.js +122 -0
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +20 -50
- package/.agents/scripts/generate-skills-index.js +17 -1
- package/.agents/scripts/generate-workflows-doc.js +4 -4
- package/.agents/scripts/lib/ITicketingProvider.js +1 -19
- 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 +328 -28
- 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 -15
- package/.agents/scripts/lib/baselines/reader.js +1 -6
- package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
- package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
- package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
- package/.agents/scripts/lib/checks/index.js +3 -2
- package/.agents/scripts/lib/checks/loop-health.js +12 -11
- package/.agents/scripts/lib/checks/state.js +17 -248
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
- package/.agents/scripts/lib/cli/standard-args.js +13 -22
- package/.agents/scripts/lib/cli-args.js +39 -9
- package/.agents/scripts/lib/close-validation/gates.js +15 -15
- package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
- package/.agents/scripts/lib/close-validation/runner.js +13 -21
- package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
- package/.agents/scripts/lib/config/ci.js +6 -31
- package/.agents/scripts/lib/config/delivery-routing.js +52 -35
- package/.agents/scripts/lib/config/explain.js +61 -48
- package/.agents/scripts/lib/config/github.js +7 -5
- package/.agents/scripts/lib/config/limits.js +29 -80
- package/.agents/scripts/lib/config/paths.js +0 -2
- package/.agents/scripts/lib/config/quality.js +12 -15
- package/.agents/scripts/lib/config/runners.js +20 -66
- package/.agents/scripts/lib/config/temp-paths.js +30 -63
- package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
- package/.agents/scripts/lib/config-resolver.js +2 -7
- package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
- package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
- package/.agents/scripts/lib/config-settings-schema.js +100 -60
- package/.agents/scripts/lib/dead-exports-knip.js +105 -0
- package/.agents/scripts/lib/dead-exports-mode.js +51 -0
- package/.agents/scripts/lib/dependency-parser.js +3 -2
- package/.agents/scripts/lib/doc-tiers.js +2 -2
- package/.agents/scripts/lib/duplicate-search.js +242 -41
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
- package/.agents/scripts/lib/findings/promote-finding.js +23 -14
- package/.agents/scripts/lib/format-generated-json.js +97 -0
- package/.agents/scripts/lib/framework-version.js +19 -190
- package/.agents/scripts/lib/gh-exec.js +8 -0
- package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
- package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
- package/.agents/scripts/lib/git-utils.js +32 -20
- package/.agents/scripts/lib/github/framework-repo.js +6 -0
- package/.agents/scripts/lib/json-utils.js +1 -2
- package/.agents/scripts/lib/label-constants.js +10 -38
- package/.agents/scripts/lib/label-taxonomy.js +10 -55
- package/.agents/scripts/lib/observability/active-story-env.js +44 -165
- package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
- package/.agents/scripts/lib/observability/signal-validator.js +4 -4
- package/.agents/scripts/lib/observability/signals-writer.js +6 -82
- package/.agents/scripts/lib/observability/source-classifier.js +5 -5
- package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
- package/.agents/scripts/lib/onboard/init-tail.js +1 -3
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
- package/.agents/scripts/lib/orchestration/code-review.js +78 -436
- package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
- package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
- package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
- package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
- 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/git-cleanup/phases/fast-forward.js +34 -0
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
- package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
- package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
- package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
- package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
- package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
- 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 +52 -51
- package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
- package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
- package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
- package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
- package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
- package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
- package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
- package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
- package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
- 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/format-autofix.js +10 -10
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
- package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
- package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
- package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
- package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
- package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
- package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
- package/.agents/scripts/lib/planning-corpus.js +12 -281
- package/.agents/scripts/lib/preflight-runner.js +4 -4
- package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
- package/.agents/scripts/lib/signals/index.js +4 -17
- package/.agents/scripts/lib/signals/read.js +35 -35
- package/.agents/scripts/lib/signals/schema.js +8 -11
- package/.agents/scripts/lib/signals/span-tree.js +7 -7
- package/.agents/scripts/lib/signals/write.js +0 -1
- package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
- package/.agents/scripts/lib/skills/parse-skill.js +16 -3
- package/.agents/scripts/lib/story-adjacency.js +17 -19
- package/.agents/scripts/lib/story-body/story-body.js +130 -75
- package/.agents/scripts/lib/story-plan.js +2 -4
- package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
- package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
- package/.agents/scripts/lib/test-env.js +14 -1
- package/.agents/scripts/lib/test-tiers.js +0 -3
- package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
- package/.agents/scripts/lib/validation-evidence.js +32 -60
- package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
- package/.agents/scripts/lib/workspace-provisioner.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
- 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 +102 -80
- package/.agents/scripts/plan-persist.js +230 -279
- package/.agents/scripts/plan-run-epilogue.js +142 -0
- package/.agents/scripts/post-structured-comment.js +0 -38
- package/.agents/scripts/pr-watch-with-update.js +43 -22
- package/.agents/scripts/providers/github/compose.js +0 -1
- package/.agents/scripts/providers/github/errors.js +0 -19
- package/.agents/scripts/providers/github/issues.js +13 -39
- package/.agents/scripts/providers/github/mappers.js +5 -12
- package/.agents/scripts/providers/github/sub-issues.js +0 -47
- package/.agents/scripts/providers/github/tickets.js +33 -156
- package/.agents/scripts/providers/github.js +17 -6
- package/.agents/scripts/resolve-stories.js +236 -0
- package/.agents/scripts/run-coverage.js +4 -1
- package/.agents/scripts/run-lint.js +2 -2
- package/.agents/scripts/run-verify.js +31 -2
- package/.agents/scripts/signals-view.js +25 -21
- package/.agents/scripts/single-story-close.js +178 -26
- package/.agents/scripts/single-story-confirm-merge.js +313 -24
- package/.agents/scripts/single-story-init.js +35 -30
- package/.agents/scripts/stories-wave-tick.js +85 -10
- package/.agents/scripts/story-plan.js +28 -49
- package/.agents/scripts/update-ticket-state.js +14 -65
- package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
- package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
- package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
- package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
- package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
- package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
- package/.agents/skills/core/scope-triage/SKILL.md +31 -172
- package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
- package/.agents/skills/core/security-and-hardening/reference.md +375 -0
- package/.agents/skills/skills.index.json +3 -53
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
- package/.agents/starter-agentrc.json +0 -5
- package/.agents/templates/agent-protocol.md +9 -10
- package/.agents/workflows/audit-architecture.md +6 -7
- package/.agents/workflows/audit-clean-code.md +7 -7
- package/.agents/workflows/audit-dependencies.md +3 -3
- package/.agents/workflows/audit-devops.md +3 -3
- package/.agents/workflows/audit-documentation.md +9 -10
- package/.agents/workflows/audit-lighthouse.md +11 -3
- package/.agents/workflows/audit-navigability.md +13 -2
- package/.agents/workflows/audit-performance.md +5 -6
- package/.agents/workflows/audit-privacy.md +3 -3
- package/.agents/workflows/audit-quality.md +11 -12
- package/.agents/workflows/audit-security.md +4 -5
- package/.agents/workflows/audit-seo.md +13 -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 +10 -3
- package/.agents/workflows/deliver.md +177 -176
- package/.agents/workflows/git-cleanup.md +5 -6
- package/.agents/workflows/git-deliver.md +1 -1
- package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
- package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
- package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
- package/.agents/workflows/helpers/code-review.md +75 -196
- package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
- package/.agents/workflows/helpers/deliver-story.md +606 -0
- package/.agents/workflows/helpers/diagnose.md +10 -10
- package/.agents/workflows/helpers/parallel-tooling.md +3 -3
- package/.agents/workflows/helpers/signals.md +16 -16
- package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
- package/.agents/workflows/mandrel-update.md +2 -1
- package/.agents/workflows/plan.md +277 -145
- package/.agents/workflows/qa-assist.md +27 -33
- package/.agents/workflows/qa-explore.md +29 -38
- package/.agents/workflows/qa-run.md +2 -6
- package/README.md +9 -8
- package/bin/mandrel.js +12 -1
- package/docs/CHANGELOG.md +70 -0
- package/lib/cli/registry.js +262 -19
- package/lib/cli/sync-agents.js +157 -0
- package/lib/cli/sync-commands.js +115 -6
- package/lib/cli/sync.js +168 -6
- package/lib/cli/update.js +105 -8
- package/lib/cli/version-helpers.js +131 -0
- package/lib/migrations/README.md +7 -5
- package/lib/migrations/index.js +12 -8
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
- package/package.json +2 -2
- package/.agents/agents/retro.md +0 -42
- package/.agents/personas/architect.md +0 -113
- package/.agents/personas/devops-engineer.md +0 -38
- package/.agents/personas/engineer.md +0 -33
- package/.agents/personas/project-manager.md +0 -114
- package/.agents/personas/qa-engineer.md +0 -95
- package/.agents/personas/security-engineer.md +0 -111
- package/.agents/personas/technical-writer.md +0 -101
- package/.agents/schemas/dispatch-manifest.json +0 -232
- package/.agents/schemas/epic-perf-report.schema.json +0 -89
- package/.agents/schemas/epic-spec.schema.json +0 -153
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
- package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
- package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
- package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
- package/.agents/schemas/risk-verdict.schema.json +0 -66
- package/.agents/schemas/story-perf-summary.schema.json +0 -73
- package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
- package/.agents/scripts/analyze-execution.js +0 -444
- package/.agents/scripts/bookkeeping-reconcile.js +0 -117
- package/.agents/scripts/check-prepush-recovery.js +0 -90
- 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 -852
- package/.agents/scripts/epic-execute-record-wave.js +0 -449
- package/.agents/scripts/epic-plan-clarity.js +0 -211
- package/.agents/scripts/epic-plan-healthcheck.js +0 -581
- 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/git-merge-orchestrator.js +0 -261
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
- package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
- package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
- package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
- package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
- package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
- 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/risk-verdict.js +0 -105
- 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 -621
- 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/story-run-progress-writer.js +0 -400
- 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/error-journal.js +0 -139
- 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-slice-lifecycle.js +0 -270
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
- 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 -284
- 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/merge-watcher.js +0 -665
- 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/plan-review-routing.js +0 -63
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
- package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
- package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
- 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-perf-heuristics.js +0 -275
- package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
- 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 -302
- 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/retro-run.js +0 -218
- package/.agents/scripts/slice-phase.js +0 -361
- 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 -464
- package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
- 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 -383
- package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
- package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
- package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
- package/.agents/workflows/helpers/deliver-epic.md +0 -998
- package/.agents/workflows/helpers/deliver-stories.md +0 -450
- package/.agents/workflows/helpers/epic-audit.md +0 -189
- package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
- 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 -353
- package/.agents/workflows/helpers/plan-story.md +0 -251
- package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
- package/.agents/workflows/helpers/single-story-deliver.md +0 -557
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
# Security and Hardening — Reference (on-demand)
|
|
2
|
+
|
|
3
|
+
**Read this when** a task engages one of the sections below and the Policy
|
|
4
|
+
Capsule in [`SKILL.md`](SKILL.md) does not settle it on its own. The capsule
|
|
5
|
+
is the contract; this file is the reference material behind it. Nothing here
|
|
6
|
+
relaxes a capsule MUST, and nothing here is required reading merely because
|
|
7
|
+
the skill is active.
|
|
8
|
+
|
|
9
|
+
## When to Use
|
|
10
|
+
|
|
11
|
+
- Building anything that accepts user input
|
|
12
|
+
- Implementing authentication or authorization
|
|
13
|
+
- Storing or transmitting sensitive data
|
|
14
|
+
- Integrating with external APIs or services
|
|
15
|
+
- Adding file uploads, webhooks, or callbacks
|
|
16
|
+
- Handling payment or PII data
|
|
17
|
+
|
|
18
|
+
## Security Surfacing, Not Runtime Pause
|
|
19
|
+
|
|
20
|
+
Some changes are not unsafe by themselves but expand the security surface
|
|
21
|
+
enough that the change must be **explicitly documented** in the PR
|
|
22
|
+
description and on the originating ticket so a reviewer can sign off in
|
|
23
|
+
band. Documenting them is the gate — they do **not** pause execution:
|
|
24
|
+
|
|
25
|
+
- Adding new authentication flows or changing auth logic
|
|
26
|
+
- Storing new categories of sensitive data (PII, payment info)
|
|
27
|
+
- Adding new external service integrations
|
|
28
|
+
- Changing CORS configuration
|
|
29
|
+
- Adding file upload handlers
|
|
30
|
+
- Modifying rate limiting or throttling
|
|
31
|
+
- Granting elevated permissions or roles
|
|
32
|
+
|
|
33
|
+
For each item that applies, call it out under a "Security surface" section
|
|
34
|
+
in the PR body and on the parent ticket, label the change `risk::high`,
|
|
35
|
+
and link the relevant `security-baseline.md` MUST. Reviewers gate the
|
|
36
|
+
merge; the agent keeps moving.
|
|
37
|
+
|
|
38
|
+
`agent::blocked` remains the **only** runtime pause label. Use it for
|
|
39
|
+
unrecoverable blockers (missing prerequisite, ambiguous spec a sub-agent
|
|
40
|
+
cannot resolve), not for "this change is sensitive." Sensitive changes
|
|
41
|
+
ship through the documentation path above.
|
|
42
|
+
|
|
43
|
+
## OWASP Top 10 Prevention Patterns
|
|
44
|
+
|
|
45
|
+
The patterns below show **how** to satisfy the MUSTs in
|
|
46
|
+
[`security-baseline.md`](../../../rules/security-baseline.md). The MUSTs
|
|
47
|
+
themselves (parameterize queries, hash passwords, encode output, verify
|
|
48
|
+
ownership, set headers, restrict CORS, exclude sensitive fields) are listed
|
|
49
|
+
in the rule.
|
|
50
|
+
|
|
51
|
+
### 1. Injection (SQL, NoSQL, OS Command)
|
|
52
|
+
|
|
53
|
+
See [security-baseline § Output & Rendering](../../../rules/security-baseline.md#output--rendering).
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// BAD: SQL injection via string concatenation
|
|
57
|
+
const query = `SELECT * FROM users WHERE id = '${userId}'`;
|
|
58
|
+
|
|
59
|
+
// GOOD: Parameterized query
|
|
60
|
+
const user = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
|
|
61
|
+
|
|
62
|
+
// GOOD: ORM with parameterized input
|
|
63
|
+
const user = await prisma.user.findUnique({ where: { id: userId } });
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 2. Broken Authentication
|
|
67
|
+
|
|
68
|
+
See [security-baseline § Authentication](../../../rules/security-baseline.md#authentication).
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
import { hash, compare } from 'bcrypt';
|
|
72
|
+
|
|
73
|
+
const SALT_ROUNDS = 12;
|
|
74
|
+
const hashedPassword = await hash(plaintext, SALT_ROUNDS);
|
|
75
|
+
const isValid = await compare(plaintext, hashedPassword);
|
|
76
|
+
|
|
77
|
+
// Session management
|
|
78
|
+
app.use(
|
|
79
|
+
session({
|
|
80
|
+
secret: process.env.SESSION_SECRET, // From environment, not code
|
|
81
|
+
resave: false,
|
|
82
|
+
saveUninitialized: false,
|
|
83
|
+
cookie: {
|
|
84
|
+
httpOnly: true,
|
|
85
|
+
secure: true,
|
|
86
|
+
sameSite: 'lax',
|
|
87
|
+
maxAge: 24 * 60 * 60 * 1000,
|
|
88
|
+
},
|
|
89
|
+
}),
|
|
90
|
+
);
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 3. Cross-Site Scripting (XSS)
|
|
94
|
+
|
|
95
|
+
See [security-baseline § Output & Rendering](../../../rules/security-baseline.md#output--rendering).
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// BAD: Rendering user input as HTML
|
|
99
|
+
element.innerHTML = userInput;
|
|
100
|
+
|
|
101
|
+
// GOOD: Use framework auto-escaping (React does this by default)
|
|
102
|
+
return <div>{userInput}</div>;
|
|
103
|
+
|
|
104
|
+
// If you MUST render HTML, sanitize first
|
|
105
|
+
import DOMPurify from 'dompurify';
|
|
106
|
+
const clean = DOMPurify.sanitize(userInput);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 4. Broken Access Control
|
|
110
|
+
|
|
111
|
+
See [security-baseline § Authorization](../../../rules/security-baseline.md#authorization).
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
app.patch('/api/tasks/:id', authenticate, async (req, res) => {
|
|
115
|
+
const task = await taskService.findById(req.params.id);
|
|
116
|
+
|
|
117
|
+
if (task.ownerId !== req.user.id) {
|
|
118
|
+
return res.status(403).json({
|
|
119
|
+
error: {
|
|
120
|
+
code: 'FORBIDDEN',
|
|
121
|
+
message: 'Not authorized to modify this task',
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const updated = await taskService.update(req.params.id, req.body);
|
|
127
|
+
return res.json(updated);
|
|
128
|
+
});
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 5. Security Misconfiguration
|
|
132
|
+
|
|
133
|
+
See [security-baseline § Transport & Headers](../../../rules/security-baseline.md#transport--headers).
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import helmet from 'helmet';
|
|
137
|
+
app.use(helmet());
|
|
138
|
+
|
|
139
|
+
app.use(
|
|
140
|
+
helmet.contentSecurityPolicy({
|
|
141
|
+
directives: {
|
|
142
|
+
defaultSrc: ["'self'"],
|
|
143
|
+
scriptSrc: ["'self'"],
|
|
144
|
+
styleSrc: ["'self'", "'unsafe-inline'"],
|
|
145
|
+
imgSrc: ["'self'", 'data:', 'https:'],
|
|
146
|
+
connectSrc: ["'self'"],
|
|
147
|
+
},
|
|
148
|
+
}),
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
app.use(
|
|
152
|
+
cors({
|
|
153
|
+
origin: process.env.ALLOWED_ORIGINS?.split(',') || 'http://localhost:3000',
|
|
154
|
+
credentials: true,
|
|
155
|
+
}),
|
|
156
|
+
);
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 6. Sensitive Data Exposure
|
|
160
|
+
|
|
161
|
+
See [security-baseline § Output & Rendering](../../../rules/security-baseline.md#output--rendering)
|
|
162
|
+
and [§ Secrets Management](../../../rules/security-baseline.md#secrets-management).
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
function sanitizeUser(user: UserRecord): PublicUser {
|
|
166
|
+
const { passwordHash, resetToken, ...publicFields } = user;
|
|
167
|
+
return publicFields;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const API_KEY = process.env.STRIPE_API_KEY;
|
|
171
|
+
if (!API_KEY) throw new Error('STRIPE_API_KEY not configured');
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Input Validation Patterns
|
|
175
|
+
|
|
176
|
+
See [security-baseline § Input Validation](../../../rules/security-baseline.md#input-validation).
|
|
177
|
+
|
|
178
|
+
### Schema Validation at Boundaries
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
import { z } from 'zod';
|
|
182
|
+
|
|
183
|
+
const CreateTaskSchema = z.object({
|
|
184
|
+
title: z.string().min(1).max(200).trim(),
|
|
185
|
+
description: z.string().max(2000).optional(),
|
|
186
|
+
priority: z.enum(['low', 'medium', 'high']).default('medium'),
|
|
187
|
+
dueDate: z.string().datetime().optional(),
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
app.post('/api/tasks', async (req, res) => {
|
|
191
|
+
const result = CreateTaskSchema.safeParse(req.body);
|
|
192
|
+
if (!result.success) {
|
|
193
|
+
return res.status(422).json({
|
|
194
|
+
error: {
|
|
195
|
+
code: 'VALIDATION_ERROR',
|
|
196
|
+
message: 'Invalid input',
|
|
197
|
+
details: result.error.flatten(),
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
const task = await taskService.create(result.data);
|
|
202
|
+
return res.status(201).json(task);
|
|
203
|
+
});
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### File Upload Safety
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
const ALLOWED_TYPES = ['image/jpeg', 'image/png', 'image/webp'];
|
|
210
|
+
const MAX_SIZE = 5 * 1024 * 1024; // 5MB
|
|
211
|
+
|
|
212
|
+
function validateUpload(file: UploadedFile) {
|
|
213
|
+
if (!ALLOWED_TYPES.includes(file.mimetype)) {
|
|
214
|
+
throw new ValidationError('File type not allowed');
|
|
215
|
+
}
|
|
216
|
+
if (file.size > MAX_SIZE) {
|
|
217
|
+
throw new ValidationError('File too large (max 5MB)');
|
|
218
|
+
}
|
|
219
|
+
// Don't trust the file extension — check magic bytes if critical
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## Triaging npm audit Results
|
|
224
|
+
|
|
225
|
+
The MUST is in [security-baseline § Dependency Hygiene](../../../rules/security-baseline.md#dependency-hygiene).
|
|
226
|
+
This decision tree shows how to prioritize:
|
|
227
|
+
|
|
228
|
+
```text
|
|
229
|
+
npm audit reports a vulnerability
|
|
230
|
+
├── Severity: critical or high
|
|
231
|
+
│ ├── Is the vulnerable code reachable in your app?
|
|
232
|
+
│ │ ├── YES --> Fix immediately (update, patch, or replace the dependency)
|
|
233
|
+
│ │ └── NO (dev-only dep, unused code path) --> Fix soon, but not a blocker
|
|
234
|
+
│ └── Is a fix available?
|
|
235
|
+
│ ├── YES --> Update to the patched version
|
|
236
|
+
│ └── NO --> Check for workarounds, consider replacing the dependency, or add to allowlist with a review date
|
|
237
|
+
├── Severity: moderate
|
|
238
|
+
│ ├── Reachable in production? --> Fix in the next release cycle
|
|
239
|
+
│ └── Dev-only? --> Fix when convenient, track in backlog
|
|
240
|
+
└── Severity: low
|
|
241
|
+
└── Track and fix during regular dependency updates
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Key questions:**
|
|
245
|
+
|
|
246
|
+
- Is the vulnerable function actually called in your code path?
|
|
247
|
+
- Is the dependency a runtime dependency or dev-only?
|
|
248
|
+
- Is the vulnerability exploitable given your deployment context (e.g., a
|
|
249
|
+
server-side vulnerability in a client-only app)?
|
|
250
|
+
|
|
251
|
+
When you defer a fix, document the reason and set a review date.
|
|
252
|
+
|
|
253
|
+
## Rate Limiting
|
|
254
|
+
|
|
255
|
+
```typescript
|
|
256
|
+
import rateLimit from 'express-rate-limit';
|
|
257
|
+
|
|
258
|
+
// General API rate limit
|
|
259
|
+
app.use(
|
|
260
|
+
'/api/',
|
|
261
|
+
rateLimit({
|
|
262
|
+
windowMs: 15 * 60 * 1000,
|
|
263
|
+
max: 100,
|
|
264
|
+
standardHeaders: true,
|
|
265
|
+
legacyHeaders: false,
|
|
266
|
+
}),
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
// Stricter limit for auth endpoints (the rule MUSTs rate-limiting on auth)
|
|
270
|
+
app.use(
|
|
271
|
+
'/api/auth/',
|
|
272
|
+
rateLimit({
|
|
273
|
+
windowMs: 15 * 60 * 1000,
|
|
274
|
+
max: 10,
|
|
275
|
+
}),
|
|
276
|
+
);
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## Secrets Management Layout
|
|
280
|
+
|
|
281
|
+
See [security-baseline § Secrets Management](../../../rules/security-baseline.md#secrets-management).
|
|
282
|
+
|
|
283
|
+
```text
|
|
284
|
+
.env files:
|
|
285
|
+
├── .env.example → Committed (template with placeholder values)
|
|
286
|
+
├── .env → NOT committed (contains real secrets)
|
|
287
|
+
└── .env.local → NOT committed (local overrides)
|
|
288
|
+
|
|
289
|
+
.gitignore must include:
|
|
290
|
+
.env
|
|
291
|
+
.env.local
|
|
292
|
+
.env.*.local
|
|
293
|
+
*.pem
|
|
294
|
+
*.key
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**Always check before committing:**
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
# Check for accidentally staged secrets
|
|
301
|
+
git diff --cached | grep -i "password\|secret\|api_key\|token"
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## Security Review Checklist
|
|
305
|
+
|
|
306
|
+
Use this when reviewing your own change before requesting human review. Each
|
|
307
|
+
item maps to a section in
|
|
308
|
+
[`security-baseline.md`](../../../rules/security-baseline.md).
|
|
309
|
+
|
|
310
|
+
```markdown
|
|
311
|
+
### Authentication
|
|
312
|
+
|
|
313
|
+
- [ ] Passwords hashed with bcrypt/scrypt/argon2 (salt rounds ≥ 12)
|
|
314
|
+
- [ ] Session tokens are httpOnly, secure, sameSite
|
|
315
|
+
- [ ] Login has rate limiting
|
|
316
|
+
- [ ] Password reset tokens expire
|
|
317
|
+
|
|
318
|
+
### Authorization
|
|
319
|
+
|
|
320
|
+
- [ ] Every endpoint checks user permissions
|
|
321
|
+
- [ ] Users can only access their own resources
|
|
322
|
+
- [ ] Admin actions require admin role verification
|
|
323
|
+
|
|
324
|
+
### Input
|
|
325
|
+
|
|
326
|
+
- [ ] All user input validated at the boundary
|
|
327
|
+
- [ ] SQL queries are parameterized
|
|
328
|
+
- [ ] HTML output is encoded/escaped
|
|
329
|
+
|
|
330
|
+
### Data
|
|
331
|
+
|
|
332
|
+
- [ ] No secrets in code or version control
|
|
333
|
+
- [ ] Sensitive fields excluded from API responses
|
|
334
|
+
- [ ] PII encrypted at rest (if applicable)
|
|
335
|
+
|
|
336
|
+
### Infrastructure
|
|
337
|
+
|
|
338
|
+
- [ ] Security headers configured (CSP, HSTS, etc.)
|
|
339
|
+
- [ ] CORS restricted to known origins
|
|
340
|
+
- [ ] Dependencies audited for vulnerabilities
|
|
341
|
+
- [ ] Error messages don't expose internals
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
## Common Rationalizations
|
|
345
|
+
|
|
346
|
+
| Rationalization | Reality |
|
|
347
|
+
| --------------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
348
|
+
| "This is an internal tool, security doesn't matter" | Internal tools get compromised. Attackers target the weakest link. |
|
|
349
|
+
| "We'll add security later" | Security retrofitting is 10x harder than building it in. Add it now. |
|
|
350
|
+
| "No one would try to exploit this" | Automated scanners will find it. Security by obscurity is not security. |
|
|
351
|
+
| "The framework handles security" | Frameworks provide tools, not guarantees. You still need to use them correctly. |
|
|
352
|
+
| "It's just a prototype" | Prototypes become production. Security habits from day one. |
|
|
353
|
+
|
|
354
|
+
## Red Flags
|
|
355
|
+
|
|
356
|
+
- User input passed directly to database queries, shell commands, or HTML
|
|
357
|
+
rendering
|
|
358
|
+
- Secrets in source code or commit history
|
|
359
|
+
- API endpoints without authentication or authorization checks
|
|
360
|
+
- Missing CORS configuration or wildcard (`*`) origins
|
|
361
|
+
- No rate limiting on authentication endpoints
|
|
362
|
+
- Stack traces or internal errors exposed to users
|
|
363
|
+
- Dependencies with known critical vulnerabilities
|
|
364
|
+
|
|
365
|
+
## Verification
|
|
366
|
+
|
|
367
|
+
After implementing security-relevant code, confirm against the rule:
|
|
368
|
+
|
|
369
|
+
- [ ] `npm audit` shows no critical or high vulnerabilities
|
|
370
|
+
- [ ] No secrets in source code or git history
|
|
371
|
+
- [ ] All user input validated at system boundaries
|
|
372
|
+
- [ ] Authentication and authorization checked on every protected endpoint
|
|
373
|
+
- [ ] Security headers present in response (check with browser DevTools)
|
|
374
|
+
- [ ] Error responses don't expose internal details
|
|
375
|
+
- [ ] Rate limiting active on auth endpoints
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-07-
|
|
2
|
+
"generatedAt": "2026-07-16T20:44:41.281Z",
|
|
3
3
|
"generator": "generate-skills-index.js@1",
|
|
4
4
|
"skills": [
|
|
5
|
-
{
|
|
6
|
-
"name": "analyze-execution",
|
|
7
|
-
"tier": "core",
|
|
8
|
-
"category": "core",
|
|
9
|
-
"path": ".agents/skills/core/analyze-execution/SKILL.md",
|
|
10
|
-
"description": "Aggregate per-Story or per-Epic execution signals into a structured perf-summary or perf-report and upsert it onto the corresponding GitHub ticket. Use after a Story closes (Story mode) or as part of `/deliver` Phase 6 (Epic mode). Reads NDJSON via `lib/signals/read` and writes a single structured comment.",
|
|
11
|
-
"policyCapsuleBullets": 8,
|
|
12
|
-
"allowedTools": ["Read", "Bash"],
|
|
13
|
-
"vendor": null
|
|
14
|
-
},
|
|
15
5
|
{
|
|
16
6
|
"name": "api-and-interface-design",
|
|
17
7
|
"tier": "core",
|
|
@@ -72,46 +62,6 @@
|
|
|
72
62
|
"allowedTools": null,
|
|
73
63
|
"vendor": null
|
|
74
64
|
},
|
|
75
|
-
{
|
|
76
|
-
"name": "epic-plan-consolidate",
|
|
77
|
-
"tier": "core",
|
|
78
|
-
"category": "core",
|
|
79
|
-
"path": ".agents/skills/core/epic-plan-consolidate/SKILL.md",
|
|
80
|
-
"description": "Run a holistic, pre-persist consolidation pass over the draft Story ticket array an Epic's decompose phase produced. Use during Phase 8 of `/plan`, after `epic-plan-decompose-author` writes `temp/epic-<Epic_ID>/tickets.json` and before `plan-persist.js` validates and persists it. Reconciles the draft against the Tech Spec \"Delivery Slicing\" ceiling via scope-preserving operations only.",
|
|
81
|
-
"policyCapsuleBullets": 9,
|
|
82
|
-
"allowedTools": ["Read", "Write", "Bash"],
|
|
83
|
-
"vendor": null
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
"name": "epic-plan-decompose-author",
|
|
87
|
-
"tier": "core",
|
|
88
|
-
"category": "core",
|
|
89
|
-
"path": ".agents/skills/core/epic-plan-decompose-author/SKILL.md",
|
|
90
|
-
"description": "Author the Story ticket JSON for an Epic from the decomposer authoring context emitted by `plan-context.js --epic <Epic_ID>`. Use during Phase 8 of `/plan` when the host LLM needs to write the ticket array before `plan-persist.js` validates and persists it.",
|
|
91
|
-
"policyCapsuleBullets": 15,
|
|
92
|
-
"allowedTools": ["Read", "Write", "Bash"],
|
|
93
|
-
"vendor": null
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
"name": "epic-plan-premortem",
|
|
97
|
-
"tier": "core",
|
|
98
|
-
"category": "core",
|
|
99
|
-
"path": ".agents/skills/core/epic-plan-premortem/SKILL.md",
|
|
100
|
-
"description": "Run a fresh-context, code-reading pre-mortem critic over the draft Story ticket array an Epic's decompose phase produced. Use during Phase 8 of `/plan`, after `epic-plan-decompose-author` / `epic-plan-consolidate` write `temp/epic-<Epic_ID>/tickets.json` and before `plan-persist.js` validates and persists it. Reads the sectioned Epic body AND the cited code surfaces, then emits predicted-rework findings before any GitHub write.",
|
|
101
|
-
"policyCapsuleBullets": 7,
|
|
102
|
-
"allowedTools": ["Read", "Write", "Bash", "Grep"],
|
|
103
|
-
"vendor": null
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
"name": "epic-plan-spec-author",
|
|
107
|
-
"tier": "core",
|
|
108
|
-
"category": "core",
|
|
109
|
-
"path": ".agents/skills/core/epic-plan-spec-author/SKILL.md",
|
|
110
|
-
"description": "Author the Tech Spec, Acceptance Table markdown, and risk-verdict JSON for an Epic from the planner authoring context emitted by `plan-context.js --epic <Epic_ID>`. Use during Phase 7 of `/plan` when the host LLM needs to write the three artifacts before `plan-persist.js` folds them into the Epic body's managed sections.",
|
|
111
|
-
"policyCapsuleBullets": 14,
|
|
112
|
-
"allowedTools": ["Read", "Write", "Bash"],
|
|
113
|
-
"vendor": null
|
|
114
|
-
},
|
|
115
65
|
{
|
|
116
66
|
"name": "gates-and-baselines",
|
|
117
67
|
"tier": "core",
|
|
@@ -157,8 +107,8 @@
|
|
|
157
107
|
"tier": "core",
|
|
158
108
|
"category": "core",
|
|
159
109
|
"path": ".agents/skills/core/scope-triage/SKILL.md",
|
|
160
|
-
"description": "
|
|
161
|
-
"policyCapsuleBullets":
|
|
110
|
+
"description": "Optional split-advisory for `/plan`. Under v2 there is no epic|story routing verdict — `/plan` always authors Stories. Use this skill only when judging whether a draft should stay one Story or legitimately split (near-zero overlap or an architectural seam).",
|
|
111
|
+
"policyCapsuleBullets": 5,
|
|
162
112
|
"allowedTools": null,
|
|
163
113
|
"vendor": null
|
|
164
114
|
},
|
|
@@ -122,9 +122,8 @@ authoring.
|
|
|
122
122
|
expression across jobs — tag-sharding makes flake triage non-deterministic.
|
|
123
123
|
- Run `bddgen` once per job before `playwright test`; cache the generated
|
|
124
124
|
directory only if the cache key includes every `.feature` and step file.
|
|
125
|
-
- Publish the Cucumber HTML/JSON report as the evidence artifact
|
|
126
|
-
|
|
127
|
-
zips.
|
|
125
|
+
- Publish the Cucumber HTML/JSON report as the evidence artifact, alongside
|
|
126
|
+
the Playwright HTML report and any trace zips.
|
|
128
127
|
- Quarantine `@flaky` scenarios with a dedicated job that does not gate the
|
|
129
128
|
merge queue; do not silently retry flakes in the main suite.
|
|
130
129
|
|
|
@@ -185,4 +184,3 @@ those outcomes.
|
|
|
185
184
|
- Scenario authoring rules: `.agents/rules/gherkin-standards.md`.
|
|
186
185
|
- Browser-level conventions: `.agents/skills/stack/qa/playwright/SKILL.md`.
|
|
187
186
|
- Operator entry point: `.agents/workflows/qa-run.md`.
|
|
188
|
-
- Evidence handoff: `.agents/workflows/helpers/epic-testing.md`.
|
|
@@ -91,7 +91,7 @@ source, route definitions, and rendered markup rather than a running browser.
|
|
|
91
91
|
|
|
92
92
|
The agent-driven Capture phase is **strictly read-only**. This invariant is
|
|
93
93
|
inviolable per [`security-baseline.md`](../../../../rules/security-baseline.md)
|
|
94
|
-
and the
|
|
94
|
+
and the Story's security considerations — it is not a soft preference.
|
|
95
95
|
|
|
96
96
|
- **No source edits.** The agent does not modify application code, config, or
|
|
97
97
|
tests while driving. Exploration observes; it never repairs.
|
|
@@ -192,9 +192,7 @@ Bundle findings **by likely root cause** into proposed follow-up tickets with
|
|
|
192
192
|
`Depends-on` / `Blocks` relationships, then present the draft for operator
|
|
193
193
|
approval. The harness **MUST NOT** create tickets autonomously — it stops at a
|
|
194
194
|
draft. The operator-approval gate is the safety boundary against spurious
|
|
195
|
-
filing.
|
|
196
|
-
**approved** findings to the Epic-testing helper for attachment to the Epic's
|
|
197
|
-
QA evidence ticket.
|
|
195
|
+
filing.
|
|
198
196
|
|
|
199
197
|
## 6. Sign-In & Contract Discipline
|
|
200
198
|
|
|
@@ -5,14 +5,14 @@ Version: {{PROTOCOL_VERSION}}
|
|
|
5
5
|
You are an AI coding assistant. This protocol governs your execution of the
|
|
6
6
|
current work unit. You must follow these rules strictly.
|
|
7
7
|
|
|
8
|
-
> **Hierarchy shape.** Mandrel uses a **
|
|
9
|
-
>
|
|
10
|
-
>
|
|
11
|
-
>
|
|
8
|
+
> **Hierarchy shape.** Mandrel uses a **Story-only** model. The work unit
|
|
9
|
+
> is the `type::story` issue itself, with acceptance criteria and
|
|
10
|
+
> verification inlined on the Story body and the folded Tech Spec in
|
|
11
|
+
> `## Spec`. There is no per-Task sub-loop; the agent authors commit
|
|
12
12
|
> subjects directly per `.agents/rules/git-conventions.md` and
|
|
13
|
-
> references the
|
|
14
|
-
> (`{{BRANCH_NAME}}` from `{{EPIC_BRANCH}}`), the
|
|
15
|
-
>
|
|
13
|
+
> references the Story via `(refs #<storyId>)`. Branch naming
|
|
14
|
+
> (`{{BRANCH_NAME}}` from `{{EPIC_BRANCH}}` / base), the PR target
|
|
15
|
+
> (`main`), and the close protocol are as documented below.
|
|
16
16
|
|
|
17
17
|
## 1. Pre-Flight Verification
|
|
18
18
|
|
|
@@ -50,9 +50,8 @@ When your implementation is complete and verified:
|
|
|
50
50
|
`{{TEST_CMD}}`) here. The close script's lint/test/format/maintainability
|
|
51
51
|
chain is the authoritative gate, run at Story closure (`story-close.js`).
|
|
52
52
|
Exception: you may run them interactively while iterating on a fix.
|
|
53
|
-
3. The Story branch is
|
|
54
|
-
|
|
55
|
-
manually.
|
|
53
|
+
3. The Story branch is opened as a PR to `main` by `helpers/deliver-story`
|
|
54
|
+
(via `single-story-close.js`) — do **not** merge manually.
|
|
56
55
|
|
|
57
56
|
## 6. Definition of Done
|
|
58
57
|
|
|
@@ -19,8 +19,7 @@ existing external APIs or business logic.
|
|
|
19
19
|
## Execution strategy (dual-path)
|
|
20
20
|
|
|
21
21
|
This lens runs along one of two execution paths. Both emit the **identical**
|
|
22
|
-
report contract (Step 3); downstream consumers (
|
|
23
|
-
epic-audit, `audit-to-stories`) are agnostic to which path produced it.
|
|
22
|
+
report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
|
|
24
23
|
|
|
25
24
|
- **Orchestrated (dynamic-workflow) path.** When Claude Code's
|
|
26
25
|
[dynamic workflows](https://code.claude.com/docs/en/workflows) are
|
|
@@ -70,10 +69,10 @@ degrade to the sequential path.
|
|
|
70
69
|
> read/search tools (`Read`, `Grep`, `Glob`) — no write/edit/shell-mutation
|
|
71
70
|
> tools. The single write in an orchestrated run is the final report artifact.
|
|
72
71
|
|
|
73
|
-
## Scope (
|
|
72
|
+
## Scope (Story / plan-run mode)
|
|
74
73
|
|
|
75
|
-
When this lens is invoked from `/deliver`
|
|
76
|
-
following block is populated with the
|
|
74
|
+
When this lens is invoked from `/deliver` close lenses (or a plan-run audit), the
|
|
75
|
+
following block is populated with the Story (or plan-run) change-set file list.
|
|
77
76
|
Otherwise — for any manual `/audit-<dimension>` invocation — the block
|
|
78
77
|
renders the literal substitution token and you MUST treat it as **no
|
|
79
78
|
scope filter — run the lens codebase-wide** exactly as you would have
|
|
@@ -218,7 +217,7 @@ Evaluate the gathered context against the following clean code dimensions:
|
|
|
218
217
|
gates, baseline kinds, close-validation steps, dependencies, or
|
|
219
218
|
harness subsystems under this dimension.
|
|
220
219
|
|
|
221
|
-
**Scope-mode behavior.** When this lens is invoked in
|
|
220
|
+
**Scope-mode behavior.** When this lens is invoked in Story scope (the
|
|
222
221
|
`{{changedFiles}}` block above is populated with a file list), the
|
|
223
222
|
maturity assessment for this dimension is a repo-wide property that
|
|
224
223
|
cannot be represented by a small changeset. In that case, render the
|
|
@@ -269,7 +268,7 @@ architectural pain points and areas for simplification.]
|
|
|
269
268
|
## Architecture Guardrail Coverage
|
|
270
269
|
|
|
271
270
|
[Codebase-wide mode: complete this section using the maturity rubric in
|
|
272
|
-
Step 2.
|
|
271
|
+
Step 2. Story-scoped run: set `Current Maturity` to
|
|
273
272
|
`Not Assessed — scoped run` and leave the remaining fields empty or
|
|
274
273
|
marked `n/a`.]
|
|
275
274
|
|
|
@@ -15,10 +15,10 @@ quality. Your objective is to identify "code smells," technical debt, and
|
|
|
15
15
|
violations of clean code principles (SOLID, DRY, KISS) that hinder long-term
|
|
16
16
|
velocity.
|
|
17
17
|
|
|
18
|
-
## Scope (
|
|
18
|
+
## Scope (Story / plan-run mode)
|
|
19
19
|
|
|
20
|
-
When this lens is invoked from `/deliver`
|
|
21
|
-
following block is populated with the
|
|
20
|
+
When this lens is invoked from `/deliver` close lenses (or a plan-run audit), the
|
|
21
|
+
following block is populated with the Story (or plan-run) change-set file list.
|
|
22
22
|
Otherwise — for any manual `/audit-<dimension>` invocation — the block
|
|
23
23
|
renders the literal substitution token and you MUST treat it as **no
|
|
24
24
|
scope filter — run the lens codebase-wide** exactly as you would have
|
|
@@ -39,8 +39,7 @@ before this section existed.
|
|
|
39
39
|
## Execution strategy (dual-path)
|
|
40
40
|
|
|
41
41
|
This lens runs along one of two execution paths. Both emit the **identical**
|
|
42
|
-
report contract (Step 3); downstream consumers (
|
|
43
|
-
epic-audit, `audit-to-stories`) are agnostic to which path produced it.
|
|
42
|
+
report contract (Step 3); downstream consumers (`audit-to-stories`) are agnostic to which path produced it.
|
|
44
43
|
|
|
45
44
|
- **Orchestrated (dynamic-workflow) path.** When Claude Code's
|
|
46
45
|
[dynamic workflows](https://code.claude.com/docs/en/workflows) are
|
|
@@ -102,8 +101,9 @@ Analyze the repository with a focus on:
|
|
|
102
101
|
cyclomatic complexity > 8 (`delivery.quality.codingGuardrails.cyclomaticFlag`)
|
|
103
102
|
is **flag in review** (annotate or split); > 12
|
|
104
103
|
(`codingGuardrails.cyclomaticMustFix`) is **must-fix** before the work merges.
|
|
105
|
-
A per-file MI drop
|
|
106
|
-
|
|
104
|
+
A per-file MI drop beyond the configured
|
|
105
|
+
`delivery.quality.gates.maintainability.tolerance` (default 0.5pt) requires
|
|
106
|
+
a refactor in the same Story rather than a baseline bump.
|
|
107
107
|
- **Duplication:** Find "copy-paste" logic that should be abstracted into
|
|
108
108
|
reusable utilities or hooks.
|
|
109
109
|
- **Component Health:** In UI code, look for "component bloat" (files > 300
|
|
@@ -14,10 +14,10 @@ Manage the lifecycle of project dependencies. Your goal is to identify outdated,
|
|
|
14
14
|
vulnerable, or bloated packages and suggest a safe upgrade path that maintains
|
|
15
15
|
system stability.
|
|
16
16
|
|
|
17
|
-
## Scope (
|
|
17
|
+
## Scope (Story / plan-run mode)
|
|
18
18
|
|
|
19
|
-
When this lens is invoked from `/deliver`
|
|
20
|
-
following block is populated with the
|
|
19
|
+
When this lens is invoked from `/deliver` close lenses (or a plan-run audit), the
|
|
20
|
+
following block is populated with the Story (or plan-run) change-set file list.
|
|
21
21
|
Otherwise — for any manual `/audit-<dimension>` invocation — the block
|
|
22
22
|
renders the literal substitution token and you MUST treat it as **no
|
|
23
23
|
scope filter — run the lens codebase-wide** exactly as you would have
|
|
@@ -15,10 +15,10 @@ infrastructure, developer experience (DX) tooling, and CI/CD pipelines. Your
|
|
|
15
15
|
goal is to identify inefficiencies, security risks, and areas for modernization
|
|
16
16
|
without making any immediate changes.
|
|
17
17
|
|
|
18
|
-
## Scope (
|
|
18
|
+
## Scope (Story / plan-run mode)
|
|
19
19
|
|
|
20
|
-
When this lens is invoked from `/deliver`
|
|
21
|
-
following block is populated with the
|
|
20
|
+
When this lens is invoked from `/deliver` close lenses (or a plan-run audit), the
|
|
21
|
+
following block is populated with the Story (or plan-run) change-set file list.
|
|
22
22
|
Otherwise — for any manual `/audit-<dimension>` invocation — the block
|
|
23
23
|
renders the literal substitution token and you MUST treat it as **no
|
|
24
24
|
scope filter — run the lens codebase-wide** exactly as you would have
|