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,300 @@
|
|
|
1
|
+
# Monitor Filter Patterns
|
|
2
|
+
|
|
3
|
+
> Vetted Monitor-tool snippets for the recurring observation points in the
|
|
4
|
+
> session-orchestrator workflow. Each snippet ships with the description
|
|
5
|
+
> string, recommended timeout / persistent flag, and an explicit failure
|
|
6
|
+
> coverage note (per the **silence-is-not-success** rule from
|
|
7
|
+
> `.claude/rules/loop-and-monitor.md`).
|
|
8
|
+
|
|
9
|
+
## Why this file exists
|
|
10
|
+
|
|
11
|
+
Anthropic recommends `Monitor` over `/loop` for any stream-able event
|
|
12
|
+
(https://code.claude.com/docs/en/scheduled-tasks). The Monitor tool turns
|
|
13
|
+
each stdout line into a notification, avoiding poll-token cost. But a
|
|
14
|
+
naïve filter that matches only the success marker reads identical to a
|
|
15
|
+
crash — silent. The snippets below are calibrated to emit on **every
|
|
16
|
+
terminal state**, not just the happy path.
|
|
17
|
+
|
|
18
|
+
When in doubt, copy a snippet, adjust the path or repo, and arm it. Do
|
|
19
|
+
not invent new filters from scratch unless you have re-derived the
|
|
20
|
+
coverage check.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Pattern 1 — GitLab pipeline + GitHub mirror sync (post-push)
|
|
25
|
+
|
|
26
|
+
**When.** After `git push origin main` from `commands/close.md` Phase 6.
|
|
27
|
+
Watches the GitLab pipeline through to a terminal status, then prints
|
|
28
|
+
the GitHub mirror's main-branch SHA so the operator can confirm parity.
|
|
29
|
+
|
|
30
|
+
**Description.** `pipeline + mirror sync after push`
|
|
31
|
+
|
|
32
|
+
**timeout_ms.** `1800000` (30 min — most pipelines finish well inside)
|
|
33
|
+
|
|
34
|
+
**persistent.** `false`
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
prev=""
|
|
38
|
+
while true; do
|
|
39
|
+
s=$(glab ci status --pipeline-id LATEST --output json 2>/dev/null || echo '[]')
|
|
40
|
+
cur=$(jq -r '.[] | select(.status!="running" and .status!="pending") | "\(.name): \(.status)"' <<<"$s" 2>/dev/null | sort)
|
|
41
|
+
comm -13 <(echo "$prev") <(echo "$cur")
|
|
42
|
+
prev=$cur
|
|
43
|
+
jq -e 'all(.status=="success" or .status=="failed" or .status=="canceled" or .status=="skipped")' <<<"$s" >/dev/null 2>&1 && {
|
|
44
|
+
sha=$(gh api repos/Kanevry/session-orchestrator/commits/main --jq '.sha' 2>/dev/null || echo "(mirror unreachable)")
|
|
45
|
+
echo "GitHub mirror main: $sha"
|
|
46
|
+
break
|
|
47
|
+
}
|
|
48
|
+
sleep 30
|
|
49
|
+
done
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Coverage.** Emits a line for each job transitioning out of `running` /
|
|
53
|
+
`pending`. Terminates when **all** jobs are in a terminal state (`success`,
|
|
54
|
+
`failed`, `canceled`, `skipped`). The final line prints the GitHub mirror
|
|
55
|
+
SHA — silence at the end means glab JSON parsing failed (the `||` fallbacks
|
|
56
|
+
prevent the whole loop from dying).
|
|
57
|
+
|
|
58
|
+
**GitHub-mirror equivalent.** When the pipeline is GitHub-Actions-native (PR
|
|
59
|
+
checks rather than a GitLab pipeline), use `gh pr checks <pr> --watch --fail-fast`
|
|
60
|
+
as the `command` source — it streams each check transition and exits non-zero on
|
|
61
|
+
the first failure, so the terminal state is never silent.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Pattern 2 — Long-running test suite (`npm test` ≥ 2700 cases)
|
|
66
|
+
|
|
67
|
+
**When.** During a deep session's Quality wave when the suite takes long
|
|
68
|
+
enough that synchronous stdout is impractical. Monitor surfaces progress
|
|
69
|
+
and any failure signature without re-running the suite.
|
|
70
|
+
|
|
71
|
+
**Description.** `vitest progress + failure signatures`
|
|
72
|
+
|
|
73
|
+
**timeout_ms.** `1200000` (20 min)
|
|
74
|
+
|
|
75
|
+
**persistent.** `false`
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Pre-req: npm test 2>&1 | tee vitest.log was started in another terminal
|
|
79
|
+
tail -f vitest.log | grep -E --line-buffered \
|
|
80
|
+
"Test Files.*passed|Test Files.*failed|Tests.*failed|FAIL |PASS |Traceback|Error:|AssertionError|UnhandledRejection|OOM|Killed|Aborted"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Coverage.** Matches both success markers (`Test Files … passed`,
|
|
84
|
+
`PASS `) and the full failure surface: vitest's own
|
|
85
|
+
`FAIL ` / `Tests.*failed`, Node's `Traceback` / `AssertionError` /
|
|
86
|
+
`UnhandledRejection`, and OS-level kill signatures (`OOM`, `Killed`,
|
|
87
|
+
`Aborted`). A crashed worker produces at least one of the failure tokens
|
|
88
|
+
within 200 ms — never silent.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Pattern 3 — `autopilot.jsonl` live read-out
|
|
93
|
+
|
|
94
|
+
**When.** Operator runs `/autopilot --headless` in terminal A and wants
|
|
95
|
+
a live dashboard in terminal B without building telemetry tooling.
|
|
96
|
+
|
|
97
|
+
**Description.** `autopilot iteration + kill-switch tail`
|
|
98
|
+
|
|
99
|
+
**timeout_ms.** `3600000` (1 h — the 1 h ceiling this file uses; repo-internal convention, upstream documents no explicit `timeout_ms` maximum)
|
|
100
|
+
|
|
101
|
+
**persistent.** `true` (run for the lifetime of the session — autopilot
|
|
102
|
+
runs can take hours)
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
tail -f .orchestrator/metrics/autopilot.jsonl | jq -r --line-buffered '
|
|
106
|
+
select(.kind == "iteration" or .kind == "kill_switch" or .kind == "loop_end") |
|
|
107
|
+
"\(.timestamp) iter=\(.iteration // "—") mode=\(.mode // "—") status=\(.status // "—") kill=\(.kill_switch // "none")"
|
|
108
|
+
'
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Coverage.** Emits on three event kinds: per-iteration progress,
|
|
112
|
+
kill-switch firings (the ten tracked in
|
|
113
|
+
`scripts/lib/autopilot/kill-switches.mjs`), and the loop-end record. A
|
|
114
|
+
silent autopilot run means autopilot is not actually writing to the
|
|
115
|
+
JSONL — that itself is a signal worth surfacing manually.
|
|
116
|
+
|
|
117
|
+
**Detachment seam (Spike #640).** A headless autopilot run detached via
|
|
118
|
+
Bash `run_in_background` (`node scripts/autopilot.mjs --headless … &`)
|
|
119
|
+
is observed through the returned **task-id**, its **output-file**
|
|
120
|
+
(`.../tasks/<id>.output`), and the **completion notification** — never
|
|
121
|
+
through `TaskList` / `claude agents`, which lists nested *agent* sessions
|
|
122
|
+
only and returns "No tasks found" for a Bash-backgrounded process even
|
|
123
|
+
while the run is healthy. This JSONL tail is therefore the **primary live
|
|
124
|
+
view** once a run is detached, not a supplementary one. Stop a detached
|
|
125
|
+
run with `TaskStop(task_id)`, not the in-session `/tasks`/`/stop` slash
|
|
126
|
+
commands.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Pattern 4 — Vault-mirror backlog watcher (long sessions)
|
|
131
|
+
|
|
132
|
+
**When.** Multi-hour deep session where vault-mirror auto-commit (GH#31)
|
|
133
|
+
fires only at session-end / evolve. Surfaces drift before it accumulates.
|
|
134
|
+
|
|
135
|
+
**Description.** `vault 40-learnings/50-sessions backlog`
|
|
136
|
+
|
|
137
|
+
**timeout_ms.** `3600000` (1 h)
|
|
138
|
+
|
|
139
|
+
**persistent.** `true`
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
prev=0
|
|
143
|
+
while true; do
|
|
144
|
+
n=$(git -C ~/Projects/vault status --short 40-learnings/ 50-sessions/ 2>/dev/null | wc -l | tr -d ' ')
|
|
145
|
+
if [ "$n" != "$prev" ]; then
|
|
146
|
+
echo "$(date -u +%H:%M:%SZ) vault-mirror backlog: $n files"
|
|
147
|
+
prev=$n
|
|
148
|
+
fi
|
|
149
|
+
sleep 1800
|
|
150
|
+
done
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Coverage.** Emits **only on change** to keep the stream quiet during
|
|
154
|
+
idle work. A drop to zero is also reported (e.g. when session-end runs
|
|
155
|
+
mirror-commit). Silence = no drift, which is the desired idle state. The
|
|
156
|
+
30-min sleep matches the `1200s+` idle-tick band from
|
|
157
|
+
`.claude/rules/loop-and-monitor.md` LM-003 (idle observation-rate; under the
|
|
158
|
+
1-hour subscription cache TTL there is no cache penalty here anyway).
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Pattern 5 — GitHub mirror push verification (secret-scanner safety net)
|
|
163
|
+
|
|
164
|
+
**When.** After `git push github main` when there is any chance of a
|
|
165
|
+
secret-scanner false positive. The plugin hit one on 2026-04-28 (the
|
|
166
|
+
`${SCHEMA_DRIFT_TOKEN}` placeholder); silent push success without mirror
|
|
167
|
+
parity bit the operator a day later.
|
|
168
|
+
|
|
169
|
+
**Description.** `github mirror parity vs local main`
|
|
170
|
+
|
|
171
|
+
**timeout_ms.** `300000` (5 min — push usually completes in seconds; this is the wall-clock ceiling **for this watch**, **not** the `/loop` cadence band that LM-003 in `.claude/rules/loop-and-monitor.md` warns against)
|
|
172
|
+
|
|
173
|
+
**persistent.** `false`
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
local_sha=$(git rev-parse main)
|
|
177
|
+
prev=""
|
|
178
|
+
while true; do
|
|
179
|
+
remote_sha=$(gh api repos/Kanevry/session-orchestrator/commits/main --jq '.sha' 2>/dev/null || echo "unreachable")
|
|
180
|
+
if [ "$remote_sha" != "$prev" ]; then
|
|
181
|
+
if [ "$remote_sha" = "$local_sha" ]; then
|
|
182
|
+
echo "mirror parity OK: $remote_sha"
|
|
183
|
+
break
|
|
184
|
+
elif [ "$remote_sha" = "unreachable" ]; then
|
|
185
|
+
echo "$(date -u +%H:%M:%SZ) GitHub API unreachable — retrying"
|
|
186
|
+
else
|
|
187
|
+
echo "$(date -u +%H:%M:%SZ) mirror at $remote_sha (local $local_sha)"
|
|
188
|
+
fi
|
|
189
|
+
prev=$remote_sha
|
|
190
|
+
fi
|
|
191
|
+
sleep 15
|
|
192
|
+
done
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**Coverage.** Emits on every SHA transition and on API unreachability.
|
|
196
|
+
Terminates only when remote SHA matches local — never silent. If the
|
|
197
|
+
push was actually rejected by GitHub's secret scanner, the remote SHA
|
|
198
|
+
never advances and the watcher keeps emitting the stale-SHA line every
|
|
199
|
+
15 s until the operator notices.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Pattern 6 — WebSocket event source (`ws://` / `wss://`, v2.1.195+)
|
|
204
|
+
|
|
205
|
+
**When.** The upstream already speaks WebSocket (a CI relay, an error-tracker
|
|
206
|
+
push socket, a daemon's `GET /events` upgraded to WS). Point Monitor's `ws`
|
|
207
|
+
source at it directly — the server pushes each text frame as one notification,
|
|
208
|
+
so there is no polling script and no `grep --line-buffered` line-buffering
|
|
209
|
+
pitfall to get right. Prefer this over a `command` source whenever a socket is
|
|
210
|
+
available.
|
|
211
|
+
|
|
212
|
+
**Input shape.** Monitor takes a `ws` source *instead of* a `command` source —
|
|
213
|
+
the two are mutually exclusive, never combined:
|
|
214
|
+
|
|
215
|
+
```jsonc
|
|
216
|
+
{
|
|
217
|
+
"ws": {
|
|
218
|
+
"url": "wss://relay.internal.example/ci-events", // ws:// or wss:// only
|
|
219
|
+
"protocols": ["ci-events.v1"] // optional subprotocols
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
The `url` must be a bare `ws://`/`wss://` URL — **no embedded credentials, no
|
|
225
|
+
whitespace, ASCII-only**. Each inbound **text** message becomes one
|
|
226
|
+
notification (multi-line frames included). A **binary** frame is surfaced as the
|
|
227
|
+
placeholder `[binary frame, N bytes]` rather than decoded.
|
|
228
|
+
|
|
229
|
+
**Coverage / termination.** Two clean terminations and one **silent** one — the
|
|
230
|
+
silent case is the whole reason this pattern needs the silence-is-not-success
|
|
231
|
+
discipline:
|
|
232
|
+
|
|
233
|
+
- **Socket close** → the watch ends and reports the close code (a clean,
|
|
234
|
+
visible terminal state).
|
|
235
|
+
- **Frame > 1 MiB → the watch ends SILENTLY.** No close code, no error line —
|
|
236
|
+
it just stops. Therefore **always subscribe to a filtered / compact feed**
|
|
237
|
+
(a pre-narrowed event topic), **never a raw feed** whose payloads can cross
|
|
238
|
+
1 MiB. A raw firehose that occasionally emits a large frame is
|
|
239
|
+
indistinguishable from a healthy-but-quiet socket, which is exactly the
|
|
240
|
+
crash-reads-as-success trap this file exists to prevent.
|
|
241
|
+
|
|
242
|
+
**Caveats.**
|
|
243
|
+
|
|
244
|
+
- **Own approval prompt.** A `ws` source raises its own connect-approval prompt
|
|
245
|
+
and has **no "skip future" affordance** — each armed socket is approved
|
|
246
|
+
explicitly.
|
|
247
|
+
- **SSRF denials.** Monitor refuses `ws` URLs pointing at private,
|
|
248
|
+
link-local, or cloud-metadata hosts, and honours `sandbox.network.deniedDomains`
|
|
249
|
+
plus `allowManagedDomainsOnly`. Point it at a reachable, allow-listed relay,
|
|
250
|
+
not an internal-range host.
|
|
251
|
+
- **When to stay on `command`.** If frames must be filtered or reshaped
|
|
252
|
+
shell-side before they are notification-worthy, keep the `command` (tail/grep)
|
|
253
|
+
source per `.claude/rules/loop-and-monitor.md` LM-002 — the `ws` source
|
|
254
|
+
delivers frames verbatim, with no shell-side filter seam.
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Pattern — `/tmux-layout` (operator-side persistent visualization)
|
|
259
|
+
|
|
260
|
+
> Per ADR-0007 + GitLab #561 #562 #563. Opt-in skill, NOT Monitor/loop replacement.
|
|
261
|
+
|
|
262
|
+
`/tmux-layout` is a sibling primitive to `Monitor` and `/loop` — not a substitute. The three serve genuinely different purposes:
|
|
263
|
+
|
|
264
|
+
| Primitive | Purpose | When to use |
|
|
265
|
+
|---|---|---|
|
|
266
|
+
| **`Monitor` tool** | Event-driven stream → coordinator reaction | The coordinator must REACT to each terminal-state line (CI fails → take action, build error → patch). Each stdout line = one coordinator notification. |
|
|
267
|
+
| **`/loop` skill** | Periodic coordinator-side polling | "Check vault-staleness every 30 minutes while session runs." Lives inside the coordinator's turn budget. |
|
|
268
|
+
| **`/tmux-layout` skill** | Operator-side persistent visualization (4-pane) | The OPERATOR (human) wants to peripherally observe side-channels — STATE.md tail, CI watch, events.jsonl — in a SECOND terminal without coordinator reaction. Pure observability. |
|
|
269
|
+
|
|
270
|
+
**Key distinction:** `/tmux-layout` visualizes the *outputs* of `Monitor` and `/loop` peripherally so the coordinator pane stays focused on decisions (AUQ-001). It does NOT replace either — Pane 3 of the default layout, for example, runs a `glab ci status` poll-loop equivalent to a `/loop` cadence, but the coordinator does not see those refreshes (the operator does).
|
|
271
|
+
|
|
272
|
+
**See also:** `docs/adr/0007-tmux-visualization-substrate.md`, `skills/tmux-layout/SKILL.md`.
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## Anti-patterns
|
|
277
|
+
|
|
278
|
+
- **`tail -f log | grep "passed"`** — silent on failure. See LM-002.
|
|
279
|
+
- **`while true; do …; sleep 0.5; done`** with no change detection —
|
|
280
|
+
spams notifications and gets auto-stopped by Monitor's volume guard.
|
|
281
|
+
- **Forgetting `--line-buffered`** in `grep` pipes — pipe buffering
|
|
282
|
+
delays events by minutes, which usually masks itself as "no events".
|
|
283
|
+
- **Unbounded `tail -f` for one-shot signals** — use Bash with
|
|
284
|
+
`run_in_background` and an `until` loop instead. See the Monitor tool
|
|
285
|
+
docs.
|
|
286
|
+
- **Using Monitor as a `/loop` replacement for periodic scans without a
|
|
287
|
+
stream** (e.g. polling `glab issue list`). Use `/loop` dynamic mode.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## See also
|
|
292
|
+
|
|
293
|
+
- `.claude/rules/loop-and-monitor.md` — primitive routing (Monitor vs
|
|
294
|
+
`/loop` vs Routines)
|
|
295
|
+
- `.claude/loop.md` — bare-`/loop` body that delegates to Monitor where
|
|
296
|
+
appropriate
|
|
297
|
+
- "Background Detachment Test" (#640; archived in the private Meta-Vault) — empirical
|
|
298
|
+
verification of the Bash `run_in_background` + `TaskStop` detachment
|
|
299
|
+
seam behind Pattern 3
|
|
300
|
+
- Anthropic Monitor tool reference (in-session)
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Parallel-Aware AUQ Templates
|
|
2
|
+
|
|
3
|
+
> Three reusable AskUserQuestion blocks for the parallel-aware preamble (`parallel-aware-preamble.md`).
|
|
4
|
+
> Consumed by: autopilot, session-start, session-plan, wave-executor, session-end (5 orchestrator entry-points).
|
|
5
|
+
|
|
6
|
+
## When to fire which AUQ
|
|
7
|
+
|
|
8
|
+
Driven by the preamble's outcome (see `parallel-aware-preamble.md` § Outcome Handling):
|
|
9
|
+
|
|
10
|
+
| Preamble outcome | AUQ to fire |
|
|
11
|
+
|------------------|-------------|
|
|
12
|
+
| `EXCLUSIVE_BLOCKED` | Exclusive-Conflict AUQ (below) |
|
|
13
|
+
| `PROMOTION_OFFER` | Worktree-Promotion AUQ (below) |
|
|
14
|
+
| `PASS_THROUGH` | No AUQ |
|
|
15
|
+
|
|
16
|
+
The third variant — **Always-OK Pass-Through** — fires no AUQ; documented here only for completeness so callers don't reinvent it.
|
|
17
|
+
|
|
18
|
+
## Exclusive-Conflict AUQ (PRD §3 P1 row 2)
|
|
19
|
+
|
|
20
|
+
Fires when an `exclusive`-class session (`bootstrap`, `housekeeping`, `memory-cleanup`) is already active in the worktree-family AND the caller is NOT `always-ok`-class.
|
|
21
|
+
|
|
22
|
+
### Claude Code (AskUserQuestion)
|
|
23
|
+
|
|
24
|
+
```js
|
|
25
|
+
AskUserQuestion({
|
|
26
|
+
questions: [{
|
|
27
|
+
question: `An exclusive session is active in this repository (mode=${blockingSession.mode}, started ${ageHours}h ago, host=${blockingSession.host}, pid=${blockingSession.pid}, worktree=${blockingSession.worktreePath}). This blocks all other modes. How should I proceed?`,
|
|
28
|
+
header: "Parallel-Exclusive",
|
|
29
|
+
multiSelect: false,
|
|
30
|
+
options: [
|
|
31
|
+
{ label: "Warten (Recommended)", description: "Wait for the exclusive session to finish. The preamble will not retry automatically — re-run the command after the other session closes." },
|
|
32
|
+
{ label: "Andere Session beenden", description: "I will close the other session myself, then re-run this command. The preamble surfaces but does NOT terminate the other session." },
|
|
33
|
+
{ label: "Abbrechen", description: "Exit cleanly. No STATE.md initialization, no lock acquired." },
|
|
34
|
+
],
|
|
35
|
+
}],
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Codex CLI / Cursor IDE / Pi fallback (numbered Markdown list)
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
Parallel-Exclusive conflict — an exclusive session is active in this repository.
|
|
43
|
+
Mode: <blockingSession.mode>
|
|
44
|
+
Started: <ageHours>h ago (host=<host>, pid=<pid>)
|
|
45
|
+
Worktree: <blockingSession.worktreePath>
|
|
46
|
+
This blocks all other modes.
|
|
47
|
+
|
|
48
|
+
1. Warten (Recommended) — wait for the exclusive session to finish; re-run after it closes.
|
|
49
|
+
2. Andere Session beenden — I will close the other session myself.
|
|
50
|
+
3. Abbrechen — exit cleanly without initializing STATE.md.
|
|
51
|
+
|
|
52
|
+
Reply with the number of your choice.
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Outcome handling
|
|
56
|
+
|
|
57
|
+
- **Warten** → exit Phase-0 cleanly with stderr note `parallel-aware: waiting on exclusive session_id=<id>`. No retry loop.
|
|
58
|
+
- **Andere Session beenden** → exit Phase-0 cleanly with stderr note `parallel-aware: deferred to operator — exclusive session_id=<id>`. No automatic termination.
|
|
59
|
+
- **Abbrechen** → exit Phase-0 immediately. No file writes.
|
|
60
|
+
|
|
61
|
+
## Worktree-Promotion AUQ (PRD §3 P1 row 3)
|
|
62
|
+
|
|
63
|
+
Fires when the caller is `parallel-ok`-class AND another `parallel-ok` session is active in the SAME worktree (i.e., main worktree collision).
|
|
64
|
+
|
|
65
|
+
### Claude Code (AskUserQuestion)
|
|
66
|
+
|
|
67
|
+
```js
|
|
68
|
+
AskUserQuestion({
|
|
69
|
+
questions: [{
|
|
70
|
+
question: `A compatible parallel session is active in this worktree (mode=${parallelPeer.mode}, started ${ageHours}h ago, pid=${parallelPeer.pid}). You can either: (a) auto-promote to a sibling worktree to run isolated, or (b) run in-place alongside the existing session (file conflicts likely). How should I proceed?`,
|
|
71
|
+
header: "Worktree-Promo",
|
|
72
|
+
multiSelect: false,
|
|
73
|
+
options: [
|
|
74
|
+
{ label: "Worktree anlegen + starten (Recommended)", description: "Create a sibling git worktree at ../<repo-name>-<semantic-session-id>/ and start the new session there. Isolates file edits; recommended for parallel deep/feature sessions. Calls enterWorktree() from scripts/lib/autopilot/worktree-pipeline.mjs." },
|
|
75
|
+
{ label: "Manuell — in-place daneben", description: "Run in the current worktree alongside the existing session. File conflicts possible; PSA-001/002/004 discipline required. A Deviation is logged." },
|
|
76
|
+
{ label: "Abbrechen", description: "Exit cleanly. No STATE.md initialization." },
|
|
77
|
+
],
|
|
78
|
+
}],
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Codex CLI / Cursor IDE / Pi fallback (numbered Markdown list)
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
Worktree-Promotion offer — a compatible parallel session is active in this worktree.
|
|
86
|
+
Peer mode: <parallelPeer.mode>
|
|
87
|
+
Started: <ageHours>h ago (pid=<pid>)
|
|
88
|
+
|
|
89
|
+
1. Worktree anlegen + starten (Recommended) — create sibling worktree and start isolated session.
|
|
90
|
+
2. Manuell — in-place daneben — run alongside (file conflicts possible, Deviation logged).
|
|
91
|
+
3. Abbrechen — exit cleanly.
|
|
92
|
+
|
|
93
|
+
Reply with the number of your choice.
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Outcome handling
|
|
97
|
+
|
|
98
|
+
- **Worktree anlegen + starten** → invoke `enterWorktree({ basePath, sessionId, branch, repoRoot })` from `scripts/lib/autopilot/worktree-pipeline.mjs`. The helper creates a sibling worktree at `<basePath>/<repo-name>-<sessionId>/`, runs idempotency + boundary checks, and logs a WARN line to stderr on fresh creation. Once the worktree exists, exit the current preamble flow — the new worktree's own session-start runs from scratch (Phase 1 onwards). On failure (`WorktreeBoundaryError` or `git worktree add` non-zero exit), emit a stderr warning `parallel-aware: enterWorktree failed: <error>; falling back to Manuell` and proceed via the Manuell path.
|
|
99
|
+
- **Manuell** → append a Deviation via `appendDeviationOnDisk()`:
|
|
100
|
+
`Worktree-Auto-Promotion declined; running in-place alongside session_id=<peer.sessionId>, mode=<peer.mode>, pid=<peer.pid>. PSA-001/PSA-002/PSA-004 discipline applies.`
|
|
101
|
+
Continue Phase-0.
|
|
102
|
+
- **Abbrechen** → exit Phase-0 immediately. No file writes.
|
|
103
|
+
|
|
104
|
+
## Always-OK Pass-Through (no AUQ)
|
|
105
|
+
|
|
106
|
+
Fires when the caller's mode is in the `always-ok` class (`discovery`, `evolve`, `plan`, `repo-audit`, `portfolio`). The preamble returns `PASS_THROUGH` immediately regardless of other active sessions. No AUQ, no Deviation, no latency penalty.
|
|
107
|
+
|
|
108
|
+
```js
|
|
109
|
+
// Conceptual — there is NO AUQ for this case.
|
|
110
|
+
// The preamble returns { outcome: 'PASS_THROUGH', callerClass: 'always-ok', active }.
|
|
111
|
+
// The caller skill continues to Phase 1 unconditionally.
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
PRD §3 P1 row 5 specifies this is a hard guarantee — read-only modes never produce an interrupt.
|
|
115
|
+
|
|
116
|
+
## See Also
|
|
117
|
+
|
|
118
|
+
- `parallel-aware-preamble.md` — the preamble that fires these AUQs
|
|
119
|
+
- `.claude/rules/ask-via-tool.md` — AUQ-001 through AUQ-005 (always use the tool, not prose)
|
|
120
|
+
- `.claude/rules/parallel-sessions.md` — PSA-001/PSA-002 (overlap-check discipline)
|
|
121
|
+
- "Parallel-Aware Sessions" (#568; archived in the private Meta-Vault) § 3 P1 — Gherkin rows 2, 3, 5 that these AUQs satisfy
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# Parallel-Aware Preamble
|
|
2
|
+
|
|
3
|
+
> Single source of truth for the parallel-session-detection preamble.
|
|
4
|
+
> Referenced by: autopilot, session-start, session-plan, wave-executor, session-end (5 orchestrator entry-points).
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
Every session-orchestrator entry-point runs this preamble silently at Phase-0.x (after the bootstrap-gate, before config-reading). It detects other active sessions in the same repository worktree-family, classifies the caller's mode against the exclusivity-matrix, and either passes through, offers Worktree-Auto-Promotion (P3), or blocks via AskUserQuestion.
|
|
9
|
+
|
|
10
|
+
When no parallel session is detected, execution continues with zero overhead. When a conflict is detected, the appropriate AUQ from `parallel-aware-auq.md` fires.
|
|
11
|
+
|
|
12
|
+
## Gate Classes
|
|
13
|
+
|
|
14
|
+
The preamble applies one of three gate semantics based on the caller's mode-class:
|
|
15
|
+
|
|
16
|
+
<HARD-GATE>
|
|
17
|
+
**Exclusive class** (`bootstrap`, `housekeeping`, `memory-cleanup`):
|
|
18
|
+
If any other active session exists in the worktree-family, you MUST NOT proceed. The preamble fires the Exclusive-Conflict AUQ from `parallel-aware-auq.md` (`[Warten / Andere Session beenden / Abbrechen]`).
|
|
19
|
+
There is no bypass. There is no exception for urgent housekeeping. The ONLY valid next action is the user's AUQ response.
|
|
20
|
+
</HARD-GATE>
|
|
21
|
+
|
|
22
|
+
<SOFT-GATE>
|
|
23
|
+
**Parallel-OK class** (`deep`, `feature`):
|
|
24
|
+
If another `parallel-ok`-class session is active in the same worktree, the preamble offers Worktree-Auto-Promotion via the Promotion AUQ from `parallel-aware-auq.md` (`[Worktree anlegen + starten (Recommended) / Manuell / Abbrechen]`). The user may proceed in-place by selecting "Manuell" — the preamble logs a Deviation but does not block.
|
|
25
|
+
|
|
26
|
+
If an `exclusive`-class session is also active, the Exclusive-Conflict AUQ takes precedence (HARD-GATE wins).
|
|
27
|
+
</SOFT-GATE>
|
|
28
|
+
|
|
29
|
+
**Always-OK class** (`discovery`, `evolve`, `plan`, `repo-audit`, `portfolio`):
|
|
30
|
+
The preamble passes through with zero AUQ regardless of other active sessions. Read-only modes never conflict.
|
|
31
|
+
|
|
32
|
+
## Preamble Algorithm
|
|
33
|
+
|
|
34
|
+
Execute these steps in order. Any classification determines outcome.
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
1. Call findPeers(repoRoot, { mySessionId: callerSessionId }) from scripts/lib/peer-discovery.mjs.
|
|
38
|
+
- Returns: { peers: Array<{source, sessionId, mode, pid, host, worktreePath, ageHours?, currentWave?}> }
|
|
39
|
+
- Phase 0.5 consumes the non-'state-md' subset: peers.filter(p => p.source !== 'state-md').
|
|
40
|
+
- 2-second timeout built-in (via discoverActiveSessions). On timeout or git failure: A1 fallback (single-worktree mode).
|
|
41
|
+
- Empty active list → no parallel context → PASS_THROUGH (continue immediately).
|
|
42
|
+
|
|
43
|
+
2. Classify the caller's mode via classifyMode(callerMode) from scripts/lib/exclusivity-matrix.mjs.
|
|
44
|
+
- GOTCHA: classifyMode throws on unknown mode. Wrap in try/catch; on throw, default to 'parallel-ok' (most permissive default) and log a stderr WARN.
|
|
45
|
+
- Returns: 'exclusive' | 'parallel-ok' | 'always-ok'
|
|
46
|
+
|
|
47
|
+
3. Apply the decision matrix:
|
|
48
|
+
- If callerClass === 'always-ok' → return PASS_THROUGH (no AUQ; preamble done).
|
|
49
|
+
- For each active session, classify entry.mode via classifyMode (same safe fallback).
|
|
50
|
+
- If any entry has entryClass === 'exclusive' AND callerClass !== 'always-ok':
|
|
51
|
+
→ fire Exclusive-Conflict AUQ from parallel-aware-auq.md
|
|
52
|
+
→ block until user response
|
|
53
|
+
- Else if callerClass === 'parallel-ok' AND any entry has entryClass === 'parallel-ok':
|
|
54
|
+
→ fire Promotion AUQ from parallel-aware-auq.md
|
|
55
|
+
→ user may pick "Worktree anlegen" (P3 fills the action), "Manuell" (in-place + Deviation), or "Abbrechen" (exit)
|
|
56
|
+
- Otherwise (no overlap) → return PASS_THROUGH.
|
|
57
|
+
|
|
58
|
+
4. Record any non-PASS_THROUGH outcome as a Deviation in STATE.md via appendDeviationOnDisk().
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Implementation (JavaScript reference)
|
|
62
|
+
|
|
63
|
+
```js
|
|
64
|
+
import { findPeers } from '../../scripts/lib/peer-discovery.mjs';
|
|
65
|
+
import { classifyMode } from '../../scripts/lib/exclusivity-matrix.mjs';
|
|
66
|
+
|
|
67
|
+
async function runParallelAwarePreamble({ repoRoot, callerMode, callerSessionId }) {
|
|
68
|
+
// Step 1: discover active sessions via unified findPeers (fail-open, never throws).
|
|
69
|
+
// Phase 0.5 consumes only the non-'state-md' subset (lock+registry surface).
|
|
70
|
+
// The 'state-md' subset is reserved for Phase 1.2.1 (peer-guard after lock acquire).
|
|
71
|
+
let active;
|
|
72
|
+
try {
|
|
73
|
+
const { peers } = await findPeers(repoRoot, { mySessionId: callerSessionId });
|
|
74
|
+
active = peers.filter((p) => p.source !== 'state-md');
|
|
75
|
+
} catch (err) {
|
|
76
|
+
process.stderr.write(`[parallel-aware-preamble] WARN: findPeers failed: ${err.message} — passing through (A1 fallback)\n`);
|
|
77
|
+
return { outcome: 'PASS_THROUGH', reason: 'discovery-error' };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Step 2: classify caller (safe — never throw)
|
|
81
|
+
let callerClass;
|
|
82
|
+
try {
|
|
83
|
+
callerClass = classifyMode(callerMode);
|
|
84
|
+
} catch {
|
|
85
|
+
process.stderr.write(`[parallel-aware-preamble] WARN: unknown mode '${callerMode}' — defaulting to 'parallel-ok'\n`);
|
|
86
|
+
callerClass = 'parallel-ok';
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Step 3: always-ok passes through
|
|
90
|
+
if (callerClass === 'always-ok') return { outcome: 'PASS_THROUGH', callerClass, active };
|
|
91
|
+
|
|
92
|
+
// Step 4: empty active list → no conflict
|
|
93
|
+
if (!Array.isArray(active) || active.length === 0) {
|
|
94
|
+
return { outcome: 'PASS_THROUGH', callerClass, active: [] };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Step 5: classify each entry (safe)
|
|
98
|
+
const classifiedActive = active.map((entry) => {
|
|
99
|
+
let entryClass;
|
|
100
|
+
try { entryClass = classifyMode(entry.mode); } catch { entryClass = 'parallel-ok'; }
|
|
101
|
+
return { ...entry, _class: entryClass };
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// Step 6: decision matrix
|
|
105
|
+
const exclusiveActive = classifiedActive.find((e) => e._class === 'exclusive' && e.sessionId !== callerSessionId);
|
|
106
|
+
if (exclusiveActive && callerClass !== 'always-ok') {
|
|
107
|
+
return { outcome: 'EXCLUSIVE_BLOCKED', callerClass, blockingSession: exclusiveActive, active: classifiedActive };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const parallelPeer = callerClass === 'parallel-ok'
|
|
111
|
+
? classifiedActive.find((e) => e._class === 'parallel-ok' && e.sessionId !== callerSessionId)
|
|
112
|
+
: null;
|
|
113
|
+
if (parallelPeer) {
|
|
114
|
+
return { outcome: 'PROMOTION_OFFER', callerClass, parallelPeer, active: classifiedActive };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return { outcome: 'PASS_THROUGH', callerClass, active: classifiedActive };
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Outcome Handling
|
|
122
|
+
|
|
123
|
+
The skill consuming the preamble translates the outcome:
|
|
124
|
+
|
|
125
|
+
| Outcome | Action |
|
|
126
|
+
|---------|--------|
|
|
127
|
+
| `PASS_THROUGH` | Continue immediately. No AUQ. Pre-P1.3 behavior. |
|
|
128
|
+
| `EXCLUSIVE_BLOCKED` | Fire Exclusive-Conflict AUQ from `parallel-aware-auq.md`. Block until user response. On "Abbrechen": exit cleanly. On "Andere Session beenden": surface to user (preamble does NOT kill other session). On "Warten": pause Phase 0; re-run preamble on user retry. |
|
|
129
|
+
| `PROMOTION_OFFER` | Fire Promotion AUQ from `parallel-aware-auq.md`. On "Worktree anlegen": call enterWorktree() from worktree-pipeline.mjs (see parallel-aware-auq.md outcome-handling). On "Manuell": append Deviation (`Worktree-Auto-Promotion declined; running in-place alongside session_id=<peer.sessionId>`) and continue. On "Abbrechen": exit. |
|
|
130
|
+
|
|
131
|
+
## Phase 1b Peer-Guard (defense-in-depth)
|
|
132
|
+
|
|
133
|
+
After Phase 0.5 (parallel-aware preamble) and Phase 1.2 (session-lock acquire), session-start Phase 1b initializes STATE.md. Before overwriting, the guard MUST run — via `findPeers(repoRoot, { mySessionId })` consuming the `state-md`-sourced subset (which delegates internally to `scripts/lib/state-md-peer-guard.mjs:checkPeerStateMd()`).
|
|
134
|
+
|
|
135
|
+
If `findPeers` yields a `state-md`-sourced peer (non-null), fire the Worktree-Promotion AUQ from `parallel-aware-auq.md`. This catches races where the preamble's lock-based detection missed an active peer (e.g., a session whose lock was force-deleted but STATE.md is still status:active).
|
|
136
|
+
|
|
137
|
+
The guard is a SOFT-GATE — operator can override, but the warning is mandatory.
|
|
138
|
+
|
|
139
|
+
### Guard decision tree (for Phase 1b callers)
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
findPeers(repoRoot, { mySessionId }) → peer = peers.find((p) => p.source === 'state-md') →
|
|
143
|
+
peer === null → safe to write STATE.md; continue Phase 1b normally.
|
|
144
|
+
peer !== null → fire Promotion AUQ (parallel-aware-auq.md "Promotion" block).
|
|
145
|
+
On "Worktree anlegen": enterWorktree() → continue in sibling.
|
|
146
|
+
On "Manuell": appendDeviationOnDisk() + continue in-place.
|
|
147
|
+
On "Abbrechen": exit cleanly.
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Integration reference
|
|
151
|
+
|
|
152
|
+
```js
|
|
153
|
+
import { findPeers } from '../../scripts/lib/peer-discovery.mjs';
|
|
154
|
+
|
|
155
|
+
// Inside Phase 1b, before writing STATE.md:
|
|
156
|
+
const { peers } = await findPeers(repoRoot, { mySessionId: sessionId });
|
|
157
|
+
const peer = peers.find((p) => p.source === 'state-md') ?? null;
|
|
158
|
+
// Phase 1.2.1 consumes only the 'state-md' subset (STATE.md surface only).
|
|
159
|
+
if (peer !== null) {
|
|
160
|
+
// peer.sessionId, peer.mode, peer.currentWave, peer.ageHours are populated.
|
|
161
|
+
// Fire the Promotion AUQ — do NOT silently overwrite.
|
|
162
|
+
// ... AUQ logic per parallel-aware-auq.md ...
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Cross-References
|
|
167
|
+
|
|
168
|
+
- **Discovery layer:** `scripts/lib/session-discovery.mjs` (`discoverActiveSessions`, `findWorktrees`) — shipped in P1.1 #569
|
|
169
|
+
- **Classification:** `scripts/lib/exclusivity-matrix.mjs` (`EXCLUSIVITY_MATRIX`, `classifyMode`) — shipped in P1.1 #569
|
|
170
|
+
- **Lock integration:** `scripts/lib/session-lock.mjs:acquire()` extended in P1.2 #570 — accepts pre-computed `activeSessions[]` and returns matrix-aware reasons (`active-incompatible-exclusive`, `active-compatible-parallel`, `active-readonly-bypass`)
|
|
171
|
+
- **AUQ patterns:** `parallel-aware-auq.md` (three reusable AUQ blocks) — sibling file
|
|
172
|
+
- **Deviation logging:** `scripts/lib/state-md.mjs:appendDeviationOnDisk()`
|
|
173
|
+
- **Phase 1b peer-guard:** `scripts/lib/state-md-peer-guard.mjs:checkPeerStateMd()` — shipped in #588
|
|
174
|
+
|
|
175
|
+
## Idempotency
|
|
176
|
+
|
|
177
|
+
The preamble is read-only relative to repository state (no file writes unless the user picks an action). Repeated invocation produces the same outcome given the same active-session set. Safe to call multiple times in the same skill invocation if the caller wants to re-check after a wait period.
|
|
178
|
+
|
|
179
|
+
The Promotion AUQ's "Worktree anlegen" path (P3.1) creates a new sibling worktree and is NOT idempotent — re-running after promotion discovers the new worktree as an active session (which is intended behavior).
|
|
180
|
+
|
|
181
|
+
## See Also
|
|
182
|
+
|
|
183
|
+
- `bootstrap-gate.md` — sibling Phase-0 gate (HARD; orthogonal layer)
|
|
184
|
+
- `.claude/rules/parallel-sessions.md` — PSA-001 through PSA-006 (behavioural rules complementing this mechanical layer)
|
|
185
|
+
- "Parallel-Aware Sessions" (#568; archived in the private Meta-Vault) § 3 P1 + § 3.A P1 — acceptance criteria this preamble satisfies
|