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,954 @@
|
|
|
1
|
+
# Mandrel — `.agents/`
|
|
2
|
+
|
|
3
|
+
This is the framework payload (`.agents/`) consumed by host repos. It ships
|
|
4
|
+
inside the [`mandrel`](https://www.npmjs.com/package/mandrel)
|
|
5
|
+
npm package and is materialized into a consumer's `./.agents/` directory by
|
|
6
|
+
`mandrel sync`. It carries a system prompt, a baseline rule pack, a
|
|
7
|
+
two-tier skill library, a slash-command workflow set, and the
|
|
8
|
+
orchestration engine that runs Epic → Feature → Story plans on
|
|
9
|
+
GitHub. The framework version is the version of the installed
|
|
10
|
+
[`mandrel`](https://www.npmjs.com/package/mandrel) npm
|
|
11
|
+
package — run `npm ls mandrel` (or read `package.json`), not a
|
|
12
|
+
count here.
|
|
13
|
+
|
|
14
|
+
> **Ticket hierarchy.** Mandrel uses a **3-tier hierarchy**
|
|
15
|
+
> (Epic → Feature → Story) with inline `acceptance[]` / `verify[]` on
|
|
16
|
+
> Story bodies. See [`docs/SDLC.md` § Ticket hierarchy](docs/SDLC.md) for the
|
|
17
|
+
> diagram and execution-model implications.
|
|
18
|
+
|
|
19
|
+
This is the only README inside the distributed `.agents/` bundle. It
|
|
20
|
+
explains what each part of the bundle is for and captures the
|
|
21
|
+
cross-directory authoring conventions. The process narrative for
|
|
22
|
+
`/epic-plan` and `/epic-deliver` stays in [`docs/SDLC.md`](docs/SDLC.md).
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Activation
|
|
27
|
+
|
|
28
|
+
### Cold start — `npx create-mandrel`
|
|
29
|
+
|
|
30
|
+
The canonical cold-start path is a single launcher command, run from the
|
|
31
|
+
root of your project (the folder does **not** need to be a git repo yet):
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npx create-mandrel # install mandrel → mandrel sync → bootstrap.js
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`create-mandrel` installs `mandrel`, materializes `./.agents/` via
|
|
38
|
+
`mandrel sync` (skipping the install when `.agents/` already exists), and
|
|
39
|
+
finishes by running `node .agents/scripts/bootstrap.js`, forwarding any flags
|
|
40
|
+
you pass. After it completes, run **`/onboard`** inside Claude Code for the
|
|
41
|
+
guided first run — stack detection, docs scaffolding, a `mandrel doctor`
|
|
42
|
+
readiness gate, and a started `/epic-plan` handoff.
|
|
43
|
+
|
|
44
|
+
The remainder of this section documents the manual steps `create-mandrel`
|
|
45
|
+
wraps, for operators who prefer to drive them by hand.
|
|
46
|
+
|
|
47
|
+
### Manual cold start — install the npm package
|
|
48
|
+
|
|
49
|
+
From an **empty or existing** project that does not yet have `.agents/`,
|
|
50
|
+
install the package and materialize the framework payload:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npm install mandrel
|
|
54
|
+
# pnpm add mandrel
|
|
55
|
+
# yarn add mandrel
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Installing `mandrel` pins an exact, provenance-signed version in
|
|
59
|
+
your lockfile (the npm publish attaches a Sigstore build-provenance
|
|
60
|
+
statement proving the tarball was built from this repo's CI). The package's
|
|
61
|
+
`postinstall` hook runs `mandrel sync` best-effort, which copies the
|
|
62
|
+
package's `.agents/` payload into your project's `./.agents/` directory as
|
|
63
|
+
plain regular files (never a symlink). If lifecycle scripts are skipped
|
|
64
|
+
(`--ignore-scripts`, sandboxed CI), run it yourself:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npx mandrel sync # materialize ./.agents/ (idempotent, copy-only)
|
|
68
|
+
npx mandrel sync --dry-run # preview the planned copies, write nothing
|
|
69
|
+
npx mandrel doctor # confirm the install is healthy
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Then run the bootstrap to wire the project and GitHub side:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
node .agents/scripts/bootstrap.js
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Upgrading and local additions
|
|
79
|
+
|
|
80
|
+
Once installed, the ongoing upgrade path is **`mandrel update`** — it bumps
|
|
81
|
+
`mandrel` to the newest non-major version, re-runs `mandrel sync`,
|
|
82
|
+
applies version-keyed migrations, and verifies the install with
|
|
83
|
+
`mandrel doctor`. The lockfile bump is left **staged for you to review and
|
|
84
|
+
commit** (the command performs no `git` mutation):
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npx mandrel update # update → sync → migrate → doctor
|
|
88
|
+
npx mandrel update --dry-run # preview the target version + ordered steps
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
A **major** crossing (e.g. `1.x → 2.0`) is **gated**: Mandrel lives on the
|
|
92
|
+
1.x line under release-please `always-bump-minor`, so a major is a deliberate
|
|
93
|
+
operator decision. `mandrel update` refuses a major bump, points at the
|
|
94
|
+
[`docs/upgrade-major.md`](../docs/upgrade-major.md) runbook, and exits
|
|
95
|
+
without touching anything — re-run with `--major` to adopt it. Minor and
|
|
96
|
+
patch bumps are never gated. Migrations can also be run on their own:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
npx mandrel migrate --from <version> --to <version> [--dry-run]
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Local additions survive upgrades only inside `.agents/local/`.** Because
|
|
103
|
+
`mandrel sync` overwrites `./.agents/` in place from the package payload,
|
|
104
|
+
hand edits to synced framework files are clobbered on the next upgrade — and
|
|
105
|
+
`mandrel doctor`'s drift check flags them. The **`.agents/local/`** zone is
|
|
106
|
+
the consumer-owned space `mandrel sync` never copies into nor prunes and the
|
|
107
|
+
drift check treats as sanctioned, so keep project-specific skills and local
|
|
108
|
+
workflow fragments there rather than editing synced files in place.
|
|
109
|
+
|
|
110
|
+
### Run the unified bootstrap directly
|
|
111
|
+
|
|
112
|
+
When `.agents/` is already materialized, run the bootstrap straight from the
|
|
113
|
+
host repo root:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
node .agents/scripts/bootstrap.js
|
|
117
|
+
# bootstrap also seeds a discoverable npm alias, so after the first run:
|
|
118
|
+
npm run bootstrap
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
The bootstrap adds an `npm run bootstrap` script to the consumer's
|
|
122
|
+
`package.json` (pointing at `node .agents/scripts/bootstrap.js`) the
|
|
123
|
+
first time it runs — an operator-defined `bootstrap` script always wins,
|
|
124
|
+
so the seed is skipped when the key already exists.
|
|
125
|
+
|
|
126
|
+
The bootstrap pipeline, in order:
|
|
127
|
+
|
|
128
|
+
1. **Preflight gate (runs first, before any mutation).** A single
|
|
129
|
+
fail-before-mutate check confirms Node is at the required major
|
|
130
|
+
version, `git` is on `PATH`, the command is running inside a git work
|
|
131
|
+
tree, and — unless `--skip-github` is set — that the `gh` CLI is
|
|
132
|
+
installed and authenticated. If any check fails the bootstrap prints
|
|
133
|
+
each failing check's remedy and halts with exit 1 **before** touching
|
|
134
|
+
a single file or making a GitHub call, so a half-configured repo is
|
|
135
|
+
never left behind.
|
|
136
|
+
2. **Resolve answers (owner / repo / base branch / operator handle /
|
|
137
|
+
project number).** Defaults are inferred from the local `git remote`
|
|
138
|
+
and config (no network calls). Each value is resolved through a
|
|
139
|
+
priority chain: CLI flag → environment variable
|
|
140
|
+
(`GH_OWNER`, `GH_REPO`, …) → silently-accepted inferred default →
|
|
141
|
+
interactive picker → free-text prompt → `--assume-yes` default.
|
|
142
|
+
3. **Project-side mutations.** Seeds `.agentrc.json` from
|
|
143
|
+
[`starter-agentrc.json`](starter-agentrc.json), merges the framework's
|
|
144
|
+
runtime dependencies into `package.json`, runs the install, wires the
|
|
145
|
+
command-sync hook (the UserPromptSubmit hook that regenerates the flat
|
|
146
|
+
`.claude/commands/` tree so every `/<command>` loads), wires the system
|
|
147
|
+
prompt (see below), gitignores derived artefacts, and runs the
|
|
148
|
+
quality-gates installer.
|
|
149
|
+
4. **GitHub-side mutations.** Creates the label taxonomy, Project V2
|
|
150
|
+
fields, branch protection, and merge-method settings. Skipped with
|
|
151
|
+
`--skip-github`.
|
|
152
|
+
|
|
153
|
+
The bootstrap is idempotent — safe to re-run; an already-configured
|
|
154
|
+
clone produces zero file mutations.
|
|
155
|
+
|
|
156
|
+
### Automatic system-prompt wiring
|
|
157
|
+
|
|
158
|
+
The bootstrap wires the framework system prompt into a project-root
|
|
159
|
+
`CLAUDE.md` automatically, so there is no manual "load the system prompt"
|
|
160
|
+
step. Claude Code hydrates its always-loaded context from `CLAUDE.md`,
|
|
161
|
+
and the wiring step (idempotent, keyed off the literal
|
|
162
|
+
`@.agents/instructions.md` import path) does one of three things:
|
|
163
|
+
|
|
164
|
+
- **No `CLAUDE.md`** → writes a minimal one carrying a `## System Prompt`
|
|
165
|
+
heading and the `@.agents/instructions.md` import.
|
|
166
|
+
- **`CLAUDE.md` exists but lacks the import** → appends the import block.
|
|
167
|
+
- **`CLAUDE.md` already imports it** → no-op (no duplicate import line).
|
|
168
|
+
|
|
169
|
+
If your AI tool is not Claude Code, load
|
|
170
|
+
[`instructions.md`](instructions.md) verbatim through that tool's own
|
|
171
|
+
system-prompt mechanism (`.cursorrules`, Custom Instructions, etc.).
|
|
172
|
+
|
|
173
|
+
### Interactive repo / project pickers
|
|
174
|
+
|
|
175
|
+
When the bootstrap runs interactively (a TTY, and `--assume-yes` is not
|
|
176
|
+
set), the **repo** and **project-number** questions render a live,
|
|
177
|
+
numbered menu of real choices instead of a blank prompt:
|
|
178
|
+
|
|
179
|
+
- The **repo picker** lists the resolved owner's repositories via
|
|
180
|
+
`gh repo list <owner>`.
|
|
181
|
+
- The **project picker** lists the owner's Projects V2 titles via
|
|
182
|
+
`gh project list --owner <owner>`.
|
|
183
|
+
|
|
184
|
+
The pickers are interactive-only and never block: a `--owner`/`--repo`
|
|
185
|
+
flag, a `GH_OWNER`/`GH_REPO` environment variable, or `--assume-yes`
|
|
186
|
+
short-circuits the picker (the earlier resolvers win); a non-TTY run
|
|
187
|
+
skips it entirely. If the owner cannot be resolved, or `gh` is missing,
|
|
188
|
+
unauthenticated, too old, or returns nothing, the list comes back empty
|
|
189
|
+
and the prompt falls through to manual free-text entry — so a missing or
|
|
190
|
+
stale `gh` never breaks the run.
|
|
191
|
+
|
|
192
|
+
For non-interactive (CI) installs, pass `--owner`, `--repo`, and
|
|
193
|
+
`--assume-yes`; pass `--skip-github` to defer the remote half.
|
|
194
|
+
|
|
195
|
+
After bootstrap, every Mandrel command is generated into a flat
|
|
196
|
+
`.claude/commands/` tree by `npm run sync:commands` (the UserPromptSubmit hook
|
|
197
|
+
keeps it current) and loads as a bare `/<command>` slash command — e.g.
|
|
198
|
+
`/epic-plan`, `/story-plan`, `/story-deliver`, `/audit-security`. The
|
|
199
|
+
commands load in every Claude Code environment. The [SDLC guide](docs/SDLC.md) walks
|
|
200
|
+
an end-to-end Epic; standalone Stories pair
|
|
201
|
+
[`/story-plan`](workflows/story-plan.md) (idea → drafted Story
|
|
202
|
+
Issue) with [`/story-deliver`](workflows/story-deliver.md) (Story Issue → merged
|
|
203
|
+
PR).
|
|
204
|
+
|
|
205
|
+
### Runtime dependencies
|
|
206
|
+
|
|
207
|
+
The framework scripts under `.agents/scripts/` import a small set of
|
|
208
|
+
third-party npm packages at runtime. The materialized `./.agents/` tree
|
|
209
|
+
carries **no `node_modules` of its own** — `mandrel sync` copies only the
|
|
210
|
+
`.agents/` payload, so the scripts resolve their dependencies from the
|
|
211
|
+
**consuming repository's** install (Node walks `node_modules` upward from
|
|
212
|
+
the script's location to your repo root). The required set is enumerated in
|
|
213
|
+
a single vendored manifest that ships inside the bundle:
|
|
214
|
+
|
|
215
|
+
- **[`runtime-deps.json`](runtime-deps.json)** — the single source of
|
|
216
|
+
truth. Its `dependencies` block lists the **required** packages (`ajv`,
|
|
217
|
+
`ajv-formats`, `js-yaml`, `minimatch`, `picomatch`, `string-argv`,
|
|
218
|
+
`typescript`, `typhonjs-escomplex`); its `optionalDependencies` block
|
|
219
|
+
lists packages used only behind graceful-degradation paths (`chokidar`
|
|
220
|
+
for `quality:watch`, `@commitlint/load` for commit-subject sizing).
|
|
221
|
+
|
|
222
|
+
**How a consumer satisfies them:** `bootstrap` (above) merges the required
|
|
223
|
+
set into your `package.json` `dependencies` and runs your package manager's
|
|
224
|
+
install — so a freshly bootstrapped repo already has them. If you adopt
|
|
225
|
+
`.agents/` without the bootstrap, add the `runtime-deps.json` `dependencies`
|
|
226
|
+
to your own `package.json` (any compatible versions) and install.
|
|
227
|
+
|
|
228
|
+
**Fail-fast guard.** The dependency-dependent entry points
|
|
229
|
+
(`epic-plan-spec.js`, `epic-plan-decompose.js`, and the baseline scorers)
|
|
230
|
+
run a presence check on their required deps before doing any work. When the
|
|
231
|
+
install is missing, empty, or stale, they exit non-zero with an actionable
|
|
232
|
+
message naming the missing packages and your install command — instead of a
|
|
233
|
+
raw `ERR_MODULE_NOT_FOUND` deep inside a workflow. A drift test
|
|
234
|
+
(`tests/scripts/runtime-deps-drift.test.js`) keeps the manifest honest: it
|
|
235
|
+
fails if any third-party import under `.agents/scripts/**` is not declared
|
|
236
|
+
in `runtime-deps.json`.
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Contents
|
|
241
|
+
|
|
242
|
+
| Path | Purpose |
|
|
243
|
+
| ---- | ------- |
|
|
244
|
+
| [`instructions.md`](instructions.md) | Primary system prompt loaded by the host AI tool. |
|
|
245
|
+
| [`docs/SDLC.md`](docs/SDLC.md) | Operator process for `/epic-plan` and `/epic-deliver`. |
|
|
246
|
+
| [`starter-agentrc.json`](starter-agentrc.json) | Bootstrap delta-seed copied to the consumer repo root as `.agentrc.json`. |
|
|
247
|
+
| [`agentrc-reference.json`](docs/agentrc-reference.json) | Exhaustive editor reference enumerating every schema key with its framework default. |
|
|
248
|
+
| [`personas/`](personas/) | Role-specific behavior packs selected by task persona or explicit user instruction. |
|
|
249
|
+
| [`rules/`](rules/) | Domain-agnostic coding, security, testing, shell, git, and workflow rules. |
|
|
250
|
+
| [`skills/core/`](skills/core/) | Universal process skills such as debugging, TDD, security, documentation, and code review. |
|
|
251
|
+
| [`skills/stack/`](skills/stack/) | Stack-specific guardrails for frameworks, services, and testing tools. |
|
|
252
|
+
| [`workflows/`](workflows/) | Workflow definitions. Top-level files are projected into the flat `.claude/commands/` tree and invoked as `/<name>`. |
|
|
253
|
+
| [`workflows/helpers/`](workflows/helpers/) | Workflow fragments read by parent workflows; not exposed as commands. |
|
|
254
|
+
| [`scripts/`](scripts/) | Deterministic Node.js CLIs used by workflows and operators. |
|
|
255
|
+
| [`scripts/lib/orchestration/`](scripts/lib/orchestration/) | In-process orchestration SDK used by the CLI wrappers. |
|
|
256
|
+
| [`scripts/lib/checks/`](scripts/lib/checks/) | Discovery-based self-healing checks registry for preflight, the `diagnose.js` viewer, and retro surfaces. |
|
|
257
|
+
| [`schemas/`](schemas/) | JSON Schema contracts for config, manifests, reports, and persisted runtime artefacts. |
|
|
258
|
+
| [`templates/`](templates/) | Prompt and planning templates used by the orchestration flow. |
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Where to Look
|
|
263
|
+
|
|
264
|
+
| You want… | Open |
|
|
265
|
+
| --------- | ---- |
|
|
266
|
+
| The Epic planning and delivery process | [`docs/SDLC.md`](docs/SDLC.md) |
|
|
267
|
+
| The system prompt loaded by your AI tool | [`instructions.md`](instructions.md) |
|
|
268
|
+
| Every `.agentrc.json` key, default, and override | [`docs/configuration.md`](docs/configuration.md) (under `.agents/`) |
|
|
269
|
+
| Quality-gate runbooks (CRAP, MI, lint, friction) plus the baseline envelope, component model, and writer/reader contract | [`docs/quality-gates.md`](../docs/quality-gates.md) |
|
|
270
|
+
| Slash-command workflow definitions | [`workflows/`](workflows/) |
|
|
271
|
+
| Render the signals span-tree (debug helper) | [`workflows/helpers/signals.md`](workflows/helpers/signals.md) |
|
|
272
|
+
| Persona behavior packs | [`personas/`](personas/) |
|
|
273
|
+
| Domain-agnostic baseline rules | [`rules/`](rules/) |
|
|
274
|
+
| Skill library (core process + stack guardrails) | [`skills/core/`](skills/core/) · [`skills/stack/`](skills/stack/) |
|
|
275
|
+
| Decision rule: should this be a Skill or a Script? | [§ When to use a Skill vs a Script](#when-to-use-a-skill-vs-a-script) |
|
|
276
|
+
| Workflow authoring conventions | [§ Workflow authoring](#workflow-authoring) |
|
|
277
|
+
| Orchestration SDK and GitHub authentication | [§ Orchestration SDK](#orchestration-sdk) |
|
|
278
|
+
| Check registry authoring rules | [§ Self-healing checks](#self-healing-checks) |
|
|
279
|
+
| JSON Schema conventions | [§ Schemas](#schemas) |
|
|
280
|
+
| Bootstrap script (project + GitHub setup) | [`scripts/bootstrap.js`](scripts/bootstrap.js) |
|
|
281
|
+
| Adopt the QA workflows (`/qa-explore`, `/qa-assist`, `/qa-run-harness`) in your project | [§ Adopting the QA harness](#adopting-the-qa-harness) |
|
|
282
|
+
| Coordinate two operators on the same repo (lease model) | [§ Multi-developer coordination](#multi-developer-coordination) |
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## When to use a Skill vs a Script
|
|
287
|
+
|
|
288
|
+
The framework ships two surfaces for automation under `.agents/`:
|
|
289
|
+
|
|
290
|
+
- **Scripts** under [`scripts/`](scripts/) — Node modules invoked via
|
|
291
|
+
`node .agents/scripts/<name>.js`, typically wired into a slash command
|
|
292
|
+
in [`workflows/`](workflows/).
|
|
293
|
+
- **Skills** under [`skills/core/`](skills/core/) and
|
|
294
|
+
[`skills/stack/`](skills/stack/) — declarative `SKILL.md` packages with
|
|
295
|
+
YAML front-matter (`name`, `description`, `allowed_tools`) that the host
|
|
296
|
+
LLM dispatches directly from a slash command.
|
|
297
|
+
|
|
298
|
+
The decision between the two is **not** a matter of taste. Apply this
|
|
299
|
+
rule:
|
|
300
|
+
|
|
301
|
+
> **Deterministic + parseable output → keep it a script.** Examples:
|
|
302
|
+
> GitHub I/O, label transitions, JSON validators, NDJSON readers,
|
|
303
|
+
> diff-vs-baseline gates, template renderers.
|
|
304
|
+
>
|
|
305
|
+
> **Prompt + judgment → make it a Skill.** Examples: composing a PRD
|
|
306
|
+
> from an Epic body, classifying friction signals from a failed shell
|
|
307
|
+
> command, decomposing a Tech Spec into a ticket hierarchy.
|
|
308
|
+
|
|
309
|
+
The rule is two-sided on purpose. "Has an LLM step adjacent" is *not*
|
|
310
|
+
the signal — many deterministic scripts emit a JSON envelope that a host
|
|
311
|
+
LLM consumes downstream, and that does not turn the script into a Skill.
|
|
312
|
+
The signal is whether the *output of this unit* is the product of
|
|
313
|
+
judgment (Skill) or of a parseable transform (script).
|
|
314
|
+
|
|
315
|
+
### Worked example 1 — split: `epic-plan-decompose.js`
|
|
316
|
+
|
|
317
|
+
[`scripts/epic-plan-decompose.js`](scripts/epic-plan-decompose.js) is a
|
|
318
|
+
**split**: the deterministic halves stay as a script, the judgment middle
|
|
319
|
+
moves to a Skill.
|
|
320
|
+
|
|
321
|
+
- **`--emit-context`** (script half) — fetches the PRD and Tech Spec
|
|
322
|
+
bodies, scrapes project docs, emits a JSON envelope. Parseable in,
|
|
323
|
+
parseable out. Stays a script.
|
|
324
|
+
- **Authoring middle** (Skill half) — given the envelope, author the
|
|
325
|
+
ticket hierarchy JSON. Pure prompt + judgment. Migrates to a Skill
|
|
326
|
+
under `.agents/skills/core/` so it ships with declarative
|
|
327
|
+
`allowed_tools` and a smoke test rather than bespoke prompt-template
|
|
328
|
+
plumbing inside a Node module.
|
|
329
|
+
- **Persist half** (script half) — given the author-provided tickets
|
|
330
|
+
JSON, validate against the schema, create GitHub issues, flip the Epic
|
|
331
|
+
label. Deterministic GitHub I/O + schema validation. Stays a script.
|
|
332
|
+
|
|
333
|
+
The split codifies the "host LLM authors directly" pattern explicitly:
|
|
334
|
+
the prompt+judgment step gets a `description`, an
|
|
335
|
+
`allowed_tools` declaration, and a smoke test; the GitHub I/O around it
|
|
336
|
+
keeps its imperative implementation.
|
|
337
|
+
|
|
338
|
+
### Worked example 2 — pure script: `resync-status-column.js`
|
|
339
|
+
|
|
340
|
+
[`scripts/resync-status-column.js`](scripts/resync-status-column.js)
|
|
341
|
+
**stays a script** because every step is deterministic GitHub I/O.
|
|
342
|
+
|
|
343
|
+
- It derives the target Projects v2 Status column for a ticket,
|
|
344
|
+
re-asserts it via a GraphQL mutation after auto-merge fires, and
|
|
345
|
+
polls for drift so the orchestrator wins the race against GitHub's
|
|
346
|
+
built-in merge bot.
|
|
347
|
+
- Input is the operator's CLI flags (`--ticket`, `--poll-attempts`,
|
|
348
|
+
etc.) and the GitHub API; output is a single-line JSON envelope
|
|
349
|
+
summarising the synced state.
|
|
350
|
+
|
|
351
|
+
The script's own input/output is deterministic and parseable: it does
|
|
352
|
+
not compose prompts, it does not classify, it does not author prose.
|
|
353
|
+
There is no judgment step adjacent to it — the verdict is "this is
|
|
354
|
+
the right shape" without any future Skill migration.
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Workflow Authoring
|
|
359
|
+
|
|
360
|
+
`workflows/` is the source of truth for the command surface exposed by
|
|
361
|
+
Claude Code in this repo. Each top-level `.md` file is projected into the
|
|
362
|
+
flat `.claude/commands/<name>.md` tree by
|
|
363
|
+
[`sync-claude-commands.js`](scripts/sync-claude-commands.js), so it is
|
|
364
|
+
invoked as `/<name>`. The flat projection has no plugin manifest and no
|
|
365
|
+
marketplace listing. Files under `workflows/helpers/` are path-included
|
|
366
|
+
modules read by parent workflows; they are not projected or exposed as
|
|
367
|
+
commands.
|
|
368
|
+
|
|
369
|
+
If you are looking for an end-user reference for an individual workflow,
|
|
370
|
+
read the workflow file itself. Every workflow is a self-contained
|
|
371
|
+
contract.
|
|
372
|
+
|
|
373
|
+
Every workflow begins with a flat YAML-ish frontmatter block delimited by
|
|
374
|
+
`---` lines. The parser in
|
|
375
|
+
[`frontmatter.js`](scripts/lib/audit-suite/frontmatter.js) reads a flat
|
|
376
|
+
key/value map; nested structures are not supported.
|
|
377
|
+
|
|
378
|
+
```yaml
|
|
379
|
+
---
|
|
380
|
+
description: <one-paragraph summary surfaced in the skill index>
|
|
381
|
+
---
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
`description` is recommended. Keep it under roughly 280 characters; the
|
|
385
|
+
audit-suite summary helpers truncate after three sentences. Missing
|
|
386
|
+
frontmatter falls back to the file's first prose paragraph.
|
|
387
|
+
|
|
388
|
+
Workflow frontmatter does **not** carry model identifiers. `Agent`
|
|
389
|
+
sub-dispatches inherit from the `general-purpose` sub-agent definition
|
|
390
|
+
unless a specific call in the workflow body passes a per-call `model:`
|
|
391
|
+
literal — that per-call override is the only supported way to pin a
|
|
392
|
+
sub-agent's model.
|
|
393
|
+
|
|
394
|
+
To add a workflow:
|
|
395
|
+
|
|
396
|
+
1. Drop a new `.md` file at the top level of `workflows/`.
|
|
397
|
+
2. Add frontmatter with at least `description`.
|
|
398
|
+
3. Run `npm run sync:commands` to project the file into the flat
|
|
399
|
+
`.claude/commands/` tree; it surfaces as `/<name>`.
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## Orchestration SDK
|
|
404
|
+
|
|
405
|
+
`scripts/lib/orchestration/` is the in-process orchestration SDK. Every
|
|
406
|
+
top-level CLI under `scripts/` should be a thin wrapper that parses argv,
|
|
407
|
+
resolves config, and delegates business logic to the SDK.
|
|
408
|
+
|
|
409
|
+
Provider operations are mediated through `ITicketingProvider`. The shipped
|
|
410
|
+
ticketing provider is GitHub, resolved by `provider-factory.js` from the
|
|
411
|
+
`orchestration.provider` config key. CLI scripts receive provider
|
|
412
|
+
instances from the SDK surface rather than importing provider
|
|
413
|
+
implementations directly. Execution is Claude-Code-in-session — there is
|
|
414
|
+
no separate adapter abstraction; `wave-dispatcher.js` synthesizes the
|
|
415
|
+
dispatch record inline and the dispatch manifest (md + structured
|
|
416
|
+
comment) is the cross-runtime contract.
|
|
417
|
+
|
|
418
|
+
The SDK barrel is `scripts/lib/orchestration/index.js`; its exports are
|
|
419
|
+
the source of truth for the public in-process surface. Key families
|
|
420
|
+
include dispatch (`dispatch-engine.js`, `manifest-builder.js`), context
|
|
421
|
+
hydration, planning state, label transitions, Epic runner phases,
|
|
422
|
+
Story-close internals, retro heuristics, and structured error capture.
|
|
423
|
+
|
|
424
|
+
### GitHub authentication
|
|
425
|
+
|
|
426
|
+
The GitHub provider resolves credentials in this order:
|
|
427
|
+
|
|
428
|
+
| Priority | Method | Environment |
|
|
429
|
+
| -------- | ------ | ----------- |
|
|
430
|
+
| 1 | `GITHUB_TOKEN` or `GH_TOKEN` | CI/CD and background scripts |
|
|
431
|
+
| 2 | `gh auth token` | Local developer workflow |
|
|
432
|
+
|
|
433
|
+
Fine-grained PATs should grant GitHub Projects V2 read/write, Issues
|
|
434
|
+
read/write, Metadata read-only, and Pull requests read/write. Classic
|
|
435
|
+
PATs need `repo` and `project`.
|
|
436
|
+
|
|
437
|
+
Set `GITHUB_TOKEN` in the process environment or in `.env` at the
|
|
438
|
+
project root; the resolver auto-loads `.env`. For local interactive
|
|
439
|
+
sessions, `gh auth login` is sufficient.
|
|
440
|
+
|
|
441
|
+
---
|
|
442
|
+
|
|
443
|
+
## Self-Healing Checks
|
|
444
|
+
|
|
445
|
+
`scripts/lib/checks/` is the discovery-based registry of named checks
|
|
446
|
+
consumed by preflight guards (`/epic-deliver`, `/story-close`, `npm test`),
|
|
447
|
+
the `diagnose.js` ad-hoc viewer, and the retro surface. Use one check per
|
|
448
|
+
file. The runner (`index.js`) loads checks at process start and filters by
|
|
449
|
+
scope at each call site.
|
|
450
|
+
|
|
451
|
+
Each check module default-exports an object with this shape:
|
|
452
|
+
|
|
453
|
+
```js
|
|
454
|
+
export default {
|
|
455
|
+
id: 'stale-origin-epic',
|
|
456
|
+
severity: 'blocker', // 'blocker' | 'warning' | 'info'
|
|
457
|
+
scope: ['epic-deliver', 'story-close', 'retro'],
|
|
458
|
+
autoCorrect: 'refuse-and-print', // 'auto' | 'refuse-and-print'
|
|
459
|
+
detect(state) {
|
|
460
|
+
return null;
|
|
461
|
+
},
|
|
462
|
+
async fix(state) {
|
|
463
|
+
return { ok: true, message: 'what was changed' };
|
|
464
|
+
},
|
|
465
|
+
};
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
`detect(state)` returns a finding or `null`. Read git, filesystem, and
|
|
469
|
+
environment projections from the assembled `state`; do not re-probe the
|
|
470
|
+
environment inside the check. A finding includes `id`, `severity`,
|
|
471
|
+
`scope`, `summary`, optional `detail`, mandatory `fixCommand`, and
|
|
472
|
+
`autoCorrectable`.
|
|
473
|
+
|
|
474
|
+
`autoCorrect: 'auto'` means the fix is local, bounded, and reversible.
|
|
475
|
+
Auto-fixes must not push to remotes, commit to `epic/*` or `main`, amend
|
|
476
|
+
history, recursively delete outside `.worktrees/<id>/`, write GitHub
|
|
477
|
+
state, or read secret values. Anything requiring those operations must be
|
|
478
|
+
`refuse-and-print` with a human-run `fixCommand`.
|
|
479
|
+
|
|
480
|
+
The retro scope is read-only. `runChecks({ scope: 'retro', autoFix: true
|
|
481
|
+
})` is invalid, and retro-scoped checks should usually omit `fix()`.
|
|
482
|
+
|
|
483
|
+
Module boundary rules:
|
|
484
|
+
|
|
485
|
+
- Filenames match check ids in kebab-case.
|
|
486
|
+
- `index.js` and `state.js` are runner infrastructure and excluded from
|
|
487
|
+
discovery.
|
|
488
|
+
- Checks do not import from other checks.
|
|
489
|
+
- Shared probes belong in `state.js`; pure formatting helpers may live in
|
|
490
|
+
sibling helper modules.
|
|
491
|
+
- Checks do not keep module-level mutable state.
|
|
492
|
+
|
|
493
|
+
---
|
|
494
|
+
|
|
495
|
+
## Baselines
|
|
496
|
+
|
|
497
|
+
The framework's quality gates compare against per-kind baseline files
|
|
498
|
+
under `baselines/<kind>.json` (lint, coverage, crap, maintainability,
|
|
499
|
+
mutation, lighthouse, bundle-size). Every baseline shares a single
|
|
500
|
+
envelope, every gate reads through one shared module
|
|
501
|
+
([`.agents/scripts/lib/baselines/reader.js`](scripts/lib/baselines/reader.js)),
|
|
502
|
+
and every refresher writes through one shared writer
|
|
503
|
+
([`.agents/scripts/lib/baselines/writer.js`](scripts/lib/baselines/writer.js)).
|
|
504
|
+
|
|
505
|
+
See the [Baseline reference](../docs/quality-gates.md#baseline-reference)
|
|
506
|
+
section of `docs/quality-gates.md` for the full reference: envelope shape,
|
|
507
|
+
per-kind axes, component model, path canonicalisation, writer/reader
|
|
508
|
+
contract, kernel-version friction, and — most relevant to consumers — the
|
|
509
|
+
**floor override** path. Consumers add a `floors` block
|
|
510
|
+
(and optional `components`) under their gate in `.agentrc.json`:
|
|
511
|
+
|
|
512
|
+
```json
|
|
513
|
+
{
|
|
514
|
+
"delivery": {
|
|
515
|
+
"quality": {
|
|
516
|
+
"gates": {
|
|
517
|
+
"coverage": {
|
|
518
|
+
"floors": { "*": { "lines": 90, "branches": 85 } },
|
|
519
|
+
"components": { "api": ["src/api/**"] }
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
The unified runtime gate
|
|
528
|
+
[`.agents/scripts/check-baselines.js`](scripts/check-baselines.js)
|
|
529
|
+
currently runs floor + tolerance + schema + kernel-mismatch checks only;
|
|
530
|
+
full regression absorption and per-kind CLI deletion are tracked in
|
|
531
|
+
follow-up **Epic #1943**.
|
|
532
|
+
|
|
533
|
+
---
|
|
534
|
+
|
|
535
|
+
## Schemas
|
|
536
|
+
|
|
537
|
+
`schemas/` contains JSON Schema draft 2020-12 contracts consumed by the
|
|
538
|
+
orchestration layer. Each schema describes one structured artefact:
|
|
539
|
+
configuration, structural Epic specs, runtime reports, dispatch
|
|
540
|
+
manifests, or persisted state. Where a runtime AJV schema also exists,
|
|
541
|
+
the JSON file is a mirror kept in sync by a drift test.
|
|
542
|
+
|
|
543
|
+
Important schema groups:
|
|
544
|
+
|
|
545
|
+
- Structural specs: `epic-spec.schema.json` for the declarative
|
|
546
|
+
`epic.yaml` plus reconciler flow.
|
|
547
|
+
- Configuration: `agentrc.schema.json`, mirrored from the runtime config
|
|
548
|
+
schemas.
|
|
549
|
+
- Runtime reports: audit results, CRAP and maintainability reports,
|
|
550
|
+
performance summaries, friction and signal events, and validation
|
|
551
|
+
evidence.
|
|
552
|
+
- Dispatch: `dispatch-manifest.json`, the per-Epic dispatch manifest
|
|
553
|
+
schema written by `dispatcher.js`.
|
|
554
|
+
|
|
555
|
+
Schema conventions:
|
|
556
|
+
|
|
557
|
+
- `$schema` references draft 2020-12.
|
|
558
|
+
- `$id` is the canonical GitHub blob URL for the file.
|
|
559
|
+
- Every property carries a `description`.
|
|
560
|
+
- Objects use `additionalProperties: false` unless the contract
|
|
561
|
+
explicitly needs an open extension point.
|
|
562
|
+
- Structural schemas do not model `agent::*` labels; wave-runner state is
|
|
563
|
+
separate from structural intent.
|
|
564
|
+
|
|
565
|
+
---
|
|
566
|
+
|
|
567
|
+
## Code review providers (pluggable chain)
|
|
568
|
+
|
|
569
|
+
`runCodeReview()` (invoked at the end of `helpers/epic-deliver-story`,
|
|
570
|
+
`helpers/single-story-deliver`, and `/epic-deliver`'s `delivery.code-review`
|
|
571
|
+
state) loads its review backend through a pluggable registry. Two configuration shapes are supported:
|
|
572
|
+
|
|
573
|
+
- **Legacy single provider** — `delivery.codeReview.provider: "native"`
|
|
574
|
+
(default), `"codex"`, or `"security-review"`. Returns one adapter; one
|
|
575
|
+
set of findings; one structured comment.
|
|
576
|
+
- **Provider chain** (Story #2871) — `delivery.codeReview.providers: []`
|
|
577
|
+
iterates a declared list of entries, merges every inline adapter's
|
|
578
|
+
`Finding[]` in declaration order, and appends a non-blocking
|
|
579
|
+
"Manual Review Suggestions" section for any manual-prompt entries
|
|
580
|
+
that contributed text. When both fields are set, `providers` wins.
|
|
581
|
+
|
|
582
|
+
```json
|
|
583
|
+
{
|
|
584
|
+
"delivery": {
|
|
585
|
+
"codeReview": {
|
|
586
|
+
"providers": [
|
|
587
|
+
{ "name": "native" },
|
|
588
|
+
{ "name": "security-review", "scopes": ["epic"], "optional": true },
|
|
589
|
+
{
|
|
590
|
+
"name": "ultrareview",
|
|
591
|
+
"scopes": ["epic"],
|
|
592
|
+
"manualPrompt": true,
|
|
593
|
+
"when": { "label": "risk::high" }
|
|
594
|
+
}
|
|
595
|
+
]
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
Each chain entry accepts:
|
|
602
|
+
|
|
603
|
+
- `name` (required) — registered key. Inline: `native`, `codex`,
|
|
604
|
+
`security-review`. Manual-prompt: `ultrareview`.
|
|
605
|
+
- `scopes` — invocation scopes this entry fires on (`["story", "epic"]`).
|
|
606
|
+
Default is both.
|
|
607
|
+
- `optional` — when `true`, a construction failure (host missing the
|
|
608
|
+
required CLI/plugin) is logged and the entry is skipped instead of
|
|
609
|
+
hard-failing the chain. Use for portable configs that ship across
|
|
610
|
+
Claude and non-Claude runtimes — for example,
|
|
611
|
+
`security-review` requires the `claude` CLI on PATH and degrades
|
|
612
|
+
cleanly on a non-Claude host when `optional: true`.
|
|
613
|
+
- `manualPrompt` — when `true`, the entry is loaded from the
|
|
614
|
+
manual-prompt registry and contributes a one-line operator suggestion
|
|
615
|
+
via `renderPrompt()` instead of running a real review. Manual-prompt
|
|
616
|
+
contributions do NOT affect severity counts or the `halted` gate.
|
|
617
|
+
- `when` — optional label predicate evaluated at invocation time
|
|
618
|
+
against the ticket's labels (`when.label` for a single required
|
|
619
|
+
label, `when.labelAny` for "any of these"). False predicates skip
|
|
620
|
+
the entry silently for that run.
|
|
621
|
+
|
|
622
|
+
Cross-runtime contract: manual-prompt providers (e.g. `ultrareview`)
|
|
623
|
+
emit Markdown only and MUST NEVER throw under any host. Inline
|
|
624
|
+
providers that require a host-specific binary (e.g.
|
|
625
|
+
`security-review` shells out to `claude --print /security-review`)
|
|
626
|
+
SHOULD be declared `optional: true` so non-Claude consumers can pin
|
|
627
|
+
the same `.agents/` version without modifying their config.
|
|
628
|
+
|
|
629
|
+
The pluggable backend was introduced in Epic #2815; the multi-provider
|
|
630
|
+
chain, `security-review`, and `ultrareview` were added in Story #2871.
|
|
631
|
+
|
|
632
|
+
---
|
|
633
|
+
|
|
634
|
+
## Feedback loop — code-review auto-graduation
|
|
635
|
+
|
|
636
|
+
When the Epic finalize listener runs, non-blocking code-review findings
|
|
637
|
+
(severity `high`, `medium`, or `low`) that survived merge are
|
|
638
|
+
auto-graduated into follow-up issues, routed by source classification
|
|
639
|
+
into the framework repo or the consumer repo. The toggle lives at
|
|
640
|
+
`delivery.feedbackLoop.codeReviewAutoFile` and defaults to `true`.
|
|
641
|
+
|
|
642
|
+
To opt out (for example, to triage findings manually during a
|
|
643
|
+
stabilization window), set the toggle to `false` in your root
|
|
644
|
+
`.agentrc.json`:
|
|
645
|
+
|
|
646
|
+
```json
|
|
647
|
+
{
|
|
648
|
+
"delivery": {
|
|
649
|
+
"feedbackLoop": {
|
|
650
|
+
"codeReviewAutoFile": false
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
When disabled, the listener short-circuits and leaves the structured
|
|
657
|
+
`code-review` comments on the Epic ticket untouched. Re-enabling the
|
|
658
|
+
toggle is safe: the graduator embeds an idempotency marker
|
|
659
|
+
(`<!-- code-review-followup: epic-<id>-finding-<idx> -->`) in each filed
|
|
660
|
+
issue body, so re-runs skip findings that already have an issue.
|
|
661
|
+
|
|
662
|
+
---
|
|
663
|
+
|
|
664
|
+
## Worktree dependency strategies
|
|
665
|
+
|
|
666
|
+
When `delivery.worktreeIsolation.enabled` is `true`, each Story runs in
|
|
667
|
+
its own worktree under `.worktrees/story-<id>/`. The
|
|
668
|
+
`nodeModulesStrategy` field on `delivery.worktreeIsolation` controls how
|
|
669
|
+
`node_modules` is populated in that worktree. Three values are supported,
|
|
670
|
+
each with different cost/portability trade-offs:
|
|
671
|
+
|
|
672
|
+
| Strategy | When to use | Cold-start cost | Notes |
|
|
673
|
+
| -------------- | ---------------------------------------------------------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------- |
|
|
674
|
+
| `per-worktree` | Default-safe — no host setup, no symlink semantics to worry about. | Full `npm ci` per Story. | Slowest. Each worktree gets an independent `node_modules`. |
|
|
675
|
+
| `symlink` | npm/yarn repos that want the fast path. **Opt-in.** | Near-zero. | Junctions a single donor `node_modules` into each worktree. Refuses on Windows unless explicitly opted in. |
|
|
676
|
+
| `pnpm-store` | pnpm repos. **Shipped consumer default in `agentrc-reference.json`.** | Fast (store-backed). | Runs `pnpm install --frozen-lockfile` against the shared content-addressable store. |
|
|
677
|
+
|
|
678
|
+
The **shipped consumer default in
|
|
679
|
+
[`.agents/docs/agentrc-reference.json`](./docs/agentrc-reference.json) remains
|
|
680
|
+
`pnpm-store`**. Repos that do not use pnpm should opt in to `symlink`
|
|
681
|
+
explicitly in their root `.agentrc.json`; this repo dogfoods that
|
|
682
|
+
configuration.
|
|
683
|
+
|
|
684
|
+
### Symlink opt-in (npm / yarn)
|
|
685
|
+
|
|
686
|
+
To opt in, set three fields on `delivery.worktreeIsolation` in your root
|
|
687
|
+
`.agentrc.json`:
|
|
688
|
+
|
|
689
|
+
```json
|
|
690
|
+
{
|
|
691
|
+
"delivery": {
|
|
692
|
+
"worktreeIsolation": {
|
|
693
|
+
"enabled": true,
|
|
694
|
+
"nodeModulesStrategy": "symlink",
|
|
695
|
+
"primeFromPath": ".",
|
|
696
|
+
"allowSymlinkOnWindows": true
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
```
|
|
701
|
+
|
|
702
|
+
- **`nodeModulesStrategy: "symlink"`** — switch off the per-worktree
|
|
703
|
+
install and link instead.
|
|
704
|
+
- **`primeFromPath`** — relative path (from the repo root) to the donor
|
|
705
|
+
worktree whose `node_modules/` is reused. `"."` means the root
|
|
706
|
+
checkout, which must already have `node_modules/` populated before a
|
|
707
|
+
Story initializes. `story-init.js` enforces this with a pre-check.
|
|
708
|
+
- **`allowSymlinkOnWindows`** — required on Windows. The strategy uses
|
|
709
|
+
junctions (no admin rights needed) on Windows when this is `true`; it
|
|
710
|
+
refuses with an explanatory error otherwise, because symlink semantics
|
|
711
|
+
vary by Windows version.
|
|
712
|
+
|
|
713
|
+
Once these are set, `story-init.js` skips `npm ci` in the worktree and
|
|
714
|
+
junctions/symlinks `node_modules` from the donor — typical cold-start
|
|
715
|
+
falls from minutes to under a second.
|
|
716
|
+
|
|
717
|
+
---
|
|
718
|
+
|
|
719
|
+
## Multi-developer coordination
|
|
720
|
+
|
|
721
|
+
Two operators can drive the same repository at once — one running
|
|
722
|
+
`/epic-deliver <id>`, another running `/single-story-deliver <id>`, or two
|
|
723
|
+
operators on the same Epic from separate clones. The framework keeps those
|
|
724
|
+
runs from clobbering one another with **two distinct coordination layers**.
|
|
725
|
+
They solve different problems and must not be confused:
|
|
726
|
+
|
|
727
|
+
- **Filesystem locks** (`epic-merge-lock`, `sweep-lock`) serialise work
|
|
728
|
+
**within a single machine/clone**. They are keyed on local process PIDs
|
|
729
|
+
and live under `.git/` (or a local lockfile path), so they do **not**
|
|
730
|
+
coordinate across clones. See
|
|
731
|
+
[`docs/SDLC.md` § Cross-clone coordination](docs/SDLC.md#cross-clone-coordination)
|
|
732
|
+
for why.
|
|
733
|
+
- **The assignee-as-lease claim** coordinates **across clones** by riding
|
|
734
|
+
the ticket's GitHub `assignees` surface — a substrate every clone can
|
|
735
|
+
see. This is the cross-clone layer, described below.
|
|
736
|
+
|
|
737
|
+
### Assignee-as-lease claim model
|
|
738
|
+
|
|
739
|
+
The lease primitive lives in
|
|
740
|
+
[`scripts/lib/orchestration/ticket-lease.js`](scripts/lib/orchestration/ticket-lease.js).
|
|
741
|
+
Rather than inventing a new state column, the lease rides the ticket's
|
|
742
|
+
existing **assignees** field: the single assignee *is* the lease owner.
|
|
743
|
+
Liveness is decided by the owner's most-recent `story.heartbeat` timestamp
|
|
744
|
+
compared against a configurable TTL (`delivery.lease.ttlMs`).
|
|
745
|
+
|
|
746
|
+
The model has five behaviours, all expressed through `acquireLease` /
|
|
747
|
+
`releaseLease`:
|
|
748
|
+
|
|
749
|
+
| Behaviour | When it fires | Outcome |
|
|
750
|
+
| --------- | ------------- | ------- |
|
|
751
|
+
| **Acquire by self-assign** | The ticket is unassigned. | The operator is written to `assignees`; the run proceeds (`reason: 'unclaimed'`). |
|
|
752
|
+
| **Re-affirm a self-held claim** | The operator already holds the lease. | No write; the run proceeds (`reason: 'already-held'`). |
|
|
753
|
+
| **Refuse-if-foreign** | A *different* operator holds the lease and their heartbeat is within the TTL (the claim is **live**). | The acquire **fails closed** — the run refuses to start and names the current owner so you know who to coordinate with (`reason: 'held'`). |
|
|
754
|
+
| **Stale-claim reclaim** | A foreign claim exists but its heartbeat is older than the TTL (or the owner never heartbeated). | The lease is automatically reassigned to the operator (`reason: 'reclaimed'`). An abandoned claim never wedges the ticket. |
|
|
755
|
+
| **`--steal` override** | A foreign claim is *live* and the operator passes `--steal`. | The live claim is forcibly transferred (`reason: 'stolen'`). This is the **only** way past a live foreign claim. |
|
|
756
|
+
|
|
757
|
+
On a clean completion the holder **releases** the lease (clears the
|
|
758
|
+
assignment), but only when it still holds it — a late release on a ticket
|
|
759
|
+
that was since reassigned (e.g. via `--steal`) is a no-op, so it never
|
|
760
|
+
yanks the claim back from whoever legitimately took over.
|
|
761
|
+
|
|
762
|
+
**Where it's wired:**
|
|
763
|
+
|
|
764
|
+
- **`/epic-deliver`** acquires the lease on the **Epic** ticket during its
|
|
765
|
+
prepare phase, before any mutating git work
|
|
766
|
+
([`epic-deliver-lease-guard.js`](scripts/lib/orchestration/epic-deliver-lease-guard.js)).
|
|
767
|
+
A live foreign claim refuses the run; pass `--steal` to override and
|
|
768
|
+
`--as <handle>` to claim under a specific identity. The operator is
|
|
769
|
+
resolved from `--as`, then `github.operatorHandle`, then
|
|
770
|
+
`git config user.email`; when none resolve, the lease step is skipped
|
|
771
|
+
(the checkout-safety guard still runs).
|
|
772
|
+
- **`/single-story-deliver`** acquires the lease on the **Story** ticket at
|
|
773
|
+
init and releases it at close
|
|
774
|
+
([`single-story-lease-guard.js`](scripts/lib/orchestration/single-story-lease-guard.js)).
|
|
775
|
+
The standalone path requires `github.operatorHandle` to be set — without
|
|
776
|
+
an operator identity the lease has no owner to record.
|
|
777
|
+
- **`/epic-plan`** acquires the lease on the **Epic** ticket before Phase 7
|
|
778
|
+
(spec) and releases it after Phase 8 (decompose)
|
|
779
|
+
([`epic-plan-lease-guard.js`](scripts/lib/orchestration/epic-plan-lease-guard.js)).
|
|
780
|
+
Because planning emits no `story.heartbeat` (heartbeats are a
|
|
781
|
+
delivery-time signal), the plan path has no live-heartbeat source and so
|
|
782
|
+
**fails closed**: any foreign assignee is treated as a live claim and
|
|
783
|
+
refuses the run unless `--steal` transfers it. Unassigned or self-held
|
|
784
|
+
Epics proceed. When `github.operatorHandle` is unset the lease cannot be
|
|
785
|
+
keyed and the preflight degrades to a no-op.
|
|
786
|
+
|
|
787
|
+
---
|
|
788
|
+
|
|
789
|
+
## Root config vs distributed templates
|
|
790
|
+
|
|
791
|
+
Three `.agentrc`-shaped files live in this repository and are easy to
|
|
792
|
+
confuse:
|
|
793
|
+
|
|
794
|
+
| File | Audience | Role |
|
|
795
|
+
| --------------------------------- | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
|
796
|
+
| `.agentrc.json` (repo root) | The framework dogfooding itself | Live config used when running `/epic-*`, `/story-deliver` against this repo. Exercises the framework end-to-end. |
|
|
797
|
+
| `.agents/starter-agentrc.json` | Downstream consumer repos | Bootstrap delta-seed a consumer copies via `cp .agents/starter-agentrc.json .agentrc.json`. Minimum schema-required keys. |
|
|
798
|
+
| `.agents/docs/agentrc-reference.json` | Operators and reviewers | Exhaustive editor reference enumerating every schema key with its framework default. Not a copy target. |
|
|
799
|
+
|
|
800
|
+
The three files share a schema; where they legitimately diverge (target
|
|
801
|
+
dirs, repo identifiers, version-file pointer) is documented in
|
|
802
|
+
[`docs/configuration.md` § Root dogfood vs distributed template](docs/configuration.md#root-dogfood-vs-distributed-template).
|
|
803
|
+
Edit `agentrc-reference.json` when a framework default changes; edit
|
|
804
|
+
`starter-agentrc.json` only when the bootstrap seed itself needs new
|
|
805
|
+
schema-required keys; edit the root `.agentrc.json` for changes that
|
|
806
|
+
only affect this repo's own dogfood runs.
|
|
807
|
+
|
|
808
|
+
---
|
|
809
|
+
|
|
810
|
+
## Adopting the QA harness
|
|
811
|
+
|
|
812
|
+
Mandrel ships **three** complementary QA loops, all adopting the `qa-engineer`
|
|
813
|
+
persona and all reading the same `qa.*` project contract from `.agentrc.json`.
|
|
814
|
+
Two are exploratory siblings that differ on **who drives**; the third steps a
|
|
815
|
+
known scenario set:
|
|
816
|
+
|
|
817
|
+
- **`/qa-explore <surface>`** — an **agent-led**, open-ended
|
|
818
|
+
**Plan → Capture → Triage** exploratory sweep. The operator names a surface;
|
|
819
|
+
the **agent drives** it (through the browser MCP by default, or statically as
|
|
820
|
+
a documented interim), probing for product bugs, environment-setup friction,
|
|
821
|
+
tooling/DX gaps, missing tests, and enhancement ideas, recording each
|
|
822
|
+
observation as a `QaLedgerItem` against the
|
|
823
|
+
[`qa-ledger.schema.json`](schemas/qa-ledger.schema.json) contract. Capture is
|
|
824
|
+
strictly read-only — the only write it performs is appending ledger lines to
|
|
825
|
+
the session ledger at **`temp/qa/<sessionId>.ndjson`** (session scratch under
|
|
826
|
+
`project.paths.tempRoot`, gitignored, never committed). Triage then
|
|
827
|
+
classifies, dedups, and routes each item into a `file` / `defer` / `dismiss`
|
|
828
|
+
disposition; the session is HITL-gated — every phase transition and every
|
|
829
|
+
ticket-filing write is operator-gated. A resumed session
|
|
830
|
+
(`--session-id <id>`) appends and carries its un-triaged backlog forward. The
|
|
831
|
+
end-to-end procedure is the SSOT in
|
|
832
|
+
[`workflows/qa-explore.md`](workflows/qa-explore.md), with the deterministic
|
|
833
|
+
decision seams under `scripts/lib/qa/` (session, redaction, coverage,
|
|
834
|
+
missing-test) and `scripts/lib/findings/` (classification, dedup/route).
|
|
835
|
+
- **`/qa-assist`** — the **human-led** sibling of `/qa-explore`: a
|
|
836
|
+
single-observation **Intake → Enrich → Record** loop. Here the **human
|
|
837
|
+
drives** — the operator reports one thing they observed (a bug, a flaky
|
|
838
|
+
behavior, a "this feels off") and the agent enriches it into a triage-ready
|
|
839
|
+
`QaLedgerItem` (a clean repro, a `file:line` root-cause locus, a coverage
|
|
840
|
+
verdict), asking clarifying questions when the observation is ambiguous, then
|
|
841
|
+
appends it — after explicit confirmation — to a persistent, resumable rolling
|
|
842
|
+
session under `temp/qa/`. It writes the **same** ledger contract `/qa-explore`
|
|
843
|
+
produces, so a `/qa-assist` item flows through the identical dedup,
|
|
844
|
+
classification, and promotion machinery later. The end-to-end procedure is
|
|
845
|
+
the SSOT in [`workflows/qa-assist.md`](workflows/qa-assist.md). Reach for
|
|
846
|
+
`/qa-assist` when you hit something mid-flight and want it captured well
|
|
847
|
+
without breaking stride; reach for `/qa-explore` when you want the agent to
|
|
848
|
+
go hunt a named surface.
|
|
849
|
+
- **`/qa-run-harness <selector>`** — the **automated complement**: it drives a
|
|
850
|
+
consumer's Gherkin `.feature` scenarios through a real browser (the
|
|
851
|
+
`chrome-devtools` MCP surface), captures per-surface console/network into
|
|
852
|
+
structured `F#` findings, and drafts follow-up tickets for operator
|
|
853
|
+
sign-off. The end-to-end procedure is the SSOT in
|
|
854
|
+
[`workflows/qa-run-harness.md`](workflows/qa-run-harness.md); the
|
|
855
|
+
instrumentation conventions live in the
|
|
856
|
+
[`skills/stack/qa/qa-harness`](skills/stack/qa/qa-harness/SKILL.md) skill; the
|
|
857
|
+
architectural overview (run pipeline, contract fields, finding shape) is in
|
|
858
|
+
[`docs/architecture.md` § Agent-driven QA harness](../docs/architecture.md#agent-driven-qa-harness).
|
|
859
|
+
|
|
860
|
+
Reach for `/qa-explore` when you want the **agent** to hunt a freshly delivered
|
|
861
|
+
Story/Feature or run a structured bug-hunt captured into a triageable ledger;
|
|
862
|
+
reach for `/qa-assist` when **you** hit something mid-flight and want it
|
|
863
|
+
enriched into a single triage-ready ledger item; reach for `/qa-run-harness` to
|
|
864
|
+
step a **known** scenario set through the browser for a regression pass.
|
|
865
|
+
|
|
866
|
+
Binding the QA contract is **opt-in**. All three workflows resolve the
|
|
867
|
+
consumer's `qa` block through the single seam
|
|
868
|
+
[`resolve-qa-contract.js`](scripts/lib/qa/resolve-qa-contract.js); a consumer
|
|
869
|
+
that has not bound it gets a loud, actionable failure ("this project has not
|
|
870
|
+
bound the QA harness") when either workflow runs — there is no auto-detection
|
|
871
|
+
fallback. To adopt the QA surface, a consumer project takes three concrete
|
|
872
|
+
steps.
|
|
873
|
+
|
|
874
|
+
### 1. Bind the `qa` block in `.agentrc.json`
|
|
875
|
+
|
|
876
|
+
Add a top-level `qa` block. It is optional in the schema (so config
|
|
877
|
+
validation never breaks a non-QA consumer), but the four core fields are
|
|
878
|
+
required at run time by `resolveQaContract`. Copy the reference shape from
|
|
879
|
+
[`agentrc-reference.json`](docs/agentrc-reference.json) and adapt the paths:
|
|
880
|
+
|
|
881
|
+
```jsonc
|
|
882
|
+
{
|
|
883
|
+
"qa": {
|
|
884
|
+
"featureRoot": "tests/features", // root the selector resolves .feature files against
|
|
885
|
+
"fixturesManifest": "tests/fixtures/personas.json", // persona → seed-data manifest
|
|
886
|
+
"signInSeam": { "urlTemplate": "/dev/sign-in-as/{persona}" }, // dev seam (see step 3)
|
|
887
|
+
"personas": ["admin", "member"], // name-only array — the honest shape for a url-template seam
|
|
888
|
+
"consoleAllowlist": ["[HMR]"], // optional benign-noise filter (default [])
|
|
889
|
+
"designTokens": "src/styles/tokens.css" // optional visual-check pointer (default null)
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
```
|
|
893
|
+
|
|
894
|
+
`featureRoot`, `fixturesManifest`, `signInSeam`, and `personas` are
|
|
895
|
+
mandatory; omitting any one makes the resolver throw a field-named error.
|
|
896
|
+
`consoleAllowlist` and `designTokens` default to `[]` and `null`.
|
|
897
|
+
|
|
898
|
+
`personas` accepts **two shapes** (the resolver normalizes both to one
|
|
899
|
+
canonical internal map keyed by persona name):
|
|
900
|
+
|
|
901
|
+
- **Name-only array** (above) — `["admin", "member"]`. This is the honest
|
|
902
|
+
shape under a `urlTemplate` dev-impersonation seam, where the persona name
|
|
903
|
+
is the only input the harness consumes (it is substituted into the URL) and
|
|
904
|
+
no per-persona auth material is ever read. Do **not** fabricate
|
|
905
|
+
`credentialRef`/`signInSkill` values a url-template seam ignores.
|
|
906
|
+
- **Object map** — keyed by persona name, each entry carrying per-persona
|
|
907
|
+
auth material (`{ credentialRef }` or `{ signInSkill }`). Use this only
|
|
908
|
+
under a `skill` (or credential) seam where that material is genuinely
|
|
909
|
+
consulted:
|
|
910
|
+
|
|
911
|
+
```jsonc
|
|
912
|
+
"signInSeam": { "skill": "stack/qa/sign-in" },
|
|
913
|
+
"personas": {
|
|
914
|
+
"admin": { "credentialRef": "QA_ADMIN_CREDENTIAL" }, // stored-credential reference, never an inline secret
|
|
915
|
+
"member": { "signInSkill": "stack/qa/sign-in-member" } // or a per-persona sign-in skill
|
|
916
|
+
}
|
|
917
|
+
```
|
|
918
|
+
|
|
919
|
+
### 2. Author the fixtures manifest
|
|
920
|
+
|
|
921
|
+
Create the file referenced by `fixturesManifest`. It binds each persona to
|
|
922
|
+
the seed data the harness loads before signing that persona in, so scenarios
|
|
923
|
+
start from a known state. Every persona named under `qa.personas` should have
|
|
924
|
+
a corresponding entry. Keep the manifest free of real secrets — it carries
|
|
925
|
+
seed-data shape, not credentials (credentials resolve through `credentialRef`
|
|
926
|
+
or a sign-in skill).
|
|
927
|
+
|
|
928
|
+
### 3. Expose a `signInSeam`
|
|
929
|
+
|
|
930
|
+
The harness signs in once per persona using a **dev-only seam** — real
|
|
931
|
+
credentials are never entered. Expose one of two shapes:
|
|
932
|
+
|
|
933
|
+
- **`{ urlTemplate }`** — a dev sign-in route where `{persona}` is
|
|
934
|
+
substituted (e.g. `/dev/sign-in-as/{persona}` → `/dev/sign-in-as/admin`).
|
|
935
|
+
Gate this route to non-production builds.
|
|
936
|
+
- **`{ skill }`** — when sign-in is multi-step or non-URL, point at a
|
|
937
|
+
consumer skill whose `SKILL.md` the harness reads and follows.
|
|
938
|
+
|
|
939
|
+
Which seam kinds consult per-persona material: under a `{ urlTemplate }` seam
|
|
940
|
+
the persona **name** is the sole input, so author `personas` as a name-only
|
|
941
|
+
array and supply no auth material. Under a `{ skill }` (or credential) seam,
|
|
942
|
+
author `personas` as the object map and supply per-persona overrides:
|
|
943
|
+
`{ credentialRef }` points at a stored-credential reference (resolved from the
|
|
944
|
+
environment, never inlined) and `{ signInSkill }` points at a per-persona
|
|
945
|
+
sign-in skill.
|
|
946
|
+
|
|
947
|
+
Once these three `qa.*` keys are in place, `/qa-explore <surface>`,
|
|
948
|
+
`/qa-assist`, and `/qa-run-harness <selector>` all resolve the contract and
|
|
949
|
+
operate against the bound surface. For `/qa-run-harness`, the `chrome-devtools`
|
|
950
|
+
MCP surface is a host-provided runtime dependency; when it is unavailable the
|
|
951
|
+
harness degrades with a clear error rather than falling back to a headless
|
|
952
|
+
runner. `/qa-explore` and `/qa-assist` read the same `qa.*` keys to scope their
|
|
953
|
+
work and to drive the deterministic coverage/missing-test verdicts, then record
|
|
954
|
+
each observation into the `temp/qa/` ledger described above.
|