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,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tailwind-v4
|
|
3
|
+
description:
|
|
4
|
+
Implements maintainable styling with Tailwind CSS v4. Use when writing
|
|
5
|
+
styles in v4 projects — CSS-first configuration via `@theme` blocks (never
|
|
6
|
+
`tailwind.config.ts/js`), mobile-first breakpoints, full class names (no
|
|
7
|
+
string interpolation), and no arbitrary `p-[13px]`-style values.
|
|
8
|
+
vendor: tailwind
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Skill: Tailwind CSS v4
|
|
12
|
+
|
|
13
|
+
## Policy Capsule
|
|
14
|
+
|
|
15
|
+
- Configure the theme via CSS-first `@theme` blocks; never use `tailwind.config.ts` or `tailwind.config.js` in v4 projects.
|
|
16
|
+
- Prefer atomic utility classes (`flex`, `p-4`, `text-lg`) over hand-written CSS classes.
|
|
17
|
+
- Use mobile-first breakpoints (`sm:`, `md:`, `lg:`, `xl:`); never write desktop-first overrides.
|
|
18
|
+
- Define `hover:`, `focus-visible:`, and `active:` states explicitly on every interactive element.
|
|
19
|
+
- Arbitrary values (`p-[13px]`) are prohibited — map one-off values to a `@theme` CSS variable instead.
|
|
20
|
+
- Never build utility classes by string interpolation (e.g. `text-${color}`); always use full literal class names so the compiler detects them.
|
|
21
|
+
- Adhere to the design system's spacing, color, and typography tokens defined in `@theme` variables.
|
|
22
|
+
- For repeated UI patterns, extract a component or a CSS `@apply` block — do not let class strings bloat in JSX.
|
|
23
|
+
|
|
24
|
+
Rules for implementing high-performance, maintainable styling using the latest
|
|
25
|
+
Tailwind CSS specification.
|
|
26
|
+
|
|
27
|
+
## 1. Core Principles
|
|
28
|
+
|
|
29
|
+
- **CSS-First Configuration:** Use CSS variables for theme customization within
|
|
30
|
+
the `@theme` block. **NEVER** use `tailwind.config.ts` or `tailwind.config.js`
|
|
31
|
+
in v4 projects.
|
|
32
|
+
- **Modern Syntax:** Leverage the new `@theme` directive, fluid design
|
|
33
|
+
utilities, and lightning-fast compilation.
|
|
34
|
+
- **Token Consistency:** Strictly adhere to the design system's spacing, color,
|
|
35
|
+
and typography tokens defined in the CSS variables.
|
|
36
|
+
|
|
37
|
+
## 2. Technical Standards
|
|
38
|
+
|
|
39
|
+
- **Utility Usage:** Prefer atomic utility classes (`flex`, `p-4`, `text-lg`)
|
|
40
|
+
over custom CSS classes.
|
|
41
|
+
- **Responsive Design:** Use mobile-first breakpoints (`sm:`, `md:`, `lg:`,
|
|
42
|
+
`xl:`).
|
|
43
|
+
- **Interactive States:** Explicitly define `hover:`, `focus-visible:`, and
|
|
44
|
+
`active:` states for all interactive elements to ensure a premium feel.
|
|
45
|
+
- **Arbitrary Values:** **STRICTLY PROHIBITED** (`p-[13px]`) unless explicitly
|
|
46
|
+
required by a one-off legacy asset. Always map unique values to a temporary
|
|
47
|
+
CSS variable in the `@theme` block instead.
|
|
48
|
+
|
|
49
|
+
## 3. Best Practices
|
|
50
|
+
|
|
51
|
+
- **Class Ordering:** Use the standard Tailwind class ordering (Layout -> Box
|
|
52
|
+
Model -> Typography -> Visual -> Misc).
|
|
53
|
+
- **Component Patterns:** For repeated UI patterns (e.g., buttons), use a
|
|
54
|
+
dedicated component or a reusable `@apply` block in a CSS file to avoid
|
|
55
|
+
class-string bloat.
|
|
56
|
+
- **Dynamic Classes:** Never use string interpolation to create utility classes
|
|
57
|
+
(e.g., `text-${color}`). Always use full class names to ensure the compiler
|
|
58
|
+
detects them.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-accessibility-engineer
|
|
3
|
+
description:
|
|
4
|
+
Enforces mobile-first Tailwind CSS and strict WCAG 2.1 AA compliance for
|
|
5
|
+
user-facing UI. Use when building UI components — utility classes only (no
|
|
6
|
+
custom CSS or inline `style={{}}`), mobile-first breakpoints, visible focus
|
|
7
|
+
states, alt text, and 4.5:1 contrast.
|
|
8
|
+
vendor: tailwind
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# UI/UX Accessibility & Styling Engineer
|
|
12
|
+
|
|
13
|
+
## Policy Capsule
|
|
14
|
+
|
|
15
|
+
- Style only with Tailwind utility classes; never write custom CSS files or inline `style={{}}` objects in components.
|
|
16
|
+
- Follow mobile-first responsive design: default classes target mobile, `md:` / `lg:` prefixes scale up.
|
|
17
|
+
- Give every interactive element a visible focus state (`focus:ring`, `focus-visible:*`).
|
|
18
|
+
- Provide meaningful `alt` text on every image; empty `alt=""` only for purely decorative imagery.
|
|
19
|
+
- Meet WCAG 2.1 AA contrast: minimum 4.5:1 for normal text, 3:1 for large text.
|
|
20
|
+
- Ensure every interactive element is reachable and triggerable via keyboard alone.
|
|
21
|
+
- Use semantic HTML elements (`<button>`, `<nav>`, `<main>`) before reaching for ARIA roles.
|
|
22
|
+
|
|
23
|
+
**Description:** Enforces mobile-first Tailwind CSS and strict WCAG AA
|
|
24
|
+
compliance.
|
|
25
|
+
|
|
26
|
+
**Instruction:** You are building user-facing interfaces.
|
|
27
|
+
|
|
28
|
+
- Strictly use Tailwind CSS utility classes. DO NOT write custom CSS or inline
|
|
29
|
+
`style={{}}` objects.
|
|
30
|
+
- Follow a mobile-first approach: default classes apply to mobile, using `md:`
|
|
31
|
+
and `lg:` prefixes for larger viewports.
|
|
32
|
+
- Enforce WCAG 2.1 AA accessibility: All interactive elements must have focus
|
|
33
|
+
states (`focus:ring`), images must have meaningful `alt` text, and color
|
|
34
|
+
contrasts must meet the 4.5:1 ratio.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: audit-accessibility
|
|
3
|
+
description:
|
|
4
|
+
Audits sites and apps for WCAG 2.1 Level AA compliance using automated and
|
|
5
|
+
manual testing tools. Use when running an accessibility audit or building a
|
|
6
|
+
remediation plan — semantic HTML, contrast, focus management, keyboard
|
|
7
|
+
reachability, and axe-core integration in Vitest/Playwright.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Skill: Accessibility Audit (A11y)
|
|
11
|
+
|
|
12
|
+
## Policy Capsule
|
|
13
|
+
|
|
14
|
+
- Use semantic HTML (`<nav>`, `<main>`, `<header>`, `<button>`) before reaching for ARIA roles.
|
|
15
|
+
- Maintain a minimum 4.5:1 contrast for normal text and 3:1 for large text.
|
|
16
|
+
- Ensure a visible focus indicator on every focusable element and a logical tab order across the page.
|
|
17
|
+
- Use `aria-label`, `aria-labelledby`, and `aria-describedby` only when semantic HTML cannot express the intent.
|
|
18
|
+
- Treat automated scans as 40–50% coverage only; follow every audit with manual keyboard and screen-reader checks.
|
|
19
|
+
- Integrate `axe-core` into Vitest or Playwright runs so a11y regressions are caught in CI.
|
|
20
|
+
- Give every `<img>` an `alt` attribute — empty for decorative, descriptive for functional.
|
|
21
|
+
- Verify every interactive element is reachable and triggerable via keyboard alone.
|
|
22
|
+
|
|
23
|
+
Protocols for ensuring WCAG 2.1 Level AA compliance using automated and manual
|
|
24
|
+
testing tools.
|
|
25
|
+
|
|
26
|
+
## 1. Core Principles
|
|
27
|
+
|
|
28
|
+
- **Inclusive Design:** The application must be usable by everyone, regardless
|
|
29
|
+
of disability.
|
|
30
|
+
- **Automated First, Not Only:** Use tools to catch 40-50% of issues, then
|
|
31
|
+
follow with manual keyboard and screen reader checks.
|
|
32
|
+
|
|
33
|
+
## 2. Technical Standards
|
|
34
|
+
|
|
35
|
+
- **Semantic HTML:** Use correct tags (e.g., `<nav>`, `<main>`, `<header>`,
|
|
36
|
+
`<button>`) to provide native accessibility features.
|
|
37
|
+
- **Contrast Ratios:** Maintain a minimum 4.5:1 contrast for normal text and 3:1
|
|
38
|
+
for large text.
|
|
39
|
+
- **Focus Management:** Ensure a visible focus indicator is always present and
|
|
40
|
+
the tab order is logical.
|
|
41
|
+
- **ARIA Labels:** Use `aria-label`, `aria-labelledby`, and `aria-describedby`
|
|
42
|
+
only when standard HTML is insufficient.
|
|
43
|
+
|
|
44
|
+
## 3. Best Practices
|
|
45
|
+
|
|
46
|
+
- **pa11y/axe:** Integrate `axe-core` into Vitest/Playwright tests for automated
|
|
47
|
+
regressions.
|
|
48
|
+
- **Alt Text:** Every image must have an `alt` attribute (empty for decorative
|
|
49
|
+
images, descriptive for functional ones).
|
|
50
|
+
- **Keyboard Navigation:** Every interactive element must be reachable and
|
|
51
|
+
triggerable via keyboard alone.
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gherkin-authoring
|
|
3
|
+
description:
|
|
4
|
+
Authors `.feature` files that stay business-readable, translate cleanly from
|
|
5
|
+
PRD acceptance criteria, and reuse a shared step-definition library. Use
|
|
6
|
+
when writing or editing scenarios — the SSOT enforcement rules live in
|
|
7
|
+
`.agents/rules/gherkin-standards.md`; this skill shows authors how to apply
|
|
8
|
+
them.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Skill: gherkin-authoring
|
|
12
|
+
|
|
13
|
+
## Policy Capsule
|
|
14
|
+
|
|
15
|
+
- Write `Given` clauses as stative preconditions, `When` as a single business action, and `Then` as a user-visible outcome.
|
|
16
|
+
- Allow exactly one `When` per scenario; if you need two, split into two scenarios.
|
|
17
|
+
- Never assert on HTTP status codes, SQL state, DOM selectors, URLs, or JSON payloads inside `.feature` prose — push those to contract tests.
|
|
18
|
+
- Tag every Scenario or Outline with exactly one canonical `@domain-*` tag and the appropriate risk/platform tags from the gherkin-standards taxonomy.
|
|
19
|
+
- Use `Background` only when every scenario in the file genuinely shares the precondition with no per-scenario variation.
|
|
20
|
+
- Reuse existing step definitions: grep the steps tree for the verb stem before authoring a new step.
|
|
21
|
+
- Author one scenario per PRD acceptance criterion; for bounded matrices, use a Scenario Outline with ≤12 Examples rows.
|
|
22
|
+
- Use third-person present-tense, role-qualified actors (`the billing-admin`), never first person.
|
|
23
|
+
|
|
24
|
+
Guidance for authoring `.feature` files that stay business-readable, translate
|
|
25
|
+
cleanly from PRD acceptance criteria, and reuse a shared step-definition
|
|
26
|
+
library. The enforcement rules — tag taxonomy, forbidden patterns, Outline
|
|
27
|
+
conventions, selector discipline, step reuse — live in
|
|
28
|
+
[`.agents/rules/gherkin-standards.md`](../../../../rules/gherkin-standards.md),
|
|
29
|
+
which is the SSOT. This skill shows authors **how** to apply those rules; read
|
|
30
|
+
the rule file for the **what**. Runtime wiring for Playwright consumers is
|
|
31
|
+
covered by [`playwright-bdd`](../playwright-bdd/SKILL.md); test-layer scope is
|
|
32
|
+
covered by
|
|
33
|
+
[`testing-standards.md`](../../../../rules/testing-standards.md).
|
|
34
|
+
|
|
35
|
+
## 1. Canonical Given / When / Then Phrasing
|
|
36
|
+
|
|
37
|
+
`.feature` prose is written for a product-minded reader, not a test harness.
|
|
38
|
+
Each clause has exactly one job:
|
|
39
|
+
|
|
40
|
+
- **Given** — a precondition that is *already true* when the scenario starts.
|
|
41
|
+
Stative, past or present tense. No actions.
|
|
42
|
+
- Good: `Given a signed-in account-owner with an unpaid invoice`.
|
|
43
|
+
- Bad: `Given the user clicks the login button` (that's a When).
|
|
44
|
+
- **When** — the single business action under test. One verb, one actor, one
|
|
45
|
+
event. Splitting a When into multiple clauses is almost always wrong — move
|
|
46
|
+
the extra clauses into Given.
|
|
47
|
+
- Good: `When they issue the invoice`.
|
|
48
|
+
- Bad: `When they log in and issue the invoice and download the PDF`.
|
|
49
|
+
- **Then** — an observable, user-visible outcome. Assert what the *user* sees
|
|
50
|
+
or what the *business* records, not what the system emits internally.
|
|
51
|
+
- Good: `Then the invoice appears in the issued invoices list`.
|
|
52
|
+
- Bad: `Then a 201 is returned` (forbidden; see
|
|
53
|
+
[gherkin-standards § Forbidden Patterns](../../../../rules/gherkin-standards.md#forbidden-patterns)).
|
|
54
|
+
- **And / But** — continuation clauses. They inherit the mood of the most
|
|
55
|
+
recent Given/When/Then. Never start a scenario with And/But.
|
|
56
|
+
|
|
57
|
+
Voice and tense:
|
|
58
|
+
|
|
59
|
+
- Third-person, present tense. `the user`, `an admin`, `a billing-admin`
|
|
60
|
+
(role-qualified nouns, not "I" or "we").
|
|
61
|
+
- One clause, one fact. Comma-chained facts hide compound assertions.
|
|
62
|
+
- Numbers and identifiers go in `Examples` tables or fixtures, not inline
|
|
63
|
+
prose. Prose should read the same whether the underlying fixture has 1 or
|
|
64
|
+
10,000 rows.
|
|
65
|
+
|
|
66
|
+
## 2. Translating PRD Acceptance Criteria to Scenarios
|
|
67
|
+
|
|
68
|
+
PRD ACs are the raw material. The authoring move is **one AC → one scenario**
|
|
69
|
+
unless the AC encodes a matrix (in which case it becomes a Scenario Outline —
|
|
70
|
+
see §3).
|
|
71
|
+
|
|
72
|
+
Walkthrough — a PRD AC from a billing feature:
|
|
73
|
+
|
|
74
|
+
> **AC-3:** When a billing-admin issues an invoice for a customer with a
|
|
75
|
+
> negative balance, the system rejects the issue and shows an error naming the
|
|
76
|
+
> outstanding amount.
|
|
77
|
+
|
|
78
|
+
Translation steps:
|
|
79
|
+
|
|
80
|
+
1. **Identify the domain.** Billing → tag the scenario `@domain-billing`.
|
|
81
|
+
2. **Identify the actor and precondition.** "billing-admin", "customer with a
|
|
82
|
+
negative balance" → two Givens.
|
|
83
|
+
3. **Identify the single action.** "issues an invoice" → one When.
|
|
84
|
+
4. **Identify the observable outcome.** "rejects the issue and shows an error
|
|
85
|
+
naming the outstanding amount" → two Thens. The first asserts the business
|
|
86
|
+
outcome (rejection); the second asserts the user-visible detail (error
|
|
87
|
+
names the amount).
|
|
88
|
+
5. **Pick the risk tag.** If the originating ticket was `risk::high`, add
|
|
89
|
+
`@risk-high`. Smoke tag only if this is a critical path on every PR.
|
|
90
|
+
|
|
91
|
+
Resulting scenario:
|
|
92
|
+
|
|
93
|
+
```gherkin
|
|
94
|
+
@domain-billing @risk-high
|
|
95
|
+
Scenario: Issuing an invoice is rejected when the customer has a negative balance
|
|
96
|
+
Given a signed-in billing-admin
|
|
97
|
+
And a customer with a negative account balance
|
|
98
|
+
When the billing-admin issues an invoice for that customer
|
|
99
|
+
Then the issue is rejected
|
|
100
|
+
And the rejection message names the outstanding amount
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Heuristics:
|
|
104
|
+
|
|
105
|
+
- If a single AC needs more than **one When**, it is really two ACs. Split
|
|
106
|
+
before you write.
|
|
107
|
+
- If a Then starts with "and the database has…" or "and the API returned…",
|
|
108
|
+
you have crossed into step-definition or contract-test territory. Rewrite
|
|
109
|
+
it as user-visible language or move the assertion to a contract test (see
|
|
110
|
+
[testing-standards](../../../../rules/testing-standards.md)).
|
|
111
|
+
- If an AC says "the system logs X", that's an engineering non-functional
|
|
112
|
+
requirement — not a BDD scenario. Cover it with a focused unit or
|
|
113
|
+
integration test, not a `.feature` file.
|
|
114
|
+
- When a PRD AC is phrased negatively ("non-admins cannot export"), prefer a
|
|
115
|
+
Scenario Outline if there are multiple negative roles; write a plain
|
|
116
|
+
Scenario if there is exactly one.
|
|
117
|
+
|
|
118
|
+
## 3. Background vs. Given — and Outline vs. Multi-Scenario
|
|
119
|
+
|
|
120
|
+
Two authoring decisions that authors routinely get wrong.
|
|
121
|
+
|
|
122
|
+
### 3.1 Background vs. Given
|
|
123
|
+
|
|
124
|
+
`Background` runs before **every** scenario in the file. Use it only when:
|
|
125
|
+
|
|
126
|
+
- Every scenario in the file genuinely shares the precondition, **and**
|
|
127
|
+
- The precondition has no per-scenario variation (no `<placeholders>`,
|
|
128
|
+
no per-scenario data).
|
|
129
|
+
|
|
130
|
+
Prefer a per-scenario Given when:
|
|
131
|
+
|
|
132
|
+
- Only some scenarios need the precondition. A Background that applies to
|
|
133
|
+
four out of five scenarios is a Background for none of them; move it.
|
|
134
|
+
- The precondition varies by role, plan tier, or fixture shape. Variation
|
|
135
|
+
belongs in a Scenario Outline's Examples, not in Background.
|
|
136
|
+
- Readers cannot understand the scenario without scrolling up to read
|
|
137
|
+
Background. Background is a shortcut; if it hurts readability, inline it.
|
|
138
|
+
|
|
139
|
+
Rule of thumb: if you find yourself writing *"except in the admin scenario,
|
|
140
|
+
where the Background step is actually…"*, delete the Background.
|
|
141
|
+
|
|
142
|
+
### 3.2 Scenario Outline vs. multiple Scenarios
|
|
143
|
+
|
|
144
|
+
Use `Scenario Outline` when the **same behavior** is exercised across a
|
|
145
|
+
**bounded matrix** (roles, plan tiers, locales). The shape of the scenario —
|
|
146
|
+
Givens, When, Thens — is identical; only the data varies.
|
|
147
|
+
|
|
148
|
+
Use multiple `Scenario` blocks when:
|
|
149
|
+
|
|
150
|
+
- The Givens differ structurally (not just in value).
|
|
151
|
+
- The When verb differs.
|
|
152
|
+
- The Then outcomes differ in kind, not just in value. "Delivered vs.
|
|
153
|
+
denied" is one outcome column (see Outline skeleton in
|
|
154
|
+
[gherkin-standards § Scenario Outline Conventions](../../../../rules/gherkin-standards.md#scenario-outline-conventions)).
|
|
155
|
+
"Email is sent vs. invoice is issued vs. account is suspended" are three
|
|
156
|
+
different scenarios.
|
|
157
|
+
|
|
158
|
+
Scale guardrails (also in gherkin-standards):
|
|
159
|
+
|
|
160
|
+
- Keep `Examples` tables under ~12 rows. Larger tables hide distinct
|
|
161
|
+
behaviors behind a shared skeleton.
|
|
162
|
+
- Split `Examples` by tag when rows need different tags (e.g. `@risk-high`
|
|
163
|
+
on admin rows only).
|
|
164
|
+
|
|
165
|
+
## 4. Step-Definition Library Structure
|
|
166
|
+
|
|
167
|
+
Authoring scenarios and maintaining steps are the same job split across two
|
|
168
|
+
files. The library layout below keeps that coupling visible.
|
|
169
|
+
|
|
170
|
+
### 4.1 Layout
|
|
171
|
+
|
|
172
|
+
```text
|
|
173
|
+
tests/
|
|
174
|
+
steps/
|
|
175
|
+
_common/ # actor, auth, navigation — reused across every domain
|
|
176
|
+
auth.steps.ts
|
|
177
|
+
navigation.steps.ts
|
|
178
|
+
billing/ # one directory per @domain-* tag
|
|
179
|
+
invoices.steps.ts
|
|
180
|
+
subscriptions.steps.ts
|
|
181
|
+
auth/
|
|
182
|
+
signin.steps.ts
|
|
183
|
+
_deprecated/ # steps pending migration; see §4.4
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
- One directory per `@domain-*` tag. `_common/` holds cross-cutting steps
|
|
187
|
+
(sign-in, navigation, generic waits handled at the fixture layer).
|
|
188
|
+
- Files are named by the noun the steps act on
|
|
189
|
+
(`invoices.steps.ts`, not `billing-steps-1.ts`). A new noun is a new file.
|
|
190
|
+
- Avoid deep nesting. Two levels (`steps/<domain>/<noun>.steps.ts`) is the
|
|
191
|
+
ceiling for most projects.
|
|
192
|
+
|
|
193
|
+
### 4.2 Naming
|
|
194
|
+
|
|
195
|
+
Step text follows the scenario text verbatim — if the scenario reads `the
|
|
196
|
+
invoice appears in the issued invoices list`, the step regex matches exactly
|
|
197
|
+
that phrase. Divergence between scenario prose and step text is a bug.
|
|
198
|
+
|
|
199
|
+
- Parameterize only over values that vary across scenarios. A step that
|
|
200
|
+
accepts `{string}` for a literal that is always the same value is over-
|
|
201
|
+
parameterized; bake the constant in and rename the step.
|
|
202
|
+
- Role-qualified actors (`{actor}`) read better than generic `{string}`.
|
|
203
|
+
Define a custom parameter type that resolves `account-owner`, `billing-admin`,
|
|
204
|
+
`viewer` to fixtures.
|
|
205
|
+
- Keep step implementations ≤20 lines. Longer implementations indicate a
|
|
206
|
+
missing helper (domain fixture, page object, API client).
|
|
207
|
+
|
|
208
|
+
### 4.3 Reuse Before Authoring
|
|
209
|
+
|
|
210
|
+
The non-negotiable workflow is in
|
|
211
|
+
[gherkin-standards § Step Reuse](../../../../rules/gherkin-standards.md#step-reuse--grep-before-you-write):
|
|
212
|
+
grep the step tree for the verb stem before writing anything new. In practice:
|
|
213
|
+
|
|
214
|
+
1. Search for the verb: `rg -n "issues? an invoice" tests/steps`.
|
|
215
|
+
2. If the phrase exists, **change your scenario** to use that phrase. Do not
|
|
216
|
+
fork a near-duplicate step.
|
|
217
|
+
3. If a near-match exists, extend the existing step (add a parameter, widen
|
|
218
|
+
the regex) and update every call site in the same PR.
|
|
219
|
+
4. Only when no reasonable match exists, add a new step in the correct
|
|
220
|
+
domain directory.
|
|
221
|
+
|
|
222
|
+
### 4.4 Deprecation
|
|
223
|
+
|
|
224
|
+
When a step is superseded:
|
|
225
|
+
|
|
226
|
+
1. Move the old definition into `steps/_deprecated/` and annotate it with a
|
|
227
|
+
one-line comment naming the replacement.
|
|
228
|
+
2. Migrate every call site to the replacement in the same PR.
|
|
229
|
+
3. Delete the `_deprecated/` entry when the migration lands.
|
|
230
|
+
|
|
231
|
+
Never leave two live step definitions that mean the same thing. Parallel
|
|
232
|
+
vocabularies rot the suite faster than any other source of maintenance cost.
|
|
233
|
+
|
|
234
|
+
## 5. Authoring Checklist
|
|
235
|
+
|
|
236
|
+
Before opening a PR that adds or edits a `.feature` file:
|
|
237
|
+
|
|
238
|
+
- [ ] Every Scenario/Outline carries exactly one `@domain-*` tag.
|
|
239
|
+
- [ ] No forbidden patterns (SQL, status codes, selectors, URLs, payloads,
|
|
240
|
+
framework names, explicit waits) appear in prose.
|
|
241
|
+
- [ ] Each scenario has exactly one `When`.
|
|
242
|
+
- [ ] `Then` clauses assert user-visible outcomes, not implementation.
|
|
243
|
+
- [ ] `Background` is justified (applies to every scenario in the file).
|
|
244
|
+
- [ ] If a Scenario Outline is used, the matrix is bounded (≤12 rows) and the
|
|
245
|
+
shape is truly identical across rows.
|
|
246
|
+
- [ ] Every step phrase grep-matches an existing step definition **or** is
|
|
247
|
+
accompanied by a new step definition in the right domain directory.
|
|
248
|
+
- [ ] Reads standalone — a product reader who has never seen the codebase can
|
|
249
|
+
understand the intent without opening a step file.
|
|
250
|
+
|
|
251
|
+
## 6. Cross-References
|
|
252
|
+
|
|
253
|
+
- SSOT rules: [`.agents/rules/gherkin-standards.md`](../../../../rules/gherkin-standards.md).
|
|
254
|
+
- Runtime wiring: [`playwright-bdd`](../playwright-bdd/SKILL.md).
|
|
255
|
+
- Browser-level conventions: [`playwright`](../playwright/SKILL.md).
|
|
256
|
+
- Test-layer scope: [`testing-standards.md`](../../../../rules/testing-standards.md).
|
|
257
|
+
- Example feature: [`examples/invoice-issue.feature`](./examples/invoice-issue.feature).
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
@domain-billing
|
|
2
|
+
Feature: Issuing invoices
|
|
3
|
+
Billing admins and account owners issue invoices to customers. The system
|
|
4
|
+
rejects issues that violate account-state or role constraints and records
|
|
5
|
+
successful issues on the customer's timeline.
|
|
6
|
+
|
|
7
|
+
Background:
|
|
8
|
+
Given the billing workspace is configured with the default tax profile
|
|
9
|
+
|
|
10
|
+
@smoke
|
|
11
|
+
Scenario: A billing-admin issues an invoice for a customer in good standing
|
|
12
|
+
Given a signed-in billing-admin
|
|
13
|
+
And a customer with a zero account balance
|
|
14
|
+
When the billing-admin issues an invoice for that customer for 500 USD
|
|
15
|
+
Then the invoice appears in the issued invoices list
|
|
16
|
+
And the customer's timeline shows the invoice was issued
|
|
17
|
+
|
|
18
|
+
@risk-high
|
|
19
|
+
Scenario: Issuing is rejected when the customer has a negative balance
|
|
20
|
+
Given a signed-in billing-admin
|
|
21
|
+
And a customer with a negative account balance
|
|
22
|
+
When the billing-admin issues an invoice for that customer
|
|
23
|
+
Then the issue is rejected
|
|
24
|
+
And the rejection message names the outstanding amount
|
|
25
|
+
|
|
26
|
+
Scenario Outline: <user-role> access to invoice issuing
|
|
27
|
+
Given a signed-in <user-role>
|
|
28
|
+
And a customer with a zero account balance
|
|
29
|
+
When they attempt to issue an invoice for that customer
|
|
30
|
+
Then the attempt is <issue-outcome>
|
|
31
|
+
|
|
32
|
+
Examples:
|
|
33
|
+
| user-role | issue-outcome |
|
|
34
|
+
| account-owner | accepted |
|
|
35
|
+
| billing-admin | accepted |
|
|
36
|
+
| viewer | denied |
|
|
37
|
+
|
|
38
|
+
@risk-high
|
|
39
|
+
Examples:
|
|
40
|
+
| user-role | issue-outcome |
|
|
41
|
+
| external-audit | denied |
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lighthouse-baseline
|
|
3
|
+
description:
|
|
4
|
+
Codifies the capture-and-check baseline pattern for long-running quality
|
|
5
|
+
signals (Lighthouse scores, bundle size, p95 latency, runtime memory). Use
|
|
6
|
+
when wiring a new metric that needs a baseline file, paired :capture /
|
|
7
|
+
:check npm scripts, a tolerance-bounded gate, and a weekly refresh
|
|
8
|
+
cadence — the goal is a hard CI signal that ratchets only with intent.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Skill: Lighthouse-Style Quality Baseline
|
|
12
|
+
|
|
13
|
+
## Policy Capsule
|
|
14
|
+
|
|
15
|
+
- Use this pattern only for numeric, run-to-run-comparable signals with directional intent (higher-is-better or lower-is-better) and meaningful noise variance.
|
|
16
|
+
- Commit one canonical `baselines/<name>.json` per signal — never combine multiple metrics into a single baseline file.
|
|
17
|
+
- Provide paired `<name>:capture` and `<name>:check` npm scripts; `:capture` writes the baseline, `:check` compares with tolerance and exits non-zero on regression.
|
|
18
|
+
- Implement a `--self-test` mode that runs the comparator against known-good and known-regression fixtures so CI verifies the gate itself.
|
|
19
|
+
- Pick tolerance from observed run-to-run spread (~2σ); tolerance of 0 flaps and trains reviewers to rubber-stamp refreshes.
|
|
20
|
+
- Refresh baselines through deliberate, human-reviewed commits with the `baseline-refresh:` subject prefix; never auto-refresh on every CI run.
|
|
21
|
+
- Run a weekly scheduled `:capture` workflow that opens a PR only when drift exceeds tolerance.
|
|
22
|
+
- Keep baselines under source control — never store them in `temp/` or `coverage/` or anything covered by `.gitignore`.
|
|
23
|
+
|
|
24
|
+
Pattern for promoting an episodic measurement into a long-running quality
|
|
25
|
+
signal. The audit-lighthouse / audit-performance / audit-bundle-size
|
|
26
|
+
workflows produce a snapshot. This skill is for the next step: turning that
|
|
27
|
+
snapshot into a baseline a CI gate can ratchet against.
|
|
28
|
+
|
|
29
|
+
## When to reach for this
|
|
30
|
+
|
|
31
|
+
Reach for this pattern when **all** of these hold:
|
|
32
|
+
|
|
33
|
+
- The signal is **numeric and comparable** across runs (a score, a duration,
|
|
34
|
+
a byte count). Boolean pass/fail signals belong in a normal lint, not a
|
|
35
|
+
baseline.
|
|
36
|
+
- The signal has **noise floor variance** between runs, so equality checks
|
|
37
|
+
would flap. You need a tolerance band.
|
|
38
|
+
- The signal has **directional intent** — bigger is worse (bundle KB, p95
|
|
39
|
+
ms) or bigger is better (Lighthouse score). The gate enforces direction;
|
|
40
|
+
a refresh moves the line on purpose.
|
|
41
|
+
- Refreshing the baseline should be a **deliberate commit**, reviewed like
|
|
42
|
+
any other change. Auto-refreshing on every CI run defeats the gate.
|
|
43
|
+
|
|
44
|
+
If the signal is binary or one-shot (e.g. "page returns 200", "alt-text
|
|
45
|
+
present"), stay in the audit-* workflow space — don't spin up a baseline
|
|
46
|
+
for it.
|
|
47
|
+
|
|
48
|
+
## Anatomy
|
|
49
|
+
|
|
50
|
+
The five pieces every baseline of this shape carries:
|
|
51
|
+
|
|
52
|
+
1. **`baselines/<name>.json`** — canonical snapshot committed to the repo.
|
|
53
|
+
One file per signal. JSON, not YAML or TOML — diff tooling handles it
|
|
54
|
+
uniformly.
|
|
55
|
+
2. **`<name>:capture` npm script** — runs the measurement, writes the new
|
|
56
|
+
snapshot to a temp path. Never overwrites the canonical baseline
|
|
57
|
+
directly. Operator-driven.
|
|
58
|
+
3. **`<name>:check` npm script** — runs the measurement, compares against
|
|
59
|
+
`baselines/<name>.json` with a tolerance, exits non-zero on regression.
|
|
60
|
+
Wired into the close-validation gate chain (see `buildDefaultGates` in
|
|
61
|
+
`lib/close-validation.js`) and into the PR gate.
|
|
62
|
+
4. **`--self-test` flag** — every check script accepts `--self-test`,
|
|
63
|
+
which runs the comparator against synthetic inputs (a known-good and a
|
|
64
|
+
known-regression fixture) and asserts the gate's verdict matches. CI
|
|
65
|
+
runs this on every PR so a comparator bug can't silently mask a real
|
|
66
|
+
regression.
|
|
67
|
+
5. **Weekly cadence workflow** — a scheduled CI job that runs `:capture`,
|
|
68
|
+
diffs against the committed baseline, opens a PR if drift is real
|
|
69
|
+
(above tolerance) or a comment if it is within band. Intent-driven
|
|
70
|
+
refresh: the PR is the place to argue the regression is justified.
|
|
71
|
+
|
|
72
|
+
## Worked example: Lighthouse Performance score
|
|
73
|
+
|
|
74
|
+
`baselines/lighthouse-performance.json`:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"$schema": "../.agents/schemas/baseline-numeric.schema.json",
|
|
79
|
+
"metric": "lighthouse.categories.performance",
|
|
80
|
+
"value": 92,
|
|
81
|
+
"direction": "higher-is-better",
|
|
82
|
+
"tolerance": 2,
|
|
83
|
+
"capturedAt": "2026-05-06T00:00:00Z",
|
|
84
|
+
"capturedFrom": {
|
|
85
|
+
"url": "https://preview.example.com/",
|
|
86
|
+
"lighthouseVersion": "12.2.1",
|
|
87
|
+
"formFactor": "desktop"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Two npm scripts in `package.json`:
|
|
93
|
+
|
|
94
|
+
```jsonc
|
|
95
|
+
{
|
|
96
|
+
"scripts": {
|
|
97
|
+
"lighthouse:capture": "node scripts/lighthouse-baseline.js --capture",
|
|
98
|
+
"lighthouse:check": "node scripts/lighthouse-baseline.js --check"
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
The script implements three modes:
|
|
104
|
+
|
|
105
|
+
- `--capture` — Run Lighthouse, write `baselines/lighthouse-performance.json`.
|
|
106
|
+
- `--check` — Run Lighthouse, compare to the committed baseline. Exit 0 if
|
|
107
|
+
the value is within `(baseline ± tolerance)` or improving. Exit 1 if the
|
|
108
|
+
value falls below `(baseline − tolerance)` for higher-is-better metrics,
|
|
109
|
+
or above `(baseline + tolerance)` for lower-is-better metrics.
|
|
110
|
+
- `--self-test` — Skip the real measurement. Run the comparator against
|
|
111
|
+
fixtures (e.g. known-good=92, known-regression=87). Assert that the gate
|
|
112
|
+
verdicts match the expected pass/fail. Exit 0 on success.
|
|
113
|
+
|
|
114
|
+
## Gate hint shape
|
|
115
|
+
|
|
116
|
+
When the `:check` script fails, the error message must point at the exact
|
|
117
|
+
remediation path. A working hint:
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
Lighthouse performance score 87 is below baseline 92 (tolerance ±2).
|
|
121
|
+
Either: (a) fix the regression, or (b) if the drop is justified, run
|
|
122
|
+
`npm run lighthouse:capture` and commit the refreshed baseline with a
|
|
123
|
+
`baseline-refresh:` tagged subject (non-empty body explaining why).
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
The `baseline-refresh:` subject prefix mirrors the existing CRAP / MI
|
|
127
|
+
convention so the same commit-tag tooling already validating those
|
|
128
|
+
baselines extends to this one.
|
|
129
|
+
|
|
130
|
+
## Weekly cadence
|
|
131
|
+
|
|
132
|
+
`.github/workflows/lighthouse-weekly.yml` (or the equivalent for your CI):
|
|
133
|
+
|
|
134
|
+
```yaml
|
|
135
|
+
on:
|
|
136
|
+
schedule:
|
|
137
|
+
- cron: "0 14 * * 1" # Mondays 14:00 UTC
|
|
138
|
+
workflow_dispatch: {}
|
|
139
|
+
|
|
140
|
+
jobs:
|
|
141
|
+
refresh:
|
|
142
|
+
steps:
|
|
143
|
+
- run: npm run lighthouse:capture
|
|
144
|
+
- run: |
|
|
145
|
+
if git diff --quiet baselines/lighthouse-performance.json; then
|
|
146
|
+
echo "No drift; baseline still valid."
|
|
147
|
+
exit 0
|
|
148
|
+
fi
|
|
149
|
+
# Drift exists — open a PR with the refreshed baseline.
|
|
150
|
+
gh pr create --title "baseline-refresh: lighthouse perf" \
|
|
151
|
+
--body "Auto-captured weekly baseline. Review the diff and merge if intentional."
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
The cadence is weekly, not daily — a daily refresh creates so many PRs
|
|
155
|
+
that reviewers stop reading them. The point is for a reviewer to read the
|
|
156
|
+
diff and say "yes, this is the new floor" or "no, that regression
|
|
157
|
+
shouldn't be in main."
|
|
158
|
+
|
|
159
|
+
## Tolerance picking
|
|
160
|
+
|
|
161
|
+
Tolerance encodes "what's noise". Pick it from the **observed run-to-run
|
|
162
|
+
spread** on a known-good build, not a vibe:
|
|
163
|
+
|
|
164
|
+
1. Capture the metric ten times against the same artifact.
|
|
165
|
+
2. Take the standard deviation σ.
|
|
166
|
+
3. Set tolerance ≈ 2σ. That gates real regressions without flapping on
|
|
167
|
+
warmup variance.
|
|
168
|
+
|
|
169
|
+
If σ is bigger than the regressions you care about, the metric is too
|
|
170
|
+
noisy for this pattern — invest in stabilising the measurement (warm-up
|
|
171
|
+
runs, pinned hardware, controlled network) before adding the gate.
|
|
172
|
+
|
|
173
|
+
## Anti-patterns
|
|
174
|
+
|
|
175
|
+
- **Auto-refresh on every CI run.** Defeats the gate; every regression
|
|
176
|
+
becomes the new normal. Refreshes must be commits.
|
|
177
|
+
- **Tolerance = 0.** Flaps on warmup noise, training reviewers to
|
|
178
|
+
rubber-stamp `baseline-refresh:` PRs without reading them. Then a real
|
|
179
|
+
regression sneaks through.
|
|
180
|
+
- **No `--self-test`.** A bug in the comparator silently disables the
|
|
181
|
+
gate. The self-test is the gate's gate.
|
|
182
|
+
- **Multiple metrics in one baseline file.** Couples unrelated drifts. A
|
|
183
|
+
bundle-size regression shouldn't block a Lighthouse refresh. One signal
|
|
184
|
+
per file.
|
|
185
|
+
- **Baseline lives in `temp/` or `coverage/`.** The baseline is source of
|
|
186
|
+
truth — committed and reviewed. Anything under `temp/` or in `.gitignore`
|
|
187
|
+
is a snapshot, not a baseline.
|
|
188
|
+
|
|
189
|
+
## Cross-references
|
|
190
|
+
|
|
191
|
+
- Existing baseline-shape conventions in this framework:
|
|
192
|
+
`baselines/maintainability.json`, `baselines/crap.json`,
|
|
193
|
+
`baselines/lint.json`. Their `:update` / `:check` script pairs and the
|
|
194
|
+
`baseline-refresh:` commit-subject contract are the prior art this
|
|
195
|
+
skill generalises.
|
|
196
|
+
- The audit-lighthouse workflow (`/audit-lighthouse`) produces the
|
|
197
|
+
one-shot Lighthouse snapshot that feeds the first `:capture`. Run it
|
|
198
|
+
once to confirm the script's measurement matches the workflow's, then
|
|
199
|
+
promote to a baseline.
|