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,154 @@
|
|
|
1
|
+
# Owner Persona Schema (`owner.yaml`)
|
|
2
|
+
|
|
3
|
+
> Per-user configuration for the session-orchestrator plugin. Lives at
|
|
4
|
+
> `~/.config/session-orchestrator/owner.yaml`. Never committed to a project repo.
|
|
5
|
+
>
|
|
6
|
+
> Issue [#174](../../../-/issues/174) — D1 of Sub-Epic [#161](../../../-/issues/161) (Owner Persona Layer).
|
|
7
|
+
> Parent epic: [#157](../../../-/issues/157) (v3.1.0 Environment-Aware Sessions).
|
|
8
|
+
|
|
9
|
+
## Path Resolution
|
|
10
|
+
|
|
11
|
+
The loader (`scripts/lib/owner-config-loader.mjs`) resolves the canonical path as:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
${XDG_CONFIG_HOME ?? <homedir>/.config}/session-orchestrator/owner.yaml
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
| Platform | Default path |
|
|
18
|
+
|------------|---------------------------------------------------------|
|
|
19
|
+
| macOS | `~/.config/session-orchestrator/owner.yaml` |
|
|
20
|
+
| Linux | `${XDG_CONFIG_HOME:-~/.config}/session-orchestrator/owner.yaml` |
|
|
21
|
+
| Windows | `%USERPROFILE%\.config\session-orchestrator\owner.yaml` |
|
|
22
|
+
|
|
23
|
+
A missing file is **not an error** — it signals the user has not opted in.
|
|
24
|
+
The loader returns `{ok: false, source: 'missing'}` in that case and consumers
|
|
25
|
+
fall back to plugin defaults.
|
|
26
|
+
|
|
27
|
+
## Schema (`schema-version: 1`)
|
|
28
|
+
|
|
29
|
+
| Section / Field | Type | Required | Default | Notes |
|
|
30
|
+
|------------------------------------------|-------------------------------|----------|---------------|----------------------------------------------------|
|
|
31
|
+
| `schema-version` | integer | yes | — | Must equal `1`. |
|
|
32
|
+
| `owner.name` | string (1-100) | yes | — | Display name. |
|
|
33
|
+
| `owner.email-hash` | hex (64 chars) or `null` | no | `null` | SHA256 of email; cross-host identity correlation. |
|
|
34
|
+
| `owner.language` | ISO-639-1 (`de`, `en`, ...) | yes | — | Drives soul.md default language. |
|
|
35
|
+
| `tone.style` | `direct\|neutral\|friendly` | no | `neutral` | |
|
|
36
|
+
| `tone.tonality` | string (≤200) or `null` | no | `null` | Free-form descriptor. |
|
|
37
|
+
| `efficiency.output-level` | `lite\|full\|ultra` | no | `full` | Caveman-inspired token dial. |
|
|
38
|
+
| `efficiency.preamble` | `minimal\|verbose` | no | `minimal` | Pre-tool-call narration. |
|
|
39
|
+
| `efficiency.comments-in-code` | `minimal\|full` | no | `minimal` | Inline code comments. |
|
|
40
|
+
| `hardware-sharing.enabled` | boolean | no | `false` | Consent gate for hardware-pattern export. |
|
|
41
|
+
| `hardware-sharing.hash-salt` | hex (64 chars) or `null` | no | `null` | Per-host random salt. Required when `enabled=true`.|
|
|
42
|
+
| `defaults.preferred-test-command` | string (≤200) or `null` | no | `null` | Override CLAUDE.md `test-command`. |
|
|
43
|
+
| `defaults.preferred-editor` | string (≤50) or `null` | no | `null` | |
|
|
44
|
+
| `metadata.created_at` | ISO 8601 string or `null` | no | `null` | Auto-set on first write. |
|
|
45
|
+
| `metadata.updated_at` | ISO 8601 string or `null` | no | `null` | Auto-bumped on every save. |
|
|
46
|
+
|
|
47
|
+
### Privacy Contract
|
|
48
|
+
|
|
49
|
+
- `hardware-sharing.enabled = true` **requires** `hardware-sharing.hash-salt`
|
|
50
|
+
to be a valid 64-char hex string. The validator rejects `enabled=true` with
|
|
51
|
+
`hash-salt=null` so consent is never recorded without the means to
|
|
52
|
+
anonymise per-host learnings.
|
|
53
|
+
- `owner.email-hash` is the only field carrying potential cross-host identity;
|
|
54
|
+
it is hashed (never plaintext email) and remains optional.
|
|
55
|
+
|
|
56
|
+
## Example
|
|
57
|
+
|
|
58
|
+
See [`scripts/lib/owner-config.example.yaml`](../scripts/lib/owner-config.example.yaml)
|
|
59
|
+
for an annotated, copyable example.
|
|
60
|
+
|
|
61
|
+
## API Surface
|
|
62
|
+
|
|
63
|
+
`scripts/lib/owner-config.mjs` (pure, no I/O):
|
|
64
|
+
|
|
65
|
+
```js
|
|
66
|
+
import { validate, coerce, defaults, merge } from './scripts/lib/owner-config.mjs';
|
|
67
|
+
|
|
68
|
+
// Defensive, never throws. Use this in skill code paths.
|
|
69
|
+
const result = validate(rawObj);
|
|
70
|
+
// → { ok: true, value: <normalized>, errors: [] }
|
|
71
|
+
// → { ok: false, value: null, errors: ["owner.name must be ..."] }
|
|
72
|
+
|
|
73
|
+
// Strict mode: throws OwnerConfigError on failure. Use in tests / CLI.
|
|
74
|
+
const value = coerce(rawObj);
|
|
75
|
+
|
|
76
|
+
// Default-filled config. owner.name and owner.language remain blank
|
|
77
|
+
// (the bootstrap interview in D2 fills them in).
|
|
78
|
+
const def = defaults();
|
|
79
|
+
|
|
80
|
+
// Deep-merge two configs. `override` wins on every defined leaf.
|
|
81
|
+
const merged = merge(baseFromOwnerYaml, perSessionOverrides);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
`scripts/lib/owner-config-loader.mjs` (filesystem I/O):
|
|
85
|
+
|
|
86
|
+
```js
|
|
87
|
+
import { loadOwnerConfig, resolveOwnerConfigPath } from './scripts/lib/owner-config-loader.mjs';
|
|
88
|
+
|
|
89
|
+
const result = await loadOwnerConfig();
|
|
90
|
+
// {
|
|
91
|
+
// ok: true|false,
|
|
92
|
+
// value: <normalized> | null,
|
|
93
|
+
// errors: string[],
|
|
94
|
+
// source: 'file' | 'missing' | 'parse-error' | 'validation-error',
|
|
95
|
+
// path: '<absolute path>',
|
|
96
|
+
// }
|
|
97
|
+
|
|
98
|
+
// Test override
|
|
99
|
+
const result2 = await loadOwnerConfig({ path: '/tmp/test-owner.yaml' });
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Where this gets read
|
|
103
|
+
|
|
104
|
+
D1 only ships the schema + validator + loader. The downstream tasks consume
|
|
105
|
+
these primitives:
|
|
106
|
+
|
|
107
|
+
- **[#175 D2](../../../-/issues/175) — bootstrap interview**: writes the file via
|
|
108
|
+
`coerce()` then a YAML serializer, stamping `metadata.created_at` /
|
|
109
|
+
`metadata.updated_at`.
|
|
110
|
+
- **[#176 D3](../../../-/issues/176) — `soul.md` runtime-merge**: calls
|
|
111
|
+
`loadOwnerConfig()` from the session-start hook, then `merge()` with any
|
|
112
|
+
per-session overrides, then resolves `{{tone.style}}` /
|
|
113
|
+
`{{efficiency.output-level}}` / `{{owner.language}}` template slots.
|
|
114
|
+
- **#177 D4 — projects-baseline propagation**: stamps a
|
|
115
|
+
reference to the canonical path into every consumer repo's CLAUDE.md
|
|
116
|
+
frontmatter (path reference only — never the content).
|
|
117
|
+
- **[#168 C4](../../../-/issues/168) — hardware-sharing consent prompt**: writes
|
|
118
|
+
`hardware-sharing.enabled = true` + a freshly-generated `hash-salt` after
|
|
119
|
+
the user accepts the consent dialogue.
|
|
120
|
+
|
|
121
|
+
## Validation Rules (rejection examples)
|
|
122
|
+
|
|
123
|
+
```yaml
|
|
124
|
+
# REJECTED — schema-version missing
|
|
125
|
+
owner: { name: x, language: en }
|
|
126
|
+
|
|
127
|
+
# REJECTED — schema-version mismatch (refuses to load future versions)
|
|
128
|
+
schema-version: 2
|
|
129
|
+
owner: { name: x, language: en }
|
|
130
|
+
|
|
131
|
+
# REJECTED — name empty
|
|
132
|
+
schema-version: 1
|
|
133
|
+
owner: { name: "", language: en }
|
|
134
|
+
|
|
135
|
+
# REJECTED — language not ISO-639-1
|
|
136
|
+
schema-version: 1
|
|
137
|
+
owner: { name: x, language: "english" }
|
|
138
|
+
|
|
139
|
+
# REJECTED — enum violation
|
|
140
|
+
schema-version: 1
|
|
141
|
+
owner: { name: x, language: en }
|
|
142
|
+
tone: { style: "snarky" }
|
|
143
|
+
|
|
144
|
+
# REJECTED — privacy contract: enabled=true without hash-salt
|
|
145
|
+
schema-version: 1
|
|
146
|
+
owner: { name: x, language: en }
|
|
147
|
+
hardware-sharing: { enabled: true }
|
|
148
|
+
|
|
149
|
+
# ACCEPTED — minimal valid config
|
|
150
|
+
schema-version: 1
|
|
151
|
+
owner:
|
|
152
|
+
name: Bernhard
|
|
153
|
+
language: de
|
|
154
|
+
```
|
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
# /persona-panel — Multi-Persona Content Review
|
|
2
|
+
|
|
3
|
+
> Standalone skill + command for running N domain-expert, buyer-persona, or compliance personas
|
|
4
|
+
> against a target artifact in parallel, with deterministic consolidation, hard-gate semantics,
|
|
5
|
+
> and timestamped sidecar records for audit and trend-tracking.
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
- Reviewing a research statement or technical document from multiple expert angles simultaneously
|
|
10
|
+
(e.g. a climate-research brief reviewed by a physicist and an AI expert)
|
|
11
|
+
- Validating AI-generated accountant output from a domain-expert lens plus a compliance lens
|
|
12
|
+
before presenting it to a client
|
|
13
|
+
- Running a Buyer-Panel Hard-Gate on a B2B product landing page: all N buyer personas must PASS
|
|
14
|
+
before the page goes live
|
|
15
|
+
- Any "Multi-Pair-of-Eyes" review where you want structured, auditable output from N perspectives
|
|
16
|
+
without manually prompting each reviewer in turn
|
|
17
|
+
|
|
18
|
+
The panel runs personas **in parallel** — wall-clock time is roughly the slowest single persona,
|
|
19
|
+
not N times the slowest.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Quick Start
|
|
24
|
+
|
|
25
|
+
### 1. Create the catalog directory
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
mkdir -p .claude/personas
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### 2. Copy a starter template
|
|
32
|
+
|
|
33
|
+
Templates ship with the plugin at `templates/personas/`. Copy one as a starting point:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
cp "$(claude plugin dir session-orchestrator)/templates/personas/klima-physicist.v1.md" \
|
|
37
|
+
.claude/personas/klima-physicist.md
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Edit the file: update `name`, `role`, `evaluation_criteria`, and the `## Mission` body section
|
|
41
|
+
to match your reviewer's perspective.
|
|
42
|
+
|
|
43
|
+
### 3. Confirm the catalog loads
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
/persona-panel docs/research/my-draft.md --dry-run
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`--dry-run` resolves the catalog and prints the planned dispatch list without making any Agent
|
|
50
|
+
calls or writing any sidecar. Use it to verify setup before a real run.
|
|
51
|
+
|
|
52
|
+
### 4. Run the panel
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
/persona-panel docs/research/my-draft.md
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The command dispatches one agent per persona in parallel, consolidates verdicts using the
|
|
59
|
+
default voting mode, and prints a Markdown table summary to stdout. A timestamped sidecar is
|
|
60
|
+
written to `.orchestrator/persona-panel/`.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Reference Examples
|
|
65
|
+
|
|
66
|
+
### Example 1 — Research Statement Review (klima, 2-persona panel)
|
|
67
|
+
|
|
68
|
+
**Scenario:** A climate-research brief (`wfk-2.1.5.md`) needs sign-off from a domain physicist
|
|
69
|
+
and an AI/ML expert before it is submitted. Both must agree.
|
|
70
|
+
|
|
71
|
+
**Catalog files:** `.claude/personas/klima-physicist.md`,
|
|
72
|
+
`.claude/personas/klima-ai-expert.md`
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
/persona-panel docs/research/wfk-2.1.5.md \
|
|
76
|
+
--personas klima-physicist,klima-ai-expert \
|
|
77
|
+
--mode voting \
|
|
78
|
+
--threshold 2-of-2
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The `2-of-2` threshold means both personas must return `pass`. A single `fail` or `warn` from
|
|
82
|
+
either produces a final `fail` verdict.
|
|
83
|
+
|
|
84
|
+
**Typical stdout output:**
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
Dispatching 2 persona agents in parallel. Target: .../docs/research/wfk-2.1.5.md. Mode: voting.
|
|
88
|
+
|
|
89
|
+
## Persona Panel Report
|
|
90
|
+
|
|
91
|
+
Target: docs/research/wfk-2.1.5.md
|
|
92
|
+
Personas: 2 invoked | Mode: voting (threshold: 2-of-2)
|
|
93
|
+
Final verdict: PASS
|
|
94
|
+
|
|
95
|
+
| Persona | Tier | Verdict | Rationale (excerpt) |
|
|
96
|
+
|------------------|---------------|---------|----------------------------------------------|
|
|
97
|
+
| klima-physicist | domain-expert | pass | Physical assumptions consistent with AR6 ... |
|
|
98
|
+
| klima-ai-expert | domain-expert | pass | Model claims grounded, no hallucinated ... |
|
|
99
|
+
|
|
100
|
+
Dissenting: none
|
|
101
|
+
Sidecar: .orchestrator/persona-panel/2026-05-20T14-30-00Z-a1b2c3d4.json
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Sidecar excerpt:**
|
|
105
|
+
|
|
106
|
+
```json
|
|
107
|
+
{
|
|
108
|
+
"run_id": "a1b2c3d4",
|
|
109
|
+
"target": "/abs/path/docs/research/wfk-2.1.5.md",
|
|
110
|
+
"personas_invoked": [
|
|
111
|
+
{ "name": "klima-physicist", "version": "2", "model": "claude-opus-4-7", ... },
|
|
112
|
+
{ "name": "klima-ai-expert", "version": "1", "model": "claude-opus-4-7", ... }
|
|
113
|
+
],
|
|
114
|
+
"consolidation": {
|
|
115
|
+
"mode": "voting-quorum",
|
|
116
|
+
"final_verdict": "pass",
|
|
117
|
+
"pass_count": 2,
|
|
118
|
+
"fail_count": 0,
|
|
119
|
+
"dissenting_personas": []
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
### Example 2 — Buyer-Panel Hard-Gate (products/example-app)
|
|
127
|
+
|
|
128
|
+
**Scenario:** A landing page component must pass review from all 6 buyer personas before the
|
|
129
|
+
copy is considered launch-ready. One `fail` blocks the whole gate.
|
|
130
|
+
|
|
131
|
+
**Catalog files:** `.claude/personas/` contains
|
|
132
|
+
`buyer-p1-cto.md` through `buyer-p6-*.md`.
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
/persona-panel src/landing-page.tsx --mode hard-gate --threshold all
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Because `--threshold all` is the default for `hard-gate`, this is equivalent to:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
/persona-panel src/landing-page.tsx --mode hard-gate
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**If 5 of 6 personas pass (one fails):**
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
Consolidation (hard-gate-threshold): 5 pass / 1 fail / 0 warn — Final: FAIL
|
|
148
|
+
Dissenting: buyer-p3-kanzlei
|
|
149
|
+
|
|
150
|
+
## Persona Panel Report
|
|
151
|
+
|
|
152
|
+
Target: src/landing-page.tsx
|
|
153
|
+
Personas: 6 invoked | Mode: hard-gate (threshold: all)
|
|
154
|
+
Final verdict: FAIL
|
|
155
|
+
|
|
156
|
+
| Persona | Tier | Verdict | Rationale (excerpt) |
|
|
157
|
+
|-------------------------------|---------------|---------|----------------------------------------|
|
|
158
|
+
| buyer-p1-cto | buyer-persona | pass | Value proposition clear for CTO ... |
|
|
159
|
+
| buyer-p2-kanzlei | buyer-persona | pass | Compliance language acceptable ... |
|
|
160
|
+
| buyer-p3-kanzlei | buyer-persona | fail | DSGVO section too vague for ... |
|
|
161
|
+
| ... | ... | pass | ... |
|
|
162
|
+
|
|
163
|
+
Dissenting: buyer-p3-kanzlei
|
|
164
|
+
Sidecar: .orchestrator/persona-panel/2026-05-20T16-00-00Z-b2c3d4e5.json
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
The command exits with code 1. CI pipelines and wave-executor hooks can gate on this exit code.
|
|
168
|
+
|
|
169
|
+
**To re-run after revisions:**
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
# After fixing the DSGVO section:
|
|
173
|
+
/persona-panel src/landing-page.tsx --mode hard-gate --threshold all
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
### Example 3 — AI Accountant Output Compliance Review (accounting)
|
|
179
|
+
|
|
180
|
+
**Scenario:** An AI accountant (Sophie) produces invoice analysis JSON. A tax-advisor persona
|
|
181
|
+
and a DSGVO-compliance persona must both approve before the output is delivered to the client.
|
|
182
|
+
|
|
183
|
+
**Catalog files:** `.claude/personas/accounting-tax-advisor.md`,
|
|
184
|
+
`.claude/personas/accounting-compliance.md`
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
/persona-panel sophie-outputs/2026-05-19/invoice-12345.json \
|
|
188
|
+
--personas accounting-tax-advisor,accounting-compliance \
|
|
189
|
+
--mode voting \
|
|
190
|
+
--threshold 2-of-2
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
If the compliance persona returns `warn` (not `fail`), the tax-advisor returns `pass`, and the
|
|
194
|
+
threshold is `2-of-2` (pass-only):
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
Consolidation (voting-quorum): 1 pass / 0 fail / 1 warn — Final: FAIL
|
|
198
|
+
Dissenting: accounting-compliance (warn treated as non-pass under 2-of-2 threshold)
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
`warn` counts as a non-pass vote for quorum purposes. The sidecar records the full rationale
|
|
202
|
+
and recommendations from the compliance persona so the issue can be addressed specifically.
|
|
203
|
+
|
|
204
|
+
**Dry-run before dispatching (recommended for expensive Opus calls):**
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
/persona-panel sophie-outputs/2026-05-19/invoice-12345.json \
|
|
208
|
+
--personas accounting-tax-advisor,accounting-compliance \
|
|
209
|
+
--dry-run
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Configuration
|
|
215
|
+
|
|
216
|
+
### Catalog directory structure
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
.claude/personas/
|
|
220
|
+
klima-physicist.md
|
|
221
|
+
klima-ai-expert.md
|
|
222
|
+
accounting-tax-advisor.md
|
|
223
|
+
accounting-compliance.md
|
|
224
|
+
buyer-p1-cto.md
|
|
225
|
+
buyer-p2-kanzlei.md
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Each file is a Markdown document with YAML frontmatter. All six frontmatter fields are required.
|
|
229
|
+
|
|
230
|
+
### Persona file structure
|
|
231
|
+
|
|
232
|
+
Full specification: `skills/persona-panel/persona-format.md`. Minimum shape:
|
|
233
|
+
|
|
234
|
+
```yaml
|
|
235
|
+
---
|
|
236
|
+
name: my-reviewer
|
|
237
|
+
schema_version: 1
|
|
238
|
+
version: "1"
|
|
239
|
+
role: "Domain expert in [field] — evaluates [aspect] of the target"
|
|
240
|
+
model: claude-opus-4-7
|
|
241
|
+
tier: domain-expert
|
|
242
|
+
output_contract:
|
|
243
|
+
type: object
|
|
244
|
+
required: [verdict, rationale]
|
|
245
|
+
properties:
|
|
246
|
+
verdict:
|
|
247
|
+
type: string
|
|
248
|
+
enum: [pass, fail, warn]
|
|
249
|
+
rationale:
|
|
250
|
+
type: string
|
|
251
|
+
maxLength: 4096
|
|
252
|
+
recommendations:
|
|
253
|
+
type: array
|
|
254
|
+
items:
|
|
255
|
+
type: string
|
|
256
|
+
evaluation_criteria:
|
|
257
|
+
- "Claim X is accurate and verifiable"
|
|
258
|
+
- "No contradictions with established standard Y"
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## Mission
|
|
262
|
+
|
|
263
|
+
You are [role]. Your goal is to review the target and determine whether it meets the standards
|
|
264
|
+
defined in your evaluation criteria. Return a structured verdict.
|
|
265
|
+
|
|
266
|
+
## Context Files
|
|
267
|
+
|
|
268
|
+
None.
|
|
269
|
+
|
|
270
|
+
## Evaluation Criteria
|
|
271
|
+
|
|
272
|
+
[Expanded prose descriptions matching the frontmatter criteria.]
|
|
273
|
+
|
|
274
|
+
## Output Template
|
|
275
|
+
|
|
276
|
+
\```json
|
|
277
|
+
{
|
|
278
|
+
"verdict": "pass|fail|warn",
|
|
279
|
+
"rationale": "Detailed rationale (max 4096 chars).",
|
|
280
|
+
"recommendations": []
|
|
281
|
+
}
|
|
282
|
+
\```
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### Tier values
|
|
286
|
+
|
|
287
|
+
| Tier | Typical use |
|
|
288
|
+
|---|---|
|
|
289
|
+
| `domain-expert` | Technical reviewers: physicist, AI expert, legal, medical |
|
|
290
|
+
| `buyer-persona` | Buyer-panel hard-gates: CTO, procurement, compliance officer |
|
|
291
|
+
| `compliance` | DSGVO, SEC, HIPAA, ISO reviewers |
|
|
292
|
+
| `custom` | Any other structured reviewer |
|
|
293
|
+
|
|
294
|
+
`domain-expert` and `compliance` tiers default to `claude-opus-4-7` for model selection
|
|
295
|
+
(Opus finds real issues Sonnet misses — see vault learning `[[persona-opus-finds-real-failing-cibadge]]`).
|
|
296
|
+
|
|
297
|
+
### output_contract security rules
|
|
298
|
+
|
|
299
|
+
The `output_contract` field in each persona's YAML frontmatter is compiled by AJV at catalog
|
|
300
|
+
load time. Three structural rules are enforced before compilation:
|
|
301
|
+
|
|
302
|
+
- `$ref`, `$defs`, `allOf`, `anyOf` are **forbidden** — they enable attacker-controlled schema
|
|
303
|
+
complexity attacks (ReDoS via pathological schemas)
|
|
304
|
+
- The schema MUST declare `verdict` in its `required` array
|
|
305
|
+
- The AJV compile call is wrapped in a 2-second AbortSignal timeout
|
|
306
|
+
|
|
307
|
+
A persona with a forbidden key in `output_contract` is rejected at Phase 1 (catalog load) with
|
|
308
|
+
an informative error. Fix the frontmatter before running the panel.
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Consolidation Modes
|
|
313
|
+
|
|
314
|
+
Three modes are available via `--mode`:
|
|
315
|
+
|
|
316
|
+
| Mode | Flag | Deterministic | Extra LLM call |
|
|
317
|
+
|---|---|---|---|
|
|
318
|
+
| `voting` | `--mode voting` | Yes | No |
|
|
319
|
+
| `hard-gate` | `--mode hard-gate` | Yes | No |
|
|
320
|
+
| `summary` | `--mode summary` | No | Yes (coordinator aggregate) |
|
|
321
|
+
|
|
322
|
+
**`voting` (default):** Counts PASS verdicts against `--threshold`. Suitable for panels where
|
|
323
|
+
a majority or supermajority is sufficient.
|
|
324
|
+
|
|
325
|
+
**`hard-gate`:** All N personas must return PASS. Any single FAIL (or WARN) produces FAIL.
|
|
326
|
+
Exit code 1 on FAIL — suitable for CI gates and wave-executor integration.
|
|
327
|
+
|
|
328
|
+
**`summary`:** Coordinator LLM aggregates heterogeneous outputs into a narrative. Emits a
|
|
329
|
+
warning before dispatch: `summary mode adds one additional LLM call`. Use voting or hard-gate
|
|
330
|
+
for cost-sensitive pipelines.
|
|
331
|
+
|
|
332
|
+
### Threshold spec
|
|
333
|
+
|
|
334
|
+
The `--threshold` flag accepts:
|
|
335
|
+
|
|
336
|
+
- `M-of-N` — e.g. `2-of-3`, `5-of-6`. M and N are integers 1..20.
|
|
337
|
+
- `all` — equivalent to `N-of-N`. Default for `hard-gate`.
|
|
338
|
+
- `any` — first PASS is sufficient. Unusual; use with care.
|
|
339
|
+
|
|
340
|
+
Default when omitted: `all`.
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Wave-Gate Integration (Issue #458)
|
|
345
|
+
|
|
346
|
+
After issue #458 ships, `persona-panel` can be configured as an inter-wave gate inside
|
|
347
|
+
`wave-executor`. A `persona-gate-wave` block in Session Config (in `CLAUDE.md` or `AGENTS.md`)
|
|
348
|
+
will run the panel automatically after the Quality wave:
|
|
349
|
+
|
|
350
|
+
```yaml
|
|
351
|
+
persona-gate-wave:
|
|
352
|
+
enabled: true
|
|
353
|
+
after: quality
|
|
354
|
+
threshold: all
|
|
355
|
+
mode: strict
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
Cross-reference: `docs/session-config-reference.md` will gain a `persona-gate-wave` section
|
|
359
|
+
when #458 is implemented. Until then, run `/persona-panel` manually between waves or at
|
|
360
|
+
session-end.
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## Security Notes
|
|
365
|
+
|
|
366
|
+
**Per-repo catalog only.** The `.claude/personas/` directory is per-repo and never stored in
|
|
367
|
+
the plugin. This is intentional: climate-research repos need physicists; SaaS repos need buyer
|
|
368
|
+
personas; compliance repos need auditors. A plugin-central catalog would block that diversity.
|
|
369
|
+
|
|
370
|
+
**Flat output_contract schemas.** The `output_contract` in each persona's YAML frontmatter must
|
|
371
|
+
be a flat inline JSON Schema Draft 2020-12 object. The keywords `$ref`, `$defs`, `allOf`, and
|
|
372
|
+
`anyOf` are forbidden. This guards against pathological schemas that could cause the AJV
|
|
373
|
+
compiler to hang (schema-complexity DoS).
|
|
374
|
+
|
|
375
|
+
**Sidecar path confinement.** Sidecar files are written exclusively to
|
|
376
|
+
`.orchestrator/persona-panel/` inside the project root. The path is validated via
|
|
377
|
+
`validatePathInsideProject` from `scripts/lib/path-utils.mjs` before any write. Sidecars
|
|
378
|
+
cannot be written outside the repo boundary.
|
|
379
|
+
|
|
380
|
+
**Model field validation.** Each persona's `model:` field is validated at catalog load time
|
|
381
|
+
against `MODEL_ID_RE` and `ALLOWED_MODEL_ALIASES` from `scripts/lib/agent-frontmatter.mjs`. A
|
|
382
|
+
persona declaring an unrecognized model string is rejected with an informative error.
|
|
383
|
+
|
|
384
|
+
**Concurrency cap.** A maximum of 20 personas can run in a single panel invocation. If the
|
|
385
|
+
active set exceeds 20, the run is truncated alphabetically and a warning is emitted.
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## Trend Tracking (Future — Issue #459)
|
|
390
|
+
|
|
391
|
+
Issue #459 will add a `--trend` sub-command that compares sidecar records across runs and flags
|
|
392
|
+
verdict drift (a persona that was passing now fails, or vice versa). The `prompt_hash` field in
|
|
393
|
+
each sidecar entry — a sha256 over the canonicalized persona inputs — enables detecting whether
|
|
394
|
+
a change in persona content or model caused the drift, or whether the target artifact changed.
|
|
395
|
+
|
|
396
|
+
Trend tracking is data-gated on at least 3 runs against the same target with the same persona
|
|
397
|
+
set. It will not be useful before that threshold.
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
## Sidecar Location
|
|
402
|
+
|
|
403
|
+
All runs write a JSON sidecar to:
|
|
404
|
+
|
|
405
|
+
```
|
|
406
|
+
.orchestrator/persona-panel/<isoTimestamp>-<runId>.json
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
Example: `.orchestrator/persona-panel/2026-05-20T14-30-00Z-a1b2c3d4.json`
|
|
410
|
+
|
|
411
|
+
The sidecar schema is at `agents/schemas/persona-panel-sidecar.schema.json` (AJV Draft
|
|
412
|
+
2020-12). The file is written atomically via `writeJsonAtomic()` from `scripts/lib/io.mjs`
|
|
413
|
+
(tmp-then-rename, prevents partial writes). Schema validation runs against the sidecar object
|
|
414
|
+
before write — an invalid sidecar causes exit 1, nothing is written.
|
|
415
|
+
|
|
416
|
+
Add `.orchestrator/persona-panel/` to `.gitignore` to keep run records out of version control,
|
|
417
|
+
or commit them if you want an auditable history.
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## See Also
|
|
422
|
+
|
|
423
|
+
- `commands/persona-panel.md` — command reference: argument syntax, flag validation, examples
|
|
424
|
+
- `skills/persona-panel/SKILL.md` — full skill spec: 6 phases, catalog format, dispatch
|
|
425
|
+
mechanics, consolidation logic, sidecar schema
|
|
426
|
+
- `skills/persona-panel/persona-format.md` — persona file format specification: frontmatter
|
|
427
|
+
fields, body sections, verdict contract, security rationale for criteria delimiters
|
|
428
|
+
- `templates/personas/*.v1.md` — 6 catalog templates: `klima-physicist`, `klima-ai-expert`,
|
|
429
|
+
`accounting-tax-advisor`, `accounting-compliance`, `buyer-p1-cto`,
|
|
430
|
+
`buyer-p2-kanzlei`
|
|
431
|
+
- `agents/schemas/persona-panel-sidecar.schema.json` — sidecar JSON Schema (Draft 2020-12)
|
|
432
|
+
- Issue #457 (foundation), #458 (wave-hook integration), #459 (trend tracking), #460 (catalog
|
|
433
|
+
templates)
|
package/docs/pi-setup.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Pi Setup Guide
|
|
2
|
+
|
|
3
|
+
Guide for using Session Orchestrator with [Pi](https://pi.dev/docs/latest).
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Pi installed: `npm install -g --ignore-scripts @earendil-works/pi-coding-agent`
|
|
8
|
+
- Node.js 24 or later for this repository's hook/runtime scripts
|
|
9
|
+
- A project repository with git initialized
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
### Option 1: npm package (primary, once published)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pi install npm:session-orchestrator
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
This is the primary install path once the package has been published to npm and indexed by the [Pi packages gallery](https://pi.dev/packages) via its `pi-package` keyword — no local checkout required. Not yet available: the package has not been published to npm yet (see `docs/distribution/npm-publish-checklist.md` for the operator publish runbook). Until then, use one of the dev-fallback options below.
|
|
20
|
+
|
|
21
|
+
### Option 2: Project-local registration (dev fallback)
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
git clone https://github.com/Kanevry/session-orchestrator.git ~/Projects/session-orchestrator
|
|
25
|
+
cd ~/Projects/session-orchestrator
|
|
26
|
+
npm install
|
|
27
|
+
node scripts/pi-install.mjs /path/to/your/project --settings-only
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
This writes `/path/to/your/project/.pi/settings.json` with a `packages` entry pointing at the local checkout. Restart or reload Pi after registration.
|
|
31
|
+
|
|
32
|
+
If you want Pi's native package installer to do the registration as well:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
cd /path/to/your/project
|
|
36
|
+
pi install ~/Projects/session-orchestrator -l
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Option 3: Global registration (dev fallback)
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
cd ~/Projects/session-orchestrator
|
|
43
|
+
node scripts/pi-install.mjs --global --settings-only
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Global mode writes `~/.pi/agent/settings.json`.
|
|
47
|
+
|
|
48
|
+
## Configuration
|
|
49
|
+
|
|
50
|
+
Pi reads `AGENTS.md` and `CLAUDE.md` natively. For Session Orchestrator on Pi, prefer `AGENTS.md` when creating a new project file; existing `CLAUDE.md` files continue to work via the shared alias rule.
|
|
51
|
+
|
|
52
|
+
Add a `## Session Config` section:
|
|
53
|
+
|
|
54
|
+
```markdown
|
|
55
|
+
## Session Config
|
|
56
|
+
|
|
57
|
+
agents-per-wave: 6
|
|
58
|
+
waves: 5
|
|
59
|
+
persistence: true
|
|
60
|
+
enforcement: warn
|
|
61
|
+
test-command: npm test
|
|
62
|
+
typecheck-command: npm run typecheck
|
|
63
|
+
lint-command: npm run lint
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## What Loads
|
|
67
|
+
|
|
68
|
+
The package manifest in `package.json` exposes:
|
|
69
|
+
|
|
70
|
+
- `pi.extensions`: `./pi/extensions/session-orchestrator.ts`
|
|
71
|
+
- `pi.skills`: `./skills`
|
|
72
|
+
- `pi.prompts`: `./pi/prompts/*.md` generated from `commands/*.md`
|
|
73
|
+
|
|
74
|
+
The extension uses `hooks/hooks-pi.json` and `scripts/lib/pi-hook-bridge.mjs` to translate Pi events into the existing hook stdin contract.
|
|
75
|
+
|
|
76
|
+
## Hook Coverage
|
|
77
|
+
|
|
78
|
+
| Pi event | Session Orchestrator equivalent | Status |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| `session_start` | `SessionStart` | enabled |
|
|
81
|
+
| `session_shutdown` | `SessionEnd` | enabled |
|
|
82
|
+
| `tool_call` | `PreToolUse` | enabled for `bash`, `edit`, `write` |
|
|
83
|
+
| `tool_result` | `PostToolUse` | enabled |
|
|
84
|
+
| `agent_end` | `Stop` | enabled |
|
|
85
|
+
|
|
86
|
+
Not yet mapped in v1: `PostToolUseFailure`, `PostToolBatch`, `SubagentStart`, `SubagentStop`, and `CwdChanged`.
|
|
87
|
+
|
|
88
|
+
## Usage
|
|
89
|
+
|
|
90
|
+
After reload, use the same commands:
|
|
91
|
+
|
|
92
|
+
- `/session [housekeeping|feature|deep]`
|
|
93
|
+
- `/go`
|
|
94
|
+
- `/close`
|
|
95
|
+
- `/plan [new|feature|retro]`
|
|
96
|
+
- `/discovery [scope]`
|
|
97
|
+
- `/evolve [analyze|review|list]`
|
|
98
|
+
|
|
99
|
+
## Differences From Claude Code And Codex
|
|
100
|
+
|
|
101
|
+
| Aspect | Claude Code | Codex | Pi |
|
|
102
|
+
|---|---|---|---|
|
|
103
|
+
| Package format | Claude plugin manifest | Codex plugin manifest | `package.json.pi` package |
|
|
104
|
+
| Config file | `CLAUDE.md` | `AGENTS.md` | `AGENTS.md` preferred; `CLAUDE.md` supported |
|
|
105
|
+
| State directory | `.claude/` | `.codex/` | `.pi/` |
|
|
106
|
+
| Tool guard event | `PreToolUse` | `PreToolUse` | `tool_call` bridge |
|
|
107
|
+
| Agent dispatch | Native Agent tool | Codex subagents / typed roles | Sequential v1 |
|
|
108
|
+
|
|
109
|
+
## Troubleshooting
|
|
110
|
+
|
|
111
|
+
- **Prompts or skills not visible**: verify the project is trusted in Pi, then restart or reload.
|
|
112
|
+
- **Package not loaded**: confirm `.pi/settings.json` or `~/.pi/agent/settings.json` contains the local checkout path under `packages`.
|
|
113
|
+
- **Hooks not firing**: confirm `package.json` still has the `pi.extensions` entry and `hooks/hooks-pi.json` exists.
|
|
114
|
+
- **Config ignored**: ensure the file has a `## Session Config` header in `AGENTS.md` or `CLAUDE.md`.
|
|
115
|
+
- **Runtime error from hooks**: run `npm install` in the Session Orchestrator checkout so hook dependencies are present.
|