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,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: playwright
|
|
3
|
+
description:
|
|
4
|
+
Robust E2E browser testing with Playwright. Use when writing browser-driven
|
|
5
|
+
tests — leverage auto-waiting (no `waitForTimeout`), prefer user-visible
|
|
6
|
+
locators (`getByRole`, `getByText`, `getByLabel`) over CSS/XPath, reuse
|
|
7
|
+
`storageState` for auth, and enable trace-on-first-retry for CI debugging.
|
|
8
|
+
vendor: playwright
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Skill: Playwright
|
|
12
|
+
|
|
13
|
+
## Policy Capsule
|
|
14
|
+
|
|
15
|
+
- Rely on Playwright's auto-waiting; never use `waitForTimeout` or hardcoded sleeps to paper over flakes.
|
|
16
|
+
- Prefer user-visible locators (`getByRole`, `getByText`, `getByLabel`) over CSS selectors or XPath.
|
|
17
|
+
- Reuse `storageState` to seed authenticated scenarios; do not repeat login flows in every test.
|
|
18
|
+
- Use `toHaveScreenshot()` for critical visual surfaces; treat snapshot diffs as intentional reviews, not auto-refreshes.
|
|
19
|
+
- Write tests independent of one another so they run in parallel; clean up shared state in fixtures, not afterwards.
|
|
20
|
+
- Enable `trace: 'on-first-retry'` (or `'retain-on-failure'`) so CI failures are debuggable in the Trace Viewer.
|
|
21
|
+
- Use a unique data set per test run, or tear down state explicitly, to prevent cross-test contamination.
|
|
22
|
+
|
|
23
|
+
Standard operating procedures for robust, end-to-end (E2E) browser testing.
|
|
24
|
+
|
|
25
|
+
## 1. Core Principles
|
|
26
|
+
|
|
27
|
+
- **End-to-End focus:** Test the application as a user would, through the
|
|
28
|
+
browser.
|
|
29
|
+
- **Auto-waiting:** Leverage Playwright's built-in auto-waiting instead of
|
|
30
|
+
hardcoded `waitForTimeout` calls.
|
|
31
|
+
- **Resilience:** Write tests that survive minor UI changes (e.g., color tweaks)
|
|
32
|
+
by using robust selectors.
|
|
33
|
+
|
|
34
|
+
## 2. Technical Standards
|
|
35
|
+
|
|
36
|
+
- **Locators:** Use user-visible locators (e.g., `getByRole`, `getByText`,
|
|
37
|
+
`getByLabel`) over brittle CSS selectors or XPath.
|
|
38
|
+
- **State Management:** Use `storageState` to reuse authentication between
|
|
39
|
+
tests, avoiding repetitive login flows.
|
|
40
|
+
- **Visual Testing:** Use `toHaveScreenshot()` for critical UI layouts to detect
|
|
41
|
+
visual regressions.
|
|
42
|
+
|
|
43
|
+
## 3. Best Practices
|
|
44
|
+
|
|
45
|
+
- **Parallelism:** Ensure tests are independent so they can run concurrently to
|
|
46
|
+
reduce CI time.
|
|
47
|
+
- **Tracing:** Enable trace recording on failure to quickly debug CI issues with
|
|
48
|
+
the Playwright Trace Viewer.
|
|
49
|
+
- **Test Data:** Use a unique data set per test run or clean up state to prevent
|
|
50
|
+
cross-contamination.
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: playwright-bdd
|
|
3
|
+
description:
|
|
4
|
+
Wires Gherkin `.feature` files to Playwright via the `playwright-bdd`
|
|
5
|
+
library. Use when running BDD scenarios on a Playwright runtime — pairs
|
|
6
|
+
with the `gherkin-authoring` skill (scenario prose) and the `playwright`
|
|
7
|
+
skill (browser conventions). Drives execution by tag expression with
|
|
8
|
+
trace-first debugging and Playwright-native sharding.
|
|
9
|
+
vendor: playwright
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Skill: playwright-bdd
|
|
13
|
+
|
|
14
|
+
## Policy Capsule
|
|
15
|
+
|
|
16
|
+
- Complete the pre-authoring grep-for-existing-steps checklist before writing any new scenario text; record the matches in your output.
|
|
17
|
+
- Keep `.feature` files free of Playwright API calls — scenarios describe intent, step definitions translate to browser actions.
|
|
18
|
+
- Generate step bindings into a dedicated directory (e.g. `.features-gen/`) and add it to `.gitignore`; never commit generated specs.
|
|
19
|
+
- Drive runs by tag expression (`--grep "@smoke and not @flaky"`), not filename globs; use the canonical `@smoke`/`@risk-high`/`@platform-*`/`@domain-*` taxonomy.
|
|
20
|
+
- Inject fixtures via `createBdd` rather than pulling singletons from module scope; reset persistent state through fixture teardown, not stray `After` hooks.
|
|
21
|
+
- Reuse `storageState` for authenticated scenarios — create a logged-in user fixture instead of repeating login steps in `Background`.
|
|
22
|
+
- Keep `trace: 'on-first-retry'` (or `'retain-on-failure'`) enabled; reproduce failures by `@scenario-id` tag, not by title.
|
|
23
|
+
- Shard with Playwright's native `--shard=i/N`; never partition by tag expression across CI jobs.
|
|
24
|
+
|
|
25
|
+
Guidance for running Gherkin `.feature` files against Playwright via
|
|
26
|
+
`playwright-bdd`. Pairs with the `gherkin-authoring` skill (scenario prose) and
|
|
27
|
+
the `playwright` skill (browser-level conventions); this skill covers the wiring
|
|
28
|
+
between them.
|
|
29
|
+
|
|
30
|
+
> **Version:** consumers pick their own `playwright-bdd` version. This skill
|
|
31
|
+
> documents behavioral constraints, not a pinned release.
|
|
32
|
+
|
|
33
|
+
## Pre-authoring checklist (mandatory)
|
|
34
|
+
|
|
35
|
+
The agent MUST complete every item below AND MUST include the results in its
|
|
36
|
+
output report BEFORE any scenario text is written. See
|
|
37
|
+
[§ Step Reuse — Grep Before You Write](../../../../rules/gherkin-standards.md#step-reuse--grep-before-you-write)
|
|
38
|
+
for rationale.
|
|
39
|
+
|
|
40
|
+
1. Run `rg` against the project's steps directory and list every step signature
|
|
41
|
+
you will reuse. Format: one `Given/When/Then "…"` per line.
|
|
42
|
+
2. For each scenario line you plan to author, identify the matching existing
|
|
43
|
+
step. For any line with no match, either rephrase to reuse an existing step
|
|
44
|
+
or record it as a gap. Do NOT author new step definitions during scenario
|
|
45
|
+
authoring.
|
|
46
|
+
3. State the canonical domain tag and platform tag you will apply (or note
|
|
47
|
+
"Cross-Platform → no platform tag" per `gherkin-standards.md`).
|
|
48
|
+
4. Confirm the AC's `data-testid`, URL, and payload hints will be stripped from
|
|
49
|
+
scenario prose.
|
|
50
|
+
|
|
51
|
+
If you cannot complete every item, stop and report — do not proceed to scenario
|
|
52
|
+
authoring.
|
|
53
|
+
|
|
54
|
+
## 1. Core Principles
|
|
55
|
+
|
|
56
|
+
- **One source of truth per scenario:** `.feature` files describe intent; step
|
|
57
|
+
definitions translate intent into Playwright calls. Never author browser
|
|
58
|
+
actions in `.feature` prose.
|
|
59
|
+
- **Deterministic tag filtering:** every scenario carries enough tags that any
|
|
60
|
+
CI shard can be selected by a tag expression without inspecting file paths.
|
|
61
|
+
- **Fixture-per-scenario isolation:** scenarios must not share mutable state.
|
|
62
|
+
Treat each scenario as a fresh browser context.
|
|
63
|
+
- **Trace-first debugging:** keep the Playwright Trace Viewer workflow intact —
|
|
64
|
+
`playwright-bdd` wraps Playwright, it does not replace its diagnostics.
|
|
65
|
+
|
|
66
|
+
## 2. Config Patterns
|
|
67
|
+
|
|
68
|
+
- Generate step-definition bindings into a dedicated output directory (commonly
|
|
69
|
+
`.features-gen/`) and add it to `.gitignore`. Do not commit generated specs.
|
|
70
|
+
- Point `playwright.config.ts` at the generated directory via `testDir`; keep a
|
|
71
|
+
single `defineBddConfig` block that lists `features` and `steps` paths.
|
|
72
|
+
- Register the Cucumber HTML/JSON reporter alongside the Playwright HTML
|
|
73
|
+
reporter so a headless CI invocation emits machine-readable evidence
|
|
74
|
+
alongside the agent-driven `/qa-run-harness` sweep.
|
|
75
|
+
- Use Playwright projects (not Cucumber profiles) for browser matrix fan-out —
|
|
76
|
+
keeps sharding, retries, and trace config in one place.
|
|
77
|
+
|
|
78
|
+
## 3. Fixture Composition
|
|
79
|
+
|
|
80
|
+
- Extend Playwright's `test` via `playwright-bdd`'s `createBdd` so fixtures
|
|
81
|
+
(auth state, API clients, seeded data) are injected into `Given`/`When`/
|
|
82
|
+
`Then` callbacks by name, not pulled from module-level singletons.
|
|
83
|
+
- Layer fixtures: base Playwright fixtures → domain fixtures (authenticated
|
|
84
|
+
user, seeded tenant) → scenario-scoped helpers. Each layer depends only on the
|
|
85
|
+
layer below.
|
|
86
|
+
- Reset persistent state with fixture teardown, not with `After` hooks buried in
|
|
87
|
+
step files — teardown order is then deterministic and visible in the fixture
|
|
88
|
+
graph.
|
|
89
|
+
- Reuse `storageState` for authenticated scenarios; create a "logged-in user"
|
|
90
|
+
fixture rather than repeating login steps in `Background`.
|
|
91
|
+
|
|
92
|
+
## 4. Tag-Filtered Execution
|
|
93
|
+
|
|
94
|
+
- Drive runs via tag expressions, not filename globs:
|
|
95
|
+
`npx bddgen && npx playwright test --grep "@smoke and not @flaky"`.
|
|
96
|
+
- Use the canonical tag taxonomy defined in
|
|
97
|
+
[`.agents/rules/gherkin-standards.md`](../../../../rules/gherkin-standards.md#tag-taxonomy)
|
|
98
|
+
(`@smoke`, `@risk-high`, `@platform-*`, `@domain-*`). Do not invent parallel
|
|
99
|
+
tag vocabularies in the runner config; extend via `@domain-*` only.
|
|
100
|
+
- Wire tag-filtered headless runs to a single npm script so operators never
|
|
101
|
+
reconstruct the generate-then-run sequence by hand; the agent-driven
|
|
102
|
+
`/qa-run-harness` selector mirrors the same tag expressions for browser sweeps.
|
|
103
|
+
- Fail the run if generation produces zero matching scenarios — a silent empty
|
|
104
|
+
suite is worse than a red build.
|
|
105
|
+
|
|
106
|
+
## 5. Debug & Trace Workflow
|
|
107
|
+
|
|
108
|
+
- Keep `trace: 'on-first-retry'` (or `'retain-on-failure'`) in the Playwright
|
|
109
|
+
config. `playwright-bdd` preserves the trace attachment because each scenario
|
|
110
|
+
maps to a Playwright test.
|
|
111
|
+
- Reproduce a single failing scenario with `--grep "@scenario-id"` rather than
|
|
112
|
+
the scenario title — titles change, tags are stable.
|
|
113
|
+
- Open traces with `npx playwright show-trace` against the artifact produced
|
|
114
|
+
under `test-results/`; the trace timeline annotates each `Given`/`When`/
|
|
115
|
+
`Then` step, which is the primary debug affordance.
|
|
116
|
+
- For step-definition bugs, run with `PWDEBUG=1` to drop into the inspector at
|
|
117
|
+
the failing step — do not add `page.pause()` calls inside step files.
|
|
118
|
+
|
|
119
|
+
## 6. Sharding & CI Notes
|
|
120
|
+
|
|
121
|
+
- Shard with Playwright's native `--shard=i/N`; do not partition by tag
|
|
122
|
+
expression across jobs — tag-sharding makes flake triage non-deterministic.
|
|
123
|
+
- Run `bddgen` once per job before `playwright test`; cache the generated
|
|
124
|
+
directory only if the cache key includes every `.feature` and step file.
|
|
125
|
+
- Publish the Cucumber HTML/JSON report as the evidence artifact consumed by the
|
|
126
|
+
`epic-testing` helper, alongside the Playwright HTML report and any trace
|
|
127
|
+
zips.
|
|
128
|
+
- Quarantine `@flaky` scenarios with a dedicated job that does not gate the
|
|
129
|
+
merge queue; do not silently retry flakes in the main suite.
|
|
130
|
+
|
|
131
|
+
## Recommended invocation template
|
|
132
|
+
|
|
133
|
+
Use this template when invoking a subagent to author a `.feature` file from an
|
|
134
|
+
Acceptance Criterion.
|
|
135
|
+
|
|
136
|
+
```text
|
|
137
|
+
You are an AI coding agent. Your sole task is to invoke the
|
|
138
|
+
**stack/qa/playwright-bdd** skill (defined in this repo) to author one new
|
|
139
|
+
acceptance scenario from a single Acceptance Criterion. You receive nothing
|
|
140
|
+
about this codebase except the AC text and the skill itself — you must
|
|
141
|
+
discover everything else (existing step library, naming conventions, etc.)
|
|
142
|
+
through the skill's prescribed workflow.
|
|
143
|
+
|
|
144
|
+
Follow the skill's guidance precisely. Your output will be evaluated
|
|
145
|
+
against `.agents/rules/gherkin-standards.md`.
|
|
146
|
+
|
|
147
|
+
**Skill to invoke.** Read `.agents/skills/stack/qa/playwright-bdd/SKILL.md`
|
|
148
|
+
and follow it. Also read `.agents/rules/gherkin-standards.md` (which the
|
|
149
|
+
skill references).
|
|
150
|
+
|
|
151
|
+
**The Acceptance Criterion (your sole input).** {{AC_TEXT}}
|
|
152
|
+
|
|
153
|
+
**Your task.**
|
|
154
|
+
1. Read the skill and the gherkin rule.
|
|
155
|
+
2. Per the skill's "Step Reuse — Grep Before You Write" section, grep
|
|
156
|
+
{{STEPS_DIR}} to discover the existing step vocabulary BEFORE
|
|
157
|
+
authoring. List the matches you found.
|
|
158
|
+
3. Author a NEW `.feature` file at {{OUTPUT_PATH}} that covers this AC.
|
|
159
|
+
4. You are FORBIDDEN from editing any file under {{STEPS_DIR}}. This
|
|
160
|
+
task tests scenario authorship and step REUSE. If a step you need does
|
|
161
|
+
not exist, you must either rephrase the scenario to reuse what exists,
|
|
162
|
+
or report that as a gap (do not silently invent).
|
|
163
|
+
5. Tag the feature/scenario per the canonical taxonomy in
|
|
164
|
+
`gherkin-standards.md`.
|
|
165
|
+
6. Honor every "Forbidden Patterns" rule. `data-testid` hints in the AC
|
|
166
|
+
parentheses are for the step-definition layer; they MUST NOT appear in
|
|
167
|
+
your scenario text.
|
|
168
|
+
|
|
169
|
+
**Report back.** Sections A–E: discovered steps, exact `.feature` content,
|
|
170
|
+
step-coverage analysis, forbidden-patterns self-audit, uncertainty/gaps.
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
This template encodes the invocation prompt used in the Epic C pilot of
|
|
174
|
+
dsj1984/athlete-portal, where a general-purpose subagent — given only an AC and
|
|
175
|
+
a pointer to this skill — produced a publishable scenario on the first attempt
|
|
176
|
+
with **zero Forbidden-Patterns violations**, reused **4 of 5** needed steps from
|
|
177
|
+
the existing library, and surfaced the single remaining step as a clean, named
|
|
178
|
+
gap rather than inventing one. Future maintainers: resist the urge to "simplify"
|
|
179
|
+
this template. Its explicit grep-before-author step, the hard prohibition on
|
|
180
|
+
editing the steps directory, and the mandated gap-report section are what forced
|
|
181
|
+
those outcomes.
|
|
182
|
+
|
|
183
|
+
## 7. Cross-References
|
|
184
|
+
|
|
185
|
+
- Scenario authoring rules: `.agents/rules/gherkin-standards.md`.
|
|
186
|
+
- Browser-level conventions: `.agents/skills/stack/qa/playwright/SKILL.md`.
|
|
187
|
+
- Operator entry point: `.agents/workflows/qa-run-harness.md`.
|
|
188
|
+
- Evidence handoff: `.agents/workflows/helpers/epic-testing.md`.
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qa-explore-driving
|
|
3
|
+
description:
|
|
4
|
+
Conventions for agent-driven exploratory QA driving — how the agent itself
|
|
5
|
+
drives a surface during `/qa-explore` (agent-led), as opposed to the
|
|
6
|
+
human-led `/qa-assist`. Use when the agent explores a running app via the
|
|
7
|
+
browser MCP (navigation-first, the default) or walks a static surface (the
|
|
8
|
+
documented interim until consumer persona-seeding lands), under a strictly
|
|
9
|
+
read-only capture invariant. The exploration procedure lives in
|
|
10
|
+
`.agents/workflows/qa-explore.md`; this skill is the driving-conventions
|
|
11
|
+
reference it leans on.
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Skill: qa-explore-driving
|
|
15
|
+
|
|
16
|
+
## Policy Capsule
|
|
17
|
+
|
|
18
|
+
- Drive the running app **by default** through the browser MCP, navigation-first: start at a root and reach each surface only via UI affordances — never URL-jump to a deep link.
|
|
19
|
+
- Treat **static driving** (reading source, routes, and rendered markup without a live runtime) as the **documented interim** method, chosen at Plan time when a live runtime is not reachable — never the silent fallback.
|
|
20
|
+
- Hold the **read-only capture invariant** absolutely: the agent makes no source edits and no product mutations while driving; the only write is appending to the `temp/qa/<sessionId>` ledger.
|
|
21
|
+
- Authenticated driving depends on **consumer persona-seeding infrastructure that this Epic does not deliver**; without it, drive only the unauthenticated surface or fall back to static, and record the gap — never enter real credentials or fabricate a session.
|
|
22
|
+
- Pick the driving method explicitly in the Plan phase (drive vs. static) and record it in the ledger; do not switch methods mid-surface without a new Plan note.
|
|
23
|
+
- Every phase transition and every GitHub write is HITL-gated; the agent drives and captures, but never files or promotes findings autonomously.
|
|
24
|
+
- Broken navigation, a missing affordance, or a guard redirect loop is a **finding**, not a workaround — record it and move on; do not route around it with a direct URL.
|
|
25
|
+
- Scrub captured evidence (tokens, session cookies, PII) at the boundary via the shared redaction path before any finding reaches disk or GitHub.
|
|
26
|
+
|
|
27
|
+
Guidance for the **agent-driven** half of exploratory QA. `/qa-explore` is the
|
|
28
|
+
agent-led front-end (the agent drives, the operator watches); its human-led
|
|
29
|
+
sibling is `/qa-assist` (the human drives, the agent scribes). The exploration
|
|
30
|
+
**procedure** — argument parsing, phase gates, contract resolution, ledger
|
|
31
|
+
plumbing — is the SSOT in
|
|
32
|
+
[`qa-explore.md`](../../../../workflows/qa-explore.md); this skill shows **how**
|
|
33
|
+
to apply the driving conventions that procedure depends on. The
|
|
34
|
+
navigation-first execution and per-surface capture discipline are shared with
|
|
35
|
+
[`qa-harness`](../qa-harness/SKILL.md) (the known-scenario sweep); browser
|
|
36
|
+
instrumentation lives in
|
|
37
|
+
[`browser-testing-with-devtools`](../../../core/browser-testing-with-devtools/SKILL.md);
|
|
38
|
+
the read-only and no-PII boundaries are inviolable per
|
|
39
|
+
[`security-baseline.md`](../../../../rules/security-baseline.md). Read this
|
|
40
|
+
skill before driving a live surface; read the workflow for the phase order.
|
|
41
|
+
|
|
42
|
+
## 1. Navigation-First Driving (the default)
|
|
43
|
+
|
|
44
|
+
The agent reaches every surface the way a real user would. This is the
|
|
45
|
+
load-bearing convention — it is what makes findings reflect a user-reachable
|
|
46
|
+
state rather than an artifact of a deep link.
|
|
47
|
+
|
|
48
|
+
- **Drive the running app by default.** When a live runtime is reachable, drive
|
|
49
|
+
it through the browser MCP (the chrome-devtools MCP surface). This is the
|
|
50
|
+
primary method; static driving is the interim alternative (§ 2), not the
|
|
51
|
+
norm.
|
|
52
|
+
- **Start at a root.** Begin each surface at the app's home or dashboard and
|
|
53
|
+
reach the surface under test by clicking nav links, menu items, and buttons —
|
|
54
|
+
the same affordances a user has.
|
|
55
|
+
- **Never URL-jump.** Do not navigate directly to a deep link to establish a
|
|
56
|
+
starting state. URL-jumping bypasses the app's real authorization and routing
|
|
57
|
+
flows, which both masks access-control gaps and produces findings that no
|
|
58
|
+
user could actually trigger.
|
|
59
|
+
- **Broken navigation is a finding, not a workaround.** When an affordance is
|
|
60
|
+
missing, a nav link 404s, or a guard redirect loops, that is the finding. Do
|
|
61
|
+
not route around it with a direct URL — record it and move on.
|
|
62
|
+
- **Observe, do not fabricate.** Use app-provided UI affordances to reach and
|
|
63
|
+
observe a surface. Never script the runtime to manufacture an outcome the
|
|
64
|
+
exploration is meant to discover.
|
|
65
|
+
|
|
66
|
+
## 2. Static Driving — the Documented Interim
|
|
67
|
+
|
|
68
|
+
Static driving is the **explicitly documented interim** method for when a live
|
|
69
|
+
runtime is not reachable — most commonly because authenticated driving needs
|
|
70
|
+
consumer persona-seeding infrastructure that does not yet exist (§ 4). It walks
|
|
71
|
+
the surface from source, route definitions, and rendered markup rather than a
|
|
72
|
+
running browser.
|
|
73
|
+
|
|
74
|
+
- **Choose it at Plan time, never silently.** Static is a deliberate Plan-phase
|
|
75
|
+
decision recorded in the ledger ("method: static, reason: no reachable
|
|
76
|
+
authenticated runtime"), not an unannounced fallback the agent slips into
|
|
77
|
+
when the browser MCP hiccups.
|
|
78
|
+
- **It is interim, not equivalent.** Static driving cannot exercise real
|
|
79
|
+
authorization, routing guards, or runtime console/network signal. Treat its
|
|
80
|
+
coverage as partial and say so in the ledger; a static pass does not close the
|
|
81
|
+
same coverage a driven pass would.
|
|
82
|
+
- **Same read-only invariant.** Static driving reads source and routes; it makes
|
|
83
|
+
no edits. The read-only capture invariant (§ 3) applies identically.
|
|
84
|
+
- **Promote to driving when the runtime lands.** Static is the bridge until the
|
|
85
|
+
consumer's persona-seeding infrastructure (§ 4) makes authenticated driving
|
|
86
|
+
possible. When that lands, re-run the surface driven; do not leave a surface
|
|
87
|
+
permanently static when it could be driven.
|
|
88
|
+
|
|
89
|
+
## 3. The Read-Only Capture Invariant
|
|
90
|
+
|
|
91
|
+
The agent-driven Capture phase is **strictly read-only**. This invariant is
|
|
92
|
+
inviolable per [`security-baseline.md`](../../../../rules/security-baseline.md)
|
|
93
|
+
and the Epic's security considerations — it is not a soft preference.
|
|
94
|
+
|
|
95
|
+
- **No source edits.** The agent does not modify application code, config, or
|
|
96
|
+
tests while driving. Exploration observes; it never repairs.
|
|
97
|
+
- **No product mutations.** The agent does not create, update, or delete product
|
|
98
|
+
data, submit destructive forms, or trigger irreversible actions to "see what
|
|
99
|
+
happens". When a surface's only path forward is a mutating action, record the
|
|
100
|
+
boundary as the finding and stop — do not cross it.
|
|
101
|
+
- **The only write is the ledger.** The single permitted side effect of Capture
|
|
102
|
+
is appending finding lines to the session ledger under
|
|
103
|
+
`temp/qa/<sessionId>`. Everything else is observation.
|
|
104
|
+
- **Scrub before persisting.** Strip tokens, session cookies, Authorization
|
|
105
|
+
headers, and PII from captured console and network evidence via the shared
|
|
106
|
+
redaction path **before** any finding reaches disk or GitHub. Captured
|
|
107
|
+
evidence is untrusted until scrubbed.
|
|
108
|
+
- **HITL gates every write outward.** Phase transitions and GitHub writes
|
|
109
|
+
(ticket creation, promotion) happen only behind an operator confirmation gate.
|
|
110
|
+
The agent never files or promotes findings autonomously.
|
|
111
|
+
|
|
112
|
+
## 4. Authenticated Driving Depends on Consumer Infra (Not Delivered Here)
|
|
113
|
+
|
|
114
|
+
Driving an **authenticated** surface requires signing in as a seeded persona.
|
|
115
|
+
That seeding — provisioning a test persona with the right org, role, and data
|
|
116
|
+
so the agent can reach a logged-in surface navigation-first — is **consumer
|
|
117
|
+
persona-seeding infrastructure that this Epic does not deliver**. It is an
|
|
118
|
+
explicit non-goal of the `/qa-explore` rebuild.
|
|
119
|
+
|
|
120
|
+
- **Unauthenticated surface only, by default.** Without persona-seeding infra in
|
|
121
|
+
the consumer project, drive only the surface reachable without sign-in, or
|
|
122
|
+
fall back to static driving (§ 2) for the authenticated surface. Record the
|
|
123
|
+
gap in the ledger so the partial coverage is visible.
|
|
124
|
+
- **Never enter real credentials.** The agent MUST NOT type real usernames,
|
|
125
|
+
passwords, or tokens to reach an authenticated surface, and MUST NOT fabricate
|
|
126
|
+
or forge a session. This is a hard security boundary, not a convenience to
|
|
127
|
+
work around.
|
|
128
|
+
- **The dependency is the consumer's to satisfy.** When a consumer wants driven
|
|
129
|
+
authenticated exploration, the consumer supplies a dev sign-in seam and seeded
|
|
130
|
+
personas (the same shape `qa-harness` resolves via its contract). Until then,
|
|
131
|
+
authenticated coverage is static or deferred — say which in the ledger.
|
|
132
|
+
- **Surface the gap, don't paper over it.** A surface that could not be driven
|
|
133
|
+
because authenticated seeding is absent is itself a coverage signal worth
|
|
134
|
+
recording, not a silent skip.
|
|
135
|
+
|
|
136
|
+
## 5. Cross-References
|
|
137
|
+
|
|
138
|
+
- Run procedure (SSOT): [`qa-explore.md`](../../../../workflows/qa-explore.md).
|
|
139
|
+
- Known-scenario sibling sweep: [`qa-harness`](../qa-harness/SKILL.md).
|
|
140
|
+
- Browser instrumentation: [`browser-testing-with-devtools`](../../../core/browser-testing-with-devtools/SKILL.md).
|
|
141
|
+
- Read-only / no-PII boundary: [`security-baseline.md`](../../../../rules/security-baseline.md).
|
|
142
|
+
- Assertion-tier rules: [`testing-standards.md`](../../../../rules/testing-standards.md).
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qa-harness
|
|
3
|
+
description:
|
|
4
|
+
Conventions for the agent-driven QA harness that drives Gherkin scenarios
|
|
5
|
+
through a real browser. Use when executing `/qa-run-harness` or instrumenting
|
|
6
|
+
a live surface — covers navigation-first execution, per-surface console and
|
|
7
|
+
network capture, design-token visual checks, and the framework-generic
|
|
8
|
+
heuristic cards for turning signal into findings. The harness procedure lives
|
|
9
|
+
in `.agents/workflows/qa-run-harness.md`; this skill is the conventions
|
|
10
|
+
reference it leans on.
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Skill: qa-harness
|
|
14
|
+
|
|
15
|
+
## Policy Capsule
|
|
16
|
+
|
|
17
|
+
- Drive every scenario navigation-first: start at a root and reach the surface under test only via UI affordances — never URL-jump to a deep link to set up a `Given`.
|
|
18
|
+
- Assert `Then` outcomes semantically against the accessibility snapshot (roles, accessible names, visible text); never via DOM/CSS/XPath selectors, HTTP status codes, response bodies, or DB rows.
|
|
19
|
+
- Capture console and network per surface; turn each non-allowlisted console error and each failed/error-status request into one structured `F#` finding.
|
|
20
|
+
- Filter console through `qa.consoleAllowlist` via `filterConsoleMessages`; treat the allowlist as a benign-noise filter, never as a security control to silence genuine errors.
|
|
21
|
+
- Spot-check surfaces against `qa.designTokens` when set; flag gross token violations (off-palette colors, off-scale spacing/typography) as findings.
|
|
22
|
+
- Scrub captured console and network of tokens, session cookies, and PII before rendering any finding — findings are posted to GitHub at approval time.
|
|
23
|
+
- Bundle findings by likely root cause into a draft for operator sign-off; the harness never files tickets autonomously.
|
|
24
|
+
- Resolve the `qa` contract first and fail loudly when it is absent or malformed; there is no auto-detection fallback and no headless degrade.
|
|
25
|
+
|
|
26
|
+
Guidance for executing the agent-driven QA harness through a real browser (the
|
|
27
|
+
chrome-devtools MCP surface). The harness **procedure** — argument parsing,
|
|
28
|
+
step ordering, contract resolution sequence — is the SSOT in
|
|
29
|
+
[`.agents/workflows/qa-run-harness.md`](../../../../workflows/qa-run-harness.md);
|
|
30
|
+
this skill shows **how** to apply the instrumentation and inspection
|
|
31
|
+
conventions that procedure depends on. The assertion-tier rules it enforces
|
|
32
|
+
live in [`testing-standards.md`](../../../../rules/testing-standards.md)
|
|
33
|
+
(§ Assertion Placement); scenario prose conventions live in
|
|
34
|
+
[`gherkin-authoring`](../gherkin-authoring/SKILL.md); browser-locator
|
|
35
|
+
discipline is shared with [`playwright`](../playwright/SKILL.md). Read this
|
|
36
|
+
skill before instrumenting a live surface; read the workflow for the run order.
|
|
37
|
+
|
|
38
|
+
## 1. Navigation-First Execution
|
|
39
|
+
|
|
40
|
+
The harness reaches every surface the way a real user would. This is the
|
|
41
|
+
load-bearing convention — it is what makes findings reflect a user-reachable
|
|
42
|
+
state rather than an artifact of a deep link.
|
|
43
|
+
|
|
44
|
+
- **Start at a root.** After sign-in, begin each scenario at the app's home or
|
|
45
|
+
dashboard. Reach the surface under test by clicking nav links, menu items,
|
|
46
|
+
and buttons — the same affordances a user has.
|
|
47
|
+
- **Never URL-jump.** Do not `navigate_page` directly to a deep link to
|
|
48
|
+
establish a `Given`. URL-jumping bypasses the app's real authorization and
|
|
49
|
+
routing flows, which both masks access-control gaps and produces findings
|
|
50
|
+
that no user could actually trigger.
|
|
51
|
+
- **Broken navigation is a finding, not a workaround.** When an affordance is
|
|
52
|
+
missing, a nav link 404s, or a guard redirect loops, that is the finding.
|
|
53
|
+
Do not route around it with a direct URL — record it and move on.
|
|
54
|
+
- **Map Gherkin to browser actions.** `Given` establishes state by navigating
|
|
55
|
+
from the root (sign in as the persona, walk to the starting surface, seed via
|
|
56
|
+
UI where the manifest does not pre-seed). `When` performs the single user
|
|
57
|
+
action (`click`, `fill_form`, then `wait_for` the transition). Use
|
|
58
|
+
`evaluate_script` only for app-provided hooks — never to fabricate the
|
|
59
|
+
outcome a `Then` is meant to observe.
|
|
60
|
+
|
|
61
|
+
### Semantic `Then` assertion
|
|
62
|
+
|
|
63
|
+
Assert every `Then` against the accessibility snapshot from `take_snapshot`,
|
|
64
|
+
matching on **roles, accessible names, labels, and visible text** that express
|
|
65
|
+
the user-visible outcome — "a banner with text _Invoice sent_ is visible", "a
|
|
66
|
+
row for _ACME Corp_ appears in the invoices table".
|
|
67
|
+
|
|
68
|
+
- **Never** assert against brittle DOM/CSS/XPath selectors.
|
|
69
|
+
- **Never** assert on HTTP status codes, response bodies, or DB rows inside a
|
|
70
|
+
scenario — those are contract-tier concerns (see
|
|
71
|
+
[`testing-standards.md` § Assertion Placement](../../../../rules/testing-standards.md#assertion-placement)).
|
|
72
|
+
- A `Then` that can only be expressed as a wire-shape or DB check is a signal
|
|
73
|
+
the scenario is **mis-tiered**, not a license to break the semantic rule.
|
|
74
|
+
|
|
75
|
+
Record each scenario's result (pass / fail / blocked), the surface it ended on,
|
|
76
|
+
and a one-line user-visible symptom for any failure.
|
|
77
|
+
|
|
78
|
+
## 2. Per-Surface Console & Network Capture
|
|
79
|
+
|
|
80
|
+
Instrument each surface the moment you land on it, before moving on. Capture is
|
|
81
|
+
**per surface** so evidence is attributable to a concrete user-reachable state.
|
|
82
|
+
|
|
83
|
+
### 2.1 Console
|
|
84
|
+
|
|
85
|
+
1. Capture with `list_console_messages` on the current surface.
|
|
86
|
+
2. Filter through the contract's `consoleAllowlist` using
|
|
87
|
+
[`filterConsoleMessages`](../../../../scripts/lib/qa/console-allowlist.js).
|
|
88
|
+
The filter is the pure decision layer: it escalates only messages at level
|
|
89
|
+
`error` / `severe`, suppresses any message matched by an allowlist
|
|
90
|
+
substring pattern, and returns one structured finding per surviving error in
|
|
91
|
+
capture order (`F1`, `F2`, …).
|
|
92
|
+
3. Each surviving console error becomes one `F#` finding. Non-error levels
|
|
93
|
+
(`log`, `info`, `debug`, `warning`) are never escalated.
|
|
94
|
+
|
|
95
|
+
The allowlist is a **benign-noise filter, not a security control.** It exists
|
|
96
|
+
to suppress known, expected, harmless console chatter (a third-party widget's
|
|
97
|
+
deprecation notice, a dev-only HMR log). Never expand it to silence a genuine
|
|
98
|
+
error signal — if a real error is noisy, fix the error, do not allowlist it.
|
|
99
|
+
Allowlist matching is case-sensitive substring matching, so patterns stay
|
|
100
|
+
readable in `.agentrc.json` without regex escaping; a blank pattern is ignored
|
|
101
|
+
rather than matching everything.
|
|
102
|
+
|
|
103
|
+
### 2.2 Network
|
|
104
|
+
|
|
105
|
+
Capture with `list_network_requests` on the surface. Failed requests and
|
|
106
|
+
error-status responses (4xx / 5xx) become findings alongside the
|
|
107
|
+
console-derived set, sharing the same `F#` numbering across the surface.
|
|
108
|
+
|
|
109
|
+
### 2.3 Design-token visual check
|
|
110
|
+
|
|
111
|
+
When the contract's `designTokens` pointer is set (it defaults to `null`),
|
|
112
|
+
spot-check the rendered surface against the token source. Flag **gross** token
|
|
113
|
+
violations as findings — the goal is catching drift, not pixel-perfect audits:
|
|
114
|
+
|
|
115
|
+
- **Color** — text or controls rendered in an off-palette color where a token
|
|
116
|
+
color is expected (a hard-coded `#3366ff` where the primary token is the
|
|
117
|
+
contract).
|
|
118
|
+
- **Spacing** — padding/margins that visibly break the spacing scale (a
|
|
119
|
+
one-off `13px` gutter amid an 8px-based scale).
|
|
120
|
+
- **Typography** — font families, sizes, or weights outside the type scale.
|
|
121
|
+
|
|
122
|
+
A gross violation is one a designer would call a regression on sight; subtle
|
|
123
|
+
sub-pixel differences are not harness findings. When `designTokens` is `null`,
|
|
124
|
+
skip this check entirely — do not invent a token source.
|
|
125
|
+
|
|
126
|
+
## 3. Findings — the `F#` Shape
|
|
127
|
+
|
|
128
|
+
Every captured problem is normalized into the structured `F#` finding shape so
|
|
129
|
+
the draft bundle stays diffable and the schema validates:
|
|
130
|
+
|
|
131
|
+
```jsonc
|
|
132
|
+
{
|
|
133
|
+
"id": "F1", // 1-based, assigned per surface across console+network
|
|
134
|
+
"classification": "console-error", // console-error | network-error | visual-token | ...
|
|
135
|
+
"surface": "/invoices", // the user-reachable surface, not a deep link
|
|
136
|
+
"symptom": "...", // one-line user-visible / captured symptom
|
|
137
|
+
"likelyRootCause": null, // heuristic card output (§4); null until enriched
|
|
138
|
+
"disposition": "follow-up", // blocker | follow-up
|
|
139
|
+
"acceptance": null, // AC this folds into, when known
|
|
140
|
+
"foldsInto": "F2", // optional: another finding this is a duplicate facet of
|
|
141
|
+
"evidence": {
|
|
142
|
+
"console": [{ "level": "error", "text": "..." }],
|
|
143
|
+
"network": []
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
- **Determinism is load-bearing.** Re-running the same selector over the same
|
|
149
|
+
captured console with the same allowlist yields the same findings in the same
|
|
150
|
+
order. Do not reorder or renumber findings between sweeps.
|
|
151
|
+
- **Scrub before rendering.** Before any finding's `evidence` is rendered or
|
|
152
|
+
drafted, strip tokens, session cookies, Authorization headers, and PII from
|
|
153
|
+
the captured console and network per
|
|
154
|
+
[`security-baseline.md`](../../../../rules/security-baseline.md). Findings are
|
|
155
|
+
posted to GitHub at approval time — captured evidence is untrusted until
|
|
156
|
+
scrubbed.
|
|
157
|
+
|
|
158
|
+
## 4. Framework-Generic Heuristic Cards
|
|
159
|
+
|
|
160
|
+
The harness ships **framework-generic** root-cause heuristics — they reason
|
|
161
|
+
about symptoms, not about any one frontend framework. Use a card to populate
|
|
162
|
+
`likelyRootCause` and to set `disposition`. The cards are guidance, not a
|
|
163
|
+
classifier: when a symptom matches none cleanly, leave `likelyRootCause: null`
|
|
164
|
+
and let the operator triage from the symptom.
|
|
165
|
+
|
|
166
|
+
| Symptom pattern | Likely root cause | Default disposition |
|
|
167
|
+
| --- | --- | --- |
|
|
168
|
+
| `404` / `Not Found` on a navigation or asset request | Dead route, broken link, or missing build artifact | follow-up (blocker if it breaks the scenario path) |
|
|
169
|
+
| `401` / `403` reaching a surface the persona should see | Missing or over-tight authorization check; guard misconfig | blocker |
|
|
170
|
+
| `500` / `502` / `503` on a user action | Server-side fault behind the action | blocker |
|
|
171
|
+
| Uncaught `TypeError` / `ReferenceError` in console | Null/undefined dereference or missing binding in client code | blocker when it breaks the surface, else follow-up |
|
|
172
|
+
| `Failed to fetch` / `NetworkError` / CORS-rejected request | Misconfigured CORS allowlist, wrong origin, or a downed dependency | follow-up |
|
|
173
|
+
| Hydration / mismatch warning escalated to error | Server/client render divergence | follow-up |
|
|
174
|
+
| Off-palette color, off-scale spacing/typography | Design-token drift — hard-coded value bypassing the token | follow-up |
|
|
175
|
+
| Repeated identical console error across many surfaces | A shared component or global bootstrap fault | fold the duplicates into one finding via `foldsInto` |
|
|
176
|
+
|
|
177
|
+
Heuristics for working the cards:
|
|
178
|
+
|
|
179
|
+
- **Fold duplicates.** When the same error fires on many surfaces, emit one
|
|
180
|
+
finding and point the rest at it with `foldsInto` rather than filing N copies.
|
|
181
|
+
- **Blocker vs. follow-up.** A finding is a **blocker** when it breaks the
|
|
182
|
+
scenario's user-visible outcome or exposes an authorization gap. Everything
|
|
183
|
+
else (noise that does not break the journey, cosmetic token drift) is a
|
|
184
|
+
**follow-up**.
|
|
185
|
+
- **Symptom over diagnosis.** When unsure of the root cause, record the precise
|
|
186
|
+
symptom and leave `likelyRootCause: null`. A wrong guess is worse than an
|
|
187
|
+
honest "unknown" the operator can triage.
|
|
188
|
+
|
|
189
|
+
## 5. Draft & Sign-Off (Never File Autonomously)
|
|
190
|
+
|
|
191
|
+
Bundle findings **by likely root cause** into proposed follow-up tickets with
|
|
192
|
+
`Depends-on` / `Blocks` relationships, then present the draft for operator
|
|
193
|
+
approval. The harness **MUST NOT** create tickets autonomously — it stops at a
|
|
194
|
+
draft. The operator-approval gate is the safety boundary against spurious
|
|
195
|
+
filing. When the run was triggered from an Epic-testing context, hand the
|
|
196
|
+
**approved** findings to the Epic-testing helper for attachment to the Epic's
|
|
197
|
+
QA evidence ticket.
|
|
198
|
+
|
|
199
|
+
## 6. Sign-In & Contract Discipline
|
|
200
|
+
|
|
201
|
+
- **Resolve the `qa` contract first.** Before any browser work, resolve the
|
|
202
|
+
contract via `resolveQaContract(config)`. When the block is absent,
|
|
203
|
+
malformed, or missing a required field, the resolver **throws** — relay its
|
|
204
|
+
verbatim message and STOP. There is no auto-detection fallback.
|
|
205
|
+
- **Dev seam only.** Sign in once per persona via the contract's `signInSeam`
|
|
206
|
+
(`kind: 'url'` dev seam or `kind: 'skill'`). **Never** enter real
|
|
207
|
+
credentials. Confirm authenticated state with a `take_snapshot` before
|
|
208
|
+
driving any scenario.
|
|
209
|
+
- **No headless fallback.** The chrome-devtools MCP surface is a host-provided
|
|
210
|
+
runtime dependency. If it is unavailable, degrade with a clear error and stop
|
|
211
|
+
— never fall back to the retired headless BDD runner.
|
|
212
|
+
|
|
213
|
+
## 7. Cross-References
|
|
214
|
+
|
|
215
|
+
- Run procedure (SSOT): [`qa-run-harness.md`](../../../../workflows/qa-run-harness.md).
|
|
216
|
+
- Console filter module: [`console-allowlist.js`](../../../../scripts/lib/qa/console-allowlist.js).
|
|
217
|
+
- Assertion-tier rules: [`testing-standards.md`](../../../../rules/testing-standards.md).
|
|
218
|
+
- Scenario prose: [`gherkin-authoring`](../gherkin-authoring/SKILL.md).
|
|
219
|
+
- Browser-locator discipline: [`playwright`](../playwright/SKILL.md).
|
|
220
|
+
- Evidence scrubbing: [`security-baseline.md`](../../../../rules/security-baseline.md).
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vitest
|
|
3
|
+
description:
|
|
4
|
+
Writes fast, isolated unit and integration tests with Vitest. Use when each
|
|
5
|
+
test must run on file-save without shared state — `vi.mock()` for external
|
|
6
|
+
deps, `vi.spyOn()` for call monitoring, AAA structure, and edge-case
|
|
7
|
+
coverage for null/undefined/boundary inputs.
|
|
8
|
+
vendor: vitest
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Skill: Vitest
|
|
12
|
+
|
|
13
|
+
## Policy Capsule
|
|
14
|
+
|
|
15
|
+
- Keep each test independent — never share mutable state between tests; reset mocks in `afterEach`.
|
|
16
|
+
- Mock external dependencies with `vi.mock()`; use `vi.spyOn()` only to observe call shape, not to replace logic.
|
|
17
|
+
- Structure tests as Arrange / Act / Assert — do not interleave the three phases.
|
|
18
|
+
- Use descriptive titles in the `describe('Component', () => { it('should [action] when [condition]') })` form.
|
|
19
|
+
- Cover error paths, null/undefined inputs, and boundary conditions, not just the happy path.
|
|
20
|
+
- Use snapshots only for large, stable data structures; avoid them for frequently changing UI to prevent snapshot fatigue.
|
|
21
|
+
- Aim for 80%+ coverage on business logic and edge cases; audit with `vitest --coverage`.
|
|
22
|
+
- Test observable behavior, not internal implementation details; refactors should not require rewriting passing tests.
|
|
23
|
+
|
|
24
|
+
Guidelines for writing fast, reliable unit and integration tests.
|
|
25
|
+
|
|
26
|
+
## 1. Core Principles
|
|
27
|
+
|
|
28
|
+
- **Speed:** Tests should be fast enough to run on every file save.
|
|
29
|
+
- **Isolation:** Each test must be independent. Avoid shared state between
|
|
30
|
+
tests.
|
|
31
|
+
- **Confidence:** Tests should verify behavior, not implementation details.
|
|
32
|
+
|
|
33
|
+
## 2. Technical Standards
|
|
34
|
+
|
|
35
|
+
- **Mocking:** Use `vi.mock()` for external dependencies (APIs, network calls)
|
|
36
|
+
and `vi.spyOn()` for monitoring function calls.
|
|
37
|
+
- **Snapshot Testing:** Use snapshots for large, stable data structures, but
|
|
38
|
+
avoid them for frequently changing UI components to prevent "snapshot
|
|
39
|
+
fatigue."
|
|
40
|
+
- **Coverage:** Aim for 80%+ coverage on business logic and edge cases. Use
|
|
41
|
+
`vitest --coverage` for auditing.
|
|
42
|
+
|
|
43
|
+
## 3. Best Practices
|
|
44
|
+
|
|
45
|
+
- **Descriptive Titles:** Use the
|
|
46
|
+
`describe('Component/Utility', () => { it('should [action] when [condition]') })`
|
|
47
|
+
pattern.
|
|
48
|
+
- **Arrange-Act-Assert (AAA):** Structure tests clearly into setup (Arrange),
|
|
49
|
+
execution (Act), and verification (Assert) phases.
|
|
50
|
+
- **Edge Cases:** Always include tests for error states, null/undefined inputs,
|
|
51
|
+
and boundary conditions.
|