mandrel 2.60.0 → 2.61.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 +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +25 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
package/.agents/docs/SDLC.md
DELETED
|
@@ -1,590 +0,0 @@
|
|
|
1
|
-
# Software Development Life Cycle (SDLC) Workflow
|
|
2
|
-
|
|
3
|
-
Mandrel uses **Story-centric GitHub orchestration** — GitHub Issues,
|
|
4
|
-
Labels, and Projects V2 are the Single Source of Truth. Plans persist as
|
|
5
|
-
`type::story` tickets ordered by `depends_on` edges;
|
|
6
|
-
each Story is delivered on its own `story-<id>` branch and reaches `main`
|
|
7
|
-
through its own PR.
|
|
8
|
-
|
|
9
|
-
An Epic may still exist as an **optional untyped human umbrella issue**
|
|
10
|
-
(the only shipped issue form is `.github/ISSUE_TEMPLATE/story.yml`), and
|
|
11
|
-
**delivery and planning orchestration are Story-only**: there is no Epic
|
|
12
|
-
wave loop, no `epic/<id>` integration branch, no `epic.yaml` reconciler,
|
|
13
|
-
and any ticket that still carries an `Epic: #N` footer is **refused** by
|
|
14
|
-
`/mandrel-deliver` (close it or re-plan it as a v2 Story). `type::epic`
|
|
15
|
-
exists as a **container only** — a grouping ticket with no execution
|
|
16
|
-
payload, expanded to its children at delivery (ADR `20260905-5139`).
|
|
17
|
-
|
|
18
|
-
The framework is **Claude Code-first**: `.claude/`, hooks, skills, and
|
|
19
|
-
the slash-command surface lean in on Claude Code as the reference
|
|
20
|
-
runtime, and the dispatcher (`.agents/scripts/`) treats the dispatch
|
|
21
|
-
manifest (md + structured comment) as the cross-runtime contract. See
|
|
22
|
-
ADR 20260512-coupling-stance in [`../docs/decisions.md`](../../docs/decisions.md).
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## The simple flow
|
|
27
|
-
|
|
28
|
-
From zero to shipped:
|
|
29
|
-
|
|
30
|
-
1. **Plan the work.** Run [`/mandrel-plan`](../workflows/mandrel-plan.md) in your agentic IDE.
|
|
31
|
-
The framework authors **one Story by default** (folded Tech Spec in
|
|
32
|
-
`## Spec`), splitting into N>1 only under the default-single split policy.
|
|
33
|
-
Three operator modes are the **only** accepted entries — `/mandrel-plan --seed
|
|
34
|
-
"<text>"` (ideate from chat text), `/mandrel-plan --seed-file <path>` (author from
|
|
35
|
-
on-disk notes / a plan seed — the [`/audit-to-stories`](../workflows/audit-to-stories.md)
|
|
36
|
-
handoff via `--emit-plan-seed`), and `/mandrel-plan --tickets 123[,456…]` (analyze
|
|
37
|
-
existing issue(s), preferring an N=1 rewrite). `/mandrel-plan` is a **single path**
|
|
38
|
-
— interrogate → author → persist, bracketed by two HITL gates and a single
|
|
39
|
-
critic gate — with no Epic/Story router, split-routing verdict, or
|
|
40
|
-
`deliveryShape`. Duplicate search targets open **Stories**, never Epics. The
|
|
41
|
-
step-by-step lives in [`mandrel-plan.md`](../workflows/mandrel-plan.md).
|
|
42
|
-
|
|
43
|
-
2. **Deliver the Story.** Run [`/mandrel-deliver <storyId>`](../workflows/mandrel-deliver.md)
|
|
44
|
-
(or `/mandrel-deliver <a> <b> …` for several). `/mandrel-deliver` takes only Story ids and
|
|
45
|
-
resolves their dependency graph from live state — body edges union native
|
|
46
|
-
GitHub `blocked_by` edges, every blocker checked against its real issue
|
|
47
|
-
state, so a Story whose blocker landed in an earlier plan run is simply
|
|
48
|
-
ready. `/mandrel-deliver` owns input resolution and dispatch order — the declared
|
|
49
|
-
`depends_on` edges plus a delivery-time file-overlap guard that withholds
|
|
50
|
-
two Stories whose footprints would race the same path (see
|
|
51
|
-
[`architecture.md` § Scheduler safety mechanics](../../docs/architecture.md));
|
|
52
|
-
every Story runs through the single v2 delivery engine
|
|
53
|
-
[`helpers/deliver-story`](../workflows/helpers/deliver-story.md) —
|
|
54
|
-
init → implement → acceptance self-eval → ceremony → close → CI watch →
|
|
55
|
-
confirm-merge — which owns its own per-step detail. For a multi-Story run,
|
|
56
|
-
`/mandrel-deliver` sequences ready Stories by `depends_on` — plus that footprint
|
|
57
|
-
guard — and runs the per-run epilogue (audit roster · follow-up roll-up ·
|
|
58
|
-
sibling coherence) once after the last Story lands.
|
|
59
|
-
|
|
60
|
-
That is the whole happy path. Everything below is **detail** — branching
|
|
61
|
-
conventions, HITL escalation, audit lenses — that you only need when the
|
|
62
|
-
default flow requires adjustment. It intentionally **links** to
|
|
63
|
-
[`mandrel-plan.md`](../workflows/mandrel-plan.md) and [`mandrel-deliver.md`](../workflows/mandrel-deliver.md)
|
|
64
|
-
rather than re-documenting the ceremony they own.
|
|
65
|
-
|
|
66
|
-
## Core Principles
|
|
67
|
-
|
|
68
|
-
- **Layered state stores with explicit precedence.** Ticket status lives
|
|
69
|
-
in GitHub Issues and Labels; the lifecycle ledger
|
|
70
|
-
(`lifecycle.ndjson`) records merge-terminal outcomes for post-hoc
|
|
71
|
-
attribution; structured comments (`verification-results`, retro) are
|
|
72
|
-
the operator-visible rollup. The
|
|
73
|
-
stores, their owners, and their conflict-resolution rules are listed in
|
|
74
|
-
[§ State stores](#state-stores) — that matrix is the single source of
|
|
75
|
-
truth for "who owns which write."
|
|
76
|
-
- **Provider Abstraction.** Orchestration flows through
|
|
77
|
-
`ITicketingProvider`, an abstract interface with a shipped GitHub
|
|
78
|
-
implementation.
|
|
79
|
-
- **Story-level branching.** All work for a Story lands on the shared
|
|
80
|
-
`story-<id>` branch. Each Story reaches `main` through its own PR
|
|
81
|
-
(squash + required checks); there is **no** `epic/<id>` integration
|
|
82
|
-
branch and **no** `--no-ff` wave merge.
|
|
83
|
-
- **One delivery engine.** `/mandrel-deliver` resolves and sequences a Story set;
|
|
84
|
-
`helpers/deliver-story` executes each Story identically (trivial or
|
|
85
|
-
large). Story sub-agents run inside the operator's Claude session via
|
|
86
|
-
the Agent tool — worktree filesystem isolation is preserved; only the
|
|
87
|
-
subprocess boundary is gone.
|
|
88
|
-
- **PR is the sole promotion gate.** Delivery ends with a PR open against
|
|
89
|
-
`main` and (by default) GitHub native auto-merge armed; the workflow
|
|
90
|
-
itself never executes `git merge` against `main`. Branch protection on
|
|
91
|
-
`main` enforces required checks before the merge button (auto or
|
|
92
|
-
manual) fires.
|
|
93
|
-
- **HITL-minimal by default.** Exactly one mandatory operator touchpoint
|
|
94
|
-
on the happy path — blocker resolution mid-run. PR merge is autonomous
|
|
95
|
-
via the armed auto-merge; the operator becomes a second touchpoint only
|
|
96
|
-
when they disarm auto-merge (`--no-auto-merge` / `delivery.ci.autoMerge:
|
|
97
|
-
"strict"`) or when required checks fail and need remediation.
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## State stores
|
|
102
|
-
|
|
103
|
-
Mandrel writes orchestration state across several distinct stores. Each
|
|
104
|
-
store has one canonical writer and one well-defined idempotency key;
|
|
105
|
-
conflicts are resolved in the **Conflict resolution** column. Run-scoped
|
|
106
|
-
artifacts live under `temp/run-<id>/` (standalone Stories under
|
|
107
|
-
`temp/standalone/stories/story-<id>/`); the `run-<id>` directory naming is
|
|
108
|
-
historical (it predates the Story-centric cutover) but remains the live
|
|
109
|
-
on-disk layout resolved by
|
|
110
|
-
[`lib/config/temp-paths.js`](../scripts/lib/config/temp-paths.js).
|
|
111
|
-
|
|
112
|
-
| State Store | Owner (canonical writer) | Mutation API | Idempotency key | Conflict resolution |
|
|
113
|
-
| --- | --- | --- | --- | --- |
|
|
114
|
-
| GitHub labels | `transitionTicketState` via `ticketing.js` | `gh issue edit --add-label / --remove-label`, wrapped in `update-ticket-state.js` | `(ticketId, label-set)` — set-equality before write | Authoritative for current ticket lifecycle state; if a label disagrees with the lifecycle ledger, the **ledger wins on resume** and the label is re-derived. |
|
|
115
|
-
| `verification-results` comment | `lib/orchestration/code-review.js` | `post-structured-comment.js` (upsert by `kind`) | `(storyId, kind='verification-results')` | Authoritative for the Story-scope review + lens findings; critical findings block close. |
|
|
116
|
-
| Lifecycle ledger NDJSON | `appendLedgerEvent` (`lib/orchestration/lifecycle/emit-ledger-event.js`) — a bare `appendFileSync` from the close path; Story #5024 retired the `LedgerWriter` listener that preceded it | Append-only line write to the scope-resolved `lifecycle.ndjson` | `(storyId, event)` — one record per merge-terminal outcome | Records the two merge-terminal outcomes (`merge.unlanded`, `merge.flip-failed`) for post-hoc attribution. Labels remain authoritative for current ticket state. |
|
|
117
|
-
| Validation evidence cache | `evidence-gate.js` | JSON cache file under the run temp tree, keyed by HEAD SHA | `(gate, git rev-parse HEAD)` | Pure cache: a missing entry triggers a re-run; presence is a fast-path skip. Cache eviction is safe. |
|
|
118
|
-
| PR / auto-merge state | `single-story-close.js` (sole authorized caller of `gh pr merge`) | `gh pr merge --auto --squash --delete-branch`; PR open via the close pipeline's `gh pr create` | `(prNumber, head-branch SHA)` — `gh pr list --head` probes before create | GitHub is authoritative for PR + auto-merge arming state; the ledger records the *intent* to arm, GitHub records the outcome. |
|
|
119
|
-
| Worktree cleanup state | `WorktreeManager.reap` (via `single-story-close.js` / `git-cleanup.js`) | `git worktree remove` + on-disk pending-cleanup JSON under the run temp tree | `(storyId, worktree-path)` | Filesystem is authoritative for "is the worktree gone?"; the pending-cleanup JSON only tracks stale-registry entries needing a follow-up sweep. |
|
|
120
|
-
|
|
121
|
-
> The `gh pr merge` merge-lockout lint rule keeps the merge command
|
|
122
|
-
> confined to the sanctioned close path; no other production caller may
|
|
123
|
-
> shell it.
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
## End-to-End Process
|
|
128
|
-
|
|
129
|
-
```mermaid
|
|
130
|
-
graph LR
|
|
131
|
-
classDef manual fill:#f9d0c4,stroke:#333,stroke-width:2px,color:#000;
|
|
132
|
-
classDef agentic fill:#c4f9d0,stroke:#333,stroke-width:2px,color:#000;
|
|
133
|
-
classDef artifact fill:#ececec,stroke:#333,stroke-width:1px,stroke-dasharray: 5 5,color:#000;
|
|
134
|
-
|
|
135
|
-
subgraph Phase0 ["Phase 0: Bootstrap"]
|
|
136
|
-
direction TB
|
|
137
|
-
Z["👤 npx mandrel init<br/>(install → sync → bootstrap.js → onboarding tail → /mandrel-plan handoff)"]:::manual
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
subgraph Phase1 ["Phase 1: Plan"]
|
|
141
|
-
direction TB
|
|
142
|
-
A["👤 /mandrel-plan --seed | --seed-file | --tickets"]:::manual
|
|
143
|
-
B["🤖 interrogate → author → persist"]:::agentic
|
|
144
|
-
A --> B
|
|
145
|
-
B -.-> B_Art["📄 type::story issue(s)<br/>(+ depends_on edges)"]:::artifact
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
subgraph Phase2 ["Phase 2: Deliver"]
|
|
149
|
-
direction TB
|
|
150
|
-
E["👤 /mandrel-deliver <storyId> [<storyId>…]"]:::manual
|
|
151
|
-
F["🤖 deliver-story: story-<id> from main<br/>implement → self-eval → ceremony → close"]:::agentic
|
|
152
|
-
G["🤖 close-validation → code-review → open PR"]:::agentic
|
|
153
|
-
E --> F --> G
|
|
154
|
-
G -.-> G_Art["📄 PR open against main"]:::artifact
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
subgraph Phase3 ["Phase 3: PR merge (auto by default)"]
|
|
158
|
-
direction TB
|
|
159
|
-
H["🤖 Auto-merge armed → PR lands when checks pass<br/>(👤 operator may disarm to merge manually)"]:::agentic
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
Z --> A
|
|
163
|
-
B --> E
|
|
164
|
-
G --> H
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## Phase 0: Bootstrap (one-time setup)
|
|
170
|
-
|
|
171
|
-
Before any workflow, bootstrap your project to seed `.agentrc.json`, wire the
|
|
172
|
-
framework system prompt, and create the GitHub labels, Projects V2 fields, and
|
|
173
|
-
(when enabled) main-branch protection the orchestration engine depends on. The
|
|
174
|
-
canonical cold-start path is a single command:
|
|
175
|
-
|
|
176
|
-
```bash
|
|
177
|
-
npx mandrel init
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
`mandrel init` installs `mandrel` (when `./.agents/` is absent), materializes
|
|
181
|
-
`./.agents/` via `mandrel sync`, then presents a two-option prompt: **configure
|
|
182
|
-
now** (runs `node .agents/scripts/bootstrap.js`) or **just the files** (re-run
|
|
183
|
-
`mandrel init` later). `--assume-yes` skips the prompt; a non-TTY run without
|
|
184
|
-
it defaults to files-only so GitHub provisioning never runs unattended. The
|
|
185
|
-
`bootstrap.js` pipeline (cold-start repo/board provisioning, the `.agentrc.json`
|
|
186
|
-
seed, the label taxonomy + Projects V2 fields + branch protection) and the
|
|
187
|
-
onboarding tail are documented in
|
|
188
|
-
[`README.md` § Activation](../README.md#activation). Bootstrap runs once per
|
|
189
|
-
repository and is safe to re-run — existing labels, fields, and
|
|
190
|
-
branch-protection entries are preserved; missing ones are added.
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
## Phase 1: Planning
|
|
195
|
-
|
|
196
|
-
Planning is owned end-to-end by [`/mandrel-plan`](../workflows/mandrel-plan.md). Rather than
|
|
197
|
-
re-document the ceremony here, this section states the contract the rest of
|
|
198
|
-
the SDLC depends on:
|
|
199
|
-
|
|
200
|
-
- **Entry is text or tickets, never Epic.** The only accepted invocations
|
|
201
|
-
are `--seed`, `--seed-file`, and `--tickets`. There is no `--idea`, no
|
|
202
|
-
`--one-pager`, no `--from-notes`, and no positional `/mandrel-plan <epicId>`.
|
|
203
|
-
- **One Story by default.** `/mandrel-plan` authors a single `type::story` issue
|
|
204
|
-
whose body carries a folded `## Spec` (inline only — never spilled to
|
|
205
|
-
`docs/`) plus top-level `acceptance[]` / `verify[]`. It splits into N>1
|
|
206
|
-
siblings (ordered by `depends_on` edges) **only**
|
|
207
|
-
under the default-single split policy: near-zero overlap or a genuine
|
|
208
|
-
architectural seam. Coupled work stays one Story and is decomposed inside
|
|
209
|
-
`## Slicing` as intra-session checkpoints, not sibling tickets.
|
|
210
|
-
- **No Epic-scale ceremony on the default path.** N=1 skips the
|
|
211
|
-
Epic-era Tech Spec / Acceptance Table / clarity-gate / decompose /
|
|
212
|
-
reconciler machinery. `plan-persist.js` runs the deterministic gates
|
|
213
|
-
(ticket validator, split policy, reachability, budget) and — for N>1 —
|
|
214
|
-
the same-wave collision refusal, so a split whose siblings the dispatcher
|
|
215
|
-
would serialize anyway is rejected before the first `createIssue`.
|
|
216
|
-
- **Handoff.** Persist creates the Story issue(s) at `agent::ready` and
|
|
217
|
-
names the delivery command: `/mandrel-deliver <storyId> [<storyId> ...]`.
|
|
218
|
-
|
|
219
|
-
There is no `epic|story` routing verdict, scorer, schema field, or label
|
|
220
|
-
transition anywhere on the path: sizing is the authoring model's cohesion
|
|
221
|
-
judgment, and the one deterministic split gate is the collision refusal.
|
|
222
|
-
|
|
223
|
-
Audit findings enter planning through
|
|
224
|
-
[`/audit-to-stories`](../workflows/audit-to-stories.md), which groups and
|
|
225
|
-
deduplicates findings and hands off via `--emit-plan-seed` →
|
|
226
|
-
`/mandrel-plan --seed-file <path>`.
|
|
227
|
-
|
|
228
|
-
---
|
|
229
|
-
|
|
230
|
-
## Phase 2: Delivery
|
|
231
|
-
|
|
232
|
-
Delivery is owned end-to-end by [`/mandrel-deliver`](../workflows/mandrel-deliver.md), which
|
|
233
|
-
delegates every Story to
|
|
234
|
-
[`helpers/deliver-story`](../workflows/helpers/deliver-story.md). This
|
|
235
|
-
section states the contract; the per-Story step detail (init, implement,
|
|
236
|
-
self-eval, ceremony, close, CI watch, confirm-merge, cleanup) lives in the
|
|
237
|
-
`deliver-story` workflow and its
|
|
238
|
-
[reference](../workflows/helpers/deliver-story-reference.md).
|
|
239
|
-
|
|
240
|
-
### Invocation modes
|
|
241
|
-
|
|
242
|
-
| Mode | Entry point | When to use |
|
|
243
|
-
| --- | --- | --- |
|
|
244
|
-
| **Single Story** | `/mandrel-deliver <storyId>` | Deliver one Story end-to-end; ends with a PR open to `main`. |
|
|
245
|
-
| **Story set** | `/mandrel-deliver <storyId> [<storyId>…]` | Deliver multiple Stories in `depends_on` order (default concurrency **3**), resolved from live state so edges may point at Stories from earlier plan runs; a delivery-time file-overlap guard additionally withholds two Stories whose footprints would race the same path (`delivery.deliverRunner.footprintGuard`). Each lands through its own PR, and the per-run epilogue runs after the set lands. |
|
|
246
|
-
| **Story worker (internal)** | *helper* `helpers/deliver-story <storyId>` | Per-Story engine invoked internally by `/mandrel-deliver`; not an operator slash command. |
|
|
247
|
-
|
|
248
|
-
The single operator-facing entry point is `/mandrel-deliver`. It performs no
|
|
249
|
-
git/label mutations itself — `deliver-story` owns every script invocation
|
|
250
|
-
per Story. A `type::epic` id expands to its open child Stories before
|
|
251
|
-
resolution. Any ticket that is neither of those two types, or that still
|
|
252
|
-
carries an `Epic: #N` reference, is a hard error naming the ID and the fix
|
|
253
|
-
(close or re-plan as a v2 Story).
|
|
254
|
-
|
|
255
|
-
### Branch model (authoritative)
|
|
256
|
-
|
|
257
|
-
```text
|
|
258
|
-
story-<id> → PR → main (squash + required checks)
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
There is no `epic/<id>` integration branch and no `--no-ff` wave merge.
|
|
262
|
-
Dependent Stories land sequentially so each builds on the previous merge to
|
|
263
|
-
`main`.
|
|
264
|
-
|
|
265
|
-
### Ceremony
|
|
266
|
-
|
|
267
|
-
Who authors a Story's acceptance verdict is selected by
|
|
268
|
-
`delivery.routing.ceremonyProfile` (`minimal` | `standard` | `strict`, default
|
|
269
|
-
`standard`) and by nothing else. The **derived change level** is a separate
|
|
270
|
-
decision and tunes review depth and audit-lens selection. Hard gates (lint /
|
|
271
|
-
test / format / coverage / CRAP / maintainability) always run at close —
|
|
272
|
-
neither decision disables them. The full profile × scope matrix lives in
|
|
273
|
-
[`mandrel-deliver.md` § Ceremony](../workflows/mandrel-deliver.md).
|
|
274
|
-
|
|
275
|
-
### State sync
|
|
276
|
-
|
|
277
|
-
Agents update their state in real time on GitHub, always through
|
|
278
|
-
`update-ticket-state.js`:
|
|
279
|
-
|
|
280
|
-
- **Labels**: `agent::ready` → `agent::executing` → `agent::closing` →
|
|
281
|
-
`agent::done`. The `agent::done` flip happens only after
|
|
282
|
-
`single-story-confirm-merge.js` confirms the PR merged. When a
|
|
283
|
-
`projectNumber` is configured, the Projects v2 Status column is synced on
|
|
284
|
-
each transition (and re-asserted after merge to beat the board's late
|
|
285
|
-
built-in write).
|
|
286
|
-
- **Acceptance/verify**: the agent works the Story's inline `acceptance[]`
|
|
287
|
-
/ `verify[]` arrays; `verify[]` commands are consumed as required
|
|
288
|
-
evidence by the acceptance self-eval loop.
|
|
289
|
-
- **Friction**: friction is posted as a structured comment on the **Story**
|
|
290
|
-
(`diagnose-friction.js`), and rolls up into the retro and, for N>1, the
|
|
291
|
-
per-run follow-up roll-up.
|
|
292
|
-
|
|
293
|
-
### Cross-clone coordination
|
|
294
|
-
|
|
295
|
-
Concurrent runs are serialised by **two distinct layers**:
|
|
296
|
-
|
|
297
|
-
- **Filesystem locks are same-machine-only.** The single-story sweep lock
|
|
298
|
-
(`sweep-lock.js`) is a single-file rendezvous keyed on a local process
|
|
299
|
-
PID + mtime TTL. Because a PID is only meaningful on its own machine and
|
|
300
|
-
`.git/` is never committed, these locks coordinate only the worktrees and
|
|
301
|
-
sessions on **one** clone.
|
|
302
|
-
- **The assignee-as-lease is the cross-clone layer.** To stop two clones
|
|
303
|
-
from both *starting* the same Story, `deliver-story` takes an exclusive,
|
|
304
|
-
time-bounded claim on the ticket via
|
|
305
|
-
[`ticket-lease.js`](../scripts/lib/orchestration/ticket-lease.js), riding
|
|
306
|
-
the ticket's GitHub `assignees` field so a live foreign claim is visible
|
|
307
|
-
to every clone. The standalone lease **fails closed** on a foreign
|
|
308
|
-
assignee; `--steal` is the only override. See
|
|
309
|
-
[`README.md` § Multi-developer coordination](../README.md#multi-developer-coordination).
|
|
310
|
-
|
|
311
|
-
### Concurrent close
|
|
312
|
-
|
|
313
|
-
`single-story-close.js` syncs the Story branch from `origin/main` before
|
|
314
|
-
pushing and opening/locating the PR, so concurrent closes serialize through
|
|
315
|
-
their own worktrees rather than racing one shared branch. The push does not
|
|
316
|
-
retry: a rejected push, or a real content conflict at base-sync, aborts with
|
|
317
|
-
a clear error, leaves the tree clean, and exits non-zero for manual
|
|
318
|
-
resolution.
|
|
319
|
-
|
|
320
|
-
---
|
|
321
|
-
|
|
322
|
-
## HITL (Human-in-the-Loop) model
|
|
323
|
-
|
|
324
|
-
On the happy path there is exactly **one** mandatory operator touchpoint
|
|
325
|
-
after `/mandrel-deliver` fires (blocker resolution). PR merge is autonomous via
|
|
326
|
-
armed auto-merge; the operator becomes a second touchpoint only by
|
|
327
|
-
exception.
|
|
328
|
-
|
|
329
|
-
1. **Blocker resolution (mandatory when triggered).** If a Story hits an
|
|
330
|
-
unresolvable condition, it flips to `agent::blocked`, posts a structured
|
|
331
|
-
friction comment, and fires the notification webhook (fire-and-forget).
|
|
332
|
-
The operator resolves the underlying issue (a hand-fix commit on the
|
|
333
|
-
Story branch, or a scope edit on the ticket) and flips the Story back to
|
|
334
|
-
`agent::executing` to resume.
|
|
335
|
-
2. **PR merge (autonomous by default; operator-gated by exception).** At
|
|
336
|
-
close, `deliver-story` opens a PR to `main` and arms GitHub native
|
|
337
|
-
auto-merge. When required checks pass, the PR lands without a second
|
|
338
|
-
operator visit and the standard label transition flips the Story to
|
|
339
|
-
`agent::done`. The operator becomes a touchpoint only when they (a)
|
|
340
|
-
disarm auto-merge (`--no-auto-merge` per run, or
|
|
341
|
-
`delivery.ci.autoMerge: "strict"`) to inspect checks / the
|
|
342
|
-
`verification-results` comment / the retro before merging by hand, or
|
|
343
|
-
(b) checks fail and need remediation.
|
|
344
|
-
|
|
345
|
-
### What triggers `agent::blocked`
|
|
346
|
-
|
|
347
|
-
- Unresolvable merge conflict automated strategies cannot reconcile.
|
|
348
|
-
- Test failures that persist after automated remediation.
|
|
349
|
-
- Ambiguity requiring a product/scope decision the agent cannot make from
|
|
350
|
-
ticket context alone.
|
|
351
|
-
- A destructive action not pre-authorized by the ticket body.
|
|
352
|
-
- External-service failure preventing progress (GitHub API 5xx loop, npm
|
|
353
|
-
registry down).
|
|
354
|
-
- Acceptance self-eval exhausting its bounded round cap with criteria still
|
|
355
|
-
unmet.
|
|
356
|
-
|
|
357
|
-
### What is *not* gated at runtime
|
|
358
|
-
|
|
359
|
-
- `risk::high` Stories **run without pause.** The label is planning/audit
|
|
360
|
-
metadata and retro telemetry only; the sole runtime pause point is
|
|
361
|
-
`agent::blocked`. Branch protection on `main` and blocker escalation are
|
|
362
|
-
the runtime defenses for destructive actions.
|
|
363
|
-
- Individual Story completion — no per-Story approval prompt beyond the PR
|
|
364
|
-
merge gate.
|
|
365
|
-
|
|
366
|
-
---
|
|
367
|
-
|
|
368
|
-
## Testing strategy
|
|
369
|
-
|
|
370
|
-
Tests are **pyramid-aware**. Every test written during Story delivery
|
|
371
|
-
belongs to exactly one tier — **unit**, **contract**, or **e2e /
|
|
372
|
-
acceptance**. The canonical tier definitions, assertion-placement rules,
|
|
373
|
-
and coverage thresholds live in
|
|
374
|
-
[`rules/testing-standards.md`](../rules/testing-standards.md); Gherkin
|
|
375
|
-
authoring for the acceptance tier is governed by
|
|
376
|
-
[`rules/gherkin-standards.md`](../rules/gherkin-standards.md).
|
|
377
|
-
|
|
378
|
-
Write a Story's acceptance criteria in Gherkin-compatible `Given / When /
|
|
379
|
-
Then` form so the acceptance suite can lift them into executable `.feature`
|
|
380
|
-
files.
|
|
381
|
-
|
|
382
|
-
### QA workflows: explore, assist, and run-harness
|
|
383
|
-
|
|
384
|
-
Three complementary QA workflows sit alongside the automated pyramid, all
|
|
385
|
-
reading the consumer's `qa.*` contract through
|
|
386
|
-
[`resolve-qa-contract.js`](../scripts/lib/qa/resolve-qa-contract.js) (which
|
|
387
|
-
fails loudly when no `qa` block is bound):
|
|
388
|
-
|
|
389
|
-
- **[`/qa-explore`](../workflows/qa-explore.md)** — **agent-led** open-ended
|
|
390
|
-
Plan → Capture → Triage sweep of a named surface (read-only capture; every
|
|
391
|
-
state-changing action lands in Triage after operator confirmation).
|
|
392
|
-
- **[`/qa-assist`](../workflows/qa-assist.md)** — the **human-led** sibling: a
|
|
393
|
-
single-observation Intake → Enrich → Record loop, same ledger contract.
|
|
394
|
-
- **[`/qa-run`](../workflows/qa-run.md)** — the **automated complement**: steps
|
|
395
|
-
a *known* set of Gherkin `.feature` scenarios through a real browser into
|
|
396
|
-
structured `F#` findings.
|
|
397
|
-
|
|
398
|
-
Consumer adoption steps are in
|
|
399
|
-
[`README.md` § Adopting the QA harness](../README.md#adopting-the-qa-harness).
|
|
400
|
-
|
|
401
|
-
---
|
|
402
|
-
|
|
403
|
-
## Static analysis & audit orchestration
|
|
404
|
-
|
|
405
|
-
Audit lenses are woven into delivery as a **shift-left, three-tier**
|
|
406
|
-
verification model in which each lens concern is verified at exactly one
|
|
407
|
-
tier, chosen by the lens's `scope` field in `audit-rules.json` (resolved by
|
|
408
|
-
`resolveLensTier`). There is **no** separate Epic-lifecycle-gate delivery
|
|
409
|
-
pass — the tiers below *are* the audit machinery.
|
|
410
|
-
|
|
411
|
-
| Tier | When | What runs | Blocking? |
|
|
412
|
-
| --- | --- | --- | --- |
|
|
413
|
-
| Tier 1 — write-time | During Story implementation | Footprint-matched **local**-lens authoring checklists threaded into the Story prompt (`checklistPath`) | advisory |
|
|
414
|
-
| Tier 2 — Story-scope | `single-story-close.js` (maker-blind subprocess) | Local-tier lens roster over the Story diff (`selectLocalLenses`) + review pillars, posted as `verification-results` | blocking on 🔴 |
|
|
415
|
-
| Tier 3 — run closeout | `/mandrel-deliver` per-run epilogue (`plan-run-epilogue.js`, N>1 only) | Cumulative + global lenses (`selectAudits`) over the combined landed tip | blocking |
|
|
416
|
-
|
|
417
|
-
- **`local`** lenses (decidable from a single Story's diff) are verified at
|
|
418
|
-
Tiers 1–2 and are **not** re-run at run closeout.
|
|
419
|
-
- **`cumulative`** lenses (only decidable across a run's combined diff)
|
|
420
|
-
and **`global`** lenses (whole-product properties) are verified at Tier 3.
|
|
421
|
-
|
|
422
|
-
There is no risk-routed lens tier. Story #4542 deleted the risk→lens router:
|
|
423
|
-
it had zero callers while this document claimed it ran inside close. Lens
|
|
424
|
-
selection is change-set-matched (`selectAudits` / `selectLocalLenses`); the
|
|
425
|
-
`sensitivePaths` classes in `audit-rules.json` route review **depth**, not
|
|
426
|
-
lenses.
|
|
427
|
-
|
|
428
|
-
The run-closeout roster is deliberately **slim**: it excludes every
|
|
429
|
-
local-tier change-set lens so the outermost tier — where a fix is most
|
|
430
|
-
expensive — does not re-verify a concern already covered shift-left.
|
|
431
|
-
|
|
432
|
-
### Code review
|
|
433
|
-
|
|
434
|
-
The Story-scope code review runs **outside the maker's context**, inside the
|
|
435
|
-
`single-story-close.js` close subprocess, over `main...story-<id>`: it walks
|
|
436
|
-
the Story diff once (change-set-matched local lenses as review dimensions
|
|
437
|
-
alongside the review pillars) and posts the unified `verification-results`
|
|
438
|
-
comment, halting on surviving 🔴 Critical findings. The provider chain and
|
|
439
|
-
remediation knobs are owned by
|
|
440
|
-
[`README.md` § Code review providers](../README.md#code-review-providers-pluggable-chain);
|
|
441
|
-
the walk-through is in [`helpers/code-review.md`](../workflows/helpers/code-review.md).
|
|
442
|
-
|
|
443
|
-
### Quality ratchets
|
|
444
|
-
|
|
445
|
-
The maintainability and CRAP ratchets — and the other baseline gates — run
|
|
446
|
-
through `check-baselines.js` at close-validation, `ci.yml`, and
|
|
447
|
-
`.husky/pre-push`; the `baseline-refresh:` commit-trailer convention governs
|
|
448
|
-
baseline edits. The runbooks (bootstrap, refresh, floor policy) are owned by
|
|
449
|
-
[`quality-gates.md`](quality-gates.md).
|
|
450
|
-
|
|
451
|
-
### Audits → Stories
|
|
452
|
-
|
|
453
|
-
The standalone `/audit-<dimension>` workflows write
|
|
454
|
-
`audit-<dimension>-results.md` under `temp/audits/`;
|
|
455
|
-
[`/audit-to-stories`](../workflows/audit-to-stories.md) groups and deduplicates
|
|
456
|
-
those findings and hands off to `/mandrel-plan --seed-file` (or opens standalone
|
|
457
|
-
Stories), closing the loop back into planning.
|
|
458
|
-
|
|
459
|
-
---
|
|
460
|
-
|
|
461
|
-
## Notification system
|
|
462
|
-
|
|
463
|
-
Two independent notification surfaces, both living in `.agents/` so they
|
|
464
|
-
ship to consuming projects.
|
|
465
|
-
|
|
466
|
-
### 1. Unified `notify()` dispatcher
|
|
467
|
-
|
|
468
|
-
Every notification — whether a manual orchestration milestone (Story
|
|
469
|
-
merged, HITL gate triggered) or an auto-fired ticket-state transition —
|
|
470
|
-
routes through [`notify.js`](../scripts/notify.js). Two delivery channels:
|
|
471
|
-
|
|
472
|
-
| Channel | What it does |
|
|
473
|
-
| --- | --- |
|
|
474
|
-
| GitHub comment | Posts to the targeted ticket; @mentions the operator for `medium`/`high`. |
|
|
475
|
-
| Webhook | Fire-and-forget POST to the configured URL (Make.com / Slack / Discord). |
|
|
476
|
-
|
|
477
|
-
Severity vocabulary (`eventSeverity()` derives it for state transitions):
|
|
478
|
-
|
|
479
|
-
| Severity | Used for | Webhook prefix |
|
|
480
|
-
| --- | --- | --- |
|
|
481
|
-
| `low` | Intermediate transitions, audit reports. | `[low]` |
|
|
482
|
-
| `medium` | Operator-visible milestones: Story state transitions, story merged, run complete. | `[medium]` |
|
|
483
|
-
| `high` | Operator must act (HITL gates, Story blockers, autonomous-chain failures); body leads with `🚨 Action Required:`. | `[Action Required]` |
|
|
484
|
-
|
|
485
|
-
Two independent event-allowlist knobs in `github.notifications` (both
|
|
486
|
-
mandatory) filter each channel independently — there is no fallback chain:
|
|
487
|
-
|
|
488
|
-
- `commentEvents` — allowlist for GitHub-ticket comment posting. Default:
|
|
489
|
-
`["state-transition", "story-merged", "operator-message"]`.
|
|
490
|
-
- `webhookEvents` — allowlist for `NOTIFICATION_WEBHOOK_URL` deliveries.
|
|
491
|
-
|
|
492
|
-
`transitionTicketState` suppresses the `notify()` dispatch for low-severity
|
|
493
|
-
transitions so the comment channel sees only the medium-severity
|
|
494
|
-
Story-level events operators expect. To suppress a channel entirely, set
|
|
495
|
-
its array to `[]`.
|
|
496
|
-
|
|
497
|
-
**Webhook URL resolution.** `NOTIFICATION_WEBHOOK_URL` process env var only
|
|
498
|
-
— loaded from `.env` at the project root. It is **not** sourced from
|
|
499
|
-
`.agentrc.json` or `.mcp.json`.
|
|
500
|
-
|
|
501
|
-
Because `notify()` is called in-band from the orchestration SDK, it
|
|
502
|
-
captures state changes from `deliver-story`, the per-Story scripts
|
|
503
|
-
(`single-story-init.js`, `single-story-close.js`,
|
|
504
|
-
`single-story-confirm-merge.js`), and any script that routes through
|
|
505
|
-
`transitionTicketState`. It does **not** capture manual label clicks in the
|
|
506
|
-
GitHub UI.
|
|
507
|
-
|
|
508
|
-
### 2. Blocker / HITL notifications
|
|
509
|
-
|
|
510
|
-
Fire-and-forget webhooks fire on blocker-escalation events
|
|
511
|
-
(`agent::blocked`) and operator-attention events (PR-open hand-off, run
|
|
512
|
-
cancellation). Webhook failures never block execution.
|
|
513
|
-
|
|
514
|
-
---
|
|
515
|
-
|
|
516
|
-
## Troubleshooting
|
|
517
|
-
|
|
518
|
-
### Sub-agent CI workflow editing
|
|
519
|
-
|
|
520
|
-
Sub-agents operating under the framework's default `GITHUB_TOKEN` **cannot
|
|
521
|
-
edit files under `.github/workflows/**`** — the token does not carry the
|
|
522
|
-
`workflows` permission scope, so a push touching a workflow file is
|
|
523
|
-
rejected with:
|
|
524
|
-
|
|
525
|
-
> refusing to allow a GitHub App to create or update workflow
|
|
526
|
-
> `.github/workflows/<file>.yml` without `workflows` permission
|
|
527
|
-
|
|
528
|
-
This is a hard constraint, not a transient failure. **When a Story plans a
|
|
529
|
-
new CI gate**, route the check through a `package.json` script (add it to
|
|
530
|
-
`npm run lint` / `npm run docs:check` / `npm test`, or wire a new
|
|
531
|
-
`npm run check:<name>` script) so an existing CI job picks it up by
|
|
532
|
-
transitivity. **When a workflow file genuinely must change** (a new job, a
|
|
533
|
-
trigger change, a runner bump), the edit must be made by an operator with
|
|
534
|
-
`Workflows: Read and write` PAT permissions — see
|
|
535
|
-
[`docs/release-operations.md` § One-time PAT setup](https://github.com/dsj1984/mandrel/blob/main/docs/release-operations.md#one-time-pat-setup).
|
|
536
|
-
|
|
537
|
-
### Worktree config shadow
|
|
538
|
-
|
|
539
|
-
`helpers/deliver-story` runs inside per-Story worktrees under
|
|
540
|
-
`.worktrees/story-<id>/`. A worktree checks out the **Story branch's own
|
|
541
|
-
copy** of every repo-tracked file — including `.agentrc.json`. **Operator
|
|
542
|
-
edits made in the main checkout do NOT propagate to an already-active
|
|
543
|
-
worktree.** Symptom: you bump a runtime knob in `<main-repo>/.agentrc.json`,
|
|
544
|
-
re-run `single-story-close.js --cwd <worktree>`, and the script still uses
|
|
545
|
-
the old value. When tuning knobs mid-Story:
|
|
546
|
-
|
|
547
|
-
1. **Prefer an env-var override** when the knob exposes one (timeouts,
|
|
548
|
-
`AGENT_LOG_LEVEL`, concurrency caps) — env vars are read from your shell,
|
|
549
|
-
bypassing worktree shadow entirely.
|
|
550
|
-
2. **Edit the file inside the worktree** (`.worktrees/story-<id>/.agentrc.json`)
|
|
551
|
-
so the script sees the bump on its next read.
|
|
552
|
-
3. **Use `.agentrc.local.json`** for per-machine tuning you never commit
|
|
553
|
-
(see
|
|
554
|
-
[`configuration.md`](configuration.md#per-machine-local-overrides)) —
|
|
555
|
-
place it inside the worktree, or invoke the script with
|
|
556
|
-
`--cwd <main-repo>` so the resolver reads the main checkout's override.
|
|
557
|
-
|
|
558
|
-
Editing the main checkout's `.agentrc.json` only affects **the next**
|
|
559
|
-
`single-story-init.js` invocation, because new Story branches fork from
|
|
560
|
-
`main`'s current tip.
|
|
561
|
-
|
|
562
|
-
### `Epic: #N` refusal
|
|
563
|
-
|
|
564
|
-
`/mandrel-deliver` refuses any ticket that still carries an `Epic: #N` footer,
|
|
565
|
-
or that is neither `type::story` nor `type::epic`. This is expected — v2 has
|
|
566
|
-
no Epic *delivery* path. Close the ticket or re-plan the work as a v2 Story
|
|
567
|
-
via `/mandrel-plan --tickets <id>`.
|
|
568
|
-
|
|
569
|
-
The container Epic (ADR `20260905-5139`) does **not** soften this. Its linkage
|
|
570
|
-
runs parent→child only — the Epic body lists its children, and no Story body
|
|
571
|
-
ever gains a footer pointing back — so a ticket carrying `Epic: #N` is still a
|
|
572
|
-
v1 ticket and still refused.
|
|
573
|
-
|
|
574
|
-
---
|
|
575
|
-
|
|
576
|
-
## Quick reference
|
|
577
|
-
|
|
578
|
-
| Command | Purpose |
|
|
579
|
-
| --- | --- |
|
|
580
|
-
| `npx mandrel init` | Cold-start — install `mandrel` (if absent), `mandrel sync`, `bootstrap.js` (provisions repo + Projects V2 board, labels, branch protection), then the onboarding tail (stack detection, docs scaffolding, doctor gate, `/mandrel-plan` handoff). |
|
|
581
|
-
| `/mandrel-plan --seed "<text>"` | Plan from chat text — interrogate → author **one Story by default** → persist `type::story`. |
|
|
582
|
-
| `/mandrel-plan --seed-file <path>` | Plan from on-disk notes / a plan seed (the `/audit-to-stories` handoff). |
|
|
583
|
-
| `/mandrel-deliver <epicId>` | Deliver every open Story under a container Epic — the id expands before resolution. |
|
|
584
|
-
| `/mandrel-plan --tickets <ids>` | Analyze existing issue(s) into proper Stories (prefer an N=1 rewrite). |
|
|
585
|
-
| `/mandrel-deliver <storyId>` | Deliver one Story via `helpers/deliver-story` — `story-<id>` → PR → `main`. |
|
|
586
|
-
| `/mandrel-deliver <storyId> [<storyId>…]` | Deliver multiple Stories in `depends_on` order (resolved from live state), then run the per-run epilogue. |
|
|
587
|
-
| *helper* `helpers/deliver-story` | Per-Story engine invoked by `/mandrel-deliver`; not an operator slash command. See [`deliver-story.md`](../workflows/helpers/deliver-story.md). |
|
|
588
|
-
| `/audit-to-stories` | Convert audit findings into a plan seed / Stories → `/mandrel-plan --seed-file`. |
|
|
589
|
-
| `/qa-explore` · `/qa-assist` · `/qa-run` | Agent-led / human-led exploratory QA and the automated Gherkin harness. |
|
|
590
|
-
| `/git-deliver` | Ad-hoc delivery of working-tree changes — detects the git setup and escalates to commit, commit + push, or commit + push + PR (auto-merge armed). |
|