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,293 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Human-led QA assist loop — ingest one operator observation, enrich it with repro + root-cause (file:line) + a coverage verdict, ask clarifying questions when it is ambiguous, and append a redacted ledger item to a persistent, resumable rolling session under temp/qa/
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /qa-assist
|
|
6
|
+
|
|
7
|
+
Drive a **human-led QA-assist session** as a human-in-the-loop (HITL) loop:
|
|
8
|
+
**Intake → Enrich → Record**. The operator reports a single observation (a
|
|
9
|
+
bug they hit, a flaky behavior, a "this feels off"); the agent (acting as the
|
|
10
|
+
QA engineer) enriches that observation into a structured, triage-ready ledger
|
|
11
|
+
item — a clean repro, a root-cause locus (`file:line`), and a coverage
|
|
12
|
+
verdict — **asking clarifying questions whenever the observation is
|
|
13
|
+
ambiguous**, and only after explicit operator confirmation appends it to a
|
|
14
|
+
**persistent, resumable rolling session** under `temp/qa/`.
|
|
15
|
+
|
|
16
|
+
Unlike [`/qa-explore`](qa-explore.md) (where the *agent* drives open-ended
|
|
17
|
+
exploration of a named surface and captures many observations), `/qa-assist`
|
|
18
|
+
is **human-led and single-observation-at-a-time**: the human owns the signal,
|
|
19
|
+
the agent owns the enrichment. It is the front door for "I just saw something
|
|
20
|
+
weird — help me capture it well." Each observation is recorded as a
|
|
21
|
+
`QaLedgerItem` against the
|
|
22
|
+
[`qa-ledger.schema.json`](../schemas/qa-ledger.schema.json) contract, the same
|
|
23
|
+
ledger `/qa-explore` and the triage/promotion path consume — so a `/qa-assist`
|
|
24
|
+
item flows through the identical dedup, classification, and promotion machinery
|
|
25
|
+
later.
|
|
26
|
+
|
|
27
|
+
This is a **prose workflow**, not a Node orchestrator: the host LLM executes
|
|
28
|
+
the procedure; deterministic Node helpers under `.agents/scripts/lib/qa/` and
|
|
29
|
+
`.agents/scripts/lib/findings/` do the contract resolution, session/ledger
|
|
30
|
+
resolution, context hydration, redaction, coverage verdict, classification,
|
|
31
|
+
dedup/route, and promotion. **The agent consumes the shared core helpers; it
|
|
32
|
+
never reimplements those decisions in prose.**
|
|
33
|
+
|
|
34
|
+
> **When to run**: a developer or operator hits something mid-flight and wants
|
|
35
|
+
> it captured as a high-quality, triage-ready finding without breaking stride —
|
|
36
|
+
> a one-off bug report, a "is this even covered by a test?" question, or a
|
|
37
|
+
> rolling personal QA backlog they top up across a working session.
|
|
38
|
+
>
|
|
39
|
+
> **Persona**: `qa-engineer` · **Skills**: `core/qa-coverage-mapping`
|
|
40
|
+
|
|
41
|
+
## Persona
|
|
42
|
+
|
|
43
|
+
Adopt the **`qa-engineer`** persona
|
|
44
|
+
([`.agents/personas/qa-engineer.md`](../personas/qa-engineer.md)) for the whole
|
|
45
|
+
run. You are the quality gatekeeper: you value coverage, hermetic
|
|
46
|
+
environments, deterministic results, and — per that persona's Golden Rule —
|
|
47
|
+
you **never invent the signal**. The human owns what was observed; you enrich
|
|
48
|
+
it. Re-read that persona file as your first action so the
|
|
49
|
+
Intake/Enrich/Record loop is governed by it.
|
|
50
|
+
|
|
51
|
+
## Slash Command
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
/qa-assist [observation]
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Arguments
|
|
58
|
+
|
|
59
|
+
| Name | Required | Shape / Example | Notes |
|
|
60
|
+
| ------------- | -------- | ------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
|
|
61
|
+
| `observation` | no | `"sync-commands wipes .claude on a reused name"` | The human observation to enrich. If omitted, **ask** the operator to describe what they saw. |
|
|
62
|
+
|
|
63
|
+
If no `observation` is supplied, **stop and ask** the operator to describe
|
|
64
|
+
what they observed — the `qa-engineer` Golden Rule forbids inventing the
|
|
65
|
+
signal. Do not synthesize an observation on the operator's behalf.
|
|
66
|
+
|
|
67
|
+
## Project contract
|
|
68
|
+
|
|
69
|
+
Resolve the consumer's `qa` contract before enriching, via
|
|
70
|
+
[`resolve-qa-contract.js`](../scripts/lib/qa/resolve-qa-contract.js):
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
import { resolveQaContract } from '../scripts/lib/qa/resolve-qa-contract.js';
|
|
74
|
+
const contract = resolveQaContract(config); // throws loudly if unbound
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The resolver fails **loudly** when the project has not bound the QA harness
|
|
78
|
+
(no `qa` block in `.agentrc.json`) — there is no silent fallback. If it throws
|
|
79
|
+
the "this project has not bound the QA harness" message, surface that verbatim
|
|
80
|
+
to the operator and stop; do not pretend a contract exists.
|
|
81
|
+
|
|
82
|
+
## Session & ledger (temp/qa/) — persistent, resumable, rolling
|
|
83
|
+
|
|
84
|
+
`/qa-assist` **defaults to a persistent rolling session**: the same session
|
|
85
|
+
is resumed across invocations so an operator can top up the same ledger over a
|
|
86
|
+
working day. Resolve the session and its ledger path **once**, up front, via
|
|
87
|
+
[`qa-session.js`](../scripts/lib/qa/qa-session.js):
|
|
88
|
+
|
|
89
|
+
```js
|
|
90
|
+
import { resolveQaSession } from '../scripts/lib/qa/qa-session.js';
|
|
91
|
+
const { sessionId, ledgerPath, reused, untriaged } = resolveQaSession({ config });
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
- The ledger is always written under **`temp/qa/<sessionId>.ndjson`**
|
|
95
|
+
(`<tempRoot>/qa/`, resolved from `project.paths.tempRoot`). It is one
|
|
96
|
+
`QaLedgerItem` per line (ndjson). **Never** write the ledger anywhere else,
|
|
97
|
+
and never commit it — `temp/` is gitignored per
|
|
98
|
+
[`.agents/instructions.md` § 6](../instructions.md).
|
|
99
|
+
- When `reused` is `true`, a prior session of the same id exists: **append**,
|
|
100
|
+
never overwrite, and surface the carried `untriaged` items as the rolling
|
|
101
|
+
backlog so the operator sees what is still open. Pass `--session-id <id>`
|
|
102
|
+
(or `QA_SESSION_ID`) to resume or fork a named session. This is the
|
|
103
|
+
resumable-rolling-session contract — a `/qa-assist` run is additive to the
|
|
104
|
+
prior ledger by default.
|
|
105
|
+
|
|
106
|
+
## Phase gates (HITL)
|
|
107
|
+
|
|
108
|
+
Every phase transition **and every write** is gated on **explicit operator
|
|
109
|
+
confirmation**. Do not advance Intake → Enrich, or Enrich → Record, until the
|
|
110
|
+
operator says so. State each gate as a question, present the artifact (the
|
|
111
|
+
restated observation, then the enriched ledger item), and wait. This is a HITL
|
|
112
|
+
workflow — the agent never appends to the ledger, files a ticket, or advances
|
|
113
|
+
a phase autonomously. If the operator does not confirm, stop and hold.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Phase 1 — Intake
|
|
118
|
+
|
|
119
|
+
Goal: understand **exactly what the human observed** before enriching it.
|
|
120
|
+
This phase is where ambiguity is resolved by **asking**, not guessing.
|
|
121
|
+
|
|
122
|
+
1. Re-read the `qa-engineer` persona and resolve the `qa` contract and session
|
|
123
|
+
(above). Surface the rolling `untriaged` backlog so the operator knows what
|
|
124
|
+
is already open in this session.
|
|
125
|
+
2. **Restate the observation** back to the operator in your own words — the
|
|
126
|
+
surface it touches, the action taken, the actual result, and the expected
|
|
127
|
+
result. This restatement is the agent's read of the signal.
|
|
128
|
+
3. **Ask clarifying questions when the observation is ambiguous.** If you
|
|
129
|
+
cannot confidently fill in any of {surface, exact steps, actual result,
|
|
130
|
+
expected result, environment} from what the operator gave you, **stop and
|
|
131
|
+
ask** — do not paper over the gap with an assumption. Typical gaps:
|
|
132
|
+
- Which surface / command / flow? (so the coverage verdict targets the
|
|
133
|
+
right symbol)
|
|
134
|
+
- What were the exact steps, and is it reproducible or intermittent?
|
|
135
|
+
- What did you expect instead, and why is that the contract?
|
|
136
|
+
- What environment (OS, shell, branch, fresh vs. reused state)?
|
|
137
|
+
4. **Gate:** present the restated observation and ask the operator to confirm
|
|
138
|
+
it is accurate (or correct it). Do **not** proceed to Enrich until they
|
|
139
|
+
confirm the restatement is faithful.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Phase 2 — Enrich
|
|
144
|
+
|
|
145
|
+
Goal: turn the confirmed observation into a high-quality, triage-ready finding —
|
|
146
|
+
a clean repro, a root-cause locus, and a coverage verdict. Delegate every
|
|
147
|
+
decision to the shared core helpers.
|
|
148
|
+
|
|
149
|
+
1. **Redact first.** Before any evidence string touches disk or reaches
|
|
150
|
+
GitHub, scrub it through
|
|
151
|
+
[`redact-evidence.js`](../scripts/lib/qa/redact-evidence.js):
|
|
152
|
+
|
|
153
|
+
```js
|
|
154
|
+
import { redactEvidence } from '../scripts/lib/qa/redact-evidence.js';
|
|
155
|
+
const evidence = redactEvidence(rawObservation);
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
This is mandatory per [`security-baseline.md`](../rules/security-baseline.md)
|
|
159
|
+
(§ Data Leakage & Logging, § Secrets Management) — bearer tokens, session
|
|
160
|
+
cookies, and emails are masked. The pass is idempotent, so redact eagerly,
|
|
161
|
+
before the repro and root-cause notes are written anywhere.
|
|
162
|
+
|
|
163
|
+
2. **Establish a clean repro.** From the confirmed steps, write the minimal
|
|
164
|
+
deterministic reproduction. If the steps are still non-deterministic or
|
|
165
|
+
incomplete, return to Intake and ask — a finding without a repro is not yet
|
|
166
|
+
ready to record.
|
|
167
|
+
|
|
168
|
+
3. **Hydrate the QA context** to locate the root cause, via
|
|
169
|
+
[`qa-context-hydrator.js`](../scripts/lib/qa/qa-context-hydrator.js). It
|
|
170
|
+
resolves the Epic/Feature context tickets, the feature-file set, the
|
|
171
|
+
surface map, and recent git log so you can name the **root-cause locus as
|
|
172
|
+
`file:line`** rather than guessing:
|
|
173
|
+
|
|
174
|
+
```js
|
|
175
|
+
import { hydrateQaContext } from '../scripts/lib/qa/qa-context-hydrator.js';
|
|
176
|
+
const context = await hydrateQaContext({ epicNumber, githubPort, gitPort, surfaceMap });
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Record the root cause as a concrete `file:line` reference. If you cannot
|
|
180
|
+
pin it, say so explicitly in the ledger item rather than inventing a locus.
|
|
181
|
+
|
|
182
|
+
4. **Compute the coverage verdict** for the surface the observation points at,
|
|
183
|
+
via [`coverage-verdict.js`](../scripts/lib/qa/coverage-verdict.js) — the
|
|
184
|
+
deterministic seam behind the
|
|
185
|
+
[`core/qa-coverage-mapping`](../skills/core/qa-coverage-mapping/SKILL.md)
|
|
186
|
+
skill. Read that skill for how to assemble the `surface` input (symbol +
|
|
187
|
+
the unit/contract/acceptance tests around it) and how to read the per-tier
|
|
188
|
+
`{present|absent}` verdict. Optionally render a human-readable coverage
|
|
189
|
+
summary via [`coverage-report.js`](../scripts/lib/qa/coverage-report.js).
|
|
190
|
+
|
|
191
|
+
5. **Propose the missing test** (if any) from that verdict, via
|
|
192
|
+
[`propose-missing-test.js`](../scripts/lib/qa/propose-missing-test.js). It
|
|
193
|
+
names the lowest absent tier (the cheapest gap the signal leaked through),
|
|
194
|
+
or returns `null` when every tier is covered. Record the proposal's
|
|
195
|
+
`description` as the ledger item's `missingTest` (or `null`).
|
|
196
|
+
|
|
197
|
+
6. **Classify** the finding via
|
|
198
|
+
[`classify-finding.js`](../scripts/lib/findings/classify-finding.js) so the
|
|
199
|
+
tentative `class` resolves to the correct focus/meta label set
|
|
200
|
+
(`tooling-dx` carries `meta::framework-gap`; `enhancement` carries
|
|
201
|
+
`meta::consumer-improvement`). The helper **throws** on an absent/unknown
|
|
202
|
+
class — fix the finding's class rather than defaulting.
|
|
203
|
+
|
|
204
|
+
7. **Gate:** present the enriched candidate `QaLedgerItem` (redacted evidence,
|
|
205
|
+
repro, root-cause `file:line`, coverage verdict, `class`, `severity`,
|
|
206
|
+
`missingTest`) and ask the operator to confirm it is accurate before any
|
|
207
|
+
write. Do **not** append to the ledger until they confirm.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Phase 3 — Record
|
|
212
|
+
|
|
213
|
+
Goal: persist the enriched, confirmed finding to the rolling session ledger —
|
|
214
|
+
and optionally route or promote it — with the operator deciding each write.
|
|
215
|
+
|
|
216
|
+
1. **Append a `QaLedgerItem`** to `temp/qa/<sessionId>.ndjson`, conforming to
|
|
217
|
+
[`qa-ledger.schema.json`](../schemas/qa-ledger.schema.json): a stable `id`
|
|
218
|
+
(`L1`, `L2`, … appended after any carried backlog), the redacted
|
|
219
|
+
`evidence`, the repro and root-cause `file:line` notes, the `coverage`
|
|
220
|
+
label, the confirmed `class` and `severity`, the `missingTest`, and a
|
|
221
|
+
`disposition` (default untriaged unless the operator decides now). This
|
|
222
|
+
append is a **write** — confirm it at the Phase 2 → Record gate before it
|
|
223
|
+
happens.
|
|
224
|
+
|
|
225
|
+
2. **Optionally dedup / route** the finding against existing GitHub Issues via
|
|
226
|
+
[`route-finding.js`](../scripts/lib/findings/route-finding.js) (the
|
|
227
|
+
**single** dedup implementation shared with `/qa-explore` and
|
|
228
|
+
`audit-to-stories`), backed by
|
|
229
|
+
[`semantic-issue-search.js`](../scripts/lib/findings/semantic-issue-search.js)
|
|
230
|
+
for candidate recall:
|
|
231
|
+
|
|
232
|
+
```js
|
|
233
|
+
import { routeFinding, fingerprintFooter } from '../scripts/lib/findings/route-finding.js';
|
|
234
|
+
const { decision, matchedIssue, fingerprint } =
|
|
235
|
+
await routeFinding(finding, { searchIssues });
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
`decision` is one of `new` / `update-existing` / `duplicate` /
|
|
239
|
+
`regression-of-closed`. Stamp the `fingerprintFooter(sha)` marker into any
|
|
240
|
+
Issue body so future runs dedup against it.
|
|
241
|
+
|
|
242
|
+
3. **Optionally promote** the finding to a follow-up ticket via
|
|
243
|
+
[`promote-finding.js`](../scripts/lib/findings/promote-finding.js), which
|
|
244
|
+
clusters, routes, and files through the same ports — never hand-roll the
|
|
245
|
+
promotion:
|
|
246
|
+
|
|
247
|
+
```js
|
|
248
|
+
import { promoteFindings } from '../scripts/lib/findings/promote-finding.js';
|
|
249
|
+
const promotions = await promoteFindings(ledgerItems, { searchIssues, createStory });
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
4. **Gate:** any ledger append, ticket-filing, or label mutation is a write —
|
|
253
|
+
confirm **each one** with the operator before it happens. Redaction has
|
|
254
|
+
already run, so nothing unredacted reaches disk or GitHub.
|
|
255
|
+
|
|
256
|
+
After recording, summarize: the finding recorded, its coverage verdict and
|
|
257
|
+
`missingTest`, any route/promotion decision
|
|
258
|
+
(`new`/`update-existing`/`duplicate`/`regression-of-closed`), and the rolling
|
|
259
|
+
backlog a resumed session will pick up.
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## Constraints
|
|
264
|
+
|
|
265
|
+
- **Human-led, single-observation.** The operator owns the signal; the agent
|
|
266
|
+
enriches it. Never invent an observation; **ask clarifying questions** when
|
|
267
|
+
the observation is ambiguous instead of assuming.
|
|
268
|
+
- **Every phase transition and every write is operator-gated.** Intake →
|
|
269
|
+
Enrich, Enrich → Record, and each ledger append / ticket-filing / label
|
|
270
|
+
mutation require explicit confirmation. Never advance, append, file a
|
|
271
|
+
ticket, or mutate a label autonomously.
|
|
272
|
+
- **Persistent, resumable rolling session.** `/qa-assist` defaults to resuming
|
|
273
|
+
the same session and **appending** to its ledger; a reused session carries
|
|
274
|
+
the un-triaged backlog forward via
|
|
275
|
+
[`qa-session.js`](../scripts/lib/qa/qa-session.js) and never overwrites a
|
|
276
|
+
prior ledger.
|
|
277
|
+
- **The ledger lives under `temp/qa/` only**, one `QaLedgerItem` per ndjson
|
|
278
|
+
line, conforming to [`qa-ledger.schema.json`](../schemas/qa-ledger.schema.json).
|
|
279
|
+
Never commit it.
|
|
280
|
+
- **Redact before persist.** Every evidence string passes through
|
|
281
|
+
[`redact-evidence.js`](../scripts/lib/qa/redact-evidence.js) before it
|
|
282
|
+
reaches disk or GitHub, per [`security-baseline.md`](../rules/security-baseline.md).
|
|
283
|
+
- **Consume the shared core; never reimplement.** Context hydration
|
|
284
|
+
([`qa-context-hydrator.js`](../scripts/lib/qa/qa-context-hydrator.js)),
|
|
285
|
+
coverage verdict ([`coverage-verdict.js`](../scripts/lib/qa/coverage-verdict.js)),
|
|
286
|
+
coverage report ([`coverage-report.js`](../scripts/lib/qa/coverage-report.js)),
|
|
287
|
+
missing-test ([`propose-missing-test.js`](../scripts/lib/qa/propose-missing-test.js)),
|
|
288
|
+
classification ([`classify-finding.js`](../scripts/lib/findings/classify-finding.js)),
|
|
289
|
+
dedup/route ([`route-finding.js`](../scripts/lib/findings/route-finding.js)),
|
|
290
|
+
semantic search ([`semantic-issue-search.js`](../scripts/lib/findings/semantic-issue-search.js)),
|
|
291
|
+
promotion ([`promote-finding.js`](../scripts/lib/findings/promote-finding.js)),
|
|
292
|
+
and session resolution ([`qa-session.js`](../scripts/lib/qa/qa-session.js))
|
|
293
|
+
are deterministic — never re-derive them in prose.
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Agent-led exploratory-QA loop — the agent Plans a surface with an explicit static-vs-drive method choice, drives it (browser MCP or static), and captures ledger items read-only, then Triages — a bounded per-surface session, HITL-gated at every phase transition, routed through the shared dedup/coverage/classification/missing-test/redaction/session core under temp/qa/
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /qa-explore
|
|
6
|
+
|
|
7
|
+
Drive a **bounded, agent-led exploratory-QA session** as a human-in-the-loop
|
|
8
|
+
(HITL) loop: **Plan → Capture → Triage**. The operator names a single surface;
|
|
9
|
+
the agent (acting as the QA engineer) **plans** how it will reach that surface,
|
|
10
|
+
**drives** it itself — through the browser MCP by default, or statically as a
|
|
11
|
+
documented interim — and records each observation as a structured ledger item
|
|
12
|
+
under a strictly read-only capture invariant. Only after explicit operator
|
|
13
|
+
confirmation does it triage the ledger into routed, classified, dedup'd
|
|
14
|
+
follow-up dispositions.
|
|
15
|
+
|
|
16
|
+
This is the **agent-led** front-end of exploratory QA: **the agent drives, the
|
|
17
|
+
operator watches and gates.** Its human-led sibling is
|
|
18
|
+
[`/qa-assist`](qa-assist.md) — there the *human* drives a single observation and
|
|
19
|
+
the agent scribes/enriches. No human-driven flow lives in `/qa-explore`; if you
|
|
20
|
+
want to capture something *you* observed, use `/qa-assist` instead.
|
|
21
|
+
|
|
22
|
+
Unlike [`/qa-run-harness`](qa-run-harness.md) (which steps a known set of
|
|
23
|
+
Gherkin `.feature` scenarios through a browser), `/qa-explore` is **open-ended
|
|
24
|
+
exploration**: the agent probes the surface for product bugs, environment-setup
|
|
25
|
+
friction, tooling/DX gaps, missing tests, and enhancement ideas — each captured
|
|
26
|
+
as a `QaLedgerItem` against the
|
|
27
|
+
[`qa-ledger.schema.json`](../schemas/qa-ledger.schema.json) contract.
|
|
28
|
+
|
|
29
|
+
This is a **prose workflow**, not a Node orchestrator: the host LLM executes
|
|
30
|
+
the procedure; deterministic Node helpers under `.agents/scripts/lib/qa/` and
|
|
31
|
+
`.agents/scripts/lib/findings/` do the contract resolution, session/ledger
|
|
32
|
+
resolution, redaction, coverage verdict, missing-test proposal, classification,
|
|
33
|
+
and dedup/route decisions. The agent never invents those decisions in prose.
|
|
34
|
+
|
|
35
|
+
> **When to run**: ad-hoc agent-driven exploration of a freshly delivered Story
|
|
36
|
+
> or Feature, a regression sweep over a risky surface before `/epic-deliver`, or
|
|
37
|
+
> a structured agent-driven bug-hunt the operator wants captured into a
|
|
38
|
+
> triageable ledger.
|
|
39
|
+
>
|
|
40
|
+
> **Persona**: `qa-engineer` · **Skills**: `core/qa-coverage-mapping`,
|
|
41
|
+
> `stack/qa/qa-explore-driving`
|
|
42
|
+
|
|
43
|
+
## Persona
|
|
44
|
+
|
|
45
|
+
Adopt the **`qa-engineer`** persona
|
|
46
|
+
([`.agents/personas/qa-engineer.md`](../personas/qa-engineer.md)) for the whole
|
|
47
|
+
run. You are the quality gatekeeper: you value coverage, hermetic
|
|
48
|
+
environments, and deterministic results. Re-read that persona file as your
|
|
49
|
+
first action so the Plan/Capture/Triage loop is governed by it.
|
|
50
|
+
|
|
51
|
+
## Driving conventions skill
|
|
52
|
+
|
|
53
|
+
Before you drive a surface, read the
|
|
54
|
+
[`stack/qa/qa-explore-driving`](../skills/stack/qa/qa-explore-driving/SKILL.md)
|
|
55
|
+
skill. It is the conventions reference this procedure depends on for the
|
|
56
|
+
**how** of agent-driven exploration:
|
|
57
|
+
|
|
58
|
+
- **Navigation-first driving (the default).** Drive the running app through the
|
|
59
|
+
browser MCP, starting at a root and reaching each surface only via UI
|
|
60
|
+
affordances — never URL-jump to a deep link. Browser instrumentation lives in
|
|
61
|
+
[`core/browser-testing-with-devtools`](../skills/core/browser-testing-with-devtools/SKILL.md).
|
|
62
|
+
- **Static driving (the documented interim).** When a live runtime is not
|
|
63
|
+
reachable, walk the surface from source, route definitions, and rendered
|
|
64
|
+
markup — chosen explicitly at Plan time, never as a silent fallback.
|
|
65
|
+
- **Authenticated driving depends on consumer persona-seeding infrastructure
|
|
66
|
+
this framework does not deliver.** Without it, drive only the unauthenticated
|
|
67
|
+
surface or fall back to static, never enter real credentials, and record the
|
|
68
|
+
gap.
|
|
69
|
+
- **Broken navigation is a finding, not a workaround.** A missing affordance, a
|
|
70
|
+
nav 404, or a guard redirect loop is recorded and you move on — you do not
|
|
71
|
+
route around it with a direct URL.
|
|
72
|
+
|
|
73
|
+
The driving method (drive vs. static) is a **Plan-phase decision recorded in the
|
|
74
|
+
ledger**; do not switch methods mid-surface without a new Plan note.
|
|
75
|
+
|
|
76
|
+
## Slash Command
|
|
77
|
+
|
|
78
|
+
```text
|
|
79
|
+
/qa-explore <surface>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Arguments
|
|
83
|
+
|
|
84
|
+
| Name | Required | Shape / Example | Notes |
|
|
85
|
+
| --------- | -------- | ---------------------------------- | -------------------------------------------------------------------------------------- |
|
|
86
|
+
| `surface` | yes | `feature:login`, `area:onboarding` | A human label for the single surface to explore. Recorded as each ledger item's `coverage`. |
|
|
87
|
+
|
|
88
|
+
If no `surface` is supplied, **stop and ask** the operator to name one — the
|
|
89
|
+
`qa-engineer` Golden Rule forbids inventing scope. `/qa-explore` is **bounded
|
|
90
|
+
to one surface per session**: explore exactly the named surface, do not wander
|
|
91
|
+
into adjacent surfaces, and start a fresh session for a different surface.
|
|
92
|
+
|
|
93
|
+
## Project contract
|
|
94
|
+
|
|
95
|
+
Resolve the consumer's `qa` contract before exploring, via
|
|
96
|
+
[`resolve-qa-contract.js`](../scripts/lib/qa/resolve-qa-contract.js):
|
|
97
|
+
|
|
98
|
+
```js
|
|
99
|
+
import { resolveQaContract } from '../scripts/lib/qa/resolve-qa-contract.js';
|
|
100
|
+
const contract = resolveQaContract(config); // throws loudly if unbound
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
The resolver fails **loudly** when the project has not bound the QA harness
|
|
104
|
+
(no `qa` block in `.agentrc.json`) — there is no silent fallback. If it throws
|
|
105
|
+
the "this project has not bound the QA harness" message, surface that verbatim
|
|
106
|
+
to the operator and stop; do not pretend a contract exists.
|
|
107
|
+
|
|
108
|
+
## Session & ledger (temp/qa/)
|
|
109
|
+
|
|
110
|
+
Resolve the session and its ledger path **once**, up front, via
|
|
111
|
+
[`qa-session.js`](../scripts/lib/qa/qa-session.js):
|
|
112
|
+
|
|
113
|
+
```js
|
|
114
|
+
import { resolveQaSession } from '../scripts/lib/qa/qa-session.js';
|
|
115
|
+
const { sessionId, ledgerPath, reused, untriaged } = resolveQaSession({ config });
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
- The ledger is always written under **`temp/qa/<sessionId>.ndjson`**
|
|
119
|
+
(`<tempRoot>/qa/`, resolved from `project.paths.tempRoot`). It is one
|
|
120
|
+
`QaLedgerItem` per line (ndjson). **Never** write the ledger anywhere else,
|
|
121
|
+
and never commit it — `temp/` is gitignored per
|
|
122
|
+
[`.agents/instructions.md` § 6](../instructions.md).
|
|
123
|
+
- When `reused` is `true`, a prior session of the same id exists: **append**,
|
|
124
|
+
never overwrite, and carry the `untriaged` items forward as the rolling
|
|
125
|
+
backlog (resume safety). Pass `--session-id <id>` (or `QA_SESSION_ID`) to
|
|
126
|
+
resume a named session.
|
|
127
|
+
|
|
128
|
+
## Bounded per-surface session
|
|
129
|
+
|
|
130
|
+
A `/qa-explore` run is a **single bounded session over one named surface**, not
|
|
131
|
+
an open-ended sweep:
|
|
132
|
+
|
|
133
|
+
- **One surface.** The session explores exactly the `surface` argument. Driving
|
|
134
|
+
the named surface may legitimately touch sub-surfaces reachable from it
|
|
135
|
+
navigation-first, but the session does not pivot to a different top-level
|
|
136
|
+
surface — that is a new session.
|
|
137
|
+
- **Bounded by the operator's gate.** Capture continues until the operator says
|
|
138
|
+
exploration is complete (the Capture → Triage gate), not until the agent has
|
|
139
|
+
exhausted the app. The agent proposes when it believes the surface is
|
|
140
|
+
covered; the operator decides.
|
|
141
|
+
- **Resumable, not unbounded.** A reused session appends to the same ledger and
|
|
142
|
+
carries its untriaged backlog forward; it does not widen the surface.
|
|
143
|
+
|
|
144
|
+
## Phase gates (HITL)
|
|
145
|
+
|
|
146
|
+
Every phase transition is gated on **explicit operator confirmation**. Do not
|
|
147
|
+
advance Plan → Capture, or Capture → Triage, until the operator says so. State
|
|
148
|
+
each gate as a question, present the artifact (the plan with its chosen driving
|
|
149
|
+
method, then the captured ledger), and wait. This is a HITL workflow — the
|
|
150
|
+
agent drives and captures, but it never files tickets, promotes findings, or
|
|
151
|
+
advances phases autonomously. If the operator does not confirm, stop and hold.
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Phase 1 — Plan
|
|
156
|
+
|
|
157
|
+
Goal: agree on **what** will be explored and **how the agent will drive it**
|
|
158
|
+
before touching the surface.
|
|
159
|
+
|
|
160
|
+
1. Re-read the `qa-engineer` persona and the
|
|
161
|
+
[`stack/qa/qa-explore-driving`](../skills/stack/qa/qa-explore-driving/SKILL.md)
|
|
162
|
+
skill, and resolve the `qa` contract and session (above).
|
|
163
|
+
2. **Choose the driving method explicitly** for the named `surface`:
|
|
164
|
+
- **Drive (default):** the live runtime is reachable, so the agent will
|
|
165
|
+
drive it through the browser MCP, navigation-first (start at a root, reach
|
|
166
|
+
the surface via UI affordances, never URL-jump).
|
|
167
|
+
- **Static (documented interim):** the live runtime is *not* reachable —
|
|
168
|
+
most commonly because authenticated driving needs consumer persona-seeding
|
|
169
|
+
infrastructure that does not exist — so the agent will walk the surface
|
|
170
|
+
from source, routes, and rendered markup. This is a deliberate Plan-time
|
|
171
|
+
decision with a recorded reason, never a silent fallback when the browser
|
|
172
|
+
MCP hiccups.
|
|
173
|
+
|
|
174
|
+
Record the chosen method and reason on the ledger (e.g.
|
|
175
|
+
`method: static, reason: no reachable authenticated runtime`).
|
|
176
|
+
3. Draft an **exploration plan** for the named `surface`:
|
|
177
|
+
- the sub-surfaces / flows / states the agent intends to drive,
|
|
178
|
+
- the classes of signal it is hunting (product bug, environment-setup,
|
|
179
|
+
tooling-dx, test-gap, enhancement — the
|
|
180
|
+
[ledger `class` enum](../schemas/qa-ledger.schema.json)),
|
|
181
|
+
- the chosen driving method and its rationale,
|
|
182
|
+
- any rolling backlog (`untriaged`) carried forward from a resumed session.
|
|
183
|
+
4. Present the plan, the chosen driving method, and the resolved `ledgerPath`
|
|
184
|
+
(under `temp/qa/`) to the operator.
|
|
185
|
+
5. **Gate:** ask the operator to confirm the plan and the driving method (or
|
|
186
|
+
amend the surface/scope/method). Do **not** proceed to Capture until they
|
|
187
|
+
confirm.
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Phase 2 — Capture (agent drives, READ-ONLY)
|
|
192
|
+
|
|
193
|
+
Goal: **the agent drives the confirmed surface itself** and records its
|
|
194
|
+
observations. **This phase is strictly read-only.**
|
|
195
|
+
|
|
196
|
+
> **Read-only invariant.** The agent observes; it never mutates. Per
|
|
197
|
+
> [`stack/qa/qa-explore-driving`](../skills/stack/qa/qa-explore-driving/SKILL.md)
|
|
198
|
+
> § 3 (inviolable per
|
|
199
|
+
> [`security-baseline.md`](../rules/security-baseline.md)), do **not** edit
|
|
200
|
+
> source, run write commands, file or label GitHub issues, change tickets,
|
|
201
|
+
> submit destructive forms, or alter the product under test. The only write
|
|
202
|
+
> Capture performs is **appending ledger lines to
|
|
203
|
+
> `temp/qa/<sessionId>.ndjson`** — session scratch, not a repository or product
|
|
204
|
+
> mutation. Any action that would change state belongs in Triage (and only
|
|
205
|
+
> after the operator confirms). When a surface's only path forward is a
|
|
206
|
+
> mutating action, record the boundary as the finding and stop — do not cross
|
|
207
|
+
> it.
|
|
208
|
+
|
|
209
|
+
**Drive the surface using the method chosen in Plan:**
|
|
210
|
+
|
|
211
|
+
- **Drive (default):** reach the surface navigation-first through the browser
|
|
212
|
+
MCP — start at a root, click the affordances a real user would, and observe
|
|
213
|
+
the rendered state, console, and network signal. Never URL-jump to establish
|
|
214
|
+
a starting state; a broken affordance, nav 404, or guard redirect loop is
|
|
215
|
+
itself a **finding**, not a workaround. Never enter real credentials to reach
|
|
216
|
+
an authenticated surface and never fabricate a session — drive only the
|
|
217
|
+
unauthenticated surface (or capture the authenticated surface statically) and
|
|
218
|
+
record the persona-seeding gap.
|
|
219
|
+
- **Static (documented interim):** walk the surface from source, route
|
|
220
|
+
definitions, and rendered markup. Treat its coverage as partial and say so in
|
|
221
|
+
the ledger — a static pass does not close the same coverage a driven pass
|
|
222
|
+
would.
|
|
223
|
+
|
|
224
|
+
For each observation the agent makes while driving:
|
|
225
|
+
|
|
226
|
+
1. **Redact first.** Before any evidence string touches disk, scrub it through
|
|
227
|
+
[`redact-evidence.js`](../scripts/lib/qa/redact-evidence.js):
|
|
228
|
+
|
|
229
|
+
```js
|
|
230
|
+
import { redactEvidence } from '../scripts/lib/qa/redact-evidence.js';
|
|
231
|
+
const evidence = redactEvidence(rawObservation);
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
This is mandatory per [`security-baseline.md`](../rules/security-baseline.md)
|
|
235
|
+
(§ Data Leakage & Logging, § Secrets Management) — bearer tokens, session
|
|
236
|
+
cookies, Authorization headers, and emails are masked. The pass is
|
|
237
|
+
idempotent, so redact eagerly; captured console and network evidence is
|
|
238
|
+
untrusted until scrubbed.
|
|
239
|
+
|
|
240
|
+
2. **Compute the coverage verdict** for the surface the observation points at,
|
|
241
|
+
via [`coverage-verdict.js`](../scripts/lib/qa/coverage-verdict.js) — the
|
|
242
|
+
deterministic seam behind the
|
|
243
|
+
[`core/qa-coverage-mapping`](../skills/core/qa-coverage-mapping/SKILL.md)
|
|
244
|
+
skill. Read that skill for how to assemble the `surface` input (symbol +
|
|
245
|
+
the unit/contract/acceptance tests around it) and how to read the per-tier
|
|
246
|
+
`{present|absent}` verdict.
|
|
247
|
+
|
|
248
|
+
3. **Propose the missing test** (if any) from that verdict, via
|
|
249
|
+
[`propose-missing-test.js`](../scripts/lib/qa/propose-missing-test.js). It
|
|
250
|
+
names the lowest absent tier (the cheapest gap the signal leaked through),
|
|
251
|
+
or returns `null` when every tier is covered. Record the proposal's
|
|
252
|
+
`description` as the ledger item's `missingTest` (or `null`).
|
|
253
|
+
|
|
254
|
+
4. **Append a `QaLedgerItem`** to `temp/qa/<sessionId>.ndjson`, conforming to
|
|
255
|
+
[`qa-ledger.schema.json`](../schemas/qa-ledger.schema.json): a stable
|
|
256
|
+
`id` (`L1`, `L2`, … in capture order), the redacted `evidence`, the
|
|
257
|
+
`coverage` label (the `surface`, or `unknown`), a tentative `class` and
|
|
258
|
+
`severity`, the `missingTest`, and `disposition` left untriaged for now.
|
|
259
|
+
|
|
260
|
+
5. Continue driving until the agent believes the surface is covered, then
|
|
261
|
+
propose that exploration is complete.
|
|
262
|
+
|
|
263
|
+
6. **Gate:** present the captured ledger (item count, classes, the driving
|
|
264
|
+
method used, the rolling backlog) and ask the operator to confirm moving to
|
|
265
|
+
Triage. Do **not** triage until they confirm.
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## Phase 3 — Triage
|
|
270
|
+
|
|
271
|
+
Goal: turn the captured ledger into routed, classified, dedup'd dispositions —
|
|
272
|
+
with the operator deciding each `file` / `defer` / `dismiss`.
|
|
273
|
+
|
|
274
|
+
For each untriaged ledger item:
|
|
275
|
+
|
|
276
|
+
1. **Classify** it via
|
|
277
|
+
[`classify-finding.js`](../scripts/lib/findings/classify-finding.js). The
|
|
278
|
+
item's `class` resolves to the focus/meta label set Triage applies when
|
|
279
|
+
promoting it (`tooling-dx` carries `meta::framework-gap`; `enhancement`
|
|
280
|
+
carries `meta::consumer-improvement`). The helper **throws** on an
|
|
281
|
+
absent/unknown class — fix the ledger item's class rather than defaulting.
|
|
282
|
+
|
|
283
|
+
2. **Dedup / route** it against existing GitHub Issues via
|
|
284
|
+
[`route-finding.js`](../scripts/lib/findings/route-finding.js):
|
|
285
|
+
|
|
286
|
+
```js
|
|
287
|
+
import { routeFinding, fingerprintFooter } from '../scripts/lib/findings/route-finding.js';
|
|
288
|
+
const { decision, matchedIssue, fingerprint } =
|
|
289
|
+
await routeFinding(finding, { searchIssues });
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
`decision` is one of `new` / `update-existing` / `duplicate` /
|
|
293
|
+
`regression-of-closed`. This is the **single** dedup implementation shared
|
|
294
|
+
with `/qa-assist` and `audit-to-stories`; stamp the `fingerprintFooter(sha)`
|
|
295
|
+
marker into any Issue body so future runs dedup against it. Wire the
|
|
296
|
+
`searchIssues` port to the GitHub provider (querying both open and closed
|
|
297
|
+
Issues).
|
|
298
|
+
|
|
299
|
+
3. **Decide the disposition** with the operator: `file` (promote to a
|
|
300
|
+
follow-up ticket with the classified labels + fingerprint footer), `defer`
|
|
301
|
+
(carry forward to a later session as backlog), or `dismiss` (non-actionable).
|
|
302
|
+
Record the chosen `disposition` back onto the ledger item.
|
|
303
|
+
|
|
304
|
+
4. **Gate:** any ticket-filing or label mutation is a write — confirm each one
|
|
305
|
+
with the operator before it happens. Capture stayed read-only precisely so
|
|
306
|
+
that every state change lands here, deliberately and confirmed.
|
|
307
|
+
|
|
308
|
+
After triage, write the updated dispositions back to the ledger (still under
|
|
309
|
+
`temp/qa/`), and summarize: items captured, the driving method used, classes,
|
|
310
|
+
routes (`new`/`update-existing`/`duplicate`/`regression-of-closed`), filed
|
|
311
|
+
tickets, and the deferred rolling backlog that a resumed session will pick up.
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## Constraints
|
|
316
|
+
|
|
317
|
+
- **Agent-led, bounded per surface.** The agent drives one named surface per
|
|
318
|
+
session and proposes when it is covered; the operator gates the boundary.
|
|
319
|
+
Human-driven single-observation capture lives in
|
|
320
|
+
[`/qa-assist`](qa-assist.md) — no human-driven flow lives here.
|
|
321
|
+
- **Pick the driving method at Plan time.** Drive (browser MCP,
|
|
322
|
+
navigation-first) is the default; static is the documented interim, chosen
|
|
323
|
+
explicitly with a recorded reason, never a silent fallback. Do not switch
|
|
324
|
+
methods mid-surface without a new Plan note. See
|
|
325
|
+
[`stack/qa/qa-explore-driving`](../skills/stack/qa/qa-explore-driving/SKILL.md).
|
|
326
|
+
- **Capture is read-only.** The only Capture write is appending ledger lines
|
|
327
|
+
under `temp/qa/`. No source edits, no ticket mutations, no product writes,
|
|
328
|
+
no destructive form submissions. Never enter real credentials or fabricate a
|
|
329
|
+
session; record the persona-seeding gap instead.
|
|
330
|
+
- **Broken navigation is a finding, not a workaround.** Never URL-jump around a
|
|
331
|
+
missing affordance, a nav 404, or a guard redirect loop — record it and move
|
|
332
|
+
on.
|
|
333
|
+
- **Every phase transition is operator-gated.** Plan → Capture and
|
|
334
|
+
Capture → Triage each require explicit confirmation. Never advance, file a
|
|
335
|
+
ticket, or mutate a label autonomously.
|
|
336
|
+
- **The ledger lives under `temp/qa/` only**, one `QaLedgerItem` per ndjson
|
|
337
|
+
line, conforming to [`qa-ledger.schema.json`](../schemas/qa-ledger.schema.json).
|
|
338
|
+
Never commit it.
|
|
339
|
+
- **Redact before persist.** Every evidence string passes through
|
|
340
|
+
[`redact-evidence.js`](../scripts/lib/qa/redact-evidence.js) before it
|
|
341
|
+
reaches disk or GitHub, per [`security-baseline.md`](../rules/security-baseline.md).
|
|
342
|
+
- **Delegate decisions to the helpers.** Coverage verdict
|
|
343
|
+
([`coverage-verdict.js`](../scripts/lib/qa/coverage-verdict.js)),
|
|
344
|
+
missing-test ([`propose-missing-test.js`](../scripts/lib/qa/propose-missing-test.js)),
|
|
345
|
+
classification ([`classify-finding.js`](../scripts/lib/findings/classify-finding.js)),
|
|
346
|
+
and dedup/route ([`route-finding.js`](../scripts/lib/findings/route-finding.js))
|
|
347
|
+
are deterministic — never re-derive them in prose.
|
|
348
|
+
- **Resume safely.** A reused session appends and carries the un-triaged
|
|
349
|
+
backlog forward via [`qa-session.js`](../scripts/lib/qa/qa-session.js); it
|
|
350
|
+
never overwrites a prior ledger.
|