mandrel 1.57.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 +954 -0
- package/.agents/docs/SDLC.md +1420 -0
- package/.agents/docs/agentrc-reference.json +278 -0
- package/.agents/docs/configuration.md +1040 -0
- package/.agents/docs/workflows.md +59 -0
- package/.agents/instructions.md +384 -0
- package/.agents/personas/architect.md +107 -0
- package/.agents/personas/devops-engineer.md +36 -0
- package/.agents/personas/engineer-mobile.md +119 -0
- package/.agents/personas/engineer-web.md +110 -0
- package/.agents/personas/engineer.md +90 -0
- package/.agents/personas/product.md +88 -0
- package/.agents/personas/project-manager.md +110 -0
- package/.agents/personas/qa-engineer.md +91 -0
- package/.agents/personas/refactorer.md +110 -0
- package/.agents/personas/security-engineer.md +112 -0
- package/.agents/personas/sre.md +86 -0
- package/.agents/personas/technical-writer.md +100 -0
- package/.agents/personas/ux-designer.md +95 -0
- package/.agents/rules/api-conventions.md +75 -0
- package/.agents/rules/changelog-style.md +238 -0
- package/.agents/rules/gherkin-standards.md +146 -0
- package/.agents/rules/git-conventions.md +146 -0
- package/.agents/rules/orchestration-error-handling.md +35 -0
- package/.agents/rules/security-baseline.md +92 -0
- package/.agents/rules/shell-conventions.md +70 -0
- package/.agents/rules/test-seams.md +59 -0
- package/.agents/rules/testing-standards.md +177 -0
- package/.agents/runtime-deps.json +18 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +93 -0
- package/.agents/schemas/agentrc.schema.json +1583 -0
- package/.agents/schemas/audit-results.schema.json +69 -0
- package/.agents/schemas/audit-rules.json +134 -0
- package/.agents/schemas/audit-rules.schema.json +69 -0
- package/.agents/schemas/baselines/baseline-envelope.schema.json +44 -0
- package/.agents/schemas/baselines/bundle-size.schema.json +47 -0
- package/.agents/schemas/baselines/coverage.schema.json +50 -0
- package/.agents/schemas/baselines/crap.schema.json +52 -0
- package/.agents/schemas/baselines/duplication.schema.json +62 -0
- package/.agents/schemas/baselines/lighthouse.schema.json +59 -0
- package/.agents/schemas/baselines/lint.schema.json +47 -0
- package/.agents/schemas/baselines/maintainability.schema.json +71 -0
- package/.agents/schemas/baselines/mutation.schema.json +52 -0
- package/.agents/schemas/crap-baseline.schema.json +57 -0
- package/.agents/schemas/crap-report.schema.json +102 -0
- package/.agents/schemas/dispatch-manifest.json +232 -0
- package/.agents/schemas/epic-perf-report.schema.json +89 -0
- package/.agents/schemas/epic-spec.schema.json +183 -0
- package/.agents/schemas/friction-event.schema.json +56 -0
- package/.agents/schemas/lifecycle/README.md +18 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +13 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +13 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +13 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +13 -0
- package/.agents/schemas/lifecycle/checkpoint.written.schema.json +13 -0
- package/.agents/schemas/lifecycle/close-validate.end.schema.json +18 -0
- package/.agents/schemas/lifecycle/close-validate.start.schema.json +13 -0
- package/.agents/schemas/lifecycle/code-review.end.schema.json +30 -0
- package/.agents/schemas/lifecycle/code-review.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +14 -0
- package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.blocked.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.close.end.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.complete.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +13 -0
- package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +14 -0
- package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +17 -0
- package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +15 -0
- package/.agents/schemas/lifecycle/epic.plan.end.schema.json +18 -0
- package/.agents/schemas/lifecycle/epic.plan.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +16 -0
- package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/epic.watch.end.schema.json +28 -0
- package/.agents/schemas/lifecycle/epic.watch.start.schema.json +16 -0
- package/.agents/schemas/lifecycle/intervention.recorded.schema.json +15 -0
- package/.agents/schemas/lifecycle/ledger-record.schema.json +59 -0
- package/.agents/schemas/lifecycle/notification.emitted.schema.json +18 -0
- package/.agents/schemas/lifecycle/pr.created.schema.json +14 -0
- package/.agents/schemas/lifecycle/retro.end.schema.json +16 -0
- package/.agents/schemas/lifecycle/retro.start.schema.json +12 -0
- package/.agents/schemas/lifecycle/story.blocked.schema.json +13 -0
- package/.agents/schemas/lifecycle/story.dispatch.end.schema.json +17 -0
- package/.agents/schemas/lifecycle/story.dispatch.start.schema.json +15 -0
- package/.agents/schemas/lifecycle/story.heartbeat.schema.json +20 -0
- package/.agents/schemas/lifecycle/story.merged.schema.json +13 -0
- package/.agents/schemas/mi-report.schema.json +58 -0
- package/.agents/schemas/model-attribution.schema.json +49 -0
- package/.agents/schemas/qa-finding.schema.json +133 -0
- package/.agents/schemas/qa-ledger.schema.json +89 -0
- package/.agents/schemas/risk-verdict.schema.json +53 -0
- package/.agents/schemas/signal-event.schema.json +58 -0
- package/.agents/schemas/skill.schema.json +31 -0
- package/.agents/schemas/skills-index.schema.json +81 -0
- package/.agents/schemas/story-perf-summary.schema.json +73 -0
- package/.agents/schemas/validation-evidence.schema.json +78 -0
- package/.agents/scripts/README.md +93 -0
- package/.agents/scripts/acceptance-eval.js +284 -0
- package/.agents/scripts/acceptance-spec-reconciler.js +556 -0
- package/.agents/scripts/agents-bootstrap-github.js +634 -0
- package/.agents/scripts/analyze-execution.js +369 -0
- package/.agents/scripts/assert-branch.js +83 -0
- package/.agents/scripts/audit-labels-bootstrap.js +253 -0
- package/.agents/scripts/audit-to-stories.js +257 -0
- package/.agents/scripts/bootstrap.js +1378 -0
- package/.agents/scripts/check-baselines.js +81 -0
- package/.agents/scripts/check-dead-exports.js +311 -0
- package/.agents/scripts/check-doc-links.js +401 -0
- package/.agents/scripts/check-gherkin-placeholders.js +663 -0
- package/.agents/scripts/check-lifecycle-doc-drift.js +402 -0
- package/.agents/scripts/check-lifecycle-lint.js +379 -0
- package/.agents/scripts/check-prepush-recovery.js +90 -0
- package/.agents/scripts/check-windows-git-perf.js +138 -0
- package/.agents/scripts/cleanup-repo-test-temp.js +67 -0
- package/.agents/scripts/coverage-capture.js +112 -0
- package/.agents/scripts/detect-merges.js +111 -0
- package/.agents/scripts/diagnose-friction.js +257 -0
- package/.agents/scripts/diagnose.js +240 -0
- package/.agents/scripts/dispatcher.js +295 -0
- package/.agents/scripts/drain-pending-cleanup.js +147 -0
- package/.agents/scripts/epic-audit-prepare.js +419 -0
- package/.agents/scripts/epic-audit-recheck.js +241 -0
- package/.agents/scripts/epic-deliver-note-intervention.js +192 -0
- package/.agents/scripts/epic-deliver-preflight.js +407 -0
- package/.agents/scripts/epic-deliver-prepare.js +383 -0
- package/.agents/scripts/epic-execute-record-wave.js +463 -0
- package/.agents/scripts/epic-plan-clarity.js +201 -0
- package/.agents/scripts/epic-plan-decompose.js +79 -0
- package/.agents/scripts/epic-plan-healthcheck.js +363 -0
- package/.agents/scripts/epic-plan-spec-validate.js +111 -0
- package/.agents/scripts/epic-plan-spec.js +198 -0
- package/.agents/scripts/epic-reconcile.js +637 -0
- package/.agents/scripts/evidence-gate.js +235 -0
- package/.agents/scripts/generate-config-docs.js +516 -0
- package/.agents/scripts/generate-lifecycle-docs.js +224 -0
- package/.agents/scripts/generate-skills-index.js +252 -0
- package/.agents/scripts/generate-workflows-doc.js +168 -0
- package/.agents/scripts/git-cleanup.js +124 -0
- package/.agents/scripts/git-pr-quality-gate.js +203 -0
- package/.agents/scripts/git-rebase-and-resolve.js +234 -0
- package/.agents/scripts/hierarchy-gate.js +176 -0
- package/.agents/scripts/hydrate-context.js +179 -0
- package/.agents/scripts/install-matrix-assert.js +282 -0
- package/.agents/scripts/lib/Graph.js +326 -0
- package/.agents/scripts/lib/ITicketingProvider.js +349 -0
- package/.agents/scripts/lib/Logger.js +194 -0
- package/.agents/scripts/lib/audit-suite/cli.js +64 -0
- package/.agents/scripts/lib/audit-suite/findings.js +164 -0
- package/.agents/scripts/lib/audit-suite/frontmatter-lint.js +32 -0
- package/.agents/scripts/lib/audit-suite/frontmatter.js +110 -0
- package/.agents/scripts/lib/audit-suite/index.js +22 -0
- package/.agents/scripts/lib/audit-suite/runner.js +233 -0
- package/.agents/scripts/lib/audit-suite/selector.js +235 -0
- package/.agents/scripts/lib/audit-suite/substitutions.js +124 -0
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +49 -0
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +130 -0
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +114 -0
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +93 -0
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +265 -0
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +246 -0
- package/.agents/scripts/lib/audit-to-stories/seed-epic-from-findings.js +160 -0
- package/.agents/scripts/lib/auto-refresh-baselines.js +308 -0
- package/.agents/scripts/lib/baseline-loader.js +0 -0
- package/.agents/scripts/lib/baseline-schema-registry.js +69 -0
- package/.agents/scripts/lib/baseline-snapshot.js +716 -0
- package/.agents/scripts/lib/baselines/component-matcher.js +21 -0
- package/.agents/scripts/lib/baselines/components.js +126 -0
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +203 -0
- package/.agents/scripts/lib/baselines/duplication-scanner.js +220 -0
- package/.agents/scripts/lib/baselines/env-overrides.js +129 -0
- package/.agents/scripts/lib/baselines/envelope.js +368 -0
- package/.agents/scripts/lib/baselines/exit-codes.js +89 -0
- package/.agents/scripts/lib/baselines/git-base.js +0 -0
- package/.agents/scripts/lib/baselines/kernel.js +111 -0
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +220 -0
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +157 -0
- package/.agents/scripts/lib/baselines/kinds/coverage.js +194 -0
- package/.agents/scripts/lib/baselines/kinds/crap.js +555 -0
- package/.agents/scripts/lib/baselines/kinds/duplication.js +197 -0
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +185 -0
- package/.agents/scripts/lib/baselines/kinds/lint.js +172 -0
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +340 -0
- package/.agents/scripts/lib/baselines/kinds/mutation.js +153 -0
- package/.agents/scripts/lib/baselines/path-canon.js +279 -0
- package/.agents/scripts/lib/baselines/preview-gates.js +298 -0
- package/.agents/scripts/lib/baselines/reader.js +321 -0
- package/.agents/scripts/lib/baselines/refresh-service.js +733 -0
- package/.agents/scripts/lib/baselines/scope.js +291 -0
- package/.agents/scripts/lib/baselines/writer.js +312 -0
- package/.agents/scripts/lib/bdd-runner-detect.js +417 -0
- package/.agents/scripts/lib/bdd-scenario-scanner.js +310 -0
- package/.agents/scripts/lib/bootstrap/baselines-layout-migration.js +202 -0
- package/.agents/scripts/lib/bootstrap/branch-protection.js +222 -0
- package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +171 -0
- package/.agents/scripts/lib/bootstrap/commit-push.js +146 -0
- package/.agents/scripts/lib/bootstrap/gh-list.js +153 -0
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +306 -0
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +89 -0
- package/.agents/scripts/lib/bootstrap/install-ledger.js +174 -0
- package/.agents/scripts/lib/bootstrap/manifest.js +272 -0
- package/.agents/scripts/lib/bootstrap/merge-methods.js +108 -0
- package/.agents/scripts/lib/bootstrap/preflight.js +195 -0
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +801 -0
- package/.agents/scripts/lib/bootstrap/prompt.js +480 -0
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +370 -0
- package/.agents/scripts/lib/bootstrap/summary.js +75 -0
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +256 -0
- package/.agents/scripts/lib/branch-name-guard.js +98 -0
- package/.agents/scripts/lib/c8-cli-path.js +21 -0
- package/.agents/scripts/lib/changed-files.js +184 -0
- package/.agents/scripts/lib/checks/baseline-drift-main-checkout.js +104 -0
- package/.agents/scripts/lib/checks/core-bare-clean.js +48 -0
- package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +54 -0
- package/.agents/scripts/lib/checks/index.js +288 -0
- package/.agents/scripts/lib/checks/push-hook-parity.js +106 -0
- package/.agents/scripts/lib/checks/stale-origin-epic.js +49 -0
- package/.agents/scripts/lib/checks/state.js +558 -0
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +186 -0
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +182 -0
- package/.agents/scripts/lib/checks/windows-coverage-noise-floor.js +92 -0
- package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +81 -0
- package/.agents/scripts/lib/checks/worktree-residue-biome.js +55 -0
- package/.agents/scripts/lib/cli/parse-numeric.js +60 -0
- package/.agents/scripts/lib/cli/standard-args.js +351 -0
- package/.agents/scripts/lib/cli-args.js +286 -0
- package/.agents/scripts/lib/cli-utils.js +69 -0
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +44 -0
- package/.agents/scripts/lib/close-validation/projections/inputs.js +86 -0
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +286 -0
- package/.agents/scripts/lib/close-validation.js +897 -0
- package/.agents/scripts/lib/codebase-snapshot.js +513 -0
- package/.agents/scripts/lib/command-header.js +33 -0
- package/.agents/scripts/lib/config/acceptance-eval.js +95 -0
- package/.agents/scripts/lib/config/baselines.js +60 -0
- package/.agents/scripts/lib/config/ci.js +30 -0
- package/.agents/scripts/lib/config/commands.js +36 -0
- package/.agents/scripts/lib/config/defaults.js +119 -0
- package/.agents/scripts/lib/config/explain.js +348 -0
- package/.agents/scripts/lib/config/gates/bundle-size.schema.js +23 -0
- package/.agents/scripts/lib/config/gates/coverage.schema.js +18 -0
- package/.agents/scripts/lib/config/gates/crap.schema.js +33 -0
- package/.agents/scripts/lib/config/gates/duplication.schema.js +26 -0
- package/.agents/scripts/lib/config/gates/index.js +36 -0
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +23 -0
- package/.agents/scripts/lib/config/gates/lint.schema.js +9 -0
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +20 -0
- package/.agents/scripts/lib/config/gates/mutation.schema.js +12 -0
- package/.agents/scripts/lib/config/gates/shared.js +117 -0
- package/.agents/scripts/lib/config/github.js +122 -0
- package/.agents/scripts/lib/config/lifecycle.js +40 -0
- package/.agents/scripts/lib/config/limits.js +211 -0
- package/.agents/scripts/lib/config/paths.js +73 -0
- package/.agents/scripts/lib/config/preflight.js +58 -0
- package/.agents/scripts/lib/config/quality.js +665 -0
- package/.agents/scripts/lib/config/retro.js +77 -0
- package/.agents/scripts/lib/config/runners.js +105 -0
- package/.agents/scripts/lib/config/runtime.js +167 -0
- package/.agents/scripts/lib/config/shared.js +46 -0
- package/.agents/scripts/lib/config/sync-agentrc.js +243 -0
- package/.agents/scripts/lib/config/temp-paths.js +373 -0
- package/.agents/scripts/lib/config/validate-orchestration.js +81 -0
- package/.agents/scripts/lib/config/worktree-isolation.js +80 -0
- package/.agents/scripts/lib/config-resolver.js +298 -0
- package/.agents/scripts/lib/config-schema-shared.js +32 -0
- package/.agents/scripts/lib/config-schema.js +20 -0
- package/.agents/scripts/lib/config-settings-schema-delivery.js +332 -0
- package/.agents/scripts/lib/config-settings-schema-quality.js +165 -0
- package/.agents/scripts/lib/config-settings-schema.js +420 -0
- package/.agents/scripts/lib/coverage-baseline.js +352 -0
- package/.agents/scripts/lib/coverage-capture.js +195 -0
- package/.agents/scripts/lib/coverage-utils.js +239 -0
- package/.agents/scripts/lib/cpu-pool.js +223 -0
- package/.agents/scripts/lib/crap-engine.js +119 -0
- package/.agents/scripts/lib/crap-utils.js +479 -0
- package/.agents/scripts/lib/degraded-mode.js +69 -0
- package/.agents/scripts/lib/dependency-parser.js +129 -0
- package/.agents/scripts/lib/duplicate-search.js +189 -0
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +70 -0
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +197 -0
- package/.agents/scripts/lib/dynamic-workflow/capability.js +396 -0
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +80 -0
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +72 -0
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +90 -0
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +43 -0
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +83 -0
- package/.agents/scripts/lib/env-loader.js +52 -0
- package/.agents/scripts/lib/epic-merge-lock.js +239 -0
- package/.agents/scripts/lib/epic-plan-clarity.js +142 -0
- package/.agents/scripts/lib/epic-plan-ideation.js +228 -0
- package/.agents/scripts/lib/error-redactor.js +125 -0
- package/.agents/scripts/lib/errors/index.js +67 -0
- package/.agents/scripts/lib/feedback-loop/audit-results-graduator.js +230 -0
- package/.agents/scripts/lib/feedback-loop/code-review-graduator.js +207 -0
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +421 -0
- package/.agents/scripts/lib/feedback-loop/memory-freshness.js +480 -0
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +229 -0
- package/.agents/scripts/lib/findings/classify-finding.js +195 -0
- package/.agents/scripts/lib/findings/promote-finding.js +353 -0
- package/.agents/scripts/lib/findings/route-finding.js +283 -0
- package/.agents/scripts/lib/findings/semantic-issue-search.js +179 -0
- package/.agents/scripts/lib/findings/severity.js +102 -0
- package/.agents/scripts/lib/gates/baseline-store.js +106 -0
- package/.agents/scripts/lib/gates/friction.js +43 -0
- package/.agents/scripts/lib/gh-exec.js +553 -0
- package/.agents/scripts/lib/git/cached-fetch.js +0 -0
- package/.agents/scripts/lib/git/sync-from-base.js +162 -0
- package/.agents/scripts/lib/git-branch-cleanup.js +213 -0
- package/.agents/scripts/lib/git-branch-lifecycle.js +353 -0
- package/.agents/scripts/lib/git-merge-orchestrator.js +261 -0
- package/.agents/scripts/lib/git-utils.js +363 -0
- package/.agents/scripts/lib/github-url.js +29 -0
- package/.agents/scripts/lib/install-cmd-parser.js +51 -0
- package/.agents/scripts/lib/issue-link-parser.js +74 -0
- package/.agents/scripts/lib/json-utils.js +60 -0
- package/.agents/scripts/lib/label-constants.js +169 -0
- package/.agents/scripts/lib/label-taxonomy.js +200 -0
- package/.agents/scripts/lib/maintainability-engine.js +164 -0
- package/.agents/scripts/lib/maintainability-utils.js +343 -0
- package/.agents/scripts/lib/mandrel-catalog.js +170 -0
- package/.agents/scripts/lib/mutation/baseline-snapshot.js +238 -0
- package/.agents/scripts/lib/mutation/config-detector.js +119 -0
- package/.agents/scripts/lib/mutation/stryker-runner.js +306 -0
- package/.agents/scripts/lib/mutation/survivor-report.js +160 -0
- package/.agents/scripts/lib/notifications/notifier.js +75 -0
- package/.agents/scripts/lib/observability/active-story-env.js +182 -0
- package/.agents/scripts/lib/observability/baseline-refresh-rate.js +221 -0
- package/.agents/scripts/lib/observability/perf-aggregator.js +887 -0
- package/.agents/scripts/lib/observability/perf-report-readers.js +319 -0
- package/.agents/scripts/lib/observability/perf-report-render.js +182 -0
- package/.agents/scripts/lib/observability/signals-writer.js +296 -0
- package/.agents/scripts/lib/observability/source-classifier.js +103 -0
- package/.agents/scripts/lib/observability/tool-trace-hook.js +417 -0
- package/.agents/scripts/lib/onboard/detect-stack.js +300 -0
- package/.agents/scripts/lib/onboard/scaffold-docs.js +128 -0
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +173 -0
- package/.agents/scripts/lib/orchestration/cascade-grouping.js +275 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +131 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +80 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +132 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +142 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +149 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +158 -0
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +56 -0
- package/.agents/scripts/lib/orchestration/code-review.js +652 -0
- package/.agents/scripts/lib/orchestration/column-sync.js +286 -0
- package/.agents/scripts/lib/orchestration/context-envelope.js +280 -0
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +581 -0
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +88 -0
- package/.agents/scripts/lib/orchestration/detectors-phase.js +188 -0
- package/.agents/scripts/lib/orchestration/dispatch-engine.js +144 -0
- package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +206 -0
- package/.agents/scripts/lib/orchestration/doc-reader.js +94 -0
- package/.agents/scripts/lib/orchestration/epic-cleanup.js +473 -0
- package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +310 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/cli.js +167 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +151 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +74 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +78 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +72 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +155 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +321 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +75 -0
- package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +86 -0
- package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +235 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/authoring-context.js +197 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/cli-args.js +48 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +94 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +414 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/prompts.js +55 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +105 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +235 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +120 -0
- package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +118 -0
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +295 -0
- package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +186 -0
- package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +50 -0
- package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +146 -0
- package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +110 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +392 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +217 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +235 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter.js +69 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +32 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +291 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +175 -0
- package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +37 -0
- package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +127 -0
- package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +400 -0
- package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +285 -0
- package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +66 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +797 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +619 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +335 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +230 -0
- package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +363 -0
- package/.agents/scripts/lib/orchestration/error-journal.js +139 -0
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +31 -0
- package/.agents/scripts/lib/orchestration/file-assumptions.js +506 -0
- package/.agents/scripts/lib/orchestration/finalize/close-planning-tickets.js +116 -0
- package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +241 -0
- package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +489 -0
- package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +88 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +219 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +309 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +99 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +123 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +57 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +114 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +426 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +84 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +365 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +72 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +69 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +214 -0
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +137 -0
- package/.agents/scripts/lib/orchestration/label-transitions.js +43 -0
- package/.agents/scripts/lib/orchestration/lifecycle/bus.js +309 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +147 -0
- package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +155 -0
- package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +226 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +69 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +378 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +248 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +527 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +259 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +278 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +355 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +647 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +331 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +140 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +421 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +168 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +668 -0
- package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +322 -0
- package/.agents/scripts/lib/orchestration/lint-baseline-service.js +114 -0
- package/.agents/scripts/lib/orchestration/manifest-builder.js +216 -0
- package/.agents/scripts/lib/orchestration/model-attribution.js +390 -0
- package/.agents/scripts/lib/orchestration/parked-follow-ons.js +147 -0
- package/.agents/scripts/lib/orchestration/phase-runner.js +87 -0
- package/.agents/scripts/lib/orchestration/plan-review-routing.js +63 -0
- package/.agents/scripts/lib/orchestration/plan-runner/plan-router.js +86 -0
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +212 -0
- package/.agents/scripts/lib/orchestration/planning-context-budget.js +213 -0
- package/.agents/scripts/lib/orchestration/planning-risk.js +155 -0
- package/.agents/scripts/lib/orchestration/planning-state-manager.js +318 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +56 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +33 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +78 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +68 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +118 -0
- package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +396 -0
- package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +205 -0
- package/.agents/scripts/lib/orchestration/pr-base-guard.js +47 -0
- package/.agents/scripts/lib/orchestration/preflight-cache.js +164 -0
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +202 -0
- package/.agents/scripts/lib/orchestration/reconciler.js +137 -0
- package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +152 -0
- package/.agents/scripts/lib/orchestration/recut.js +56 -0
- package/.agents/scripts/lib/orchestration/resolves-token.js +127 -0
- package/.agents/scripts/lib/orchestration/retro/phases/checks.js +94 -0
- package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +448 -0
- package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +335 -0
- package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +133 -0
- package/.agents/scripts/lib/orchestration/retro-heuristics.js +57 -0
- package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +275 -0
- package/.agents/scripts/lib/orchestration/retro-proposals.js +395 -0
- package/.agents/scripts/lib/orchestration/retro-runner.js +171 -0
- package/.agents/scripts/lib/orchestration/review-depth.js +93 -0
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +363 -0
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +205 -0
- package/.agents/scripts/lib/orchestration/review-providers/native.js +805 -0
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +73 -0
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +396 -0
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +373 -0
- package/.agents/scripts/lib/orchestration/review-providers/types.js +89 -0
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +107 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +159 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +194 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +81 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +190 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +70 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +106 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +42 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +73 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +225 -0
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +315 -0
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +149 -0
- package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +110 -0
- package/.agents/scripts/lib/orchestration/spec-freshness.js +320 -0
- package/.agents/scripts/lib/orchestration/spec-renderer.js +456 -0
- package/.agents/scripts/lib/orchestration/spec-section-validator.js +80 -0
- package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +797 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +163 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +152 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +387 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +266 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +48 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +67 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +161 -0
- package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +117 -0
- package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +86 -0
- package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +147 -0
- package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +142 -0
- package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +62 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix-scoped.js +221 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix-shared.js +123 -0
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +216 -0
- package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +636 -0
- package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +198 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +105 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/close.js +222 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +220 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +291 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +234 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +110 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +86 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +112 -0
- package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +157 -0
- package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +434 -0
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +290 -0
- package/.agents/scripts/lib/orchestration/story-close-recovery.js +643 -0
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +67 -0
- package/.agents/scripts/lib/orchestration/task-body-validator.js +391 -0
- package/.agents/scripts/lib/orchestration/ticket-lease.js +358 -0
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +783 -0
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +367 -0
- package/.agents/scripts/lib/orchestration/ticket-validator.js +691 -0
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +723 -0
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +474 -0
- package/.agents/scripts/lib/orchestration/ticketing/state.js +559 -0
- package/.agents/scripts/lib/orchestration/ticketing.js +55 -0
- package/.agents/scripts/lib/orchestration/wave-marker.js +28 -0
- package/.agents/scripts/lib/orchestration/wave-record-io.js +277 -0
- package/.agents/scripts/lib/orchestration/wave-record-notifications.js +189 -0
- package/.agents/scripts/lib/orchestration/wave-record-projection.js +423 -0
- package/.agents/scripts/lib/path-security.js +25 -0
- package/.agents/scripts/lib/plan-phase-cleanup.js +125 -0
- package/.agents/scripts/lib/preflight-runner.js +196 -0
- package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +95 -0
- package/.agents/scripts/lib/presentation/manifest-builder.js +245 -0
- package/.agents/scripts/lib/presentation/manifest-formatter.js +243 -0
- package/.agents/scripts/lib/presentation/manifest-helpers.js +213 -0
- package/.agents/scripts/lib/presentation/manifest-persistence.js +262 -0
- package/.agents/scripts/lib/presentation/manifest-procedures.js +55 -0
- package/.agents/scripts/lib/presentation/manifest-render-waves.js +252 -0
- package/.agents/scripts/lib/presentation/manifest-renderer.js +188 -0
- package/.agents/scripts/lib/presentation/manifest-story-views.js +119 -0
- package/.agents/scripts/lib/provider-factory.js +80 -0
- package/.agents/scripts/lib/push-epic-retry.js +209 -0
- package/.agents/scripts/lib/qa/console-allowlist.js +151 -0
- package/.agents/scripts/lib/qa/coverage-report.js +181 -0
- package/.agents/scripts/lib/qa/coverage-verdict.js +296 -0
- package/.agents/scripts/lib/qa/propose-missing-test.js +95 -0
- package/.agents/scripts/lib/qa/qa-context-hydrator.js +296 -0
- package/.agents/scripts/lib/qa/qa-session.js +197 -0
- package/.agents/scripts/lib/qa/redact-evidence.js +245 -0
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +190 -0
- package/.agents/scripts/lib/qa/resolve-selection.js +373 -0
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +100 -0
- package/.agents/scripts/lib/runtime-deps/manifest.js +96 -0
- package/.agents/scripts/lib/runtime-deps/preflight.js +78 -0
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +202 -0
- package/.agents/scripts/lib/signals/detectors/common.js +36 -0
- package/.agents/scripts/lib/signals/detectors/hotspot.js +298 -0
- package/.agents/scripts/lib/signals/detectors/index.js +14 -0
- package/.agents/scripts/lib/signals/detectors/retry.js +289 -0
- package/.agents/scripts/lib/signals/detectors/rework.js +204 -0
- package/.agents/scripts/lib/signals/index.js +39 -0
- package/.agents/scripts/lib/signals/read.js +268 -0
- package/.agents/scripts/lib/signals/schema.js +225 -0
- package/.agents/scripts/lib/signals/span-tree.js +290 -0
- package/.agents/scripts/lib/signals/write.js +19 -0
- package/.agents/scripts/lib/single-story/confirm-merge.js +201 -0
- package/.agents/scripts/lib/single-story/story-merged-notify.js +126 -0
- package/.agents/scripts/lib/single-story-sweep/protection.js +274 -0
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +169 -0
- package/.agents/scripts/lib/single-story-sweep.js +329 -0
- package/.agents/scripts/lib/skills/parse-skill.js +202 -0
- package/.agents/scripts/lib/skills/walk-skill-files.js +56 -0
- package/.agents/scripts/lib/spec/index.js +36 -0
- package/.agents/scripts/lib/spec/loader.js +425 -0
- package/.agents/scripts/lib/spec/state.js +217 -0
- package/.agents/scripts/lib/story-body/story-body.js +743 -0
- package/.agents/scripts/lib/story-init/blocker-validator.js +68 -0
- package/.agents/scripts/lib/story-init/branch-initializer.js +422 -0
- package/.agents/scripts/lib/story-init/context-resolver.js +92 -0
- package/.agents/scripts/lib/story-init/donor-precheck.js +207 -0
- package/.agents/scripts/lib/story-init/hierarchy-tracer.js +36 -0
- package/.agents/scripts/lib/story-init/state-transitioner.js +80 -0
- package/.agents/scripts/lib/story-init/task-graph-builder.js +114 -0
- package/.agents/scripts/lib/story-init/transition-summary.js +34 -0
- package/.agents/scripts/lib/story-lifecycle.js +186 -0
- package/.agents/scripts/lib/story-plan.js +246 -0
- package/.agents/scripts/lib/task-utils.js +26 -0
- package/.agents/scripts/lib/templates/decomposer-prompts.js +168 -0
- package/.agents/scripts/lib/test-env.js +30 -0
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +52 -0
- package/.agents/scripts/lib/test-isolate/list-files.js +90 -0
- package/.agents/scripts/lib/test-isolate/parse-tap.js +75 -0
- package/.agents/scripts/lib/test-isolate/runner.js +483 -0
- package/.agents/scripts/lib/test-profile/parse-tap.js +136 -0
- package/.agents/scripts/lib/test-profile/render-report.js +45 -0
- package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +35 -0
- package/.agents/scripts/lib/test-tiers.js +94 -0
- package/.agents/scripts/lib/util/concurrent-map.js +59 -0
- package/.agents/scripts/lib/util/phase-timer-state.js +72 -0
- package/.agents/scripts/lib/util/phase-timer.js +163 -0
- package/.agents/scripts/lib/util/poll-loop.js +86 -0
- package/.agents/scripts/lib/util/with-timeout.js +32 -0
- package/.agents/scripts/lib/validation-evidence.js +323 -0
- package/.agents/scripts/lib/wave-runner/tick.js +665 -0
- package/.agents/scripts/lib/wave-runner/wave-checkpoint.js +91 -0
- package/.agents/scripts/lib/wave-runner/wave-runner-error.js +19 -0
- package/.agents/scripts/lib/workers/crap-worker.js +197 -0
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +137 -0
- package/.agents/scripts/lib/workers/maintainability-worker.js +79 -0
- package/.agents/scripts/lib/workspace-provisioner.js +189 -0
- package/.agents/scripts/lib/worktree/bootstrapper.js +48 -0
- package/.agents/scripts/lib/worktree/inspector.js +140 -0
- package/.agents/scripts/lib/worktree/lifecycle/creation.js +118 -0
- package/.agents/scripts/lib/worktree/lifecycle/drift-detection.js +62 -0
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +276 -0
- package/.agents/scripts/lib/worktree/lifecycle/gc.js +49 -0
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +178 -0
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +264 -0
- package/.agents/scripts/lib/worktree/lifecycle/precheck.js +100 -0
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +588 -0
- package/.agents/scripts/lib/worktree/lifecycle/registry-sync.js +124 -0
- package/.agents/scripts/lib/worktree/lifecycle/shared.js +26 -0
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +40 -0
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +349 -0
- package/.agents/scripts/lib/worktree-manager.js +243 -0
- package/.agents/scripts/lifecycle-diff.js +206 -0
- package/.agents/scripts/lifecycle-emit-story-dispatch.js +194 -0
- package/.agents/scripts/lifecycle-emit.js +479 -0
- package/.agents/scripts/lint-baseline.js +507 -0
- package/.agents/scripts/lint-label-vocabulary.js +237 -0
- package/.agents/scripts/loc-delta.js +205 -0
- package/.agents/scripts/notify.js +307 -0
- package/.agents/scripts/package.json +3 -0
- package/.agents/scripts/post-structured-comment.js +127 -0
- package/.agents/scripts/pr-watch-with-update.js +152 -0
- package/.agents/scripts/providers/github/auth.js +65 -0
- package/.agents/scripts/providers/github/board-add.js +63 -0
- package/.agents/scripts/providers/github/branch-protection.js +186 -0
- package/.agents/scripts/providers/github/cache.js +72 -0
- package/.agents/scripts/providers/github/comments.js +131 -0
- package/.agents/scripts/providers/github/compose.js +111 -0
- package/.agents/scripts/providers/github/errors.js +242 -0
- package/.agents/scripts/providers/github/issues.js +242 -0
- package/.agents/scripts/providers/github/labels.js +179 -0
- package/.agents/scripts/providers/github/mappers.js +126 -0
- package/.agents/scripts/providers/github/merge-methods.js +82 -0
- package/.agents/scripts/providers/github/project-board.js +47 -0
- package/.agents/scripts/providers/github/projects-v2-graphql.js +472 -0
- package/.agents/scripts/providers/github/prs.js +103 -0
- package/.agents/scripts/providers/github/request-helpers.js +110 -0
- package/.agents/scripts/providers/github/sub-issues.js +369 -0
- package/.agents/scripts/providers/github/tickets.js +381 -0
- package/.agents/scripts/providers/github/transient-retry.js +62 -0
- package/.agents/scripts/providers/github.js +157 -0
- package/.agents/scripts/quality-preview.js +327 -0
- package/.agents/scripts/quality-watch.js +223 -0
- package/.agents/scripts/render-manifest.js +143 -0
- package/.agents/scripts/resync-status-column.js +176 -0
- package/.agents/scripts/retro-run.js +167 -0
- package/.agents/scripts/run-audit-suite.js +97 -0
- package/.agents/scripts/run-coverage.js +103 -0
- package/.agents/scripts/run-lint.js +94 -0
- package/.agents/scripts/run-test-profile.js +126 -0
- package/.agents/scripts/run-tests.js +185 -0
- package/.agents/scripts/run-verify.js +56 -0
- package/.agents/scripts/select-audits.js +155 -0
- package/.agents/scripts/signals-view.js +294 -0
- package/.agents/scripts/single-story-close.js +83 -0
- package/.agents/scripts/single-story-confirm-merge.js +183 -0
- package/.agents/scripts/single-story-init.js +692 -0
- package/.agents/scripts/stories-wave-tick.js +415 -0
- package/.agents/scripts/story-close.js +246 -0
- package/.agents/scripts/story-deliver-prepare.js +267 -0
- package/.agents/scripts/story-init.js +516 -0
- package/.agents/scripts/story-phase.js +327 -0
- package/.agents/scripts/story-plan.js +284 -0
- package/.agents/scripts/sync-agentrc.js +71 -0
- package/.agents/scripts/sync-branch-from-base.js +138 -0
- package/.agents/scripts/sync-claude-commands.js +151 -0
- package/.agents/scripts/test-isolate.js +222 -0
- package/.agents/scripts/test-wrapper.js +108 -0
- package/.agents/scripts/update-coverage-baseline.js +129 -0
- package/.agents/scripts/update-crap-baseline.js +177 -0
- package/.agents/scripts/update-duplication-baseline.js +134 -0
- package/.agents/scripts/update-maintainability-baseline.js +183 -0
- package/.agents/scripts/update-mutation-baseline.js +189 -0
- package/.agents/scripts/update-ticket-state.js +107 -0
- package/.agents/scripts/validate-docs-freshness.js +259 -0
- package/.agents/scripts/validate-skills.js +278 -0
- package/.agents/scripts/wave-tick.js +335 -0
- package/.agents/skills/core/analyze-execution/SKILL.md +98 -0
- package/.agents/skills/core/api-and-interface-design/SKILL.md +327 -0
- package/.agents/skills/core/baseline-refresh/SKILL.md +181 -0
- package/.agents/skills/core/browser-testing-with-devtools/SKILL.md +352 -0
- package/.agents/skills/core/ci-cd-and-automation/SKILL.md +274 -0
- package/.agents/skills/core/ci-cd-and-automation/examples.md +211 -0
- package/.agents/skills/core/code-review-and-quality/SKILL.md +421 -0
- package/.agents/skills/core/code-simplification/SKILL.md +389 -0
- package/.agents/skills/core/context-engineering/SKILL.md +309 -0
- package/.agents/skills/core/context-engineering/examples.md +58 -0
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +338 -0
- package/.agents/skills/core/deprecation-and-migration/SKILL.md +250 -0
- package/.agents/skills/core/diagnose-friction/SKILL.md +79 -0
- package/.agents/skills/core/documentation-and-adrs/SKILL.md +323 -0
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +145 -0
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +425 -0
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +393 -0
- package/.agents/skills/core/frontend-ui-engineering/SKILL.md +357 -0
- package/.agents/skills/core/git-workflow-and-versioning/SKILL.md +352 -0
- package/.agents/skills/core/hydrate-context/SKILL.md +118 -0
- package/.agents/skills/core/idea-refinement/SKILL.md +317 -0
- package/.agents/skills/core/idea-refinement/examples.md +437 -0
- package/.agents/skills/core/idea-refinement/frameworks.md +135 -0
- package/.agents/skills/core/idea-refinement/refinement-criteria.md +155 -0
- package/.agents/skills/core/idea-refinement/scripts/idea-refine.sh +15 -0
- package/.agents/skills/core/incremental-implementation/SKILL.md +271 -0
- package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +213 -0
- package/.agents/skills/core/knowledge-transfer/SKILL.md +175 -0
- package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +117 -0
- package/.agents/skills/core/performance-optimization/SKILL.md +314 -0
- package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +277 -0
- package/.agents/skills/core/property-based-testing/SKILL.md +148 -0
- package/.agents/skills/core/qa-coverage-mapping/SKILL.md +105 -0
- package/.agents/skills/core/refactoring-discipline/SKILL.md +111 -0
- package/.agents/skills/core/scope-triage/SKILL.md +127 -0
- package/.agents/skills/core/security-and-hardening/SKILL.md +400 -0
- package/.agents/skills/core/shipping-and-launch/SKILL.md +328 -0
- package/.agents/skills/core/spec-driven-development/SKILL.md +252 -0
- package/.agents/skills/core/test-driven-development/SKILL.md +475 -0
- package/.agents/skills/core/using-agent-skills/SKILL.md +232 -0
- package/.agents/skills/skills.index.json +596 -0
- package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +31 -0
- package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +51 -0
- package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +48 -0
- package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +31 -0
- package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +33 -0
- package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +31 -0
- package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +51 -0
- package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +54 -0
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +29 -0
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +30 -0
- package/.agents/skills/stack/backend/stripe-integration/SKILL.md +57 -0
- package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +9 -0
- package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +48 -0
- package/.agents/skills/stack/frontend/astro/SKILL.md +62 -0
- package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +30 -0
- package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +29 -0
- package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +50 -0
- package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +58 -0
- package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +34 -0
- package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +51 -0
- package/.agents/skills/stack/qa/gherkin-authoring/SKILL.md +257 -0
- package/.agents/skills/stack/qa/gherkin-authoring/examples/invoice-issue.feature +41 -0
- package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +199 -0
- package/.agents/skills/stack/qa/playwright/SKILL.md +50 -0
- package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +188 -0
- package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +142 -0
- package/.agents/skills/stack/qa/qa-harness/SKILL.md +220 -0
- package/.agents/skills/stack/qa/vitest/SKILL.md +51 -0
- package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +68 -0
- package/.agents/starter-agentrc.json +22 -0
- package/.agents/templates/agent-protocol.md +72 -0
- package/.agents/templates/docs/architecture.md +30 -0
- package/.agents/templates/docs/decisions.md +24 -0
- package/.agents/templates/epic-from-idea.md +21 -0
- package/.agents/templates/single-story-body.md +17 -0
- package/.agents/workflows/agents-update.md +415 -0
- package/.agents/workflows/audit-architecture.md +312 -0
- package/.agents/workflows/audit-clean-code.md +179 -0
- package/.agents/workflows/audit-dependencies.md +91 -0
- package/.agents/workflows/audit-devops.md +110 -0
- package/.agents/workflows/audit-lighthouse.md +260 -0
- package/.agents/workflows/audit-performance.md +161 -0
- package/.agents/workflows/audit-privacy.md +104 -0
- package/.agents/workflows/audit-quality.md +191 -0
- package/.agents/workflows/audit-security.md +156 -0
- package/.agents/workflows/audit-seo.md +118 -0
- package/.agents/workflows/audit-sre.md +139 -0
- package/.agents/workflows/audit-to-stories.md +257 -0
- package/.agents/workflows/audit-ux-ui.md +102 -0
- package/.agents/workflows/epic-deliver.md +864 -0
- package/.agents/workflows/epic-plan.md +998 -0
- package/.agents/workflows/explain.md +118 -0
- package/.agents/workflows/git-cleanup.md +250 -0
- package/.agents/workflows/git-commit-all.md +15 -0
- package/.agents/workflows/git-merge-pr.md +377 -0
- package/.agents/workflows/git-pr-all.md +278 -0
- package/.agents/workflows/git-push.md +60 -0
- package/.agents/workflows/helpers/_merge-conflict-template.md +54 -0
- package/.agents/workflows/helpers/acceptance-self-eval.md +74 -0
- package/.agents/workflows/helpers/agents-sync-config.md +129 -0
- package/.agents/workflows/helpers/code-quality-guardrails.md +101 -0
- package/.agents/workflows/helpers/code-review.md +370 -0
- package/.agents/workflows/helpers/diagnose.md +117 -0
- package/.agents/workflows/helpers/epic-audit.md +295 -0
- package/.agents/workflows/helpers/epic-deliver-story.md +370 -0
- package/.agents/workflows/helpers/epic-plan-decompose.md +199 -0
- package/.agents/workflows/helpers/epic-plan-spec.md +184 -0
- package/.agents/workflows/helpers/epic-testing.md +125 -0
- package/.agents/workflows/helpers/parallel-tooling.md +88 -0
- package/.agents/workflows/helpers/signals.md +112 -0
- package/.agents/workflows/helpers/single-story-deliver.md +636 -0
- package/.agents/workflows/helpers/worktree-lifecycle.md +317 -0
- package/.agents/workflows/onboard.md +207 -0
- package/.agents/workflows/qa-assist.md +293 -0
- package/.agents/workflows/qa-explore.md +350 -0
- package/.agents/workflows/qa-run-harness.md +288 -0
- package/.agents/workflows/story-deliver.md +327 -0
- package/.agents/workflows/story-plan.md +233 -0
- package/LICENSE +21 -0
- package/README.md +193 -0
- package/bin/mandrel.js +56 -0
- package/bin/postinstall.js +195 -0
- package/lib/cli/__tests__/migrate.test.js +268 -0
- package/lib/cli/__tests__/sync-local-zone.test.js +247 -0
- package/lib/cli/__tests__/sync.test.js +372 -0
- package/lib/cli/__tests__/update-major.test.js +217 -0
- package/lib/cli/__tests__/update.test.js +696 -0
- package/lib/cli/__tests__/version-check.test.js +398 -0
- package/lib/cli/doctor.js +124 -0
- package/lib/cli/explain.js +107 -0
- package/lib/cli/migrate.js +260 -0
- package/lib/cli/registry.js +830 -0
- package/lib/cli/sync-commands.js +50 -0
- package/lib/cli/sync.js +200 -0
- package/lib/cli/uninstall.js +795 -0
- package/lib/cli/update.js +854 -0
- package/lib/cli/version-check.js +206 -0
- package/lib/migrations/README.md +69 -0
- package/lib/migrations/__tests__/index.test.js +216 -0
- package/lib/migrations/index.js +164 -0
- package/package.json +105 -0
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Drive Gherkin scenarios through a real browser as an agent-driven QA sweep
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /qa-run-harness
|
|
6
|
+
|
|
7
|
+
Execute a consumer's Gherkin `.feature` scenarios through a **real browser**
|
|
8
|
+
(the chrome-devtools MCP surface), with the agent acting as the step executor
|
|
9
|
+
and a human observing. The harness resolves the consumer's `qa` contract,
|
|
10
|
+
selects a concrete scenario set, signs in via the configured seam, navigates
|
|
11
|
+
**from a root** to drive each `Given/When/Then`, and asserts `Then` outcomes
|
|
12
|
+
**semantically** against the accessibility snapshot. Per-surface console and
|
|
13
|
+
network are instrumented into structured findings; findings are bundled into a
|
|
14
|
+
follow-up **draft** for operator sign-off — the harness never files tickets
|
|
15
|
+
autonomously.
|
|
16
|
+
|
|
17
|
+
This workflow is the agent-driven successor to the framework's earlier
|
|
18
|
+
headless BDD runner. It is a **prose workflow**, not a Node orchestrator: the host LLM
|
|
19
|
+
executes the procedure; deterministic Node helpers under
|
|
20
|
+
`.agents/scripts/lib/qa/` do only contract resolution, scenario selection, and
|
|
21
|
+
console filtering.
|
|
22
|
+
|
|
23
|
+
> **When to run**: During sprint testing to exercise a targeted slice of the
|
|
24
|
+
> acceptance suite (a feature, a tag expression, or a domain), for regression
|
|
25
|
+
> passes before `/epic-deliver`, or on demand while debugging a Story's
|
|
26
|
+
> user-visible behavior in a live browser.
|
|
27
|
+
>
|
|
28
|
+
> **Persona**: `qa-engineer` · **Skills**: `stack/qa/gherkin-authoring`,
|
|
29
|
+
> `stack/qa/playwright-bdd` (authoring reference; this harness owns execution)
|
|
30
|
+
|
|
31
|
+
## Slash Command
|
|
32
|
+
|
|
33
|
+
```text
|
|
34
|
+
/qa-run-harness <selector>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Arguments
|
|
38
|
+
|
|
39
|
+
| Name | Required | Shape / Example | Notes |
|
|
40
|
+
| ---------- | -------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
41
|
+
| `selector` | yes | `feature:login`, `tag:@smoke and not @wip`, `domain:billing` | Scopes the sweep to a concrete scenario set. One of three kinds — see below. |
|
|
42
|
+
|
|
43
|
+
The selector is resolved by
|
|
44
|
+
[`resolve-selection.js`](../scripts/lib/qa/resolve-selection.js) into a
|
|
45
|
+
deterministic, `(file, line)`-sorted scenario set under the contract's
|
|
46
|
+
`featureRoot`. The three kinds map to that resolver's selector shapes:
|
|
47
|
+
|
|
48
|
+
- **`feature:<id>`** → `{ kind: 'feature', id }` — the single `.feature` file
|
|
49
|
+
whose `featureRoot`-relative path stem (or basename) equals the id
|
|
50
|
+
(case-insensitive). Ambiguous ids throw; qualify with a relative path.
|
|
51
|
+
- **`tag:<expression>`** → `{ kind: 'tag', expression }` — the scenario set
|
|
52
|
+
whose tags satisfy the cucumber boolean expression (`@tag` atoms with
|
|
53
|
+
`and` / `or` / `not` and parentheses). Quote expressions that contain
|
|
54
|
+
spaces.
|
|
55
|
+
- **`domain:<name>`** → `{ kind: 'domain', name }` — every scenario under the
|
|
56
|
+
`featureRoot`-relative subdirectory `name`.
|
|
57
|
+
|
|
58
|
+
### Examples
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
/qa-run-harness feature:login
|
|
62
|
+
/qa-run-harness "tag:@smoke and not @wip"
|
|
63
|
+
/qa-run-harness domain:billing
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The canonical tag taxonomy — `@smoke`, `@risk-high`, `@platform-web`,
|
|
67
|
+
`@platform-mobile`, `@domain-*`, and the allowed extension syntax — is defined
|
|
68
|
+
in `.agents/rules/gherkin-standards.md`. Do not invent tags inside a feature
|
|
69
|
+
file; add new tags to the rule first.
|
|
70
|
+
|
|
71
|
+
## Step 0 — Resolve the `qa` contract (fail loudly when absent)
|
|
72
|
+
|
|
73
|
+
The harness is meaningless without the consumer's `qa` contract block in
|
|
74
|
+
`.agentrc.json`. Resolve it through the single seam
|
|
75
|
+
[`resolve-qa-contract.js`](../scripts/lib/qa/resolve-qa-contract.js) **before
|
|
76
|
+
any browser work**:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
node -e "import('./.agents/scripts/lib/qa/resolve-qa-contract.js').then(async (m) => { const { resolveConfig } = await import('./.agents/scripts/config-resolver.js'); const cfg = await resolveConfig(); console.log(JSON.stringify(m.resolveQaContract(cfg), null, 2)); })"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
(Use whatever config-resolution entry point the host exposes; the contract
|
|
83
|
+
seam is `resolveQaContract(config)`.) The resolver returns the normalized
|
|
84
|
+
contract:
|
|
85
|
+
|
|
86
|
+
| Field | Use |
|
|
87
|
+
| ------------------ | ------------------------------------------------------------------------- |
|
|
88
|
+
| `featureRoot` | Root passed to `resolve-selection.js` for scenario discovery. |
|
|
89
|
+
| `fixturesManifest` | Persona → seed binding loaded before sign-in. |
|
|
90
|
+
| `signInSeam` | `{ kind: 'url', template }` **or** `{ kind: 'skill', skill }` — see Step 2. |
|
|
91
|
+
| `personas` | Canonical object map keyed by persona name (`personaNames` lists the names). Authored as a plain name array under a `urlTemplate` seam, or as a per-persona credential/skill map under a `skill` (or credential) seam — see Step 2. |
|
|
92
|
+
| `consoleAllowlist` | Inline benign-console patterns (default `[]`) — see Step 4. |
|
|
93
|
+
| `designTokens` | Pointer to the token/style source for visual inspection (default `null`). |
|
|
94
|
+
|
|
95
|
+
### Loud-failure path (no `qa` block)
|
|
96
|
+
|
|
97
|
+
`resolveQaContract` **throws** — there is no silent fallback to
|
|
98
|
+
auto-detection — in three cases:
|
|
99
|
+
|
|
100
|
+
- **Block absent** (no `qa` key, or an empty `qa: {}` with no harness-required
|
|
101
|
+
fields): the error reads
|
|
102
|
+
_"qa: this project has not bound the QA harness — add a `qa` block to
|
|
103
|
+
.agentrc.json (featureRoot, fixturesManifest, signInSeam, personas) before
|
|
104
|
+
invoking the QA harness."_
|
|
105
|
+
- **Malformed shape** (wrong-typed field, unknown field): the error names the
|
|
106
|
+
offending field, e.g. `qa.featureRoot must be a string`.
|
|
107
|
+
- **Missing required field**: the error names the first missing field.
|
|
108
|
+
|
|
109
|
+
When you hit any of these, **STOP immediately**. Relay the resolver's
|
|
110
|
+
verbatim message to the operator as the harness's terminal output and do not
|
|
111
|
+
proceed to browser execution. Do not invent a `featureRoot`, do not guess a
|
|
112
|
+
sign-in seam, and do not fall back to any retired headless BDD runner. The
|
|
113
|
+
loud failure is the contract: a consumer that has not bound the harness has
|
|
114
|
+
not opted into it.
|
|
115
|
+
|
|
116
|
+
### MCP availability check
|
|
117
|
+
|
|
118
|
+
The chrome-devtools MCP surface (`navigate_page`, `take_snapshot`, `click`,
|
|
119
|
+
`fill_form`, `evaluate_script`, `wait_for`, `list_console_messages`,
|
|
120
|
+
`list_network_requests`) is **host-provided** — it is an external runtime
|
|
121
|
+
dependency, not in-repo code. If the host does not expose it, degrade with a
|
|
122
|
+
clear error ("the chrome-devtools MCP server is unavailable; the QA harness
|
|
123
|
+
requires a live browser surface") and stop. Do not attempt a headless
|
|
124
|
+
fallback.
|
|
125
|
+
|
|
126
|
+
## Step 1 — Select the scenario set
|
|
127
|
+
|
|
128
|
+
Pass the parsed `selector` and the contract's `featureRoot` to
|
|
129
|
+
[`resolveSelection`](../scripts/lib/qa/resolve-selection.js). It returns
|
|
130
|
+
`{ kind, featureRoot, files, scenarios }` where `scenarios` is the
|
|
131
|
+
`(file, line)`-sorted set the sweep will execute. Determinism is load-bearing:
|
|
132
|
+
re-running the same selector across sweeps scopes the identical set, so the
|
|
133
|
+
evidence stays diffable.
|
|
134
|
+
|
|
135
|
+
Load the `fixturesManifest` to resolve each persona's seed data before
|
|
136
|
+
sign-in. If the selection is empty, report "no scenarios matched
|
|
137
|
+
`<selector>`" and stop — an empty selection is operator error (a typo'd
|
|
138
|
+
feature id or domain), not a passing sweep.
|
|
139
|
+
|
|
140
|
+
## Step 2 — Sign in via the `signInSeam`
|
|
141
|
+
|
|
142
|
+
Sign in **once per persona** before driving that persona's scenarios, using
|
|
143
|
+
the contract's discriminated-union seam:
|
|
144
|
+
|
|
145
|
+
- **`kind: 'url'`** — substitute `{persona}` into `template` (e.g.
|
|
146
|
+
`/dev/sign-in-as/{persona}` → `/dev/sign-in-as/admin`) and `navigate_page`
|
|
147
|
+
to the resulting dev seam URL. This is a dev-only seam; **no real
|
|
148
|
+
credentials** are ever entered. The persona **name** (a `personaNames`
|
|
149
|
+
entry) is the **sole input** the seam consumes — per-persona auth material
|
|
150
|
+
is neither needed nor read here, so under a `urlTemplate` seam the contract
|
|
151
|
+
is authored as a plain name array (`personas: ["athlete", "coach"]`).
|
|
152
|
+
- **`kind: 'skill'`** — invoke the named consumer skill for procedural
|
|
153
|
+
(multi-step or non-URL) sign-in. Read the skill's `SKILL.md` and follow it.
|
|
154
|
+
|
|
155
|
+
### Which seam kinds consult per-persona material
|
|
156
|
+
|
|
157
|
+
Per-persona auth material (`credentialRef` / `signInSkill`, authored via the
|
|
158
|
+
object-map `personas` shape) is consulted **only** under a `skill` or
|
|
159
|
+
credential seam, where the sign-in procedure needs a stored credential
|
|
160
|
+
reference or a per-persona sign-in skill. Under a `urlTemplate`
|
|
161
|
+
dev-impersonation seam the persona name is the only input, so the material is
|
|
162
|
+
never read — author name-only personas there rather than fabricating
|
|
163
|
+
`credentialRef`/`signInSkill` values the harness ignores. The resolver
|
|
164
|
+
normalizes both authored shapes to one canonical object map keyed by persona
|
|
165
|
+
name; a name-only persona resolves to an empty record (no auth material).
|
|
166
|
+
|
|
167
|
+
After sign-in, confirm the authenticated state with a `take_snapshot`
|
|
168
|
+
(e.g. the user menu or persona badge is present) before driving any scenario.
|
|
169
|
+
|
|
170
|
+
## Step 3 — Drive each scenario (navigation-first, semantic Then)
|
|
171
|
+
|
|
172
|
+
For each scenario in selection order, drive its `Given/When/Then` steps
|
|
173
|
+
through the browser. Two rules are **non-negotiable**:
|
|
174
|
+
|
|
175
|
+
### Navigation-first — never URL-jump
|
|
176
|
+
|
|
177
|
+
Start every scenario at a **root** (the app's home/dashboard after sign-in)
|
|
178
|
+
and reach the surface under test **only by navigating UI affordances** — click
|
|
179
|
+
nav links, menu items, buttons, and follow the same paths a real user would.
|
|
180
|
+
**Never** `navigate_page` directly to a deep link to set up a `Given`. URL-
|
|
181
|
+
jumping bypasses the app's real authorization and routing flows, which both
|
|
182
|
+
masks access-control gaps and produces findings that do not reflect a user-
|
|
183
|
+
reachable state. Driving via affordances keeps the agent inside the app's
|
|
184
|
+
genuine flows and surfaces broken navigation, guard redirects, and dead links
|
|
185
|
+
as findings rather than hiding them.
|
|
186
|
+
|
|
187
|
+
Map the Gherkin steps to browser actions:
|
|
188
|
+
|
|
189
|
+
- **`Given`** — establish state by navigating from the root via affordances
|
|
190
|
+
(sign in as the persona, navigate to the starting surface, seed via UI where
|
|
191
|
+
the manifest does not pre-seed).
|
|
192
|
+
- **`When`** — perform the user action: `click`, `fill_form`,
|
|
193
|
+
`evaluate_script` (only for app-provided hooks, never to fabricate the
|
|
194
|
+
outcome), then `wait_for` the resulting transition.
|
|
195
|
+
- **`Then`** — assert the outcome semantically (below).
|
|
196
|
+
|
|
197
|
+
### Semantic Then assertion against the accessibility snapshot
|
|
198
|
+
|
|
199
|
+
Assert every `Then` **semantically** against the accessibility snapshot from
|
|
200
|
+
`take_snapshot` — match on roles, accessible names, labels, and visible text
|
|
201
|
+
that express the user-visible outcome ("a banner with text _Invoice sent_ is
|
|
202
|
+
visible", "a row for _ACME Corp_ appears in the invoices table"). **Do not**
|
|
203
|
+
assert against brittle DOM/CSS/XPath selectors, and **do not** assert on HTTP
|
|
204
|
+
status codes, response bodies, or DB rows — those are contract-tier concerns
|
|
205
|
+
that belong in contract tests, not in a user-journey sweep (see
|
|
206
|
+
`.agents/rules/testing-standards.md` § Assertion Placement). A `Then` that can
|
|
207
|
+
only be expressed as a wire-shape or DB check is a signal the scenario is
|
|
208
|
+
mis-tiered, not a reason to break the semantic rule.
|
|
209
|
+
|
|
210
|
+
Before driving each scenario, state its **business intent** in one
|
|
211
|
+
plain-English line, derived from the `Scenario:` name and its
|
|
212
|
+
`Given/When/Then` (what the user is trying to do and the outcome that proves
|
|
213
|
+
it) — e.g. "a signed-in coach reaches their own team-management surface".
|
|
214
|
+
Then record the scenario's result (pass / fail / blocked) with the surface it
|
|
215
|
+
ended on and a one-line user-visible symptom for any failure. State the
|
|
216
|
+
intent for **every** scenario, not only failures. Keep it to one line sourced
|
|
217
|
+
from the `Scenario:` name and steps — the `.feature` file is the source of
|
|
218
|
+
truth; do not paraphrase every step or leak implementation detail.
|
|
219
|
+
|
|
220
|
+
## Step 4 — Instrument & inspect (findings)
|
|
221
|
+
|
|
222
|
+
Per surface visited, capture console and network and turn genuine problems
|
|
223
|
+
into structured findings:
|
|
224
|
+
|
|
225
|
+
1. **Console** — `list_console_messages`, then filter through the contract's
|
|
226
|
+
`consoleAllowlist` via
|
|
227
|
+
[`filterConsoleMessages`](../scripts/lib/qa/console-allowlist.js). Each
|
|
228
|
+
non-allowlisted console **error** (level `error` / `severe`) becomes one
|
|
229
|
+
`F#` finding; allowlisted patterns and non-error levels are suppressed. The
|
|
230
|
+
allowlist is a **noise filter, not a security control** — never expand it to
|
|
231
|
+
silence a genuine error signal.
|
|
232
|
+
2. **Network** — `list_network_requests`; failed or error-status requests on
|
|
233
|
+
the surface become findings alongside the console-derived set.
|
|
234
|
+
3. **Visual / style** — when `designTokens` is set, spot-check the surface
|
|
235
|
+
against the token source; gross token violations become findings.
|
|
236
|
+
|
|
237
|
+
Findings use the structured `F#` shape: `{ id, classification, surface,
|
|
238
|
+
symptom, likelyRootCause, disposition (blocker | follow-up), acceptance,
|
|
239
|
+
foldsInto?, evidence: { console[], network[] } }`, validated against
|
|
240
|
+
[`qa-finding.schema.json`](../schemas/qa-finding.schema.json). Before
|
|
241
|
+
rendering any finding evidence, **scrub captured console/network of tokens,
|
|
242
|
+
session cookies, and PII** per `.agents/rules/security-baseline.md` — findings
|
|
243
|
+
are posted to GitHub at approval time.
|
|
244
|
+
|
|
245
|
+
## Step 5 — Draft follow-ups (operator sign-off required)
|
|
246
|
+
|
|
247
|
+
Validate each finding against
|
|
248
|
+
[`qa-finding.schema.json`](../schemas/qa-finding.schema.json) first, then
|
|
249
|
+
bundle findings **by likely root cause** into proposed follow-up tickets with
|
|
250
|
+
`Depends-on` / `Blocks` relationships, and present the draft to the operator
|
|
251
|
+
for approval. The harness **MUST NOT** create tickets autonomously — it stops
|
|
252
|
+
at a draft. The operator-approval gate is the safety boundary against spurious
|
|
253
|
+
filing. If the run was triggered from an Epic-testing context, hand the
|
|
254
|
+
approved findings to the Epic-testing helper for attachment to the Epic's QA
|
|
255
|
+
evidence ticket.
|
|
256
|
+
|
|
257
|
+
## Step 6 — Report
|
|
258
|
+
|
|
259
|
+
Summarize the sweep in chat with:
|
|
260
|
+
|
|
261
|
+
- Selector applied and the resolved scenario count.
|
|
262
|
+
- Scenario totals: passed / failed / blocked.
|
|
263
|
+
- Findings totals by classification and disposition (blocker vs follow-up).
|
|
264
|
+
- A per-scenario line pairing each scenario's plain-English intent with its
|
|
265
|
+
verdict (pass / fail / blocked), grouped by feature file or domain — so the
|
|
266
|
+
digest reads as "what was checked → what happened", not a tag list.
|
|
267
|
+
- For each failure, the scenario name, file path, the surface it ended on, and
|
|
268
|
+
a one-line user-visible symptom.
|
|
269
|
+
- A pointer to the drafted follow-up bundle awaiting sign-off (if any).
|
|
270
|
+
|
|
271
|
+
## Constraints
|
|
272
|
+
|
|
273
|
+
- **Always** resolve the `qa` contract first and **fail loudly** when it is
|
|
274
|
+
absent or malformed. There is no auto-detection fallback.
|
|
275
|
+
- **Always** navigate from a root via UI affordances. **Never** URL-jump to a
|
|
276
|
+
deep link to set up a scenario.
|
|
277
|
+
- **Always** assert `Then` outcomes semantically against the accessibility
|
|
278
|
+
snapshot. **Never** assert via DOM/CSS/XPath selectors, HTTP status codes,
|
|
279
|
+
response bodies, or DB rows inside a scenario — push those to the contract
|
|
280
|
+
tier per `.agents/rules/testing-standards.md`.
|
|
281
|
+
- **Never** enter real credentials; sign-in uses the consumer's dev seam only.
|
|
282
|
+
- **Never** file follow-up tickets autonomously; stop at a draft for operator
|
|
283
|
+
sign-off.
|
|
284
|
+
- **Never** expand `consoleAllowlist` to suppress genuine error signal — it is
|
|
285
|
+
a benign-noise filter, not a security control.
|
|
286
|
+
- **Always** scrub captured evidence of secrets and PII before rendering a
|
|
287
|
+
finding.
|
|
288
|
+
- **Never** fall back to a retired headless BDD-runner workflow.
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >-
|
|
3
|
+
Deliver one or more standalone Stories end-to-end. Accepts 1+ Story IDs,
|
|
4
|
+
computes a dependency-aware wave plan via `stories-wave-tick.js`, asks the
|
|
5
|
+
operator to confirm the plan, then fans out parallel Agent calls per wave
|
|
6
|
+
— each delegating to `helpers/single-story-deliver`. Stories without an
|
|
7
|
+
`Epic: #N` reference only; Epic-attached Stories use `/epic-deliver`.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# /story-deliver [Story IDs...]
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
`/story-deliver` is the **operator-facing multi-Story delivery command**. It
|
|
15
|
+
takes one or more Story IDs, builds a dependency-aware wave plan, optionally
|
|
16
|
+
confirms it with the operator, and fans out one Agent call per Story per wave
|
|
17
|
+
— parallel within each wave, serialised across waves.
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
/story-deliver 101 102 103
|
|
21
|
+
→ Phase 0 — Validate input & build DAG
|
|
22
|
+
→ Phase 1 — stories-wave-tick.js → wave plan + operator confirmation
|
|
23
|
+
→ Phase 2 — for each wave:
|
|
24
|
+
Agent tool × min(wave.stories.length, plan.concurrencyCap) parallel calls
|
|
25
|
+
helpers/single-story-deliver <storyId>
|
|
26
|
+
→ Phase 3 — Summary
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**When to use `/story-deliver` vs. other commands:**
|
|
30
|
+
|
|
31
|
+
| Scenario | Command |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| 1+ standalone Stories (no `Epic: #N` in body) | `/story-deliver <id> [<id>...]` |
|
|
34
|
+
| Exactly one standalone Story (lighter path) | `/single-story-deliver <id>` |
|
|
35
|
+
| Epic-attached Stories (have `Epic: #N`) | `/epic-deliver <epicId>` |
|
|
36
|
+
|
|
37
|
+
`/story-deliver` **refuses** Stories that carry an `Epic: #N` reference in
|
|
38
|
+
their body. Those Stories belong to an Epic's dispatch manifest and must flow
|
|
39
|
+
through `/epic-deliver`. Use `/single-story-deliver` for a single Epic-free
|
|
40
|
+
Story when you want the leaner one-story path without wave machinery.
|
|
41
|
+
|
|
42
|
+
> **Concurrency cap.** The cap is resolved **deterministically in code** by
|
|
43
|
+
> `stories-wave-tick.js` (Phase 1a) — the same `resolveConfig` + `getRunners`
|
|
44
|
+
> seam `/epic-deliver` uses — and emitted as the `concurrencyCap` field on the
|
|
45
|
+
> `stories-wave-plan` envelope. The default is 3; override persistently via
|
|
46
|
+
> `delivery.deliverRunner.concurrencyCap` in `.agentrc.json` (a
|
|
47
|
+
> `.agentrc.local.json` override is honored) or per-run via the `--concurrency`
|
|
48
|
+
> flag below. Phase 2 dispatches `min(wave.stories.length, plan.concurrencyCap)`
|
|
49
|
+
> straight from the emitted field — do **not** re-read or merge config yourself.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Arguments
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
/story-deliver <storyId> [<storyId> ...] [--dep <fromId>:<toId> ...] [--yes] [--concurrency <n>]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
- `storyId` — One or more GitHub issue numbers carrying `type::story` and
|
|
60
|
+
**no** `Epic: #N` reference. At least one is required.
|
|
61
|
+
- `--dep <fromId>:<toId>` — Declare an explicit dependency edge: `<fromId>`
|
|
62
|
+
must complete before `<toId>` runs. Repeat for each edge. When omitted,
|
|
63
|
+
all Stories are treated as independent (wave 0 catches everything) unless
|
|
64
|
+
`blocked by #N` references between the supplied IDs are detected
|
|
65
|
+
automatically.
|
|
66
|
+
- `--yes` — Skip the operator confirmation in Phase 1 and proceed
|
|
67
|
+
immediately. Safe for scripted / sub-agent invocations.
|
|
68
|
+
- `--concurrency <n>` — Override the per-wave concurrency cap for this run
|
|
69
|
+
only. Passed through to `stories-wave-tick.js` in Phase 1a, which validates
|
|
70
|
+
it (must be a positive integer) and reflects it in the emitted
|
|
71
|
+
`concurrencyCap` field. When omitted, the cap is resolved from
|
|
72
|
+
`delivery.deliverRunner.concurrencyCap` (default 3).
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Phase 0 — Validate input and build DAG
|
|
77
|
+
|
|
78
|
+
For each supplied Story ID:
|
|
79
|
+
|
|
80
|
+
1. Confirm the issue exists and carries the `type::story` label.
|
|
81
|
+
2. Confirm the issue body does **not** contain an `Epic: #N` reference. If
|
|
82
|
+
it does, STOP and tell the operator to use `/epic-deliver <epicId>`
|
|
83
|
+
instead.
|
|
84
|
+
3. Collect `blocked by #N` references between the supplied Story IDs.
|
|
85
|
+
References to Story IDs outside the supplied set are advisory warnings
|
|
86
|
+
only — they do not block delivery.
|
|
87
|
+
|
|
88
|
+
Construct the DAG input array:
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
[
|
|
92
|
+
{ "id": 101, "dependsOn": [] },
|
|
93
|
+
{ "id": 102, "dependsOn": [101] },
|
|
94
|
+
{ "id": 103, "dependsOn": [] }
|
|
95
|
+
]
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
`dependsOn` is the union of:
|
|
99
|
+
|
|
100
|
+
- `blocked by #N` edges where `N` is in the supplied set.
|
|
101
|
+
- Explicit `--dep` edges.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Phase 1 — Wave planning and operator confirmation
|
|
106
|
+
|
|
107
|
+
### 1a. Compute the wave plan
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
node .agents/scripts/stories-wave-tick.js --dag '<dag-json>'
|
|
111
|
+
# with a per-run cap override:
|
|
112
|
+
node .agents/scripts/stories-wave-tick.js --dag '<dag-json>' --concurrency <n>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
When the operator passed `--concurrency <n>` to `/story-deliver`, forward it
|
|
116
|
+
verbatim to `stories-wave-tick.js`. The script resolves the cap from config
|
|
117
|
+
(`delivery.deliverRunner.concurrencyCap`, default 3) and the override wins for
|
|
118
|
+
that run.
|
|
119
|
+
|
|
120
|
+
Stdout is one JSON envelope:
|
|
121
|
+
|
|
122
|
+
```json
|
|
123
|
+
{
|
|
124
|
+
"kind": "stories-wave-plan",
|
|
125
|
+
"waves": [
|
|
126
|
+
{ "waveIndex": 0, "stories": [101, 103] },
|
|
127
|
+
{ "waveIndex": 1, "stories": [102] }
|
|
128
|
+
],
|
|
129
|
+
"totalStories": 3,
|
|
130
|
+
"concurrencyCap": 3,
|
|
131
|
+
"cycleError": null
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
- **`cycleError` non-null** → STOP. Report the cycle to the operator and
|
|
136
|
+
exit. The Story set cannot be delivered until the circular dependency is
|
|
137
|
+
resolved.
|
|
138
|
+
- **`waves` empty** → STOP. Zero Stories resolved — report and exit.
|
|
139
|
+
- **`concurrencyCap`** is the resolved per-wave cap. Phase 2 dispatches
|
|
140
|
+
`min(wave.stories.length, plan.concurrencyCap)` from this field — the
|
|
141
|
+
workflow never re-reads or merges config to recover the cap.
|
|
142
|
+
- An invalid `--concurrency` value (non-positive / non-integer) makes the
|
|
143
|
+
script exit non-zero with an `inputError` → STOP and surface the message.
|
|
144
|
+
|
|
145
|
+
### 1b. Operator confirmation (skipped with `--yes` or for single-story plans)
|
|
146
|
+
|
|
147
|
+
**Auto-skip rule (Story #3302):** When `waves.length === 1` and
|
|
148
|
+
`waves[0].stories.length === 1`, skip the confirmation prompt
|
|
149
|
+
automatically and proceed. A single-Story plan has no ordering ambiguity
|
|
150
|
+
and no meaningful operator decision to make — the plan *is* "deliver this
|
|
151
|
+
one Story". Prompting for confirmation would just be friction.
|
|
152
|
+
|
|
153
|
+
Otherwise, present the wave plan to the operator in a readable table:
|
|
154
|
+
|
|
155
|
+
```text
|
|
156
|
+
Wave plan — 3 Stories across 2 waves
|
|
157
|
+
Wave 0 (parallel): #101 "<title>", #103 "<title>"
|
|
158
|
+
Wave 1 (after wave 0): #102 "<title>"
|
|
159
|
+
|
|
160
|
+
Proceed? [Y/n]
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Wait for the operator to confirm before dispatching. When the operator
|
|
164
|
+
types `n` or `N`, abort cleanly with a summary of the plan that was
|
|
165
|
+
declined. When `--yes` was passed, skip this step and proceed regardless
|
|
166
|
+
of wave count.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Phase 2 — Wave dispatch loop
|
|
171
|
+
|
|
172
|
+
For each wave in `waves` (in `waveIndex` order):
|
|
173
|
+
|
|
174
|
+
### 2a. Fan out per-Story Agent calls
|
|
175
|
+
|
|
176
|
+
Emit **one `Agent` tool call per Story** in the wave, capped at
|
|
177
|
+
`plan.concurrencyCap` from the Phase 1a `stories-wave-plan` envelope. When
|
|
178
|
+
the wave contains more Stories than `plan.concurrencyCap`, dispatch the first
|
|
179
|
+
`plan.concurrencyCap` in one turn with `run_in_background: true` and refill
|
|
180
|
+
as each child returns — never exceed the cap, never wait for the whole
|
|
181
|
+
batch before refilling. Do **not** re-derive the cap from config here; the
|
|
182
|
+
envelope field is the single deterministic source.
|
|
183
|
+
|
|
184
|
+
Each Agent call:
|
|
185
|
+
|
|
186
|
+
1. Names the Story ID and instructs the child to invoke
|
|
187
|
+
[`helpers/single-story-deliver`](helpers/single-story-deliver.md)
|
|
188
|
+
for that Story.
|
|
189
|
+
2. States the **return contract** (see § 2c).
|
|
190
|
+
3. Reminds the child of the **non-interactive contract**: no clarifying
|
|
191
|
+
questions — if stuck, transition to `agent::blocked`, post a
|
|
192
|
+
`friction` comment, and exit non-zero.
|
|
193
|
+
4. Requests the child suppress per-phase chat relay and include its
|
|
194
|
+
**terminal** `renderedBody` in the JSON return.
|
|
195
|
+
|
|
196
|
+
Use `subagent_type: general-purpose`.
|
|
197
|
+
|
|
198
|
+
### 2b. Collect results
|
|
199
|
+
|
|
200
|
+
Wait for all dispatched Stories in the current wave to return before
|
|
201
|
+
advancing to the next wave. A wave is complete when every dispatched
|
|
202
|
+
Agent call has returned a result (success, blocked, or failed).
|
|
203
|
+
|
|
204
|
+
### 2c. Per-Story return contract
|
|
205
|
+
|
|
206
|
+
Each child returns:
|
|
207
|
+
|
|
208
|
+
```json
|
|
209
|
+
{
|
|
210
|
+
"storyId": <number>,
|
|
211
|
+
"status": "done" | "blocked" | "failed",
|
|
212
|
+
"phase": "init|implementing|closing|blocked|done",
|
|
213
|
+
"branchDeleted": <boolean>,
|
|
214
|
+
"blockerCommentId": <string|null>,
|
|
215
|
+
"detail": "<one-liner>",
|
|
216
|
+
"renderedBody": "<terminal story body>"
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### 2d. Wave outcome handling
|
|
221
|
+
|
|
222
|
+
After every Story in a wave returns:
|
|
223
|
+
|
|
224
|
+
- **All `status === 'done'`** → Advance to the next wave (or Phase 3 if
|
|
225
|
+
this was the last wave). Print a one-line wave-complete summary.
|
|
226
|
+
- **Any `status === 'blocked'`** → STOP the wave loop. Post a summary
|
|
227
|
+
of blocked Stories and their `blockerCommentId` references. Do not
|
|
228
|
+
dispatch the next wave. Wait for the operator to resolve each blocker
|
|
229
|
+
and re-run `/story-deliver` with the same set (already-done Stories
|
|
230
|
+
will short-circuit because `single-story-close.js` is idempotent).
|
|
231
|
+
- **Any `status === 'failed'`** → STOP the wave loop. Report the
|
|
232
|
+
failures. The operator must fix the failing Stories before re-running.
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Phase 3 — Summary
|
|
237
|
+
|
|
238
|
+
Print a final run summary:
|
|
239
|
+
|
|
240
|
+
```text
|
|
241
|
+
/story-deliver — 3 Stories delivered in 2 waves
|
|
242
|
+
|
|
243
|
+
Wave 0: #101 ✅ done, #103 ✅ done
|
|
244
|
+
Wave 1: #102 ✅ done
|
|
245
|
+
|
|
246
|
+
All Stories delivered. PRs opened, auto-merge armed. CI will merge each
|
|
247
|
+
PR when checks pass; each child then confirms the merge and flips its
|
|
248
|
+
Story to `agent::done` (Story #3385 — until the merge confirms, a Story
|
|
249
|
+
rests at `agent::closing` with its issue OPEN). Run
|
|
250
|
+
`git-cleanup --fast-forward-main` after the last merge to bring local
|
|
251
|
+
main up to date.
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
When some Stories are blocked or failed, list them explicitly with the
|
|
255
|
+
`blockerCommentId` or failure detail so the operator knows where to look.
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Opt-in post-green refactor stage (`delivery.refactorStage`)
|
|
260
|
+
|
|
261
|
+
When `delivery.refactorStage.enabled` is `true` in `.agentrc.json`, each
|
|
262
|
+
per-Story worker runs an **advisory** post-green refactor pass after the
|
|
263
|
+
Story's suite is green and the close-validation gates already pass — and
|
|
264
|
+
**before** close. The stage is **strictly opt-in and default-OFF**: when the
|
|
265
|
+
key is unset or `false`, story-deliver behaves exactly as documented above
|
|
266
|
+
and this stage is skipped entirely.
|
|
267
|
+
|
|
268
|
+
The stage adopts the [`refactorer`](../personas/refactorer.md) persona and the
|
|
269
|
+
[`core/refactoring-discipline`](../skills/core/refactoring-discipline/SKILL.md)
|
|
270
|
+
skill to drive a behaviour-preserving pass that lowers CRAP and removes
|
|
271
|
+
duplication on the files the Story already touched:
|
|
272
|
+
|
|
273
|
+
- **Post-green only.** It runs after the suite is green and the gates pass —
|
|
274
|
+
never from red, and never to make a failing test pass.
|
|
275
|
+
- **Behaviour-preserving.** Existing tests MUST keep passing without
|
|
276
|
+
modification; if a test had to change, the change was a behaviour change and
|
|
277
|
+
must be reverted.
|
|
278
|
+
- **Advisory, not a gate.** This stage does **not** introduce a new
|
|
279
|
+
close-validation gate and does **not** change the semantics of the existing
|
|
280
|
+
[close-validation](../scripts/lib/close-validation.js) chain (typecheck,
|
|
281
|
+
lint, test, format, maintainability, coverage, crap). The canonical gates
|
|
282
|
+
remain the single source of pass/fail at close; the refactor stage only adds
|
|
283
|
+
an extra behaviour-preserving cleanup commit when enabled.
|
|
284
|
+
|
|
285
|
+
> **Default-OFF guarantee.** Consumers who do not set
|
|
286
|
+
> `delivery.refactorStage.enabled` (or set it to `false`) see no change in
|
|
287
|
+
> delivery behaviour — no extra stage, no new gate, identical close semantics.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Idempotence
|
|
292
|
+
|
|
293
|
+
`/single-story-deliver` is idempotent at every phase:
|
|
294
|
+
`single-story-init.js` reuses an existing worktree and
|
|
295
|
+
`single-story-close.js` short-circuits when the Story is already closed.
|
|
296
|
+
Re-running `/story-deliver` with the same Story set after a partial
|
|
297
|
+
failure is safe — already-done Stories produce no-op outcomes; only the
|
|
298
|
+
blocked or unstarted Stories execute.
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Constraints
|
|
303
|
+
|
|
304
|
+
- **Never** pass Epic-attached Stories to this command. Detect `Epic: #N`
|
|
305
|
+
in Phase 0 and STOP.
|
|
306
|
+
- **Never** advance to the next wave while any Story in the current wave
|
|
307
|
+
is `blocked` or `failed`.
|
|
308
|
+
- **Never** exceed `plan.concurrencyCap` (the resolved cap emitted by
|
|
309
|
+
`stories-wave-tick.js`) parallel Agent calls at any moment.
|
|
310
|
+
- **Always** confirm the wave plan with the operator before dispatching,
|
|
311
|
+
unless `--yes` was passed.
|
|
312
|
+
- **Label transitions**: drive every `agent::*` state change through
|
|
313
|
+
`node .agents/scripts/update-ticket-state.js --ticket <id> --state <state>`.
|
|
314
|
+
This CLI is the authoritative mechanism — there is no separate
|
|
315
|
+
state-mutation MCP server to degrade from (see
|
|
316
|
+
[`.agents/instructions.md` § 1.D](../instructions.md)).
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## See also
|
|
321
|
+
|
|
322
|
+
- [`helpers/single-story-deliver`](helpers/single-story-deliver.md) — the
|
|
323
|
+
per-Story worker this command delegates to.
|
|
324
|
+
- [`/epic-deliver`](epic-deliver.md) — full Epic wave loop for
|
|
325
|
+
Epic-attached Stories.
|
|
326
|
+
- [`helpers/epic-deliver-story`](helpers/epic-deliver-story.md) — the
|
|
327
|
+
per-Story worker `/epic-deliver` uses internally.
|