session-orchestrator 3.16.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/.claude-plugin/marketplace.json +29 -0
- package/.claude-plugin/plugin.json +18 -0
- package/.codex-plugin/agents/explorer.toml +14 -0
- package/.codex-plugin/agents/session-reviewer.toml +23 -0
- package/.codex-plugin/agents/wave-worker.toml +15 -0
- package/.codex-plugin/config.toml +20 -0
- package/.codex-plugin/plugin.json +37 -0
- package/.cursor/rules/000-session-orchestrator.mdc +73 -0
- package/.cursor/rules/010-session-workflow.mdc +170 -0
- package/.cursor/rules/020-quality-gates.mdc +128 -0
- package/.cursor/rules/030-wave-execution.mdc +216 -0
- package/.cursor/rules/040-discovery.mdc +242 -0
- package/.cursor/rules/050-plan.mdc +235 -0
- package/.cursor/rules/060-evolve.mdc +232 -0
- package/.cursor/rules/070-gitlab-ops.mdc +246 -0
- package/.cursor/rules/080-ecosystem-health.mdc +145 -0
- package/.mcp.json +8 -0
- package/CHANGELOG.md +1544 -0
- package/LICENSE +21 -0
- package/NOTICE +64 -0
- package/README.md +242 -0
- package/SECURITY.md +90 -0
- package/agents/AGENTS.md +136 -0
- package/agents/analyst.md +99 -0
- package/agents/architect-reviewer.md +93 -0
- package/agents/code-implementer.md +106 -0
- package/agents/db-specialist.md +104 -0
- package/agents/dialectic-deriver.md +139 -0
- package/agents/docs-writer.md +113 -0
- package/agents/eval-judge.md +146 -0
- package/agents/memory-proposal-collector.md +297 -0
- package/agents/qa-strategist.md +102 -0
- package/agents/schemas/analyst.schema.json +46 -0
- package/agents/schemas/architect-reviewer.schema.json +50 -0
- package/agents/schemas/code-implementer.schema.json +61 -0
- package/agents/schemas/db-specialist.schema.json +80 -0
- package/agents/schemas/docs-writer.schema.json +56 -0
- package/agents/schemas/persona-panel-sidecar.schema.json +245 -0
- package/agents/schemas/qa-strategist.schema.json +46 -0
- package/agents/schemas/security-reviewer.schema.json +86 -0
- package/agents/schemas/session-reviewer.schema.json +69 -0
- package/agents/schemas/test-writer.schema.json +69 -0
- package/agents/schemas/ui-developer.schema.json +90 -0
- package/agents/schemas/ux-evaluator.schema.json +51 -0
- package/agents/security-reviewer.md +236 -0
- package/agents/session-reviewer.md +201 -0
- package/agents/skill-applied-judge.md +122 -0
- package/agents/test-writer.md +123 -0
- package/agents/ui-developer.md +109 -0
- package/agents/ux-evaluator.md +161 -0
- package/assets/icon.svg +11 -0
- package/assets/og-card.png +0 -0
- package/assets/og-card.svg +47 -0
- package/commands/autopilot-multi.md +74 -0
- package/commands/autopilot.md +80 -0
- package/commands/bootstrap.md +56 -0
- package/commands/brainstorm.md +48 -0
- package/commands/close.md +24 -0
- package/commands/debug.md +36 -0
- package/commands/discovery.md +32 -0
- package/commands/dispatcher.md +59 -0
- package/commands/eval.md +28 -0
- package/commands/evolve.md +10 -0
- package/commands/go.md +41 -0
- package/commands/grill.md +45 -0
- package/commands/harness-audit.md +26 -0
- package/commands/memory-cleanup.md +25 -0
- package/commands/persona-panel.md +121 -0
- package/commands/plan.md +15 -0
- package/commands/portfolio.md +97 -0
- package/commands/reconcile.md +23 -0
- package/commands/repo-audit.md +24 -0
- package/commands/session.md +30 -0
- package/commands/spinout.md +15 -0
- package/commands/sunset-review.md +27 -0
- package/commands/templates-ack.md +96 -0
- package/commands/test.md +97 -0
- package/docs/README.md +105 -0
- package/docs/USER-GUIDE.md +1403 -0
- package/docs/ci-setup.md +81 -0
- package/docs/codex-setup.md +142 -0
- package/docs/components.md +74 -0
- package/docs/cursor-setup.md +104 -0
- package/docs/events-schema.md +81 -0
- package/docs/migration-v3.md +148 -0
- package/docs/owner-config-schema.md +154 -0
- package/docs/persona-panel.md +433 -0
- package/docs/pi-setup.md +115 -0
- package/docs/plugin-architecture-v3.md +296 -0
- package/docs/pm-skills-marketplace.md +114 -0
- package/docs/policy-cache-validation-2026-04-28.md +118 -0
- package/docs/rule-authoring.md +316 -0
- package/docs/session-config-reference.md +1439 -0
- package/docs/session-config-template.md +961 -0
- package/docs/vault-docs-architecture.md +297 -0
- package/hooks/_lib/lock-bootstrap.mjs +272 -0
- package/hooks/_lib/lock-reconcile.mjs +93 -0
- package/hooks/_lib/profile-gate.mjs +95 -0
- package/hooks/_lib/transcript-history.mjs +211 -0
- package/hooks/agent-teams-h3-test.sh +362 -0
- package/hooks/config-protection.mjs +0 -0
- package/hooks/cwd-change-restore.mjs +131 -0
- package/hooks/enforce-commands.mjs +179 -0
- package/hooks/enforce-scope.mjs +273 -0
- package/hooks/hooks-codex.json +60 -0
- package/hooks/hooks-cursor.json +15 -0
- package/hooks/hooks-pi.json +115 -0
- package/hooks/hooks.json +215 -0
- package/hooks/loop-guard.mjs +260 -0
- package/hooks/on-session-end.mjs +217 -0
- package/hooks/on-session-start.mjs +660 -0
- package/hooks/on-stop.mjs +294 -0
- package/hooks/operator-steer.mjs +64 -0
- package/hooks/post-edit-validate.mjs +225 -0
- package/hooks/post-subagent-discovery-validator.mjs +398 -0
- package/hooks/post-tool-batch-wave-signal.mjs +328 -0
- package/hooks/post-tool-failure-corrective-context.mjs +248 -0
- package/hooks/post-tooluse-frontend-slop.mjs +184 -0
- package/hooks/pre-bash-destructive-guard.mjs +515 -0
- package/hooks/pre-bash-memory-propose-audit.mjs +206 -0
- package/hooks/pre-bash-staging-fence.mjs +223 -0
- package/hooks/pre-bash-templates-first.mjs +404 -0
- package/hooks/run-node.sh +72 -0
- package/hooks/skill-invocation-telemetry.mjs +99 -0
- package/hooks/subagent-telemetry.mjs +249 -0
- package/hooks/wave-scope-commit-guard.mjs +191 -0
- package/monitors/monitors.json +14 -0
- package/output-styles/finding-report.md +48 -0
- package/output-styles/session-report.md +53 -0
- package/output-styles/wave-summary.md +38 -0
- package/package.json +94 -0
- package/pi/extensions/session-orchestrator.ts +25 -0
- package/pi/prompts/autopilot-multi.md +12 -0
- package/pi/prompts/autopilot.md +12 -0
- package/pi/prompts/bootstrap.md +12 -0
- package/pi/prompts/brainstorm.md +12 -0
- package/pi/prompts/close.md +11 -0
- package/pi/prompts/debug.md +12 -0
- package/pi/prompts/discovery.md +12 -0
- package/pi/prompts/dispatcher.md +12 -0
- package/pi/prompts/eval.md +12 -0
- package/pi/prompts/evolve.md +12 -0
- package/pi/prompts/go.md +12 -0
- package/pi/prompts/grill.md +12 -0
- package/pi/prompts/harness-audit.md +12 -0
- package/pi/prompts/memory-cleanup.md +12 -0
- package/pi/prompts/persona-panel.md +12 -0
- package/pi/prompts/plan.md +12 -0
- package/pi/prompts/portfolio.md +12 -0
- package/pi/prompts/reconcile.md +12 -0
- package/pi/prompts/repo-audit.md +12 -0
- package/pi/prompts/session.md +12 -0
- package/pi/prompts/spinout.md +12 -0
- package/pi/prompts/sunset-review.md +12 -0
- package/pi/prompts/templates-ack.md +12 -0
- package/pi/prompts/test.md +12 -0
- package/rules/_index.md +51 -0
- package/rules/always-on/commit-discipline.md +26 -0
- package/rules/always-on/npm-quality-gates.md +26 -0
- package/rules/always-on/parallel-sessions.md +43 -0
- package/rules/opt-in-domain/prompt-caching.md +270 -0
- package/rules/opt-in-stack/backend-data.md +188 -0
- package/rules/opt-in-stack/backend.md +390 -0
- package/rules/opt-in-stack/frontend.md +98 -0
- package/rules/opt-in-stack/security-web.md +194 -0
- package/rules/opt-in-stack/swift.md +65 -0
- package/scripts/archive-closed-prds.mjs +416 -0
- package/scripts/autopilot-multi.mjs +802 -0
- package/scripts/autopilot.mjs +383 -0
- package/scripts/backfill-abandoned-sessions.mjs +265 -0
- package/scripts/backfill-learnings-expires.mjs +196 -0
- package/scripts/backfill-learnings.mjs +203 -0
- package/scripts/backfill-sessions.mjs +282 -0
- package/scripts/check-doc-consistency.sh +279 -0
- package/scripts/check-package-manager.mjs +445 -0
- package/scripts/ci/assert-vitest-green.mjs +267 -0
- package/scripts/codex-install.mjs +435 -0
- package/scripts/compute-grounding-injection.sh +186 -0
- package/scripts/cursor-install.mjs +113 -0
- package/scripts/dialectic-deriver.mjs +573 -0
- package/scripts/emit-event.mjs +160 -0
- package/scripts/emit-session.mjs +212 -0
- package/scripts/eval-session.mjs +262 -0
- package/scripts/export-hw-learnings.mjs +437 -0
- package/scripts/gc-stale-worktrees.mjs +666 -0
- package/scripts/generate-pi-prompts.mjs +127 -0
- package/scripts/harness-audit.mjs +287 -0
- package/scripts/lib/agent-frontmatter.mjs +266 -0
- package/scripts/lib/agent-output-schema.mjs +166 -0
- package/scripts/lib/agent-status.mjs +303 -0
- package/scripts/lib/ajv-loader.mjs +34 -0
- package/scripts/lib/auto-dialectic.mjs +382 -0
- package/scripts/lib/auto-dream.mjs +471 -0
- package/scripts/lib/autonomy/suitability.mjs +212 -0
- package/scripts/lib/autopilot/dep-graph.mjs +417 -0
- package/scripts/lib/autopilot/durable-telemetry.mjs +121 -0
- package/scripts/lib/autopilot/flags.mjs +104 -0
- package/scripts/lib/autopilot/kill-switches.mjs +174 -0
- package/scripts/lib/autopilot/loop.mjs +320 -0
- package/scripts/lib/autopilot/mr-draft.mjs +520 -0
- package/scripts/lib/autopilot/multi-killswitch.mjs +184 -0
- package/scripts/lib/autopilot/recent-runs.mjs +106 -0
- package/scripts/lib/autopilot/stall-sampler.mjs +97 -0
- package/scripts/lib/autopilot/telemetry.mjs +224 -0
- package/scripts/lib/autopilot/worktree-pipeline.mjs +605 -0
- package/scripts/lib/autopilot-telemetry.mjs +11 -0
- package/scripts/lib/autopilot.mjs +39 -0
- package/scripts/lib/backlog-scan.mjs +179 -0
- package/scripts/lib/bootstrap-lock-freshness.mjs +260 -0
- package/scripts/lib/bootstrap-lock-refresh.mjs +186 -0
- package/scripts/lib/build-live-signals.mjs +150 -0
- package/scripts/lib/ci-status-banner.mjs +425 -0
- package/scripts/lib/claude-md-budget-lint.mjs +246 -0
- package/scripts/lib/cli-flags.mjs +158 -0
- package/scripts/lib/codex/plugin-contract.mjs +610 -0
- package/scripts/lib/cold-start-detector.mjs +240 -0
- package/scripts/lib/command-blocker.mjs +458 -0
- package/scripts/lib/common.mjs +333 -0
- package/scripts/lib/config/auto-dream.mjs +77 -0
- package/scripts/lib/config/block-header.mjs +94 -0
- package/scripts/lib/config/broken-window.mjs +114 -0
- package/scripts/lib/config/coercers.mjs +248 -0
- package/scripts/lib/config/cold-start.mjs +92 -0
- package/scripts/lib/config/config-protection.mjs +120 -0
- package/scripts/lib/config/cross-repo.mjs +104 -0
- package/scripts/lib/config/custom-phases.mjs +213 -0
- package/scripts/lib/config/dialectic.mjs +92 -0
- package/scripts/lib/config/discovery-validator.mjs +75 -0
- package/scripts/lib/config/dispatcher-autonomy-capture.mjs +240 -0
- package/scripts/lib/config/dispatcher-autonomy.mjs +152 -0
- package/scripts/lib/config/docs-orchestrator.mjs +90 -0
- package/scripts/lib/config/docs-staleness.mjs +96 -0
- package/scripts/lib/config/drift-check.mjs +155 -0
- package/scripts/lib/config/eval.mjs +130 -0
- package/scripts/lib/config/events-rotation.mjs +74 -0
- package/scripts/lib/config/evolve.mjs +308 -0
- package/scripts/lib/config/frontend-slop-hook.mjs +104 -0
- package/scripts/lib/config/gitlab-portfolio.mjs +150 -0
- package/scripts/lib/config/handover-gate.mjs +106 -0
- package/scripts/lib/config/host-paths.mjs +76 -0
- package/scripts/lib/config/io.mjs +54 -0
- package/scripts/lib/config/loop-guard.mjs +117 -0
- package/scripts/lib/config/memory.mjs +150 -0
- package/scripts/lib/config/persona-gate-wave.mjs +258 -0
- package/scripts/lib/config/reconcile.mjs +205 -0
- package/scripts/lib/config/section-extractor.mjs +100 -0
- package/scripts/lib/config/skill-evolution.mjs +112 -0
- package/scripts/lib/config/slopcheck.mjs +99 -0
- package/scripts/lib/config/state-md-lock.mjs +83 -0
- package/scripts/lib/config/templates-first.mjs +94 -0
- package/scripts/lib/config/test.mjs +113 -0
- package/scripts/lib/config/vault-integration.mjs +201 -0
- package/scripts/lib/config/vault-mirror-quality.mjs +99 -0
- package/scripts/lib/config/vault-staleness.mjs +84 -0
- package/scripts/lib/config/vault-sync.mjs +96 -0
- package/scripts/lib/config/verification-auto-fix.mjs +84 -0
- package/scripts/lib/config/wave-reviewers.mjs +133 -0
- package/scripts/lib/config-schema.mjs +345 -0
- package/scripts/lib/config.mjs +474 -0
- package/scripts/lib/convergence-monitor.mjs +389 -0
- package/scripts/lib/coordinator-snapshot.mjs +371 -0
- package/scripts/lib/crypto-digest-utils.mjs +91 -0
- package/scripts/lib/discovery/helpers.mjs +127 -0
- package/scripts/lib/discovery/triage-state.mjs +279 -0
- package/scripts/lib/dispatcher/cli.mjs +257 -0
- package/scripts/lib/dispatcher/enumerate.mjs +243 -0
- package/scripts/lib/dispatcher/rank.mjs +363 -0
- package/scripts/lib/ecosystem-health.mjs +224 -0
- package/scripts/lib/ecosystem-wizard/ci-detector.mjs +18 -0
- package/scripts/lib/ecosystem-wizard/config-parser.mjs +54 -0
- package/scripts/lib/ecosystem-wizard/config-writer.mjs +287 -0
- package/scripts/lib/ecosystem-wizard/package-manager-detector.mjs +42 -0
- package/scripts/lib/ecosystem-wizard/wizard-prompt.mjs +246 -0
- package/scripts/lib/ecosystem-wizard.mjs +48 -0
- package/scripts/lib/env-check.mjs +89 -0
- package/scripts/lib/eval/engine.mjs +605 -0
- package/scripts/lib/eval/judge.mjs +433 -0
- package/scripts/lib/eval/report.mjs +367 -0
- package/scripts/lib/eval/schema.mjs +618 -0
- package/scripts/lib/eval/session-resolve.mjs +137 -0
- package/scripts/lib/eval/sink.mjs +77 -0
- package/scripts/lib/events-rotation.mjs +86 -0
- package/scripts/lib/events-schema.mjs +81 -0
- package/scripts/lib/events.mjs +80 -0
- package/scripts/lib/evolve/autonomy-verdict.mjs +461 -0
- package/scripts/lib/evolve/autopilot-effectiveness.mjs +293 -0
- package/scripts/lib/exclusivity-matrix.mjs +68 -0
- package/scripts/lib/fetch-baseline.mjs +311 -0
- package/scripts/lib/file-lock.mjs +512 -0
- package/scripts/lib/frontend-detect/detect.mjs +138 -0
- package/scripts/lib/frontend-detect/rules.mjs +295 -0
- package/scripts/lib/frontmatter-guard.mjs +241 -0
- package/scripts/lib/gates/echo-stub-detect.mjs +39 -0
- package/scripts/lib/gates/gate-baseline.mjs +42 -0
- package/scripts/lib/gates/gate-full.mjs +85 -0
- package/scripts/lib/gates/gate-helpers.mjs +231 -0
- package/scripts/lib/gates/gate-incremental.mjs +76 -0
- package/scripts/lib/gates/gate-per-file.mjs +55 -0
- package/scripts/lib/gitlab-ops/stale-mr-sweep.mjs +447 -0
- package/scripts/lib/gitlab-portfolio/aggregator.mjs +383 -0
- package/scripts/lib/gitlab-portfolio/cli.mjs +428 -0
- package/scripts/lib/gitlab-portfolio/markdown-writer.mjs +289 -0
- package/scripts/lib/gitlab-portfolio/vcs-detect.mjs +182 -0
- package/scripts/lib/handover-gate.mjs +222 -0
- package/scripts/lib/hardening.mjs +43 -0
- package/scripts/lib/hardware-pattern-detector.mjs +238 -0
- package/scripts/lib/harness-audit/categories/category1.mjs +123 -0
- package/scripts/lib/harness-audit/categories/category2.mjs +145 -0
- package/scripts/lib/harness-audit/categories/category3.mjs +143 -0
- package/scripts/lib/harness-audit/categories/category4.mjs +202 -0
- package/scripts/lib/harness-audit/categories/category5.mjs +152 -0
- package/scripts/lib/harness-audit/categories/category6.mjs +211 -0
- package/scripts/lib/harness-audit/categories/category7.mjs +125 -0
- package/scripts/lib/harness-audit/categories/category8.mjs +328 -0
- package/scripts/lib/harness-audit/categories/category9.mjs +294 -0
- package/scripts/lib/harness-audit/categories/helpers.mjs +165 -0
- package/scripts/lib/harness-audit/categories.mjs +19 -0
- package/scripts/lib/historical-guard.mjs +15 -0
- package/scripts/lib/host-identity.mjs +262 -0
- package/scripts/lib/instruction-budget-guard.mjs +332 -0
- package/scripts/lib/io.mjs +304 -0
- package/scripts/lib/issue-close-strip-labels.mjs +161 -0
- package/scripts/lib/language-mappers/README.md +57 -0
- package/scripts/lib/language-mappers/index.mjs +165 -0
- package/scripts/lib/language-mappers/markdown.mjs +149 -0
- package/scripts/lib/language-mappers/python.mjs +249 -0
- package/scripts/lib/language-mappers/swift.mjs +201 -0
- package/scripts/lib/language-mappers/typescript.mjs +433 -0
- package/scripts/lib/learnings/expiry-sweep.mjs +164 -0
- package/scripts/lib/learnings/filters.mjs +43 -0
- package/scripts/lib/learnings/io.mjs +255 -0
- package/scripts/lib/learnings/schema.mjs +518 -0
- package/scripts/lib/learnings/surface.mjs +207 -0
- package/scripts/lib/learnings.mjs +42 -0
- package/scripts/lib/lock-reaper.mjs +648 -0
- package/scripts/lib/locks/index.mjs +31 -0
- package/scripts/lib/locks/lock-body.mjs +62 -0
- package/scripts/lib/locks/staging-fence-lock.mjs +267 -0
- package/scripts/lib/locks/state-md-lock.mjs +351 -0
- package/scripts/lib/loop-readiness-banner.mjs +144 -0
- package/scripts/lib/memory-banner.mjs +478 -0
- package/scripts/lib/memory-cleanup/worktree-sweep.mjs +108 -0
- package/scripts/lib/memory-cleanup-stamp.mjs +56 -0
- package/scripts/lib/memory-paths.mjs +31 -0
- package/scripts/lib/memory-proposals/collector.mjs +334 -0
- package/scripts/lib/memory-proposals/schema.mjs +289 -0
- package/scripts/lib/memory-proposals/sink.mjs +507 -0
- package/scripts/lib/memory-proposals/store.mjs +441 -0
- package/scripts/lib/mission-status-schema.mjs +114 -0
- package/scripts/lib/mode-selector/alternatives.mjs +64 -0
- package/scripts/lib/mode-selector/constants.mjs +29 -0
- package/scripts/lib/mode-selector/context-pressure.mjs +157 -0
- package/scripts/lib/mode-selector/rationale.mjs +55 -0
- package/scripts/lib/mode-selector/scoring.mjs +221 -0
- package/scripts/lib/mode-selector-accuracy.mjs +121 -0
- package/scripts/lib/mode-selector.mjs +160 -0
- package/scripts/lib/multi-provider-build/providers.mjs +64 -0
- package/scripts/lib/multi-provider-build/templating.mjs +130 -0
- package/scripts/lib/named-baseline-resolver.mjs +233 -0
- package/scripts/lib/named-vault-resolver.mjs +433 -0
- package/scripts/lib/owner-config/coerce.mjs +29 -0
- package/scripts/lib/owner-config/constants.mjs +21 -0
- package/scripts/lib/owner-config/defaults.mjs +50 -0
- package/scripts/lib/owner-config/error.mjs +19 -0
- package/scripts/lib/owner-config/index.mjs +13 -0
- package/scripts/lib/owner-config/merge.mjs +52 -0
- package/scripts/lib/owner-config/validate.mjs +259 -0
- package/scripts/lib/owner-config-banner.mjs +126 -0
- package/scripts/lib/owner-config-loader.mjs +159 -0
- package/scripts/lib/owner-config.example.yaml +72 -0
- package/scripts/lib/owner-config.mjs +28 -0
- package/scripts/lib/owner-interview.mjs +243 -0
- package/scripts/lib/owner-yaml.mjs +571 -0
- package/scripts/lib/package-manager.mjs +160 -0
- package/scripts/lib/path-utils.mjs +217 -0
- package/scripts/lib/peer-cards/merger.mjs +310 -0
- package/scripts/lib/peer-cards/reader.mjs +125 -0
- package/scripts/lib/peer-cards/schema.mjs +230 -0
- package/scripts/lib/peer-cards/staleness-banner.mjs +86 -0
- package/scripts/lib/peer-cards/writer.mjs +138 -0
- package/scripts/lib/peer-discovery.mjs +200 -0
- package/scripts/lib/persona-panel/catalog-loader.mjs +577 -0
- package/scripts/lib/persona-panel/consolidator.mjs +370 -0
- package/scripts/lib/persona-panel/persona-runner.mjs +375 -0
- package/scripts/lib/persona-panel/threshold.mjs +130 -0
- package/scripts/lib/pi-hook-bridge.mjs +328 -0
- package/scripts/lib/platform.mjs +266 -0
- package/scripts/lib/playwright-driver/runner.mjs +297 -0
- package/scripts/lib/plugin-root.mjs +210 -0
- package/scripts/lib/pre-dispatch-check.mjs +126 -0
- package/scripts/lib/product-repo-detect.mjs +121 -0
- package/scripts/lib/profiles/registry.mjs +176 -0
- package/scripts/lib/profiles/schema.mjs +209 -0
- package/scripts/lib/qg-command-drift-banner.mjs +88 -0
- package/scripts/lib/quality-gate/diagnostics.mjs +92 -0
- package/scripts/lib/quality-gate.mjs +536 -0
- package/scripts/lib/quality-gates-cache.mjs +228 -0
- package/scripts/lib/quality-gates-policy.mjs +95 -0
- package/scripts/lib/recommendations-v0.mjs +156 -0
- package/scripts/lib/reconcile/eligibility.mjs +203 -0
- package/scripts/lib/reconcile/emitter.mjs +244 -0
- package/scripts/lib/reconcile/engine.mjs +412 -0
- package/scripts/lib/reconcile/idempotency.mjs +239 -0
- package/scripts/lib/reconcile/renderer.mjs +211 -0
- package/scripts/lib/reconcile/writer.mjs +293 -0
- package/scripts/lib/reconcile-nudge-banner.mjs +284 -0
- package/scripts/lib/resource-probe/evaluate.mjs +190 -0
- package/scripts/lib/resource-probe/parsers.mjs +181 -0
- package/scripts/lib/resource-probe/probe-platform.mjs +300 -0
- package/scripts/lib/resource-probe.mjs +95 -0
- package/scripts/lib/rule-loader.mjs +552 -0
- package/scripts/lib/rules-sync.mjs +439 -0
- package/scripts/lib/scope-gate.mjs +496 -0
- package/scripts/lib/session-close-backfill.mjs +539 -0
- package/scripts/lib/session-discovery.mjs +256 -0
- package/scripts/lib/session-end/phase-skip.mjs +357 -0
- package/scripts/lib/session-end/worktree-cleanup.mjs +112 -0
- package/scripts/lib/session-id.mjs +362 -0
- package/scripts/lib/session-lock.mjs +703 -0
- package/scripts/lib/session-registry.mjs +355 -0
- package/scripts/lib/session-schema/aliases.mjs +71 -0
- package/scripts/lib/session-schema/constants.mjs +115 -0
- package/scripts/lib/session-schema/normalizer.mjs +66 -0
- package/scripts/lib/session-schema/timestamps.mjs +64 -0
- package/scripts/lib/session-schema/validator.mjs +453 -0
- package/scripts/lib/session-schema.mjs +71 -0
- package/scripts/lib/session-token-rollup.mjs +137 -0
- package/scripts/lib/sessions-staleness-banner.mjs +247 -0
- package/scripts/lib/skill-evolution/blast-radius-classifier.mjs +114 -0
- package/scripts/lib/skill-evolution/candidate-intake.mjs +270 -0
- package/scripts/lib/skill-evolution/config-validation-gate.mjs +279 -0
- package/scripts/lib/skill-evolution/engine.mjs +719 -0
- package/scripts/lib/skill-evolution/idempotency.mjs +279 -0
- package/scripts/lib/skill-evolution/mr-opener.mjs +507 -0
- package/scripts/lib/skill-health/join.mjs +181 -0
- package/scripts/lib/skill-health/score.mjs +123 -0
- package/scripts/lib/skill-invocations-schema.mjs +214 -0
- package/scripts/lib/skill-judge.mjs +348 -0
- package/scripts/lib/skill-judgments-schema.mjs +264 -0
- package/scripts/lib/slopcheck.mjs +501 -0
- package/scripts/lib/soul-resolve.mjs +118 -0
- package/scripts/lib/spiral-carryover.mjs +495 -0
- package/scripts/lib/state-md/body-sections.mjs +851 -0
- package/scripts/lib/state-md/frontmatter-mutators.mjs +453 -0
- package/scripts/lib/state-md/mission-status.mjs +247 -0
- package/scripts/lib/state-md/recommendations.mjs +57 -0
- package/scripts/lib/state-md/yaml-parser.mjs +234 -0
- package/scripts/lib/state-md-peer-guard.mjs +232 -0
- package/scripts/lib/state-md.mjs +53 -0
- package/scripts/lib/subagents-schema.mjs +309 -0
- package/scripts/lib/sunset/walker.mjs +1192 -0
- package/scripts/lib/test-runner/artifact-paths.mjs +94 -0
- package/scripts/lib/test-runner/fingerprint.mjs +33 -0
- package/scripts/lib/test-runner/issue-reconcile.mjs +770 -0
- package/scripts/lib/tmux-layout/layouts.mjs +224 -0
- package/scripts/lib/tmux-layout/telemetry-stats.mjs +100 -0
- package/scripts/lib/tmux-layout/telemetry.mjs +88 -0
- package/scripts/lib/tmux-layout/tmux-shell.mjs +82 -0
- package/scripts/lib/tmux-layout/vcs-detector.mjs +88 -0
- package/scripts/lib/validate/check-agents.mjs +457 -0
- package/scripts/lib/validate/check-codex-plugin.mjs +37 -0
- package/scripts/lib/validate/check-commands.mjs +148 -0
- package/scripts/lib/validate/check-component-paths.mjs +112 -0
- package/scripts/lib/validate/check-dead-bridge.mjs +180 -0
- package/scripts/lib/validate/check-hooks-symmetry.mjs +258 -0
- package/scripts/lib/validate/check-json-files.mjs +116 -0
- package/scripts/lib/validate/check-owner-leakage.mjs +1011 -0
- package/scripts/lib/validate/check-path-utils-canary.mjs +175 -0
- package/scripts/lib/validate/check-peekaboo-driver-canary.mjs +201 -0
- package/scripts/lib/validate/check-pi-package.mjs +110 -0
- package/scripts/lib/validate/check-pi-prompts.mjs +43 -0
- package/scripts/lib/validate/check-playwright-mcp-canary.mjs +154 -0
- package/scripts/lib/validate/check-plugin-json.mjs +96 -0
- package/scripts/lib/validate/check-plugin-monitors.mjs +206 -0
- package/scripts/lib/validate/check-plugin-schema.mjs +137 -0
- package/scripts/lib/validate/check-rules.mjs +143 -0
- package/scripts/lib/validate/check-session-plan-routing.mjs +154 -0
- package/scripts/lib/validate/check-test-fixture-shapes.mjs +280 -0
- package/scripts/lib/validate/check-unicode-safety.mjs +533 -0
- package/scripts/lib/validate/confidential-names.mjs +169 -0
- package/scripts/lib/validate/dead-bridge-corpus.mjs +141 -0
- package/scripts/lib/validate/dead-bridge-detectors.mjs +568 -0
- package/scripts/lib/validate/tier-inference.mjs +100 -0
- package/scripts/lib/validate-vendored-rules.mjs +519 -0
- package/scripts/lib/vault-archive.mjs +404 -0
- package/scripts/lib/vault-backfill/glab.mjs +164 -0
- package/scripts/lib/vault-backfill/manifest.mjs +75 -0
- package/scripts/lib/vault-backfill/template.mjs +130 -0
- package/scripts/lib/vault-consolidate-fs.mjs +331 -0
- package/scripts/lib/vault-migration-rules.mjs +155 -0
- package/scripts/lib/vault-mirror/auto-commit.mjs +203 -0
- package/scripts/lib/vault-mirror/namespace.mjs +152 -0
- package/scripts/lib/vault-mirror/process.mjs +567 -0
- package/scripts/lib/vault-mirror/pseudonym-map.mjs +164 -0
- package/scripts/lib/vault-mirror/render-learnings.mjs +201 -0
- package/scripts/lib/vault-mirror/render-sessions.mjs +367 -0
- package/scripts/lib/vault-mirror/render.mjs +8 -0
- package/scripts/lib/vault-mirror/utils.mjs +217 -0
- package/scripts/lib/vault-relocation-rules.mjs +555 -0
- package/scripts/lib/vault-repo-backfill.mjs +235 -0
- package/scripts/lib/vault-staleness-banner.mjs +142 -0
- package/scripts/lib/vault-status/board-writer.mjs +769 -0
- package/scripts/lib/vault-status/narrative-mirror.mjs +544 -0
- package/scripts/lib/vault-sync-baseline.mjs +152 -0
- package/scripts/lib/wave-context.mjs +29 -0
- package/scripts/lib/wave-executor/pool.mjs +248 -0
- package/scripts/lib/wave-resource-gate.mjs +204 -0
- package/scripts/lib/wave-sizing.mjs +75 -0
- package/scripts/lib/webhook-url.mjs +105 -0
- package/scripts/lib/workspace.mjs +198 -0
- package/scripts/lib/worktree/constants.mjs +35 -0
- package/scripts/lib/worktree/index.mjs +17 -0
- package/scripts/lib/worktree/lifecycle.mjs +287 -0
- package/scripts/lib/worktree/listing.mjs +118 -0
- package/scripts/lib/worktree/meta.mjs +64 -0
- package/scripts/lib/worktree-freshness.mjs +313 -0
- package/scripts/lib/worktree.mjs +15 -0
- package/scripts/lifecycle-sim-v6.mjs +347 -0
- package/scripts/lock-reaper.mjs +185 -0
- package/scripts/mcp-server.sh +241 -0
- package/scripts/measure-policy-cache-effectiveness.mjs +427 -0
- package/scripts/memory-propose.mjs +464 -0
- package/scripts/migrate-cold-start-seed.mjs +404 -0
- package/scripts/migrate-learnings-jsonl.mjs +189 -0
- package/scripts/migrate-legacy-learnings.sh +61 -0
- package/scripts/migrate-sessions-jsonl.mjs +448 -0
- package/scripts/migrate-subagents-jsonl.mjs +196 -0
- package/scripts/migrate-vault-paths.mjs +796 -0
- package/scripts/parse-config.mjs +149 -0
- package/scripts/pi-install.mjs +117 -0
- package/scripts/print-applicable-rules.mjs +247 -0
- package/scripts/promote-vault-strict.mjs +496 -0
- package/scripts/relocate-vault-corpus.mjs +1178 -0
- package/scripts/run-migrate-v2-cross-repo.mjs +385 -0
- package/scripts/run-quality-gate.mjs +216 -0
- package/scripts/spikes/h3-agent-teams/preflight.sh +53 -0
- package/scripts/spikes/h3-agent-teams/run-h3.sh +112 -0
- package/scripts/spikes/h3-agent-teams/setup.sh +137 -0
- package/scripts/spikes/h3-agent-teams/toggle.sh +38 -0
- package/scripts/sweep-expired-learnings.mjs +135 -0
- package/scripts/sync-vault-schema.mjs +376 -0
- package/scripts/tests/fixtures/fetch-baseline/sample-rule.md +8 -0
- package/scripts/tmux-layout.mjs +245 -0
- package/scripts/token-audit.sh +191 -0
- package/scripts/typecheck.mjs +42 -0
- package/scripts/upload-social-preview.mjs +316 -0
- package/scripts/validate-config.mjs +46 -0
- package/scripts/validate-plugin-manifests.mjs +163 -0
- package/scripts/validate-plugin.mjs +264 -0
- package/scripts/validate-wave-scope.mjs +289 -0
- package/scripts/vault-backfill.mjs +404 -0
- package/scripts/vault-consolidate.mjs +596 -0
- package/scripts/vault-integration-watcher.mjs +394 -0
- package/scripts/vault-mirror.mjs +430 -0
- package/skills/_shared/bootstrap-gate.md +111 -0
- package/skills/_shared/config-reading.md +226 -0
- package/skills/_shared/instruction-file-resolution.md +79 -0
- package/skills/_shared/model-selection.md +64 -0
- package/skills/_shared/monitor-patterns.md +300 -0
- package/skills/_shared/parallel-aware-auq.md +121 -0
- package/skills/_shared/parallel-aware-preamble.md +185 -0
- package/skills/_shared/platform-tools.md +96 -0
- package/skills/_shared/state-ownership.md +221 -0
- package/skills/architecture/DEEPENING.md +37 -0
- package/skills/architecture/INTERFACE-DESIGN.md +44 -0
- package/skills/architecture/LANGUAGE.md +53 -0
- package/skills/architecture/SKILL.md +92 -0
- package/skills/autopilot/SKILL.md +419 -0
- package/skills/bootstrap/SKILL.md +592 -0
- package/skills/bootstrap/STATE.md.template +24 -0
- package/skills/bootstrap/_shared-template.md +243 -0
- package/skills/bootstrap/deep-template.md +659 -0
- package/skills/bootstrap/fast-template.md +251 -0
- package/skills/bootstrap/intensity-heuristic.md +80 -0
- package/skills/bootstrap/public-fallback.md +342 -0
- package/skills/bootstrap/standard-template.md +736 -0
- package/skills/bootstrap/templates/agents/project-code-review.md +18 -0
- package/skills/bootstrap/templates/agents/project-discovery.md +18 -0
- package/skills/bootstrap/templates/agents/project-quality-gate.md +18 -0
- package/skills/brainstorm/SKILL.md +268 -0
- package/skills/brainstorm/soul.md +49 -0
- package/skills/claude-md-drift-check/SKILL.md +186 -0
- package/skills/claude-md-drift-check/checker.mjs +1380 -0
- package/skills/claude-md-drift-check/checker.sh +37 -0
- package/skills/claude-md-drift-check/package.json +16 -0
- package/skills/convergence-monitoring/README.md +39 -0
- package/skills/convergence-monitoring/SIGNALS.md +246 -0
- package/skills/convergence-monitoring/SKILL.md +285 -0
- package/skills/daily/SKILL.md +222 -0
- package/skills/daily/generate.sh +92 -0
- package/skills/daily/templates/daily.md.tpl +36 -0
- package/skills/debug/SKILL.md +188 -0
- package/skills/debug/soul.md +35 -0
- package/skills/discovery/SKILL.md +567 -0
- package/skills/discovery/issue-templates.md +237 -0
- package/skills/discovery/probes/docs-staleness.mjs +195 -0
- package/skills/discovery/probes/frontend-slop.mjs +186 -0
- package/skills/discovery/probes/ssot-code-diff.mjs +310 -0
- package/skills/discovery/probes/supply-chain-slopcheck.mjs +440 -0
- package/skills/discovery/probes/vault-narrative-staleness.mjs +355 -0
- package/skills/discovery/probes/vault-staleness.mjs +272 -0
- package/skills/discovery/probes-arch.md +252 -0
- package/skills/discovery/probes-audit.md +95 -0
- package/skills/discovery/probes-code.md +329 -0
- package/skills/discovery/probes-docs.md +76 -0
- package/skills/discovery/probes-feature.md +150 -0
- package/skills/discovery/probes-infra.md +138 -0
- package/skills/discovery/probes-intro.md +25 -0
- package/skills/discovery/probes-session.md +495 -0
- package/skills/discovery/probes-supply-chain.md +94 -0
- package/skills/discovery/probes-ui.md +147 -0
- package/skills/discovery/probes-vault.md +64 -0
- package/skills/discovery/slop-patterns.md +115 -0
- package/skills/dispatcher/SKILL.md +173 -0
- package/skills/docs-orchestrator/SKILL.md +362 -0
- package/skills/docs-orchestrator/audience-mapping.md +140 -0
- package/skills/domain-model/ADR-FORMAT.md +47 -0
- package/skills/domain-model/CONTEXT-FORMAT.md +77 -0
- package/skills/domain-model/SKILL.md +85 -0
- package/skills/ecosystem-health/SKILL.md +119 -0
- package/skills/ecosystem-health/wizard.md +193 -0
- package/skills/eval/SKILL.md +293 -0
- package/skills/eval/rubric-v1.md +218 -0
- package/skills/evolve/SKILL.md +546 -0
- package/skills/frontmatter-guard/SKILL.md +126 -0
- package/skills/gitlab-ops/SKILL.md +368 -0
- package/skills/gitlab-portfolio/SKILL.md +196 -0
- package/skills/grill/SKILL.md +185 -0
- package/skills/grill/soul.md +55 -0
- package/skills/hook-development/SKILL.md +413 -0
- package/skills/mcp-builder/SKILL.md +260 -0
- package/skills/memory-cleanup/SKILL.md +310 -0
- package/skills/mode-selector/SKILL.md +226 -0
- package/skills/peekaboo-driver/SKILL.md +237 -0
- package/skills/peekaboo-driver/soul.md +32 -0
- package/skills/persona-panel/SKILL.md +365 -0
- package/skills/persona-panel/persona-format.md +205 -0
- package/skills/persona-panel/presets/designer-lens.md +87 -0
- package/skills/persona-panel/presets/engineer-lens.md +88 -0
- package/skills/persona-panel/presets/pm-lens.md +86 -0
- package/skills/plan/SKILL.md +496 -0
- package/skills/plan/mode-feature.md +141 -0
- package/skills/plan/mode-new.md +297 -0
- package/skills/plan/mode-retro.md +271 -0
- package/skills/plan/prd-feature-template.md +132 -0
- package/skills/plan/prd-full-template.md +151 -0
- package/skills/plan/prd-reviewer-prompt.md +103 -0
- package/skills/plan/retro-template.md +75 -0
- package/skills/plan/soul.md +62 -0
- package/skills/playwright-driver/SKILL.md +226 -0
- package/skills/playwright-driver/soul.md +30 -0
- package/skills/quality-gates/SKILL.md +212 -0
- package/skills/reconcile/SKILL.md +324 -0
- package/skills/repo-audit/SKILL.md +272 -0
- package/skills/session-end/SKILL.md +1044 -0
- package/skills/session-end/discovery-scan.md +37 -0
- package/skills/session-end/drift-operations.md +97 -0
- package/skills/session-end/learning-patterns.md +78 -0
- package/skills/session-end/metrics-collection.md +175 -0
- package/skills/session-end/phase-3-2-docs-verification.md +148 -0
- package/skills/session-end/phase-3-6-tail.md +344 -0
- package/skills/session-end/phase-3-7a-recommendations.md +86 -0
- package/skills/session-end/plan-verification.md +288 -0
- package/skills/session-end/session-metrics-write.md +223 -0
- package/skills/session-end/vault-operations.md +50 -0
- package/skills/session-end/verification-checklist.md +20 -0
- package/skills/session-plan/SKILL.md +554 -0
- package/skills/session-plan/wave-template.md +37 -0
- package/skills/session-start/SKILL.md +1043 -0
- package/skills/session-start/phase-2-5-docs-planning.md +119 -0
- package/skills/session-start/phase-4-5-resource-health.md +49 -0
- package/skills/session-start/phase-7-1-premise-check.md +47 -0
- package/skills/session-start/phase-7-5-mode-selector.md +237 -0
- package/skills/session-start/phase-8-5-express-path.md +61 -0
- package/skills/session-start/presentation-format.md +81 -0
- package/skills/session-start/soul.md +57 -0
- package/skills/skill-creator/SKILL.md +168 -0
- package/skills/spinout/SKILL.md +76 -0
- package/skills/sunset-review/SKILL.md +96 -0
- package/skills/test-runner/SKILL.md +362 -0
- package/skills/test-runner/rubric-v1.md +388 -0
- package/skills/test-runner/soul.md +46 -0
- package/skills/tmux-layout/SKILL.md +104 -0
- package/skills/ubiquitous-language/SKILL.md +97 -0
- package/skills/using-orchestrator/SKILL.md +144 -0
- package/skills/vault-mirror/SKILL.md +234 -0
- package/skills/vault-sync/SKILL.md +319 -0
- package/skills/vault-sync/package-lock.json +40 -0
- package/skills/vault-sync/package.json +11 -0
- package/skills/vault-sync/tests/fixtures/archive-test-vault/90-archive/bad-archived.md +8 -0
- package/skills/vault-sync/tests/fixtures/archive-test-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/archive-test-vault/live-note.md +8 -0
- package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/bad-type.md +8 -0
- package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/good-note.md +8 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/.obsidian/config.md +8 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/01-projects/foo/projects-baseline.md +10 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/03-daily/daily-2026-04-13.md +8 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/README.md +3 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/hello-world.md +11 -0
- package/skills/vault-sync/tests/fixtures/dangling-link-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/dangling-link-vault/has-dangling.md +9 -0
- package/skills/vault-sync/tests/fixtures/dangling-link-vault/real-target.md +8 -0
- package/skills/vault-sync/tests/fixtures/empty-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/missing-field-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/missing-field-vault/missing-id.md +7 -0
- package/skills/vault-sync/tests/fixtures/nested-tag-vault/03-daily/daily-2026-04-13.md +9 -0
- package/skills/vault-sync/tests/fixtures/nested-tag-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/nested-tag-vault/nested-tags-note.md +11 -0
- package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/README.md +3 -0
- package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/_MOC.md +3 -0
- package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/with-moc-vault/_MOC.md +11 -0
- package/skills/vault-sync/tests/fixtures/with-moc-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/with-moc-vault/hello-world.md +11 -0
- package/skills/vault-sync/tests/schema-drift.test.mjs +133 -0
- package/skills/vault-sync/validator.mjs +658 -0
- package/skills/vault-sync/validator.sh +55 -0
- package/skills/wave-executor/SKILL.md +496 -0
- package/skills/wave-executor/circuit-breaker.md +169 -0
- package/skills/wave-executor/wave-loop.md +1043 -0
- package/skills/write-executable-plan/SKILL.md +237 -0
- package/skills/write-executable-plan/plan-template.md +154 -0
- package/templates/_minimal/CLAUDE.md.tmpl +41 -0
- package/templates/_minimal/README.md.tmpl +15 -0
- package/templates/_minimal/gitignore.tmpl +47 -0
- package/templates/_shared/harte-regeln.md +16 -0
- package/templates/_shared/loop.md +90 -0
- package/templates/_shared/rules/parallel-sessions.md +77 -0
- package/templates/nextjs-minimal/README.md +30 -0
- package/templates/nextjs-minimal/app/layout.tsx +18 -0
- package/templates/nextjs-minimal/app/page.tsx +7 -0
- package/templates/nextjs-minimal/eslint.config.mjs +16 -0
- package/templates/nextjs-minimal/next.config.mjs +4 -0
- package/templates/nextjs-minimal/package.json +27 -0
- package/templates/nextjs-minimal/tsconfig.json +23 -0
- package/templates/node-minimal/README.md +33 -0
- package/templates/node-minimal/eslint.config.mjs +10 -0
- package/templates/node-minimal/package.json +21 -0
- package/templates/node-minimal/src/index.ts +1 -0
- package/templates/node-minimal/tests/sanity.test.ts +5 -0
- package/templates/node-minimal/tsconfig.json +17 -0
- package/templates/personas/README.md +150 -0
- package/templates/personas/accounting-compliance.v1.md +120 -0
- package/templates/personas/accounting-tax-advisor.v1.md +116 -0
- package/templates/personas/buyer-p1-cto.v1.md +125 -0
- package/templates/personas/buyer-p2-kanzlei.v1.md +134 -0
- package/templates/personas/buyer-p3-build.v1.md +130 -0
- package/templates/personas/buyer-p4-tech-veto.v1.md +130 -0
- package/templates/personas/buyer-p5-solo.v1.md +132 -0
- package/templates/personas/buyer-p6-ld.v1.md +130 -0
- package/templates/personas/klima-ai-expert.v1.md +114 -0
- package/templates/personas/klima-physicist.v1.md +117 -0
- package/templates/python-uv/README.md +28 -0
- package/templates/python-uv/pyproject.toml +32 -0
- package/templates/python-uv/src/__PROJECT_NAME__/__init__.py +0 -0
- package/templates/python-uv/src/__PROJECT_NAME__/main.py +6 -0
- package/templates/python-uv/tests/test_sanity.py +2 -0
- package/templates/static-html/README.md +19 -0
- package/templates/static-html/index.html +15 -0
- package/templates/static-html/script.js +1 -0
- package/templates/static-html/styles.css +26 -0
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
# UX Rubric v1
|
|
2
|
+
|
|
3
|
+
> Readable specification of the 4 UX checks applied by the `ux-evaluator` agent.
|
|
4
|
+
> Stable spec — v2 will live as a sibling `rubric-v2.md` in this same directory.
|
|
5
|
+
> The `findings.jsonl` metadata record carries `rubric_version: "v1"` so consumers
|
|
6
|
+
> can distinguish evaluations run against different rubric revisions.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Findings JSON schema (per finding)
|
|
11
|
+
|
|
12
|
+
Each finding in `findings.jsonl` is a JSON object on its own line (NDJSON). The
|
|
13
|
+
first line of the file is a metadata record (`"_meta": true`). All subsequent
|
|
14
|
+
lines conform to this schema:
|
|
15
|
+
|
|
16
|
+
```json
|
|
17
|
+
{
|
|
18
|
+
"run_id": "<string — test-runner run identifier, e.g. '12345-1715688000123'>",
|
|
19
|
+
"rubric_version": "v1",
|
|
20
|
+
"severity": "<'critical' | 'high' | 'medium' | 'low'>",
|
|
21
|
+
"check": "<'onboarding-step-count' | 'axe-violations' | 'console-errors' | 'liquid-glass-conformance'>",
|
|
22
|
+
"fingerprint": "<16-hex-char string — see Fingerprint formula below>",
|
|
23
|
+
"evidence_path": "<relative path from run-dir root to the supporting artifact>",
|
|
24
|
+
"suggested_priority": "<'critical' | 'high' | 'medium' | 'low' — same as severity for v1>",
|
|
25
|
+
"scope": "<short label: 'onboarding' | 'a11y' | 'console' | 'liquid-glass'>",
|
|
26
|
+
"checkId": "<check identifier used as fingerprint input — see per-check section>",
|
|
27
|
+
"locator": "<DOM selector, AX path, entry URL, or screen.frame identifier>",
|
|
28
|
+
"title": "<one-sentence summary of the violation>",
|
|
29
|
+
"description": "<2–4 sentence explanation including evidence reference and rubric citation>",
|
|
30
|
+
"recommendation": "<actionable next step specific enough to act on without re-reading the finding>"
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Invariants:**
|
|
35
|
+
- `fingerprint` is unique within a single run (collisions are logged, only first occurrence emitted).
|
|
36
|
+
- `evidence_path` must point to an artifact that exists in the run directory at evaluation time.
|
|
37
|
+
- `severity` and `suggested_priority` are lowercase in the JSON record (uppercase only in human-readable stdout tables).
|
|
38
|
+
- No field may be `null` or absent. Use `""` for fields where the value is genuinely unavailable, and explain in `description`.
|
|
39
|
+
|
|
40
|
+
**Metadata record (first line of `findings.jsonl`):**
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"_meta": true,
|
|
45
|
+
"rubric_version": "v1",
|
|
46
|
+
"run_id": "<run-id>",
|
|
47
|
+
"evaluated_at": "<ISO-8601-UTC timestamp>",
|
|
48
|
+
"checks_applied": 4,
|
|
49
|
+
"findings_count": <integer>,
|
|
50
|
+
"collisions": <integer — normally 0>
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Fingerprint formula
|
|
57
|
+
|
|
58
|
+
```javascript
|
|
59
|
+
fingerprint = sha256(`${scope}\n${checkId}\n${locator}`).slice(0, 16)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Inputs** (joined with `\n` newline separator):
|
|
63
|
+
|
|
64
|
+
| Input | Description |
|
|
65
|
+
|---|---|
|
|
66
|
+
| `scope` | Short namespace label — `'onboarding'`, `'a11y'`, `'console'`, `'liquid-glass'` |
|
|
67
|
+
| `checkId` | Check-specific identifier — see each check section for the exact value |
|
|
68
|
+
| `locator` | Stable DOM selector, AX path, entry URL, or screen.frame string |
|
|
69
|
+
|
|
70
|
+
**Design rationale for `\n` separator:** Newlines are forbidden in shell argument
|
|
71
|
+
boundaries by the `ARG_BOUNDARY_DANGEROUS` pattern (`/[\n\r\0]/`) established in
|
|
72
|
+
`scripts/lib/autopilot/mr-draft.mjs`. Using `\n` as the separator means it can never
|
|
73
|
+
appear within a locator string that passed validation, so the concatenated input is
|
|
74
|
+
collision-free by construction.
|
|
75
|
+
|
|
76
|
+
**Implementation:** `scripts/lib/test-runner/fingerprint.mjs` exports
|
|
77
|
+
`fingerprintFinding({scope, checkId, locator})`. The function uses Node.js
|
|
78
|
+
`crypto.createHash('sha256')` (no external dependencies) and returns the first 16
|
|
79
|
+
hex characters of the digest (64 bits of collision resistance — sufficient for the
|
|
80
|
+
expected finding volume of < 10 000 per run).
|
|
81
|
+
|
|
82
|
+
**Truncation rule for long locators:** Locators longer than 256 characters are
|
|
83
|
+
truncated to their first 256 characters before fingerprinting. This is consistent
|
|
84
|
+
with the `ux-evaluator` agent's description field convention. Both the evaluator
|
|
85
|
+
and the fingerprint module must apply truncation to guarantee matching fingerprints.
|
|
86
|
+
|
|
87
|
+
**Stability guarantee:** Given identical `(scope, checkId, locator)` inputs, the
|
|
88
|
+
fingerprint is identical across any two evaluation runs, regardless of timestamp,
|
|
89
|
+
run-id, or system state. Never include runtime-varying values in fingerprint inputs.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Check 1: onboarding-step-count
|
|
94
|
+
|
|
95
|
+
**Purpose:** Count distinct onboarding or wizard steps reachable from the flow's
|
|
96
|
+
entry point. Flag when the step count exceeds 7.
|
|
97
|
+
|
|
98
|
+
**Why 7:** The "7 ± 2" rule (Miller, 1956) characterises the capacity of short-term
|
|
99
|
+
working memory. Onboarding flows that require users to hold more than 7 steps in
|
|
100
|
+
mind reliably correlate with drop-off. A typical mobile app's V3.3 release shipped a
|
|
101
|
+
10-step onboarding flow with no E2E coverage; user-completion rate dropped significantly.
|
|
102
|
+
This rubric was inspired by that incident and is cited in project PRDs as the canonical
|
|
103
|
+
example for onboarding quality gates.
|
|
104
|
+
|
|
105
|
+
**Severity mapping:**
|
|
106
|
+
|
|
107
|
+
| Step count | Severity |
|
|
108
|
+
|---|---|
|
|
109
|
+
| ≤ 7 | No finding |
|
|
110
|
+
| 8–9 | HIGH |
|
|
111
|
+
| ≥ 10 | CRITICAL |
|
|
112
|
+
|
|
113
|
+
**What counts as a step:** A distinct page, screen, or wizard panel the user must
|
|
114
|
+
navigate through sequentially to complete onboarding. A "confirm" dialog on top of
|
|
115
|
+
a step does not count as a separate step. A branch path (e.g., "optional profile
|
|
116
|
+
setup") counts only if the user cannot skip it.
|
|
117
|
+
|
|
118
|
+
**Evidence required:**
|
|
119
|
+
- AX-tree snapshot with each step's primary heading text and a screenshot per step
|
|
120
|
+
(both written by test fixtures in the target repo to `<run-dir>/ax-snapshots/` and
|
|
121
|
+
`<run-dir>/screenshots/` — runner.mjs pre-creates these directories but does not
|
|
122
|
+
emit the content).
|
|
123
|
+
- The test fixtures must have navigated through the full onboarding sequence and
|
|
124
|
+
captured an AX snapshot at each step transition. If the fixtures did not cover the
|
|
125
|
+
full flow, the evaluator logs a warning and emits no finding (evidence requirement
|
|
126
|
+
is not met).
|
|
127
|
+
|
|
128
|
+
**Fingerprint inputs:**
|
|
129
|
+
- `scope = 'onboarding'`
|
|
130
|
+
- `checkId = 'step-count-over-7'`
|
|
131
|
+
- `locator = <entry-route-URL-for-web | entry-screen-name-for-macOS>`
|
|
132
|
+
|
|
133
|
+
**Example finding (HIGH):**
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"run_id": "42-1715700000000",
|
|
138
|
+
"rubric_version": "v1",
|
|
139
|
+
"severity": "high",
|
|
140
|
+
"check": "onboarding-step-count",
|
|
141
|
+
"fingerprint": "a3f1c8e72d904b1a",
|
|
142
|
+
"evidence_path": "screenshots/onboarding-step-8.png",
|
|
143
|
+
"suggested_priority": "high",
|
|
144
|
+
"scope": "onboarding",
|
|
145
|
+
"checkId": "step-count-over-7",
|
|
146
|
+
"locator": "/onboarding/start",
|
|
147
|
+
"title": "Onboarding flow has 9 steps (limit: 7)",
|
|
148
|
+
"description": "The onboarding sequence starting at /onboarding/start requires the user to complete 9 distinct steps before reaching the dashboard. Steps 8 and 9 are a 'verify email' confirmation screen and a 'set notification preferences' screen. The 7-step limit is defined in rubric-v1 Check 1 based on Miller's short-term memory model.",
|
|
149
|
+
"recommendation": "Merge 'verify email' into the account-creation step (step 2) or defer 'notification preferences' to a post-onboarding nudge. Target ≤7 steps in the critical path."
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Check 2: axe-violations (critical + serious)
|
|
156
|
+
|
|
157
|
+
**Purpose:** Read axe-core JSON output captured by the Playwright driver and flag
|
|
158
|
+
every accessibility violation tagged `critical` or `serious` by axe-core's impact
|
|
159
|
+
rating. Lower severity levels (`moderate`, `minor`) are out of scope for v1 — they
|
|
160
|
+
belong in a separate `/discovery` pass or a future `rubric-v2.md` extension.
|
|
161
|
+
|
|
162
|
+
**Why axe critical/serious only:** WCAG AA conformance requires that critical and
|
|
163
|
+
serious violations be eliminated before launch. Moderate and minor violations are
|
|
164
|
+
important but rarely block release; including them in v1 would produce too much noise
|
|
165
|
+
for the reconcile pipeline's per-finding issue creation to handle economically.
|
|
166
|
+
|
|
167
|
+
**Severity mapping:**
|
|
168
|
+
|
|
169
|
+
| axe-core impact | Finding severity |
|
|
170
|
+
|---|---|
|
|
171
|
+
| `'critical'` | CRITICAL |
|
|
172
|
+
| `'serious'` | HIGH |
|
|
173
|
+
| `'moderate'` | (not a finding in v1) |
|
|
174
|
+
| `'minor'` | (not a finding in v1) |
|
|
175
|
+
|
|
176
|
+
**Artifact location:** `<run-dir>/ax-snapshots/axe-*.json`
|
|
177
|
+
(written by test fixture using `@axe-core/playwright`; runner.mjs pre-creates the
|
|
178
|
+
`ax-snapshots/` directory but does NOT write these files — axe-core SOFT-SKIPs
|
|
179
|
+
if `@axe-core/playwright` is absent from the target repo)
|
|
180
|
+
|
|
181
|
+
Each file is a JSON array of axe-core `Result` objects. The evaluator iterates every
|
|
182
|
+
result entry in every snapshot file and emits one finding per unique
|
|
183
|
+
`(ruleId, nodes[0].target)` pair that is `critical` or `serious`.
|
|
184
|
+
|
|
185
|
+
**Evidence required:**
|
|
186
|
+
- The verbatim axe-core `Result` object embedded in the finding's `description` field
|
|
187
|
+
(JSON-stringified, or as a structured sub-object if the reconcile pipeline supports it).
|
|
188
|
+
- The screenshot file from the same route, if present (referenced in `evidence_path`).
|
|
189
|
+
|
|
190
|
+
**Fingerprint inputs:**
|
|
191
|
+
- `scope = 'a11y'`
|
|
192
|
+
- `checkId = 'axe-' + ruleId` (e.g., `'axe-color-contrast'`, `'axe-image-alt'`)
|
|
193
|
+
- `locator = nodes[0].target` — the CSS selector array joined with ` > ` if it is
|
|
194
|
+
a nested selector, or the first string element if it is already a string
|
|
195
|
+
|
|
196
|
+
**Example finding (CRITICAL):**
|
|
197
|
+
|
|
198
|
+
```json
|
|
199
|
+
{
|
|
200
|
+
"run_id": "42-1715700000000",
|
|
201
|
+
"rubric_version": "v1",
|
|
202
|
+
"severity": "critical",
|
|
203
|
+
"check": "axe-violations",
|
|
204
|
+
"fingerprint": "b9d2041ef3a77c50",
|
|
205
|
+
"evidence_path": "ax-snapshots/axe-dashboard-2025-05-14T14-00-00.json",
|
|
206
|
+
"suggested_priority": "critical",
|
|
207
|
+
"scope": "a11y",
|
|
208
|
+
"checkId": "axe-button-name",
|
|
209
|
+
"locator": "#submit-btn",
|
|
210
|
+
"title": "axe-core critical: button-name — submit button has no accessible name",
|
|
211
|
+
"description": "axe-core reports a critical violation of the 'button-name' rule on selector '#submit-btn' (dashboard route, snapshot axe-dashboard-2025-05-14T14-00-00.json). The button has no visible text, aria-label, or aria-labelledby. This violates WCAG 2.1 Success Criterion 4.1.2 (Name, Role, Value). Users relying on screen readers cannot identify or activate this control.",
|
|
212
|
+
"recommendation": "Add aria-label='Submit' or visible button text to the '#submit-btn' element. Verify with a screen reader (VoiceOver or NVDA) after fix."
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Check 3: console-errors
|
|
219
|
+
|
|
220
|
+
**Purpose:** Read the browser or application console output captured by the driver
|
|
221
|
+
and flag error-level messages that are visible to end users — uncaught exceptions,
|
|
222
|
+
unhandled promise rejections, and network errors surfaced in the UI.
|
|
223
|
+
|
|
224
|
+
**Why console errors matter:** TypeScript compile checks and lint catch static
|
|
225
|
+
errors; axe-core catches accessibility violations; but runtime errors only surface
|
|
226
|
+
during actual execution. A JavaScript exception that crashes a component or a 404
|
|
227
|
+
that silently removes a UI section degrades user trust and is the class of bug most
|
|
228
|
+
likely to slip through until a real user reports it.
|
|
229
|
+
|
|
230
|
+
**What is an error-level message (flag these):**
|
|
231
|
+
- Lines prefixed with `ERROR`, `UNCAUGHT`, `Unhandled`, `TypeError`, `ReferenceError`
|
|
232
|
+
- HTTP 4xx or 5xx responses logged to the console (e.g., `Failed to load resource: the server responded with a status of 404`)
|
|
233
|
+
- Unhandled Promise rejections (text contains `UnhandledPromiseRejection` or `UnhandledRejection`)
|
|
234
|
+
|
|
235
|
+
**What is developer-tooling noise (do NOT flag):**
|
|
236
|
+
- React or Vue hydration mismatch hints (often informational in dev mode)
|
|
237
|
+
- Hot Module Replacement (HMR) status messages
|
|
238
|
+
- Browser extension warnings (`[extension]`, `chrome-extension://`)
|
|
239
|
+
- `[Violation]` warnings from Chrome about long tasks (performance, not UX-blocking)
|
|
240
|
+
- Source map warnings
|
|
241
|
+
|
|
242
|
+
**Severity mapping:**
|
|
243
|
+
|
|
244
|
+
| Error class | Severity |
|
|
245
|
+
|---|---|
|
|
246
|
+
| Uncaught exception / unhandled rejection | HIGH |
|
|
247
|
+
| Visible HTTP 4xx/5xx (resource load failure in UI) | MEDIUM |
|
|
248
|
+
|
|
249
|
+
**Artifact location:** `<run-dir>/console.log` — runner.mjs appends raw Playwright
|
|
250
|
+
process stdout/stderr to this file; structured NDJSON `{ts, type, text, location}`
|
|
251
|
+
entries are fixture-emitted via `page.on('console', ...)` and are what the evaluator
|
|
252
|
+
parses. Each line has the shape:
|
|
253
|
+
`{"ts":<epoch-ms>,"type":"error"|"warning"|...,"text":"<message>","location":{...}}`.
|
|
254
|
+
The evaluator parses each line as JSON and inspects the `type` and `text` fields.
|
|
255
|
+
If the file is absent, skip check 3.
|
|
256
|
+
|
|
257
|
+
**Fingerprint inputs:**
|
|
258
|
+
- `scope = 'console'`
|
|
259
|
+
- `checkId = 'error-' + msgClass` where `msgClass` is the normalized error class:
|
|
260
|
+
- `'uncaught-exception'` for TypeError/ReferenceError/UnhandledRejection
|
|
261
|
+
- `'http-4xx'` or `'http-5xx'` for network errors
|
|
262
|
+
- `locator = <origin-URL-if-present | file:line-if-stack-frame-available | 'unknown'>`
|
|
263
|
+
|
|
264
|
+
**Example finding (HIGH):**
|
|
265
|
+
|
|
266
|
+
```json
|
|
267
|
+
{
|
|
268
|
+
"run_id": "42-1715700000000",
|
|
269
|
+
"rubric_version": "v1",
|
|
270
|
+
"severity": "high",
|
|
271
|
+
"check": "console-errors",
|
|
272
|
+
"fingerprint": "c7a140b8fe291d63",
|
|
273
|
+
"evidence_path": "console.log",
|
|
274
|
+
"suggested_priority": "high",
|
|
275
|
+
"scope": "console",
|
|
276
|
+
"checkId": "error-uncaught-exception",
|
|
277
|
+
"locator": "src/components/InvoiceTable.tsx:87",
|
|
278
|
+
"title": "Uncaught TypeError: Cannot read property 'id' of undefined",
|
|
279
|
+
"description": "The browser console captured an uncaught TypeError at InvoiceTable.tsx:87 during the dashboard flow. The error fires when the invoices array contains a null entry, causing the component to crash. This is a runtime error that is not caught by any existing test and is directly visible to the user via a blank component area.",
|
|
280
|
+
"recommendation": "Add a null guard before accessing .id in the map callback at InvoiceTable.tsx:87. Also add a test case that renders InvoiceTable with a null entry in the invoices prop."
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## Check 4: liquid-glass-conformance
|
|
287
|
+
|
|
288
|
+
**Purpose:** For SwiftUI targets where `Package.swift` declares iOS 26+ or macOS
|
|
289
|
+
Tahoe (26+), verify that UI surfaces using translucent or blurred backgrounds apply
|
|
290
|
+
Apple's Liquid Glass API (`.glassEffect()`) rather than legacy `.background(.thinMaterial)`
|
|
291
|
+
or custom `.blur(radius:)` modifiers.
|
|
292
|
+
|
|
293
|
+
**Why Liquid Glass:** Apple Liquid Glass was introduced at WWDC 2025 and is the
|
|
294
|
+
canonical platform baseline for translucent surfaces in SwiftUI 26+. Apps that
|
|
295
|
+
continue using legacy material modifiers on iOS 26+ / macOS Tahoe risk visual
|
|
296
|
+
inconsistency with system UI, rejection in App Store review for "non-standard
|
|
297
|
+
appearance", and future deprecation of the legacy API. PRD §1.2 names this check
|
|
298
|
+
as the secondary motivation for the UX rubric alongside accessibility compliance.
|
|
299
|
+
|
|
300
|
+
**Applicability condition:** This check is only executed when both conditions hold:
|
|
301
|
+
1. `Package.swift` exists in the repository root (or nearest ancestor).
|
|
302
|
+
2. `Package.swift` declares `.iOS("26")` or higher, OR `.macOS("26")` or higher,
|
|
303
|
+
in its `platforms: [...]` array.
|
|
304
|
+
|
|
305
|
+
If neither condition is met, skip check 4 and note the skip in the stdout summary.
|
|
306
|
+
This is the expected behavior for pure web projects and Swift projects targeting
|
|
307
|
+
earlier OS versions.
|
|
308
|
+
|
|
309
|
+
**What to flag:** Screens or frames where the AX-tree dump or screenshot metadata
|
|
310
|
+
indicates a translucent/blurred background that uses:
|
|
311
|
+
- `.background(.thinMaterial)` or `.background(.ultraThinMaterial)` etc.
|
|
312
|
+
- `.background(Material.*)` (any Material enum case)
|
|
313
|
+
- A `.blur(radius:)` modifier applied to a container as a background effect
|
|
314
|
+
|
|
315
|
+
**What is compliant (do NOT flag):**
|
|
316
|
+
- `.glassEffect()` — correct Liquid Glass API
|
|
317
|
+
- `.glassEffect(.regular)` / `.glassEffect(.prominent)` — parametrised Liquid Glass
|
|
318
|
+
- Solid color backgrounds (no blur) — these are not Liquid Glass candidates
|
|
319
|
+
- Explicitly documented exceptions in `docs/apple-hig-exceptions.md`
|
|
320
|
+
|
|
321
|
+
**Severity mapping:**
|
|
322
|
+
|
|
323
|
+
| Condition | Severity |
|
|
324
|
+
|---|---|
|
|
325
|
+
| Non-compliant surface, no documented exception | MEDIUM |
|
|
326
|
+
| Non-compliant surface, documented exception in `docs/apple-hig-exceptions.md` | LOW |
|
|
327
|
+
|
|
328
|
+
**Evidence required:**
|
|
329
|
+
- Peekaboo screenshot of the non-compliant surface (referenced in `evidence_path`).
|
|
330
|
+
- The AX-path or frame identifier (referenced in `locator`).
|
|
331
|
+
|
|
332
|
+
> **Note (v1):** peekaboo-driver may emit `ax-snapshots/glass-modifiers-*.json` artifacts carrying `schema_version: v1, status: stub` for forward compatibility. The v1 rubric does NOT read these — Check 4 operates from screenshots + AX dump annotations only. Future ux-evaluator versions may consume the JSON to classify frames directly.
|
|
333
|
+
|
|
334
|
+
**Fingerprint inputs:**
|
|
335
|
+
- `scope = 'liquid-glass'`
|
|
336
|
+
- `checkId = 'missing-glassEffect'`
|
|
337
|
+
- `locator = <screen-name>.<frame-id>` (e.g., `'DashboardScreen.headerBlurFrame'`)
|
|
338
|
+
|
|
339
|
+
**Example finding (MEDIUM):**
|
|
340
|
+
|
|
341
|
+
```json
|
|
342
|
+
{
|
|
343
|
+
"run_id": "42-1715700000000",
|
|
344
|
+
"rubric_version": "v1",
|
|
345
|
+
"severity": "medium",
|
|
346
|
+
"check": "liquid-glass-conformance",
|
|
347
|
+
"fingerprint": "d4e9f2a63c518b07",
|
|
348
|
+
"evidence_path": "screenshots/DashboardScreen-headerBlurFrame.png",
|
|
349
|
+
"suggested_priority": "medium",
|
|
350
|
+
"scope": "liquid-glass",
|
|
351
|
+
"checkId": "missing-glassEffect",
|
|
352
|
+
"locator": "DashboardScreen.headerBlurFrame",
|
|
353
|
+
"title": "Legacy .background(.thinMaterial) on DashboardScreen header — should use .glassEffect()",
|
|
354
|
+
"description": "The DashboardScreen header frame (DashboardScreen.headerBlurFrame) uses .background(.thinMaterial) for its translucent background. The project targets macOS 26+, where .glassEffect() is the canonical Liquid Glass API (WWDC25). Using the legacy Material modifier produces a subtly different visual output and may trigger App Store review flags on macOS Tahoe.",
|
|
355
|
+
"recommendation": "Replace .background(.thinMaterial) with .glassEffect() on the header container in DashboardScreen.swift. If the legacy appearance is intentional for this surface, document the exception in docs/apple-hig-exceptions.md to suppress this finding."
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## Out-of-scope (v1)
|
|
362
|
+
|
|
363
|
+
The following concern areas are deliberately excluded from v1. They may be addressed
|
|
364
|
+
in a future `rubric-v2.md` or a separate evaluation skill.
|
|
365
|
+
|
|
366
|
+
- **Visual-diff / pixel regression.** Pixel-level before/after comparison requires
|
|
367
|
+
a baseline screenshot corpus and a diff algorithm. This is a separate driver
|
|
368
|
+
capability not yet available in test-runner v1.
|
|
369
|
+
|
|
370
|
+
- **Performance metrics (LCP, FCP, CLS, INP).** Core Web Vitals and layout shift
|
|
371
|
+
metrics require instrumentation beyond the Playwright AX + screenshot capture
|
|
372
|
+
available in test-runner v1. These belong in a dedicated performance rubric.
|
|
373
|
+
|
|
374
|
+
- **Cross-platform Windows / Linux targets.** The liquid-glass check is macOS/iOS
|
|
375
|
+
specific. Windows and Linux desktop targets are out of scope for all 4 checks
|
|
376
|
+
in v1. Web targets are in scope for checks 1, 2, and 3.
|
|
377
|
+
|
|
378
|
+
- **Mobile (iOS / Android) native targets.** Playwright does not cover native mobile;
|
|
379
|
+
XCUITest or Appium integration is deferred to a future driver.
|
|
380
|
+
|
|
381
|
+
- **Stagehand v3 / Browserbase cloud probes.** Cloud-based headless browser pools
|
|
382
|
+
introduce network latency and session management complexity. v1 is scoped to
|
|
383
|
+
local Playwright runs only.
|
|
384
|
+
|
|
385
|
+
- **Automated recommendation generation via LLM.** The `recommendation` field is
|
|
386
|
+
written by the `ux-evaluator` agent (an LLM). LLM-generated recommendations are
|
|
387
|
+
advisory — they are not automatically filed as code changes. A human or a
|
|
388
|
+
`code-implementer` agent must review and apply them.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Test Runner — Soul
|
|
2
|
+
|
|
3
|
+
## Identity
|
|
4
|
+
|
|
5
|
+
You are the test-runner — an agentic end-to-end test orchestrator. You wire drivers, dispatch the evaluator, reconcile findings, and write the roll-up. You do NOT execute tests yourself. You do NOT judge UX quality directly — that is the `ux-evaluator` agent's job. You do NOT call glab or gh directly — that is `issue-reconcile.mjs`'s job.
|
|
6
|
+
|
|
7
|
+
You exist to wire upstream tools together with discipline: token-frugal artifact storage, fingerprint-based dedup, severity-driven routing.
|
|
8
|
+
|
|
9
|
+
## Principles
|
|
10
|
+
|
|
11
|
+
### Token-frugal
|
|
12
|
+
Every AX dump and screenshot goes to disk under `${RUN_DIR}`. The coordinator context stays small. If a tool outputs 10,000 bytes of AX tree, it belongs in a file, not in your prompt.
|
|
13
|
+
|
|
14
|
+
### Idempotent
|
|
15
|
+
Re-running against the same DOM produces the same fingerprints. The dedup set prevents duplicate issues regardless of how many times the orchestrator runs. Build the fingerprint set before reconciling — always.
|
|
16
|
+
|
|
17
|
+
### Composable
|
|
18
|
+
Each phase has a clean boundary:
|
|
19
|
+
- Phase 2 → drivers write to disk
|
|
20
|
+
- Phase 3 → evaluator reads from disk, writes `findings.jsonl`
|
|
21
|
+
- Phase 4 → reconciler reads `findings.jsonl`, writes to issue tracker
|
|
22
|
+
- Phase 5 → reporter reads everything, writes `report.md` + JSONL roll-up
|
|
23
|
+
|
|
24
|
+
No phase reaches across another's boundary.
|
|
25
|
+
|
|
26
|
+
### Wrap-not-fork
|
|
27
|
+
Playwright and Peekaboo stay on their mainlines. The test-runner's value is orchestration — not reimplementing driver logic. Dispatch via the wrapper skills; do not duplicate their contracts inline.
|
|
28
|
+
|
|
29
|
+
## Decision-Making
|
|
30
|
+
|
|
31
|
+
When a driver exits non-zero, continue — test failures are findings, not orchestrator failures.
|
|
32
|
+
|
|
33
|
+
When `findings.jsonl` is missing after evaluator dispatch, warn and skip reconciliation — do not fail the run.
|
|
34
|
+
|
|
35
|
+
When glab query fails for fingerprint dedup, proceed with an empty set and log the error. Creating a duplicate issue is safer than silently skipping a real finding.
|
|
36
|
+
|
|
37
|
+
When severity is `critical` or `high`, auto-create without AUQ — these require no user gate. When severity is `medium` or `low`, present via AUQ and respect the user's triage decision.
|
|
38
|
+
|
|
39
|
+
## What You Are NOT
|
|
40
|
+
|
|
41
|
+
- Not a tester — you orchestrate test execution, you do not write or run tests
|
|
42
|
+
- Not a UX evaluator — that is `agents/ux-evaluator.md`'s role
|
|
43
|
+
- Not a Playwright driver — that is `skills/playwright-driver/SKILL.md`'s role
|
|
44
|
+
- Not a Peekaboo driver — that will be `skills/peekaboo-driver/SKILL.md` once #381 lands
|
|
45
|
+
- Not an issue tracker — you reconcile findings via `scripts/lib/test-runner/issue-reconcile.mjs`
|
|
46
|
+
- Not a `@playwright/mcp` user — R5 hard-gate, 4× token cost, never bypass
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tmux-layout
|
|
3
|
+
description: Use this skill when the operator wants a prepared tmux visualization layout for the session's side-channels (STATE.md tail, CI-watch, events.jsonl tail). Renders a 4-pane default layout or debug layout. Read-only side-channel observability — the coordinator chat stays in the operator's original terminal. Trigger phrases: "tmux layout", "split panes for ci watch", "visualize session side-channels", "show me state-md tail and ci".
|
|
4
|
+
model: inherit
|
|
5
|
+
color: cyan
|
|
6
|
+
tools: Read, Bash, Grep, Glob
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# tmux-layout — Operator-Side Visualization Substrate
|
|
10
|
+
|
|
11
|
+
> Status: PROPOSED per ADR-0007 (`docs/adr/0007-tmux-visualization-substrate.md`). Opt-in skill — NOT default.
|
|
12
|
+
> Project-instruction file resolution: this is `CLAUDE.md` on Claude Code / Cursor IDE; the equivalent on Codex CLI is `AGENTS.md`. See `skills/_shared/instruction-file-resolution.md`.
|
|
13
|
+
|
|
14
|
+
## Purpose
|
|
15
|
+
|
|
16
|
+
Render a prepared tmux layout for *operator-side observability* of the session's asynchronous side-channels — STATE.md updates, CI status, events.jsonl wave/gate transitions. NOT a coordinator chat surface, NOT a wave-agent host. The coordinator chat remains in the operator's original terminal, period (per AUQ-001 in `.claude/rules/ask-via-tool.md`).
|
|
17
|
+
|
|
18
|
+
## When to Use
|
|
19
|
+
|
|
20
|
+
- During a long deep-session when you want CI status visible alongside Quality-Gate output without polling `glab ci status` manually.
|
|
21
|
+
- During `/debug` Phase 2 hypothesis testing (use `--layout debug`).
|
|
22
|
+
- Anywhere `tail -F .claude/STATE.md` + a CI watcher would speed up your loop.
|
|
23
|
+
|
|
24
|
+
## When NOT to Use
|
|
25
|
+
|
|
26
|
+
- For wave-agent visualization — wave agents are in-process `Agent()` calls; no PID, no TTY, no pane to attach.
|
|
27
|
+
- For autopilot multi-story panes — autopilot.jsonl currently shows 11 entries / 8 dry-runs; below the value threshold for a pane-per-story UI.
|
|
28
|
+
- As your coordinator chat surface — that stays in the terminal where you invoked /tmux-layout.
|
|
29
|
+
|
|
30
|
+
## Usage
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
/tmux-layout # default layout (4 panes)
|
|
34
|
+
/tmux-layout --layout debug # debug layout (4 panes, /debug companion)
|
|
35
|
+
/tmux-layout --json # machine-readable output (no attach)
|
|
36
|
+
/tmux-layout --session-name my-ws # custom tmux session name
|
|
37
|
+
/tmux-layout --force # replace existing session (PSA-003 escape hatch)
|
|
38
|
+
/tmux-layout --with-status-pane # add a 5th pane tailing agent-status telemetry (#565)
|
|
39
|
+
/tmux-layout --help # full CLI usage
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The skill prints a one-line tmux command. Paste it into a SECOND terminal (do not run it where /tmux-layout was invoked). That second terminal becomes the layout. Your original terminal (the coordinator chat) stays where it is.
|
|
43
|
+
|
|
44
|
+
## Default Layout (4 panes; 5 with `--with-status-pane`)
|
|
45
|
+
|
|
46
|
+
| Pane | Content | Command |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| 1 | **Shell** (operator scratch — NOT claude) | `bash` (interactive) |
|
|
49
|
+
| 2 | STATE.md tail | `tail -F <state-dir>/STATE.md` |
|
|
50
|
+
| 3 | CI watch (poll-loop wrapper) | `while true; do clear; glab ci status --pipeline-id LATEST --output json \| jq ...; sleep 15; done` |
|
|
51
|
+
| 4 | events.jsonl wave/gate filter | `tail -F .orchestrator/metrics/events.jsonl \| jq --unbuffered 'select(.event \| test("wave\|gate\|spiral"))'` |
|
|
52
|
+
| 5 | agent-status telemetry (#565, only with `--with-status-pane`) | `while true; do clear; jq . .orchestrator/runtime/agent-status-current.json 2>/dev/null \|\| echo ...; sleep 2; done` |
|
|
53
|
+
|
|
54
|
+
`<state-dir>` is resolved via `resolveStateDir()` from `scripts/lib/platform.mjs` (`.claude/`, `.codex/`, or `.cursor/`).
|
|
55
|
+
Pane 3 command is vcs-aware (`glab` for gitlab, `gh pr checks` for github, informational `echo` fallback when no CLI).
|
|
56
|
+
|
|
57
|
+
## Debug Layout (4 panes — `--layout debug`, depends-on #562)
|
|
58
|
+
|
|
59
|
+
| Pane | Content | Command |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| 1 | **Shell** (operator scratch) | `bash` (interactive) |
|
|
62
|
+
| 2 | Hypothesis-test runner | `npm test -- --watch <scope>` (or per-skill-config) |
|
|
63
|
+
| 3 | Debug-artifact tail | `tail -F .orchestrator/debug/*.md` |
|
|
64
|
+
| 4 | Diff-watch | `watch -n 2 'git diff --stat \| head -30'` |
|
|
65
|
+
|
|
66
|
+
## Architecture
|
|
67
|
+
|
|
68
|
+
Three sibling modules under `scripts/lib/tmux-layout/`:
|
|
69
|
+
|
|
70
|
+
- `layouts.mjs` — `renderDefaultLayout()`, `renderDebugLayout()`, `detectVcsCommand()`.
|
|
71
|
+
- `vcs-detector.mjs` — `detectVcsCommand({config, projectRoot})` returns `{bin, args, fallback, blocking}` per vcs key.
|
|
72
|
+
- `tmux-shell.mjs` — `detectTmuxVersion()`, session-collision policy helpers.
|
|
73
|
+
|
|
74
|
+
Entry point: `scripts/tmux-layout.mjs` (parseArgs from `node:util`, dispatcher to layout functions).
|
|
75
|
+
|
|
76
|
+
## PSA-003 Compliance
|
|
77
|
+
|
|
78
|
+
Session-collision policy: **refuse + `--force`**. The skill NEVER kills, overwrites, or modifies a tmux session it did not create unless the operator passes `--force` explicitly. See `.claude/rules/parallel-sessions.md` § PSA-003.
|
|
79
|
+
|
|
80
|
+
## AUQ-001 Compliance
|
|
81
|
+
|
|
82
|
+
The coordinator chat (where AskUserQuestion fires) stays in the operator's ORIGINAL terminal. Pane 1 of the tmux layout is intentionally a scratch shell, NOT a new `claude` session — there is no second AUQ surface, no decision-authority split. See `.claude/rules/ask-via-tool.md` § AUQ-001.
|
|
83
|
+
|
|
84
|
+
## Telemetry & Promotion Gate (#563)
|
|
85
|
+
|
|
86
|
+
This skill emits structured events to `.orchestrator/metrics/events.jsonl`:
|
|
87
|
+
- `tmux-layout.invoked`
|
|
88
|
+
- `tmux-layout.degraded` (tmux missing, version too old, session collision without --force, etc.)
|
|
89
|
+
- `tmux-layout.completed` (when the user closes the tmux session)
|
|
90
|
+
|
|
91
|
+
Promotion criteria from opt-in skill to default-recommended in session-start banner: invocation count ≥ 5 across ≥ 3 distinct deep sessions over ≥ 2 calendar weeks, layout-completion rate ≥ 80%, zero AUQ-001 / PSA-003 regressions. See ADR-0007 § Follow-ups.
|
|
92
|
+
|
|
93
|
+
## Troubleshooting
|
|
94
|
+
|
|
95
|
+
- **tmux not found** → install: `brew install tmux` (macOS) / `apt install tmux` (Linux). Minimum tmux ≥ 3.0.
|
|
96
|
+
- **Session already exists** → use `--force` (acknowledges PSA-003) or `--session-name my-other`.
|
|
97
|
+
- **CI pane shows nothing** → `glab` or `gh` not installed, or `vcs:` not set in `## Session Config`. Pane will show a clear fallback message.
|
|
98
|
+
|
|
99
|
+
## See Also
|
|
100
|
+
|
|
101
|
+
- `docs/adr/0007-tmux-visualization-substrate.md` — design rationale.
|
|
102
|
+
- `skills/_shared/monitor-patterns.md` — comparison: tmux-layout vs Monitor vs /loop.
|
|
103
|
+
- `skills/debug/SKILL.md` — Phase 2 hypothesis testing (use `--layout debug` as companion).
|
|
104
|
+
- GitLab #561 #562 #563.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ubiquitous-language
|
|
3
|
+
description: Use when the user wants to define domain terms, build a glossary, harden terminology, create a ubiquitous language, or mentions "domain model" or "DDD". Extracts a DDD-style glossary from the current conversation into UBIQUITOUS_LANGUAGE.md, flags ambiguities and synonyms, and proposes opinionated canonical terms.
|
|
4
|
+
model: inherit
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
derived-from: mattpocock/skills@90ea8ee
|
|
7
|
+
license: MIT
|
|
8
|
+
upstream-url: https://github.com/mattpocock/skills/tree/main/ubiquitous-language
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Ubiquitous Language
|
|
12
|
+
|
|
13
|
+
Extract and formalize domain terminology from the current conversation into a consistent glossary, saved to a local file.
|
|
14
|
+
|
|
15
|
+
## Process
|
|
16
|
+
|
|
17
|
+
1. **Scan the conversation** for domain-relevant nouns, verbs, and concepts
|
|
18
|
+
2. **Identify problems**:
|
|
19
|
+
- Same word used for different concepts (ambiguity)
|
|
20
|
+
- Different words used for the same concept (synonyms)
|
|
21
|
+
- Vague or overloaded terms
|
|
22
|
+
3. **Propose a canonical glossary** with opinionated term choices
|
|
23
|
+
4. **Write to `UBIQUITOUS_LANGUAGE.md`** in the working directory using the format below
|
|
24
|
+
5. **Output a summary** inline in the conversation
|
|
25
|
+
|
|
26
|
+
## Output Format
|
|
27
|
+
|
|
28
|
+
Write a `UBIQUITOUS_LANGUAGE.md` file with this structure:
|
|
29
|
+
|
|
30
|
+
```md
|
|
31
|
+
# Ubiquitous Language
|
|
32
|
+
|
|
33
|
+
## Order lifecycle
|
|
34
|
+
|
|
35
|
+
| Term | Definition | Aliases to avoid |
|
|
36
|
+
| ----------- | ------------------------------------------------------- | --------------------- |
|
|
37
|
+
| **Order** | A customer's request to purchase one or more items | Purchase, transaction |
|
|
38
|
+
| **Invoice** | A request for payment sent to a customer after delivery | Bill, payment request |
|
|
39
|
+
|
|
40
|
+
## People
|
|
41
|
+
|
|
42
|
+
| Term | Definition | Aliases to avoid |
|
|
43
|
+
| ------------ | ------------------------------------------- | ---------------------- |
|
|
44
|
+
| **Customer** | A person or organization that places orders | Client, buyer, account |
|
|
45
|
+
| **User** | An authentication identity in the system | Login, account |
|
|
46
|
+
|
|
47
|
+
## Relationships
|
|
48
|
+
|
|
49
|
+
- An **Invoice** belongs to exactly one **Customer**
|
|
50
|
+
- An **Order** produces one or more **Invoices**
|
|
51
|
+
|
|
52
|
+
## Example dialogue
|
|
53
|
+
|
|
54
|
+
> **Dev:** "When a **Customer** places an **Order**, do we create the **Invoice** immediately?"
|
|
55
|
+
> **Domain expert:** "No — an **Invoice** is only generated once a **Fulfillment** is confirmed. A single **Order** can produce multiple **Invoices** if items ship in separate **Shipments**."
|
|
56
|
+
> **Dev:** "So if a **Shipment** is cancelled before dispatch, no **Invoice** exists for it?"
|
|
57
|
+
> **Domain expert:** "Exactly. The **Invoice** lifecycle is tied to the **Fulfillment**, not the **Order**."
|
|
58
|
+
|
|
59
|
+
## Flagged ambiguities
|
|
60
|
+
|
|
61
|
+
- "account" was used to mean both **Customer** and **User** — these are distinct concepts: a **Customer** places orders, while a **User** is an authentication identity that may or may not represent a **Customer**.
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Rules
|
|
65
|
+
|
|
66
|
+
- **Be opinionated.** When multiple words exist for the same concept, pick the best one and list the others as aliases to avoid.
|
|
67
|
+
- **Flag conflicts explicitly.** If a term is used ambiguously in the conversation, call it out in the "Flagged ambiguities" section with a clear recommendation.
|
|
68
|
+
- **Only include terms relevant for domain experts.** Skip the names of modules or classes unless they have meaning in the domain language.
|
|
69
|
+
- **Keep definitions tight.** One sentence max. Define what it IS, not what it does.
|
|
70
|
+
- **Show relationships.** Use bold term names and express cardinality where obvious.
|
|
71
|
+
- **Only include domain terms.** Skip generic programming concepts (array, function, endpoint) unless they have domain-specific meaning.
|
|
72
|
+
- **Group terms into multiple tables** when natural clusters emerge (e.g. by subdomain, lifecycle, or actor). Each group gets its own heading and table. If all terms belong to a single cohesive domain, one table is fine — don't force groupings.
|
|
73
|
+
- **Write an example dialogue.** A short conversation (3-5 exchanges) between a dev and a domain expert that demonstrates how the terms interact naturally. The dialogue should clarify boundaries between related concepts and show terms being used precisely.
|
|
74
|
+
|
|
75
|
+
<example>
|
|
76
|
+
|
|
77
|
+
## Example dialogue
|
|
78
|
+
|
|
79
|
+
> **Dev:** "How do I test the **sync service** without Docker?"
|
|
80
|
+
|
|
81
|
+
> **Domain expert:** "Provide the **filesystem layer** instead of the **Docker layer**. It implements the same **Sandbox service** interface but uses a local directory as the **sandbox**."
|
|
82
|
+
|
|
83
|
+
> **Dev:** "So **sync-in** still creates a **bundle** and unpacks it?"
|
|
84
|
+
|
|
85
|
+
> **Domain expert:** "Exactly. The **sync service** doesn't know which layer it's talking to. It calls `exec` and `copyIn` — the **filesystem layer** just runs those as local shell commands."
|
|
86
|
+
|
|
87
|
+
</example>
|
|
88
|
+
|
|
89
|
+
## Re-running
|
|
90
|
+
|
|
91
|
+
When invoked again in the same conversation:
|
|
92
|
+
|
|
93
|
+
1. Read the existing `UBIQUITOUS_LANGUAGE.md`
|
|
94
|
+
2. Incorporate any new terms from subsequent discussion
|
|
95
|
+
3. Update definitions if understanding has evolved
|
|
96
|
+
4. Re-flag any new ambiguities
|
|
97
|
+
5. Rewrite the example dialogue to incorporate new terms
|