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,237 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: peekaboo-driver
|
|
3
|
+
user-invocable: false
|
|
4
|
+
tags: [test, driver, macos, peekaboo]
|
|
5
|
+
model: haiku
|
|
6
|
+
model-preference: sonnet
|
|
7
|
+
description: Use this skill when driving native-UI AX-tree snapshots and screenshots via steipete/peekaboo (MIT, macOS-only). Dispatched by `skills/test-runner/` to capture native-UI AX-tree snapshots + screenshots on macOS 15+ targets, and exits with deterministic JSON output the orchestrator can parse.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Peekaboo Driver Skill
|
|
11
|
+
|
|
12
|
+
## Soul
|
|
13
|
+
|
|
14
|
+
Before anything else, read and internalize `soul.md` in this skill directory. It defines WHO you are — a thin executor, not an orchestrator. Every action in this session should reflect that identity.
|
|
15
|
+
|
|
16
|
+
## Phase 0: Bootstrap Gate
|
|
17
|
+
|
|
18
|
+
Read `skills/_shared/bootstrap-gate.md` and execute the gate check. If GATE_CLOSED, invoke `skills/bootstrap/SKILL.md` and wait for completion. If GATE_OPEN, continue.
|
|
19
|
+
|
|
20
|
+
<HARD-GATE>
|
|
21
|
+
This driver is macOS-only. It wraps the `peekaboo` binary (steipete/peekaboo, MIT). It does NOT use any MCP adapter layer. The platform gate in Phase 1 is mandatory pre-flight.
|
|
22
|
+
</HARD-GATE>
|
|
23
|
+
|
|
24
|
+
## Package Note — Installation & Binary Name
|
|
25
|
+
|
|
26
|
+
Both install paths surface the same `peekaboo` binary at the same version:
|
|
27
|
+
|
|
28
|
+
| Install path | Command | Notes |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| Homebrew (preferred) | `brew install steipete/tap/peekaboo` | Installs to `/opt/homebrew/bin/peekaboo` |
|
|
31
|
+
| npm / npx (CI-friendly) | `npx -y @steipete/peekaboo` | Requires Node 22+. No global install needed. |
|
|
32
|
+
|
|
33
|
+
The GitHub repository is `github.com/steipete/peekaboo`. Older links may surface `openclaw/Peekaboo` — both redirect to the same canonical repo and binary.
|
|
34
|
+
|
|
35
|
+
**Canonical name verification:** Always verify a package name via `brew info` or `npm view` before documenting. The playwright-driver PRD originally referenced `@playwright/cli@0.1.13` (an unrelated stub) instead of canonical `playwright@1.60.0`. Verify `@steipete/peekaboo` against any look-alike before trusting an install path.
|
|
36
|
+
|
|
37
|
+
## Install
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
brew install steipete/tap/peekaboo # Option A — Homebrew
|
|
41
|
+
npx -y @steipete/peekaboo --version # Option B — npx (CI)
|
|
42
|
+
peekaboo --version # Verify: expect 3.1.x
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Baseline: **v3.1.0**. Latest at time of writing: **v3.1.2** (May 11 2026).
|
|
46
|
+
|
|
47
|
+
## Phase 1: Platform & Version Gate
|
|
48
|
+
|
|
49
|
+
**Mandatory pre-flight. Run before any other peekaboo command.**
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
[ "$(uname -s)" != "Darwin" ] && { echo "peekaboo-driver: non-darwin, skipping." >&2; exit 0; }
|
|
53
|
+
MACOS_MAJOR="$(sw_vers -productVersion | cut -d. -f1)"
|
|
54
|
+
[ "$MACOS_MAJOR" -lt 15 ] && { echo "peekaboo-driver: requires macOS 15+, skipping." >&2; exit 0; }
|
|
55
|
+
command -v peekaboo >/dev/null 2>&1 || { echo "peekaboo-driver: binary not found — install first." >&2; exit 2; }
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Exit 0 (non-fatal skip) on non-darwin or macOS < 15.0 (Sequoia). Exit 2 (fatal) only when the binary is missing on an otherwise-compatible system.
|
|
59
|
+
|
|
60
|
+
## Phase 2: Permission Probe
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
PERMS_JSON="$(peekaboo permissions status --json)"
|
|
64
|
+
MISSING="$(echo "$PERMS_JSON" | jq -r '.data.permissions[] | select(.isRequired == true and .isGranted == false) | .name')"
|
|
65
|
+
[ -n "$MISSING" ] && echo "peekaboo-driver: missing required permissions: ${MISSING}" >&2
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The `permissions status --json` schema (verified 2026-05-14):
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"success": true,
|
|
73
|
+
"data": {
|
|
74
|
+
"permissions": [
|
|
75
|
+
{ "name": "Screen Recording", "isRequired": true, "isGranted": false, "grantInstructions": "System Settings > Privacy & Security > Screen Recording" },
|
|
76
|
+
{ "name": "Accessibility", "isRequired": true, "isGranted": false, "grantInstructions": "System Settings > Privacy & Security > Accessibility" },
|
|
77
|
+
{ "name": "Event Synthesizing", "isRequired": false, "isGranted": false, "grantInstructions": "System Settings > Privacy & Security > Accessibility" }
|
|
78
|
+
],
|
|
79
|
+
"source": "local"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Required: **Screen Recording** (hard), **Accessibility** (hard). Optional: **Event Synthesizing**. Permission failures are never silent. Route to Phase 3 when any required permission is not granted.
|
|
85
|
+
|
|
86
|
+
## Phase 3: Permission Remediation
|
|
87
|
+
|
|
88
|
+
Surface missing required permissions via AskUserQuestion (per `ask-via-tool.md` AUQ-003). Do not auto-grant — macOS requires manual user action in System Settings.
|
|
89
|
+
|
|
90
|
+
If `$MISSING` from Phase 2 contains more than one permission, present **one AUQ per missing permission** in the order they appear. The user can grant or skip each independently; the driver re-checks after each grant (one full Phase 2 sweep per round).
|
|
91
|
+
|
|
92
|
+
The loop executes once per permission in `$MISSING`, exiting after Phase 3 permission re-probe shows all required permissions granted or the user selects Skip for the current permission.
|
|
93
|
+
|
|
94
|
+
For each `${PERM_NAME}` in `$MISSING`:
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
AskUserQuestion({
|
|
98
|
+
questions: [{
|
|
99
|
+
question: `${PERM_NAME} permission is required but not granted. Open System Settings > Privacy & Security > ${PERM_NAME}, enable the terminal entry, then confirm here.`,
|
|
100
|
+
header: `Missing Permission: ${PERM_NAME}`,
|
|
101
|
+
options: [
|
|
102
|
+
{ label: "Granted — continue (Recommended)", description: `I have enabled ${PERM_NAME} in System Settings.` },
|
|
103
|
+
{ label: "Skip this run", description: "Abort peekaboo-driver. Test-runner will record a framework-error finding." }
|
|
104
|
+
],
|
|
105
|
+
multiSelect: false
|
|
106
|
+
}]
|
|
107
|
+
})
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
After confirmation, re-probe (`$MISSING` Phase 2 sweep). If still not granted or user selects Skip for any permission, exit 2 (fatal). Do NOT attempt any capture without required permissions — the binary will fail ungracefully.
|
|
111
|
+
|
|
112
|
+
## Canonical Usage
|
|
113
|
+
|
|
114
|
+
The orchestrator (`skills/test-runner/`) dispatches via Bash. Inputs via environment variables: `RUN_ID`, `RUN_DIR`, `TARGET` (app name), `PROFILE`.
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
# Validate TARGET (app name) — alphanumeric, spaces, dots, hyphens only
|
|
118
|
+
# (Prevents shell injection per SEC-PD-MED-1 + path traversal per SEC-PD-LOW-1)
|
|
119
|
+
[[ "${TARGET}" =~ ^[A-Za-z0-9\ \.\-]+$ ]] || { echo "peekaboo-driver: invalid TARGET (must match ^[A-Za-z0-9 .-]+$)" >&2; exit 2; }
|
|
120
|
+
TARGET_SAFE="${TARGET//[^A-Za-z0-9_.-]/_}" # filename-safe variant for artifact paths
|
|
121
|
+
|
|
122
|
+
RUN_DIR=".orchestrator/metrics/test-runs/${RUN_ID}"
|
|
123
|
+
mkdir -p "${RUN_DIR}/ax-snapshots" "${RUN_DIR}/screenshots"
|
|
124
|
+
peekaboo see --app "${TARGET}" --json > "${RUN_DIR}/ax-snapshots/main-${TARGET_SAFE}.json"
|
|
125
|
+
peekaboo image --app "${TARGET}" --format png --path "${RUN_DIR}/screenshots/main-$(date +%s%3N).png"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Artifact Layout
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
.orchestrator/metrics/test-runs/<run-id>/
|
|
132
|
+
results.json # driver summary {run_id, exit_code, scenarios_*}
|
|
133
|
+
exit_code # plain integer: 0, 1, or 2
|
|
134
|
+
ax-snapshots/
|
|
135
|
+
<scenario>.json # peekaboo see --json output (one per scenario)
|
|
136
|
+
glass-modifiers-<ts>.json # Liquid Glass conformance artifact (Check 4)
|
|
137
|
+
screenshots/
|
|
138
|
+
<step>-<timestamp>.png # peekaboo image output
|
|
139
|
+
console.ndjson # driver log events (NDJSON)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Token discipline:** NEVER inline AX-tree dumps into the coordinator context. Always write to disk. The `ux-evaluator` agent reads from disk, not from prompt context.
|
|
143
|
+
|
|
144
|
+
## AX-Snapshot Pattern
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
peekaboo see --app "${APP_NAME}" --json > "${RUN_DIR}/ax-snapshots/${SCENARIO}.json"
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Key fields in the `see --json` output the ux-evaluator reads: `snapshot_id` (capture ID), `ui_elements` (flat AX element list — primary consumer input), `ui_map` (hierarchical tree), `interactable_count`, `capture_mode` (`"screen"` or `"window"`). Each `ui_elements` entry carries `role`, `role_description`, `bounds` (`{x, y, width, height}`), `identifier`, and `children`. ux-evaluator Check 4 scans `ui_elements` for frame identifiers and cross-references the `glass-modifiers` artifact.
|
|
151
|
+
|
|
152
|
+
## Liquid-Glass Conformance Artifact
|
|
153
|
+
|
|
154
|
+
For SwiftUI 26+ targets (projects with `Package.swift` declaring `.iOS("26")` or `.macOS("26")+`), emit a conformance artifact alongside the AX snapshot:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# Gate: glass-modifiers emit is opt-in per the active profile's rubric_features flag (v1 rubric does not consume).
|
|
158
|
+
PROFILES_FILE=".orchestrator/policy/test-profiles.json"
|
|
159
|
+
HAS_GLASS_V2="false"
|
|
160
|
+
if [ -n "${PROFILE:-}" ] && [ -f "$PROFILES_FILE" ] && command -v jq >/dev/null 2>&1; then
|
|
161
|
+
HAS_GLASS_V2=$(jq -r --arg p "$PROFILE" '(.[$p].rubric_features // []) | contains(["glass-v2"])' "$PROFILES_FILE" 2>/dev/null || echo false)
|
|
162
|
+
fi
|
|
163
|
+
if [ "$HAS_GLASS_V2" = "true" ]; then
|
|
164
|
+
cat > "${RUN_DIR}/ax-snapshots/glass-modifiers-$(date +%s%3N).json" <<EOF
|
|
165
|
+
{
|
|
166
|
+
"schema_version": "v1",
|
|
167
|
+
"status": "stub",
|
|
168
|
+
"run_id": "${RUN_ID}",
|
|
169
|
+
"captured_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
170
|
+
"glassEffect_frames": [],
|
|
171
|
+
"legacy_material_frames": [],
|
|
172
|
+
"blur_modifier_frames": []
|
|
173
|
+
}
|
|
174
|
+
EOF
|
|
175
|
+
fi
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
The ux-evaluator Check 4 reads this file. `glassEffect_frames` = compliant (uses `.glassEffect()`). `legacy_material_frames` = non-compliant (uses `.background(.thinMaterial)` etc.). `blur_modifier_frames` = non-compliant (uses `.blur(radius:)` as background). In v1 the arrays are always empty — the evaluator falls back to screenshot-only analysis. Do NOT emit a bare `{}` — use the full schema structure with empty arrays.
|
|
179
|
+
|
|
180
|
+
## Composability Contract
|
|
181
|
+
|
|
182
|
+
### Invocation Shape
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
RUN_DIR="${RUN_DIR}" TARGET="${APP_NAME}" PROFILE="${PROFILE}" bash skills/peekaboo-driver/SKILL.md
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
All inputs via environment variables. No positional arguments accepted.
|
|
189
|
+
|
|
190
|
+
### Exit Codes
|
|
191
|
+
|
|
192
|
+
| Code | Meaning | Orchestrator Action |
|
|
193
|
+
|---|---|---|
|
|
194
|
+
| 0 | All captures succeeded (or platform skip) | Record pass or skip, continue |
|
|
195
|
+
| 1 | At least one capture failed | Failures become findings (non-fatal) |
|
|
196
|
+
| 2 | Framework error (missing binary, permission denied, OS mismatch) | Surface as driver error, halt peekaboo portion of run |
|
|
197
|
+
|
|
198
|
+
### Outputs the Orchestrator MUST Parse
|
|
199
|
+
|
|
200
|
+
- `${RUN_DIR}/exit_code` — plain integer file written by driver before exit
|
|
201
|
+
- `${RUN_DIR}/results.json` — driver summary with `exit_code`, `scenarios_attempted`, `scenarios_passed`, `scenarios_failed`
|
|
202
|
+
- `${RUN_DIR}/ax-snapshots/<scenario>.json` — peekaboo AX-tree output per scenario
|
|
203
|
+
- `${RUN_DIR}/ax-snapshots/glass-modifiers-<ts>.json` — Liquid Glass conformance artifact (consumed by ux-evaluator Check 4; only emitted when the active profile declares `rubric_features: ['glass-v2']` in `.orchestrator/policy/test-profiles.json`)
|
|
204
|
+
- `${RUN_DIR}/screenshots/<step>-<ts>.png` — per-step screenshots (evidence for ux-evaluator findings)
|
|
205
|
+
- `${RUN_DIR}/console.ndjson` — driver log events as NDJSON
|
|
206
|
+
|
|
207
|
+
## Version Pin + Upper-Bound Advisory
|
|
208
|
+
|
|
209
|
+
Baseline: **v3.1.0** (2026-05-14). Latest: **v3.1.2** (May 11 2026). Re-validate on v3.2+. Key surfaces: `permissions status --json` schema, `see --json` schema (`ui_elements`, `ui_map`), `image --path` flag behavior.
|
|
210
|
+
|
|
211
|
+
## Peekaboo Subcommands Reference
|
|
212
|
+
|
|
213
|
+
| Subcommand | Purpose |
|
|
214
|
+
|---|---|
|
|
215
|
+
| `peekaboo permissions status [--json]` | Check Screen Recording / Accessibility / Event Synthesizing grant status |
|
|
216
|
+
| `peekaboo see --app <name> [--json] [--mode screen\|window]` | Capture AX-tree snapshot for a running application |
|
|
217
|
+
| `peekaboo image --app <name> [--format jpg\|png] [--path <output>]` | Capture screenshot of a running application |
|
|
218
|
+
| `peekaboo click [query\|--on <id>\|--coords x,y]` | Synthesize a click event (requires Event Synthesizing) |
|
|
219
|
+
| `peekaboo type [text] [--delay ms] [--wpm 80-220]` | Synthesize keyboard input |
|
|
220
|
+
| `peekaboo scroll --direction up\|down\|left\|right [--amount n]` | Synthesize a scroll gesture |
|
|
221
|
+
| `peekaboo run <scriptPath> [--output file] [--no-fail-fast] [--json]` | Execute a `.peekaboo.json` script in scripted mode |
|
|
222
|
+
| `peekaboo agent [task] [--max-steps n] [--dry-run]` | Autonomous agent mode (non-deterministic — not for CI) |
|
|
223
|
+
|
|
224
|
+
## Anti-Patterns
|
|
225
|
+
|
|
226
|
+
- **DO NOT** auto-grant permissions — macOS requires manual user action. Never use `tccutil` or similar workarounds.
|
|
227
|
+
- **DO NOT** ignore exit codes — exit 2 is a fatal framework error. Surface it; do not treat it as a test failure.
|
|
228
|
+
- **DO NOT** inline AX-tree JSON into agent prompt context — always write to `${RUN_DIR}/ax-snapshots/`. Trees for complex apps exceed 50K tokens.
|
|
229
|
+
- **DO NOT** invoke from Linux or Windows without the platform gate — Phase 1 exits 0 (skip) but nothing downstream handles peekaboo output on non-darwin.
|
|
230
|
+
- **DO NOT** use `peekaboo agent` mode in automated CI runs — non-deterministic and expensive. Reserve for manual exploratory sessions.
|
|
231
|
+
- **DO NOT** emit a bare `{}` for the glass-modifiers artifact — use the full schema with empty arrays. The ux-evaluator validates schema fields.
|
|
232
|
+
|
|
233
|
+
## Sub-File Reference
|
|
234
|
+
|
|
235
|
+
| File | Purpose |
|
|
236
|
+
|---|---|
|
|
237
|
+
| `soul.md` | Driver identity: thin wrapper around native macOS UI capture, not an orchestrator |
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Peekaboo Driver — Soul
|
|
2
|
+
|
|
3
|
+
## Identity
|
|
4
|
+
|
|
5
|
+
You are the peekaboo-driver — a thin wrapper around `peekaboo` (steipete, MIT, macOS-only). You execute Bash commands and write artifacts to disk. You do NOT implement test logic; you orchestrate the peekaboo CLI to produce token-frugal AX-tree snapshots, screenshots, and console-output artifacts under `${RUN_DIR}` for downstream evaluation by `ux-evaluator`.
|
|
6
|
+
|
|
7
|
+
## Principles
|
|
8
|
+
|
|
9
|
+
- **Token-frugal:** AX-tree snapshots go to disk under `${RUN_DIR}/ax-snapshots/`, never inline into prompt context. Inlining costs 50–200K tokens per run.
|
|
10
|
+
- **Permission-first:** probe for required permissions (Accessibility, Screen Recording) before invoking peekaboo. Surface any missing permissions to the user via AUQ before continuing.
|
|
11
|
+
- **Fail-fast on platform mismatch:** verify macOS 15.0+ Sequoia at setup; abort with a clear message if the platform check fails. Never attempt to run on Linux or Windows.
|
|
12
|
+
- **Version-pin discipline:** the peekaboo binary version is pinned per profile. Never auto-upgrade. Drift in tool output format breaks downstream parsing.
|
|
13
|
+
- **Single-app-per-run:** one target application bundle per invocation. No parallel multi-app snapshotting in a single run.
|
|
14
|
+
- **Composable:** the orchestrator calls you; you exit cleanly with a code (0/1/2). You do not loop, retry, or interpret results.
|
|
15
|
+
|
|
16
|
+
## What You Are NOT
|
|
17
|
+
|
|
18
|
+
- Not a UX evaluator — that is `agents/ux-evaluator.md`
|
|
19
|
+
- Not a test framework — you produce artifacts; rubric judgment lives in `skills/test-runner/rubric-v1.md`
|
|
20
|
+
- Not an LLM agent reasoning about UX — you orchestrate peekaboo, you do not interpret what the snapshots mean
|
|
21
|
+
- Not multi-platform — macOS 15.0+ Sequoia only; no Linux, no Windows, no iOS Simulator fallback
|
|
22
|
+
- Not a Playwright driver — that is `skills/playwright-driver/`
|
|
23
|
+
- Not an orchestrator — you receive `RUN_ID`, `RUN_DIR`, and target app; you do not plan waves or dispatch agents
|
|
24
|
+
|
|
25
|
+
## Decision Hierarchy
|
|
26
|
+
|
|
27
|
+
When something is ambiguous, resolve it in this order:
|
|
28
|
+
|
|
29
|
+
1. **Safety first** — probe permissions before driving; never silently skip the permission check
|
|
30
|
+
2. **Correctness** — verify peekaboo exit code before reporting success; a zero exit with missing artifacts is a driver error
|
|
31
|
+
3. **Token-frugality** — write to disk, not to context; any data that could be large goes to a file
|
|
32
|
+
4. **Speed last** — never sacrifice the above three to save wall-clock time
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: persona-panel
|
|
3
|
+
user-invocable: true
|
|
4
|
+
tags: [review, personas, content, quality, multi-agent]
|
|
5
|
+
model: inherit
|
|
6
|
+
description: >
|
|
7
|
+
Use this skill when you need multi-persona parallel content review — domain experts, buyer
|
|
8
|
+
personas, compliance reviewers, or custom catalog entries reviewing a target file or output.
|
|
9
|
+
Dispatches N persona agents in parallel, consolidates verdicts via a configurable mode
|
|
10
|
+
(voting-quorum, hard-gate-threshold, or coordinator-summary), and writes a timestamped sidecar
|
|
11
|
+
to .orchestrator/persona-panel/. Invoked via /persona-panel <target-path>.
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Persona Panel Skill
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
|
|
18
|
+
Persona Panel runs any number of catalog-defined personas in parallel against a single target
|
|
19
|
+
(file, document, or output range). Each persona agent produces a structured verdict. The
|
|
20
|
+
coordinator consolidates the verdicts into a final result using one of three configurable modes
|
|
21
|
+
and persists a sidecar record for audit and trend-tracking.
|
|
22
|
+
|
|
23
|
+
The catalog lives in `.claude/personas/*.md` — per-repo, never plugin-central. This is
|
|
24
|
+
intentional: climate-research repos need physicists; SaaS repos need buyer personas;
|
|
25
|
+
compliance repos need auditors. Plugin-central catalogs block that diversity.
|
|
26
|
+
|
|
27
|
+
## Bundled Presets
|
|
28
|
+
|
|
29
|
+
The plugin ships one ready-made preset alongside the general `templates/personas/` catalog: a
|
|
30
|
+
3-lens PM/Designer/Engineer panel at `skills/persona-panel/presets/` (`pm-lens.md`,
|
|
31
|
+
`designer-lens.md`, `engineer-lens.md`; tier `domain-expert`). Each lens audits one assumption
|
|
32
|
+
dimension — value (PM), usability (Designer), feasibility (Engineer) — as three parallel
|
|
33
|
+
domain-expert personas rather than one reviewer working all three serially.
|
|
34
|
+
|
|
35
|
+
Reach for it on feature/PRD/design reviews in a repo whose `.claude/personas/` is empty or
|
|
36
|
+
missing and no domain-specific catalog exists yet. It is a starting point, not a substitute —
|
|
37
|
+
the per-repo catalog philosophy above still holds; copy and adapt into the project's own
|
|
38
|
+
catalog rather than referencing the plugin copy in place.
|
|
39
|
+
|
|
40
|
+
Install:
|
|
41
|
+
```bash
|
|
42
|
+
mkdir -p .claude/personas
|
|
43
|
+
cp "$(claude plugin dir session-orchestrator)/skills/persona-panel/presets/"*.md .claude/personas/
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Phase 0: Bootstrap Gate
|
|
47
|
+
|
|
48
|
+
Read `skills/_shared/bootstrap-gate.md` and execute the gate check. If the gate is CLOSED,
|
|
49
|
+
invoke `skills/bootstrap/SKILL.md` and wait for completion before proceeding. If the gate is
|
|
50
|
+
OPEN, continue to Phase 1.
|
|
51
|
+
|
|
52
|
+
<HARD-GATE>
|
|
53
|
+
Do NOT proceed past Phase 0 if GATE_CLOSED. There is no bypass. Refer to
|
|
54
|
+
`skills/_shared/bootstrap-gate.md` for the full HARD-GATE constraints.
|
|
55
|
+
</HARD-GATE>
|
|
56
|
+
|
|
57
|
+
## Phase 1: Catalog Discovery
|
|
58
|
+
|
|
59
|
+
Load the per-repo persona catalog via `loadCatalog()` from
|
|
60
|
+
`scripts/lib/persona-panel/catalog-loader.mjs`.
|
|
61
|
+
|
|
62
|
+
**Failure modes — all are hard stops:**
|
|
63
|
+
|
|
64
|
+
**(a) `.claude/personas/` directory missing:**
|
|
65
|
+
```
|
|
66
|
+
Error (exit 2): .claude/personas/ directory not found in this repo.
|
|
67
|
+
Create persona files there to use /persona-panel.
|
|
68
|
+
See templates/personas/ for starter templates (issue #458).
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**(b) `.claude/personas/` present but empty (no `.md` files):**
|
|
72
|
+
```
|
|
73
|
+
Error (exit 2): .claude/personas/ exists but contains no persona files (*.md).
|
|
74
|
+
Add at least one persona file to use /persona-panel.
|
|
75
|
+
See templates/personas/ for starter templates (issue #458).
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**(c) `--personas <name>` arg specified but `name` not found in catalog:**
|
|
79
|
+
```
|
|
80
|
+
Error (exit 1): Persona "<name>" not found in .claude/personas/.
|
|
81
|
+
Available personas: <list of names from catalog>.
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**(d) Malformed YAML frontmatter in a catalog file:**
|
|
85
|
+
```
|
|
86
|
+
Error (exit 1): Malformed YAML in .claude/personas/<filename>.md at line <N>: <error>.
|
|
87
|
+
Fix the frontmatter before running /persona-panel.
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Model validation (H2 security guard):** The catalog loader validates each persona's `model:`
|
|
91
|
+
field against `MODEL_ID_RE` + `ALLOWED_MODEL_ALIASES` from `scripts/lib/agent-frontmatter.mjs`
|
|
92
|
+
at load time. A persona with an invalid model string triggers failure mode (d) with an
|
|
93
|
+
informative message: "invalid model '<value>' — must be a Claude model ID or alias
|
|
94
|
+
(inherit|sonnet|opus|haiku)".
|
|
95
|
+
|
|
96
|
+
**`output_contract` structural pre-check (H3 security guard):** After YAML parse and before
|
|
97
|
+
AJV compile, the loader inspects each persona's `output_contract` object for forbidden keys:
|
|
98
|
+
`$ref`, `$defs`, `allOf`, `anyOf`. Any occurrence triggers failure mode (d). This structural
|
|
99
|
+
pre-check runs BEFORE `ajv.compile()`. The AJV compile call wraps in a 2-second AbortSignal
|
|
100
|
+
timeout to guard against pathological schema inputs.
|
|
101
|
+
|
|
102
|
+
After successful load, emit a one-line status banner:
|
|
103
|
+
```
|
|
104
|
+
Catalog: [N] personas loaded from .claude/personas/. Tier breakdown: domain-expert [N], buyer-persona [N], compliance [N], custom [N].
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
If `--personas <names>` was passed, filter to the named subset. Report the active set.
|
|
108
|
+
|
|
109
|
+
## Phase 2: Target-Input-Resolution
|
|
110
|
+
|
|
111
|
+
Resolve the `<target-path>` argument against the project root.
|
|
112
|
+
|
|
113
|
+
1. Expand to absolute path (relative inputs are resolved from `git rev-parse --show-toplevel`).
|
|
114
|
+
2. Call `validatePathInsideProject(absolutePath, projectRoot)` from
|
|
115
|
+
`scripts/lib/path-utils.mjs`. This function performs a two-phase lexical + realpath guard.
|
|
116
|
+
- If the path resolves outside the project root: exit 1 with message
|
|
117
|
+
"Target path escapes project root — /persona-panel only reviews files inside the repo."
|
|
118
|
+
3. Confirm the file exists and is readable. If not: exit 1 with "Target file not found: <path>".
|
|
119
|
+
4. If a range was specified (`--lines <start>-<end>`), validate that start ≤ end and both are
|
|
120
|
+
positive integers.
|
|
121
|
+
|
|
122
|
+
Store the resolved absolute path as `$TARGET`.
|
|
123
|
+
|
|
124
|
+
## Phase 3: Parallel Dispatch
|
|
125
|
+
|
|
126
|
+
Dispatch one Agent per persona from the active catalog set.
|
|
127
|
+
|
|
128
|
+
**Model selection per persona:**
|
|
129
|
+
- If `persona.model` is a full Claude model ID (`MODEL_ID_RE`): use it as-is.
|
|
130
|
+
- If `persona.model` is `opus` or unset AND `persona.tier == 'domain-expert'`: override to
|
|
131
|
+
`claude-opus-4-7` (empirically validated — Opus finds real problems Sonnet misses; see vault
|
|
132
|
+
learning `[[persona-opus-finds-real-failing-cibadge]]`).
|
|
133
|
+
- Otherwise: use the persona's declared model alias.
|
|
134
|
+
|
|
135
|
+
**Agent dispatch contract:**
|
|
136
|
+
```
|
|
137
|
+
Agent({
|
|
138
|
+
subagent_type: "general-purpose",
|
|
139
|
+
model: <resolved model ID>,
|
|
140
|
+
prompt: <buildPersonaPrompt(persona, $TARGET, targetContent, groundingMode)>,
|
|
141
|
+
tools: ["Read", "Grep", "Glob"]
|
|
142
|
+
})
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Use `buildPersonaPrompt(persona, target, targetContent, groundingMode)` from
|
|
146
|
+
`scripts/lib/persona-panel/persona-runner.mjs` to compose the prompt. The runner wraps
|
|
147
|
+
`evaluation_criteria` entries in `<persona-criteria>...</persona-criteria>` delimiters (security
|
|
148
|
+
M1: persona body is treated as data, not free-form instructions; see `persona-format.md` for the
|
|
149
|
+
full rationale).
|
|
150
|
+
|
|
151
|
+
**Grounding Mode (optional, `--grounding <off|re-derive>`, default `off`, #730 Epic H):** when
|
|
152
|
+
`re-derive`, `groundingMode='re-derive'` is passed to `buildPersonaPrompt`, which inserts a
|
|
153
|
+
`<grounding-instruction>` block before `<target-content>` instructing the persona to
|
|
154
|
+
independently re-derive supporting sources via Read/Grep/Glob rather than trusting a "Sources"
|
|
155
|
+
section the target may already assert, and to report them as `derived_sources` in its JSON
|
|
156
|
+
output. See `persona-format.md` § "Grounding Mode (optional)" for the full contract. v1 is
|
|
157
|
+
advisory-only: `diffGroundingSources()` in `consolidator.mjs` never influences `final_verdict`.
|
|
158
|
+
|
|
159
|
+
**Concurrency cap (security M2):** Maximum 20 personas per panel run. If the active set exceeds
|
|
160
|
+
20, emit a warning and truncate to the first 20 alphabetically:
|
|
161
|
+
```
|
|
162
|
+
Warning: Persona set truncated to 20 (cap). Omitted: <names>.
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**run_in_background:** `false` for all agents. Do not proceed to Phase 4 until ALL agents
|
|
166
|
+
complete.
|
|
167
|
+
|
|
168
|
+
**Dispatch summary line (before dispatch):**
|
|
169
|
+
```
|
|
170
|
+
Dispatching [N] persona agents in parallel. Target: <$TARGET>. Mode: <consolidation-mode>.
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Phase 4: Konsolidierung (Consolidation)
|
|
174
|
+
|
|
175
|
+
After all agents complete, run consolidation via `scripts/lib/persona-panel/consolidator.mjs`.
|
|
176
|
+
|
|
177
|
+
**Three consolidation modes** (set by `--mode` arg, default: `voting-quorum`):
|
|
178
|
+
|
|
179
|
+
### `voting-quorum` (default)
|
|
180
|
+
|
|
181
|
+
Deterministic M-of-N threshold. Default M = ceil(N / 2) + 1 (simple majority). Override with
|
|
182
|
+
`--quorum <M>`.
|
|
183
|
+
|
|
184
|
+
- Count personas whose `verdict == "pass"`.
|
|
185
|
+
- If pass-count >= M: final-verdict = `"pass"`.
|
|
186
|
+
- If pass-count < M: final-verdict = `"fail"`.
|
|
187
|
+
- Tie: impossible when M > N/2. If M == ceil(N/2) exactly and count == M - 1: final-verdict =
|
|
188
|
+
`"fail"` (ties go to FAIL).
|
|
189
|
+
|
|
190
|
+
### `hard-gate-threshold`
|
|
191
|
+
|
|
192
|
+
Strict M-of-N where default M == N (unanimity). Override with `--threshold <M>`.
|
|
193
|
+
|
|
194
|
+
- If ALL N personas pass: final-verdict = `"pass"`.
|
|
195
|
+
- If any persona returns `"fail"`: final-verdict = `"fail"`.
|
|
196
|
+
- If any persona returns `"warn"` and no failures: final-verdict = `"warn"`.
|
|
197
|
+
- Tie-break: ties go to FAIL.
|
|
198
|
+
|
|
199
|
+
### `coordinator-summary`
|
|
200
|
+
|
|
201
|
+
LLM aggregate via coordinator. The coordinator reads all persona outputs and produces a
|
|
202
|
+
synthesized summary verdict.
|
|
203
|
+
|
|
204
|
+
**WARN (required — emit to BOTH stderr AND sidecar `consolidation.aggregator_warning`):**
|
|
205
|
+
```
|
|
206
|
+
Warning: coordinator-summary mode triggers an additional LLM call (the coordinator aggregation
|
|
207
|
+
step). This incurs extra token cost. Use voting-quorum or hard-gate-threshold for deterministic,
|
|
208
|
+
zero-extra-LLM-call consolidation.
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
For each persona output, parse the structured block (see `persona-format.md` Output Contract).
|
|
212
|
+
Validate that `verdict ∈ {"pass", "fail", "warn"}` — if a persona output lacks a valid verdict,
|
|
213
|
+
treat it as `"fail"` and record it in `dissenting_personas` with reason `"missing-verdict"`.
|
|
214
|
+
|
|
215
|
+
Emit a consolidation summary:
|
|
216
|
+
```
|
|
217
|
+
Consolidation ([mode]): [pass-count] pass / [fail-count] fail / [warn-count] warn — Final: <verdict>
|
|
218
|
+
Dissenting: <names> (if any)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Phase 5: Sidecar-Persist + Report
|
|
222
|
+
|
|
223
|
+
Write the sidecar record and emit the final report.
|
|
224
|
+
|
|
225
|
+
### Sidecar Persistence
|
|
226
|
+
|
|
227
|
+
**Run ID generation (H1 security guard):**
|
|
228
|
+
```js
|
|
229
|
+
const runId = randomUUID().slice(0, 8); // format: [a-z0-9-]{8}
|
|
230
|
+
```
|
|
231
|
+
Validate: `runId` MUST match `/^[a-z0-9-]{1,64}$/`. Reject and regenerate if it does not.
|
|
232
|
+
|
|
233
|
+
**Timestamp format for filename:** `^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(\.\d+)?Z?$`
|
|
234
|
+
(filename-safe ISO — colons replaced with hyphens).
|
|
235
|
+
|
|
236
|
+
Example: `2026-05-20T14-30-00Z-a1b2c3d4.json`
|
|
237
|
+
|
|
238
|
+
**Path:** `.orchestrator/persona-panel/<isoTs>-<runId>.json`
|
|
239
|
+
|
|
240
|
+
Validate the sidecar target path with `validatePathInsideProject(sidecarAbsPath, projectRoot)`
|
|
241
|
+
(H1 path guard) before writing.
|
|
242
|
+
|
|
243
|
+
**Schema validation (security M3 — validate BEFORE write):**
|
|
244
|
+
Validate the sidecar object against `agents/schemas/persona-panel-sidecar.schema.json` using
|
|
245
|
+
`validateAgentOutput()` from `scripts/lib/agent-output-schema.mjs` (AJV 2020-12). If
|
|
246
|
+
validation fails: print the AJV errors to stderr and exit 1 — never write an invalid sidecar.
|
|
247
|
+
|
|
248
|
+
**Write via `writeJsonAtomic()` from `scripts/lib/io.mjs`** (atomic tmp-then-rename to prevent
|
|
249
|
+
partial writes).
|
|
250
|
+
|
|
251
|
+
**Sidecar schema shape** (matched by `agents/schemas/persona-panel-sidecar.schema.json`):
|
|
252
|
+
|
|
253
|
+
```json
|
|
254
|
+
{
|
|
255
|
+
"run_id": "<string, 1-64 chars [a-z0-9-]>",
|
|
256
|
+
"target": "<absolute path to reviewed file>",
|
|
257
|
+
"personas_invoked": [
|
|
258
|
+
{
|
|
259
|
+
"name": "<persona name>",
|
|
260
|
+
"version": "<string>",
|
|
261
|
+
"model": "<full model ID used>",
|
|
262
|
+
"prompt_hash": "<sha256 of canonicalized prompt — see persona-format.md>",
|
|
263
|
+
"timestamp_start": "<ISO 8601>",
|
|
264
|
+
"timestamp_end": "<ISO 8601>",
|
|
265
|
+
"token_usage": {
|
|
266
|
+
"input": "<integer>",
|
|
267
|
+
"output": "<integer>",
|
|
268
|
+
"cache_read": "<integer>",
|
|
269
|
+
"cache_creation": "<integer>"
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
],
|
|
273
|
+
"outputs": [
|
|
274
|
+
{
|
|
275
|
+
"persona_name": "<string>",
|
|
276
|
+
"verdict": "<pass|fail|warn>",
|
|
277
|
+
"rationale": "<string, max 4096 chars>",
|
|
278
|
+
"recommendations": ["<string>"],
|
|
279
|
+
"derived_sources": [
|
|
280
|
+
{ "path": "<string, optional — only when groundingMode='re-derive'>", "supports_claim": "<string, optional>" }
|
|
281
|
+
]
|
|
282
|
+
}
|
|
283
|
+
],
|
|
284
|
+
"consolidation": {
|
|
285
|
+
"mode": "<voting-quorum|hard-gate-threshold|coordinator-summary>",
|
|
286
|
+
"final_verdict": "<pass|fail|warn>",
|
|
287
|
+
"pass_count": "<integer>",
|
|
288
|
+
"fail_count": "<integer>",
|
|
289
|
+
"warn_count": "<integer>",
|
|
290
|
+
"dissenting_personas": ["<name>"],
|
|
291
|
+
"audit_reason": "<string>",
|
|
292
|
+
"aggregator_warning": "<string | null>",
|
|
293
|
+
"grounding_diff": {
|
|
294
|
+
"unconfirmed_author_sources": ["<string, optional — only when authorSources was supplied>"],
|
|
295
|
+
"newly_derived": ["<string>"],
|
|
296
|
+
"personas_reporting": "<integer>"
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Token-usage contract (H4):** Each `personas_invoked` entry records `token_usage` from the
|
|
303
|
+
Anthropic API response: `{ input, output, cache_read, cache_creation }`. Agents that do not
|
|
304
|
+
return usage data record all fields as `0`.
|
|
305
|
+
|
|
306
|
+
### Final Report
|
|
307
|
+
|
|
308
|
+
Emit to stdout:
|
|
309
|
+
|
|
310
|
+
```
|
|
311
|
+
## Persona Panel Report
|
|
312
|
+
|
|
313
|
+
Target: <$TARGET>
|
|
314
|
+
Personas: <N> invoked | Mode: <mode>
|
|
315
|
+
Final verdict: <PASS|FAIL|WARN>
|
|
316
|
+
|
|
317
|
+
| Persona | Tier | Verdict | Rationale (excerpt) |
|
|
318
|
+
|---------|------|---------|---------------------|
|
|
319
|
+
| <name> | ... | pass | ... |
|
|
320
|
+
| <name> | ... | fail | ... |
|
|
321
|
+
|
|
322
|
+
Dissenting: <names or "none">
|
|
323
|
+
Sidecar: .orchestrator/persona-panel/<filename>.json
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
If `final_verdict == "fail"`: exit with code 1 so CI and wave-executor hooks can gate on the
|
|
327
|
+
result. If `final_verdict == "warn"`: exit 0 with a warning line on stderr. If
|
|
328
|
+
`final_verdict == "pass"`: exit 0.
|
|
329
|
+
|
|
330
|
+
## Critical Rules
|
|
331
|
+
|
|
332
|
+
- **NEVER** dispatch more than 20 personas per panel (security M2 cap).
|
|
333
|
+
- **NEVER** write a sidecar that fails schema validation — validate BEFORE write (security M3).
|
|
334
|
+
- **NEVER** skip `validatePathInsideProject` for the target path OR the sidecar output path (H1).
|
|
335
|
+
- **NEVER** use `run_in_background: true` for persona agents — lose coordination ability.
|
|
336
|
+
- **ALWAYS** validate `model:` fields from the catalog against `MODEL_ID_RE` + aliases (H2).
|
|
337
|
+
- **ALWAYS** run `output_contract` structural pre-check before `ajv.compile()` (H3).
|
|
338
|
+
- **ALWAYS** emit the `aggregator_warning` to BOTH stderr and sidecar when using
|
|
339
|
+
`coordinator-summary` mode.
|
|
340
|
+
- **ALWAYS** treat missing persona verdict as `"fail"` — never silently skip or default to pass.
|
|
341
|
+
- Ties in consolidation go to FAIL, not pass or warn.
|
|
342
|
+
|
|
343
|
+
## Anti-Patterns
|
|
344
|
+
|
|
345
|
+
- Running without a catalog — Phase 1 must gate on catalog existence.
|
|
346
|
+
- Using a single persona as a "quick check" — dispatch all catalog members unless `--personas`
|
|
347
|
+
restricts deliberately. The value is the N-dimensional view.
|
|
348
|
+
- Ignoring dissenting personas in `voting-quorum` — record them in the sidecar even when the
|
|
349
|
+
majority passes. They are the signal for trend-tracking (#459).
|
|
350
|
+
- Writing the sidecar before schema validation passes — invalid sidecars corrupt trend analysis.
|
|
351
|
+
- Calling `ajv.compile()` without the AbortSignal timeout — pathological schemas can block the
|
|
352
|
+
event loop indefinitely.
|
|
353
|
+
|
|
354
|
+
## See Also
|
|
355
|
+
|
|
356
|
+
- `commands/persona-panel.md` — argument parsing and CLI contract
|
|
357
|
+
- `agents/schemas/persona-panel-sidecar.schema.json` — sidecar JSON Schema (Draft 2020-12)
|
|
358
|
+
- `scripts/lib/persona-panel/catalog-loader.mjs` — loadCatalog() implementation
|
|
359
|
+
- `scripts/lib/persona-panel/persona-runner.mjs` — buildPersonaPrompt() implementation
|
|
360
|
+
- `scripts/lib/persona-panel/consolidator.mjs` — consolidation logic (3 modes)
|
|
361
|
+
- `skills/persona-panel/persona-format.md` — persona file format specification
|
|
362
|
+
- `skills/wave-executor/wave-loop.md` — Persona-Gate hook (Phase 5b/3b, added in #458)
|
|
363
|
+
- `scripts/lib/path-utils.mjs` — validatePathInsideProject()
|
|
364
|
+
- `scripts/lib/io.mjs` — writeJsonAtomic()
|
|
365
|
+
- `scripts/lib/agent-frontmatter.mjs` — MODEL_ID_RE, ALLOWED_MODEL_ALIASES
|