session-orchestrator 3.24.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/architecture/SKILL.md +18 -0
- package/.agents/skills/autopilot/SKILL.md +17 -0
- package/.agents/skills/bootstrap/SKILL.md +20 -0
- package/.agents/skills/brainstorm/SKILL.md +22 -0
- package/.agents/skills/claude-md-drift-check/SKILL.md +15 -0
- package/.agents/skills/convergence-monitoring/SKILL.md +22 -0
- package/.agents/skills/debug/SKILL.md +22 -0
- package/.agents/skills/discovery/SKILL.md +20 -0
- package/.agents/skills/dispatcher/SKILL.md +15 -0
- package/.agents/skills/docs-orchestrator/SKILL.md +18 -0
- package/.agents/skills/ecosystem-health/SKILL.md +20 -0
- package/.agents/skills/eli5/SKILL.md +20 -0
- package/.agents/skills/eval/SKILL.md +21 -0
- package/.agents/skills/evolve/SKILL.md +21 -0
- package/.agents/skills/frontmatter-guard/SKILL.md +15 -0
- package/.agents/skills/gitlab-ops/SKILL.md +20 -0
- package/.agents/skills/gitlab-portfolio/SKILL.md +15 -0
- package/.agents/skills/grill/SKILL.md +22 -0
- package/.agents/skills/hook-development/SKILL.md +15 -0
- package/.agents/skills/mcp-builder/SKILL.md +15 -0
- package/.agents/skills/memory-cleanup/SKILL.md +21 -0
- package/.agents/skills/mode-selector/SKILL.md +17 -0
- package/.agents/skills/npm-publish/SKILL.md +16 -0
- package/.agents/skills/peekaboo-driver/SKILL.md +18 -0
- package/.agents/skills/persona-panel/SKILL.md +17 -0
- package/.agents/skills/plan/SKILL.md +20 -0
- package/.agents/skills/playwright-driver/SKILL.md +20 -0
- package/.agents/skills/quality-gates/SKILL.md +20 -0
- package/.agents/skills/reconcile/SKILL.md +21 -0
- package/.agents/skills/remote-offload/SKILL.md +20 -0
- package/.agents/skills/repo-audit/SKILL.md +16 -0
- package/.agents/skills/session-end/SKILL.md +20 -0
- package/.agents/skills/session-plan/SKILL.md +20 -0
- package/.agents/skills/session-start/SKILL.md +20 -0
- package/.agents/skills/spinout/SKILL.md +16 -0
- package/.agents/skills/sunset-review/SKILL.md +16 -0
- package/.agents/skills/test-runner/SKILL.md +20 -0
- package/.agents/skills/tmux-layout/SKILL.md +21 -0
- package/.agents/skills/using-orchestrator/SKILL.md +17 -0
- package/.agents/skills/vault-mirror/SKILL.md +15 -0
- package/.agents/skills/vault-sync/SKILL.md +15 -0
- package/.agents/skills/wave-executor/SKILL.md +20 -0
- package/.agents/skills/write-executable-plan/SKILL.md +22 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +3 -2
- package/.codex-plugin/skills/architecture/SKILL.md +20 -0
- package/.codex-plugin/skills/autopilot/SKILL.md +21 -0
- package/.codex-plugin/skills/autopilot/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/bootstrap/SKILL.md +22 -0
- package/.codex-plugin/skills/bootstrap/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/brainstorm/SKILL.md +22 -0
- package/.codex-plugin/skills/brainstorm/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/claude-md-drift-check/SKILL.md +17 -0
- package/.codex-plugin/skills/close/SKILL.md +21 -0
- package/.codex-plugin/skills/close/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/convergence-monitoring/SKILL.md +24 -0
- package/.codex-plugin/skills/debug/SKILL.md +21 -0
- package/.codex-plugin/skills/debug/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/discovery/SKILL.md +21 -0
- package/.codex-plugin/skills/discovery/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/dispatcher/SKILL.md +21 -0
- package/.codex-plugin/skills/dispatcher/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/docs-orchestrator/SKILL.md +20 -0
- package/.codex-plugin/skills/ecosystem-health/SKILL.md +22 -0
- package/.codex-plugin/skills/eli5/SKILL.md +21 -0
- package/.codex-plugin/skills/eli5/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/eval/SKILL.md +21 -0
- package/.codex-plugin/skills/eval/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/evolve/SKILL.md +21 -0
- package/.codex-plugin/skills/evolve/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/frontmatter-guard/SKILL.md +17 -0
- package/.codex-plugin/skills/gitlab-ops/SKILL.md +22 -0
- package/.codex-plugin/skills/gitlab-portfolio/SKILL.md +17 -0
- package/.codex-plugin/skills/go/SKILL.md +22 -0
- package/.codex-plugin/skills/go/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/grill/SKILL.md +21 -0
- package/.codex-plugin/skills/grill/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/harness-audit/SKILL.md +19 -0
- package/.codex-plugin/skills/harness-audit/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/hook-development/SKILL.md +17 -0
- package/.codex-plugin/skills/mcp-builder/SKILL.md +17 -0
- package/.codex-plugin/skills/memory-cleanup/SKILL.md +21 -0
- package/.codex-plugin/skills/memory-cleanup/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/mode-selector/SKILL.md +19 -0
- package/.codex-plugin/skills/npm-publish/SKILL.md +18 -0
- package/.codex-plugin/skills/peekaboo-driver/SKILL.md +20 -0
- package/.codex-plugin/skills/persona-panel/SKILL.md +22 -0
- package/.codex-plugin/skills/persona-panel/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/plan/SKILL.md +22 -0
- package/.codex-plugin/skills/plan/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/playwright-driver/SKILL.md +22 -0
- package/.codex-plugin/skills/portfolio/SKILL.md +21 -0
- package/.codex-plugin/skills/portfolio/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/quality-gates/SKILL.md +22 -0
- package/.codex-plugin/skills/reconcile/SKILL.md +21 -0
- package/.codex-plugin/skills/reconcile/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/release/SKILL.md +22 -0
- package/.codex-plugin/skills/release/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/remote-offload/SKILL.md +22 -0
- package/.codex-plugin/skills/repo-audit/SKILL.md +19 -0
- package/.codex-plugin/skills/repo-audit/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/session/SKILL.md +21 -0
- package/.codex-plugin/skills/session/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/session-end/SKILL.md +22 -0
- package/.codex-plugin/skills/session-plan/SKILL.md +22 -0
- package/.codex-plugin/skills/session-start/SKILL.md +22 -0
- package/.codex-plugin/skills/spinout/SKILL.md +21 -0
- package/.codex-plugin/skills/spinout/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/sunset-review/SKILL.md +21 -0
- package/.codex-plugin/skills/sunset-review/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/templates-ack/SKILL.md +21 -0
- package/.codex-plugin/skills/templates-ack/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/test/SKILL.md +21 -0
- package/.codex-plugin/skills/test/agents/openai.yaml +5 -0
- package/.codex-plugin/skills/test-runner/SKILL.md +22 -0
- package/.codex-plugin/skills/tmux-layout/SKILL.md +23 -0
- package/.codex-plugin/skills/using-orchestrator/SKILL.md +19 -0
- package/.codex-plugin/skills/vault-mirror/SKILL.md +17 -0
- package/.codex-plugin/skills/vault-sync/SKILL.md +17 -0
- package/.codex-plugin/skills/wave-executor/SKILL.md +22 -0
- package/.codex-plugin/skills/write-executable-plan/SKILL.md +24 -0
- package/.cursor/commands/autopilot.md +2 -2
- package/.cursor/commands/bootstrap.md +1 -1
- package/.cursor/commands/brainstorm.md +1 -1
- package/.cursor/commands/debug.md +1 -1
- package/.cursor/commands/discovery.md +1 -1
- package/.cursor/commands/dispatcher.md +2 -2
- package/.cursor/commands/eli5.md +2 -2
- package/.cursor/commands/eval.md +2 -2
- package/.cursor/commands/evolve.md +1 -1
- package/.cursor/commands/go.md +1 -1
- package/.cursor/commands/grill.md +2 -2
- package/.cursor/commands/memory-cleanup.md +2 -2
- package/.cursor/commands/persona-panel.md +1 -1
- package/.cursor/commands/plan.md +1 -1
- package/.cursor/commands/portfolio.md +1 -1
- package/.cursor/commands/reconcile.md +2 -2
- package/.cursor/commands/release.md +2 -2
- package/.cursor/commands/session.md +2 -2
- package/.cursor/commands/spinout.md +2 -2
- package/.cursor/commands/sunset-review.md +2 -2
- package/.cursor/commands/templates-ack.md +2 -2
- package/.cursor/commands/test.md +2 -2
- package/.cursor/skills/brainstorm/SKILL.md +1 -1
- package/.cursor/skills/eval/SKILL.md +1 -1
- package/.cursor/skills/quality-gates/SKILL.md +1 -1
- package/.cursor/skills/remote-offload/SKILL.md +1 -1
- package/.cursor-plugin/plugin.json +30 -0
- package/.orchestrator/policy/blocked-commands.json +121 -0
- package/.orchestrator/policy/ecosystem.schema.json +66 -0
- package/.orchestrator/policy/quality-gates.example.json +16 -0
- package/.orchestrator/policy/quality-gates.schema.json +38 -0
- package/.orchestrator/policy/templates-policy.json +27 -0
- package/.orchestrator/policy/test-profiles.json +47 -0
- package/AGENTS.md +225 -0
- package/CHANGELOG.md +1314 -2
- package/NOTICE +11 -6
- package/README.md +135 -94
- package/agents/eval-judge.md +1 -1
- package/agents/skill-applied-judge.md +1 -1
- package/assets/wave-lifecycle.svg +98 -0
- package/commands/release.md +6 -3
- package/commands/session.md +18 -3
- package/docs/README.md +4 -0
- package/{agents/AGENTS.md → docs/agent-authoring.md} +19 -26
- package/docs/baseline.md +67 -0
- package/docs/ci-setup.md +108 -62
- package/docs/codex-setup.md +107 -29
- package/docs/components.md +38 -16
- package/docs/cursor-setup.md +6 -2
- package/docs/events-schema.md +9 -6
- package/docs/instruction-delivery.md +69 -0
- package/{agents/memory-proposal-collector.md → docs/memory-proposal-flow.md} +1 -8
- package/docs/migration-v4.md +365 -0
- package/docs/pi-setup.md +6 -1
- package/docs/plugin-architecture-v3.md +1 -1
- package/docs/rule-authoring.md +85 -19
- package/docs/scope-collision-guard.md +5 -5
- package/docs/session-config-reference.md +57 -56
- package/docs/session-config-template.md +6 -29
- package/docs/telemetry.md +157 -3
- package/docs/vault-docs-architecture.md +50 -11
- package/hooks/_lib/hook-import-set.json +1488 -0
- package/hooks/_lib/subagent-transcript.mjs +562 -0
- package/hooks/config-protection.mjs +2 -2
- package/hooks/cwd-change-restore.mjs +2 -2
- package/hooks/enforce-commands.mjs +69 -0
- package/hooks/hooks-codex.json +1 -1
- package/hooks/hooks-cursor.json +10 -0
- package/hooks/hooks-pi.json +5 -0
- package/hooks/hooks.json +6 -1
- package/hooks/loop-guard.mjs +3 -3
- package/hooks/on-session-end.mjs +2 -2
- package/hooks/on-session-start.mjs +103 -2
- package/hooks/on-stop.mjs +60 -14
- package/hooks/operator-steer.mjs +2 -2
- package/hooks/post-bash-write-verify.mjs +85 -0
- package/hooks/post-edit-import-probe.mjs +344 -0
- package/hooks/post-subagent-discovery-validator.mjs +187 -431
- package/hooks/post-tool-batch-wave-signal.mjs +118 -4
- package/hooks/post-tool-failure-corrective-context.mjs +2 -2
- package/hooks/post-tooluse-frontend-slop.mjs +3 -3
- package/hooks/pre-bash-destructive-guard.mjs +39 -13
- package/hooks/skill-invocation-telemetry.mjs +17 -5
- package/hooks/subagent-telemetry.mjs +13 -4
- package/monitors/monitors.json +3 -3
- package/package.json +9 -1
- package/pi/prompts/session.md +2 -2
- package/scripts/backfill-abandoned-sessions.mjs +50 -4
- package/scripts/backfill-learnings-from-vault.mjs +9 -3
- package/scripts/dialectic-deriver.mjs +73 -8
- package/scripts/export-hw-learnings.mjs +113 -1
- package/scripts/generate-agents-skills.mjs +378 -0
- package/scripts/generate-codex-skills.mjs +246 -0
- package/scripts/generate-cursor-adapter.mjs +45 -8
- package/scripts/generate-hook-import-set.mjs +292 -0
- package/scripts/lib/agent-status.mjs +13 -2
- package/scripts/lib/auto-dream.mjs +38 -36
- package/scripts/lib/autonomy/suitability.mjs +6 -0
- package/scripts/lib/autopilot/loop.mjs +2 -2
- package/scripts/lib/ci-status-banner.mjs +220 -75
- package/scripts/lib/codex/plugin-contract.mjs +88 -6
- package/scripts/lib/config/auto-dream.mjs +2 -1
- package/scripts/lib/config/block-header.mjs +8 -0
- package/scripts/lib/config/block-preprocess.mjs +177 -0
- package/scripts/lib/config/broken-window.mjs +2 -1
- package/scripts/lib/config/cold-start.mjs +2 -1
- package/scripts/lib/config/config-protection.mjs +22 -2
- package/scripts/lib/config/context-coverage.mjs +2 -1
- package/scripts/lib/config/cross-repo.mjs +2 -1
- package/scripts/lib/config/custom-phases.mjs +2 -1
- package/scripts/lib/config/dialectic.mjs +2 -1
- package/scripts/lib/config/discovery-validator.mjs +2 -1
- package/scripts/lib/config/dispatcher-autonomy-capture.mjs +24 -1
- package/scripts/lib/config/dispatcher-autonomy.mjs +2 -1
- package/scripts/lib/config/docs-orchestrator.mjs +2 -1
- package/scripts/lib/config/docs-staleness.mjs +2 -1
- package/scripts/lib/config/drift-check.mjs +2 -1
- package/scripts/lib/config/eval.mjs +2 -1
- package/scripts/lib/config/events-rotation.mjs +2 -1
- package/scripts/lib/config/evolve.mjs +8 -2
- package/scripts/lib/config/frontend-slop-hook.mjs +7 -3
- package/scripts/lib/config/gitlab-portfolio.mjs +2 -1
- package/scripts/lib/config/handover-gate.mjs +2 -1
- package/scripts/lib/config/health-endpoints.mjs +7 -2
- package/scripts/lib/config/host-paths.mjs +20 -4
- package/scripts/lib/config/issue-budget.mjs +2 -1
- package/scripts/lib/config/loop-guard.mjs +2 -1
- package/scripts/lib/config/memory.mjs +2 -1
- package/scripts/lib/config/moc-staleness.mjs +2 -1
- package/scripts/lib/config/persona-gate-wave.mjs +2 -1
- package/scripts/lib/config/private-config-dir.mjs +67 -0
- package/scripts/lib/config/reconcile.mjs +2 -1
- package/scripts/lib/config/remote-hosts.mjs +2 -1
- package/scripts/lib/config/section-extractor.mjs +7 -1
- package/scripts/lib/config/skill-evolution.mjs +2 -1
- package/scripts/lib/config/slopcheck.mjs +2 -1
- package/scripts/lib/config/state-md-lock.mjs +2 -1
- package/scripts/lib/config/templates-first.mjs +2 -1
- package/scripts/lib/config/test.mjs +2 -1
- package/scripts/lib/config/vault-integration.mjs +7 -1
- package/scripts/lib/config/vault-mirror-quality.mjs +2 -1
- package/scripts/lib/config/vault-staleness.mjs +2 -1
- package/scripts/lib/config/vault-sync.mjs +2 -1
- package/scripts/lib/config/verification-auto-fix.mjs +2 -1
- package/scripts/lib/config/wave-reviewers.mjs +2 -1
- package/scripts/lib/config/worktree-orphans.mjs +2 -1
- package/scripts/lib/convergence-monitor.mjs +82 -16
- package/scripts/lib/dispatcher/rank.mjs +124 -48
- package/scripts/lib/ecosystem-health.mjs +16 -2
- package/scripts/lib/eval/engine.mjs +9 -1
- package/scripts/lib/eval/session-resolve.mjs +23 -4
- package/scripts/lib/events.mjs +22 -6
- package/scripts/lib/frontmatter-guard.mjs +131 -13
- package/scripts/lib/gates/gate-full.mjs +30 -0
- package/scripts/lib/gates/gate-helpers.mjs +76 -0
- package/scripts/lib/hardware-pattern-detector.mjs +18 -1
- package/scripts/lib/harness-audit/categories/category4.mjs +31 -11
- package/scripts/lib/host-identity.mjs +50 -11
- package/scripts/lib/instruction-budget-guard.mjs +171 -5
- package/scripts/lib/learnings/evolve-telemetry.mjs +178 -0
- package/scripts/lib/learnings/io.mjs +60 -6
- package/scripts/lib/memory-proposals/store.mjs +30 -22
- package/scripts/lib/owner-config-banner.mjs +41 -6
- package/scripts/lib/owner-config-loader.mjs +21 -10
- package/scripts/lib/owner-interview.mjs +3 -3
- package/scripts/lib/owner-yaml.mjs +215 -15
- package/scripts/lib/platform.mjs +108 -15
- package/scripts/lib/plugin-update-banner.mjs +414 -0
- package/scripts/lib/project-hygiene.mjs +38 -2
- package/scripts/lib/qg-command-drift-banner.mjs +50 -12
- package/scripts/lib/quality-gate.mjs +133 -44
- package/scripts/lib/reconcile/emitter.mjs +68 -6
- package/scripts/lib/reconcile/engine.mjs +51 -11
- package/scripts/lib/reconcile/idempotency.mjs +37 -4
- package/scripts/lib/reconcile/writer.mjs +40 -18
- package/scripts/lib/session-close-backfill.mjs +67 -9
- package/scripts/lib/session-id.mjs +12 -23
- package/scripts/lib/session-identity/own-session.mjs +125 -10
- package/scripts/lib/session-lock-shape.mjs +43 -0
- package/scripts/lib/session-lock.mjs +5 -10
- package/scripts/lib/session-registry.mjs +25 -9
- package/scripts/lib/session-schema/constants.mjs +64 -3
- package/scripts/lib/session-schema/validator.mjs +38 -4
- package/scripts/lib/session-start-probes.mjs +30 -1
- package/scripts/lib/sessions-staleness-banner.mjs +18 -11
- package/scripts/lib/skill-health/join.mjs +17 -4
- package/scripts/lib/state-md.mjs +78 -0
- package/scripts/lib/sunset/walker.mjs +6 -0
- package/scripts/lib/telemetry/schema.mjs +202 -9
- package/scripts/lib/telemetry/sync.mjs +368 -12
- package/scripts/lib/telemetry-flush-health-banner.mjs +211 -0
- package/scripts/lib/validate/check-agents-skills.mjs +327 -0
- package/scripts/lib/validate/check-agents.mjs +3 -3
- package/scripts/lib/validate/check-codex-skills.mjs +191 -0
- package/scripts/lib/validate/check-cursor-adapter.mjs +234 -72
- package/scripts/lib/validate/check-hooks-symmetry.mjs +45 -16
- package/scripts/lib/validate/check-owner-leakage.mjs +319 -22
- package/scripts/lib/validate/check-skill-links.mjs +193 -0
- package/scripts/lib/validate/check-skill-script-paths.mjs +47 -28
- package/scripts/lib/validate/check-test-git-config-target.mjs +192 -12
- package/scripts/lib/validate/check-unwired-features.mjs +163 -15
- package/scripts/lib/validate/check-validator-registration.mjs +10 -4
- package/scripts/lib/validate/confidential-names.mjs +95 -30
- package/scripts/lib/validate/enumerate-repo-files.mjs +317 -0
- package/scripts/lib/validate/repo-files.mjs +48 -14
- package/scripts/lib/vault-backfill/template.mjs +63 -6
- package/scripts/lib/vault-mirror/process.mjs +165 -42
- package/scripts/lib/vault-mirror/telemetry.mjs +2 -2
- package/scripts/lib/vault-status/narrative-mirror.mjs +127 -18
- package/scripts/lib/wave-executor/dispatch-common.mjs +164 -0
- package/scripts/lib/wave-executor/foreign-dispatch.mjs +7 -142
- package/scripts/lib/wave-executor/remote-dispatch.mjs +5 -7
- package/scripts/lib/wave-resource-gate.mjs +8 -2
- package/scripts/lib/wave-sizing.mjs +4 -1
- package/scripts/lib/wave-transcript-tail.mjs +118 -4
- package/scripts/materialize-wave-scope.mjs +12 -5
- package/scripts/memory-propose.mjs +19 -5
- package/scripts/migrate-cold-start-seed.mjs +4 -1
- package/scripts/parse-config.mjs +60 -3
- package/scripts/release.mjs +430 -31
- package/scripts/repair-invalid-sessions.mjs +3 -3
- package/scripts/run-quality-gate.mjs +128 -11
- package/scripts/site-numbers.mjs +344 -8
- package/scripts/sweep-expired-learnings.mjs +90 -0
- package/scripts/sync-vault-schema.mjs +3 -1
- package/scripts/telemetry.mjs +2 -2
- package/scripts/validate-plugin.mjs +164 -0
- package/scripts/validate-wave-scope.mjs +28 -8
- package/scripts/wave-scope-binding.mjs +215 -0
- package/skills/_shared/instruction-file-resolution.md +10 -0
- package/skills/_shared/parallel-aware-preamble.md +1 -0
- package/skills/_shared/platform-tools.md +1 -1
- package/skills/_shared/state-ownership.md +1 -1
- package/skills/architecture/SKILL.md +7 -5
- package/skills/{domain-model/SKILL.md → architecture/references/domain-model.md} +9 -9
- package/skills/autopilot/SKILL.md +4 -18
- package/skills/claude-md-drift-check/SKILL.md +5 -1
- package/skills/claude-md-drift-check/checker.mjs +62 -2
- package/skills/convergence-monitoring/SIGNALS.md +55 -0
- package/skills/discovery/probes/vault-staleness.mjs +37 -13
- package/skills/discovery/probes-arch.md +20 -18
- package/skills/dispatcher/SKILL.md +3 -2
- package/skills/evolve/SKILL.md +65 -26
- package/skills/frontmatter-guard/SKILL.md +11 -5
- package/skills/npm-publish/SKILL.md +1 -1
- package/skills/reconcile/SKILL.md +33 -0
- package/skills/remote-offload/SKILL.md +1 -1
- package/skills/session-end/SKILL.md +18 -905
- package/skills/session-end/phase-3-6-tail.md +10 -3
- package/skills/session-end/plan-verification.md +221 -155
- package/skills/session-end/references/phase-2-quality-gate.md +93 -0
- package/skills/session-end/references/phase-3-documentation-updates.md +229 -0
- package/skills/session-end/references/phase-4a-worktree-cleanup.md +120 -0
- package/skills/session-end/references/phase-4b-worktree-orphan-sweep.md +58 -0
- package/skills/session-end/references/phase-5-issue-cleanup.md +104 -0
- package/skills/session-end/references/session-summary-template.md +62 -0
- package/skills/session-plan/SKILL.md +49 -0
- package/skills/session-start/SKILL.md +22 -904
- package/skills/session-start/phase-8-5-express-path.md +1 -1
- package/skills/session-start/references/phase-1-1-dispatcher-autonomy-capture.md +55 -0
- package/skills/session-start/references/phase-1-2-session-lock.md +140 -0
- package/skills/session-start/references/phase-1-5-session-continuity.md +254 -0
- package/skills/session-start/references/phase-1-7-vault-status-board.md +53 -0
- package/skills/session-start/references/phase-2-7-portfolio-snapshot.md +75 -0
- package/skills/session-start/references/phase-4-ssot-environment-check.md +160 -0
- package/skills/session-start/references/phase-6-5-forced-reads.md +75 -0
- package/skills/session-start/references/phase-6-6-project-intelligence.md +81 -0
- package/skills/session-start/references/phase-6-7-memory-banner-telemetry-consent.md +103 -0
- package/skills/vault-sync/SKILL.md +10 -0
- package/skills/vault-sync/validator.mjs +21 -27
- package/skills/wave-executor/SKILL.md +15 -1
- package/skills/wave-executor/references/wave-loop-dispatch.md +612 -0
- package/skills/wave-executor/references/wave-loop-review.md +570 -0
- package/skills/wave-executor/references/wave-loop-scope-manifest.md +162 -0
- package/skills/wave-executor/wave-loop.md +14 -1309
- package/templates/_shared/journey-manifest.md +10 -6
- package/.cursor/commands/autopilot-multi.md +0 -14
- package/.cursor/commands/contract-version-bump.md +0 -14
- package/.cursor/commands/journey-audit.md +0 -14
- package/.cursor/skills/contract-version-bump/SKILL.md +0 -12
- package/.cursor/skills/daily/SKILL.md +0 -12
- package/.cursor/skills/domain-model/SKILL.md +0 -13
- package/.cursor/skills/journey-audit/SKILL.md +0 -13
- package/.cursor/skills/skill-creator/SKILL.md +0 -13
- package/.cursor/skills/ubiquitous-language/SKILL.md +0 -13
- package/commands/autopilot-multi.md +0 -74
- package/commands/contract-version-bump.md +0 -28
- package/commands/journey-audit.md +0 -43
- package/pi/prompts/autopilot-multi.md +0 -12
- package/pi/prompts/contract-version-bump.md +0 -12
- package/pi/prompts/journey-audit.md +0 -12
- package/scripts/autopilot-multi.mjs +0 -885
- package/scripts/backfill-learnings-expires.mjs +0 -196
- package/scripts/backfill-learnings.mjs +0 -203
- package/scripts/fleet-instruction-scan.mjs +0 -141
- package/scripts/lib/autopilot/dep-graph.mjs +0 -417
- package/scripts/lib/autopilot/multi-killswitch.mjs +0 -184
- package/scripts/lib/webhook-url.mjs +0 -105
- package/scripts/lifecycle-sim-v6.mjs +0 -347
- package/scripts/migrate-learnings-jsonl.mjs +0 -189
- package/scripts/migrate-subagents-jsonl.mjs +0 -196
- package/scripts/upload-social-preview.mjs +0 -316
- package/skills/_shared/model-selection.md +0 -64
- package/skills/contract-version-bump/SKILL.md +0 -219
- package/skills/daily/SKILL.md +0 -222
- package/skills/daily/generate.sh +0 -92
- package/skills/daily/templates/daily.md.tpl +0 -36
- package/skills/journey-audit/SKILL.md +0 -270
- package/skills/skill-creator/SKILL.md +0 -168
- package/skills/ubiquitous-language/SKILL.md +0 -97
- package/skills/vault-sync/package-lock.json +0 -40
- /package/skills/{domain-model → architecture/references}/ADR-FORMAT.md +0 -0
- /package/skills/{domain-model → architecture/references}/CONTEXT-FORMAT.md +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* loop-guard.mjs — Parser for the top-level `loop-guard:` YAML block
|
|
@@ -57,7 +58,7 @@ export function _parseLoopGuard(content) {
|
|
|
57
58
|
window: DEFAULT_WINDOW,
|
|
58
59
|
};
|
|
59
60
|
|
|
60
|
-
const lines = content
|
|
61
|
+
const lines = preprocessBlockLines(content);
|
|
61
62
|
let inBlock = false;
|
|
62
63
|
const blockLines = [];
|
|
63
64
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* memory.mjs — Parser for the top-level `memory:` YAML block.
|
|
@@ -55,7 +56,7 @@ export function _parseMemory(content) {
|
|
|
55
56
|
},
|
|
56
57
|
};
|
|
57
58
|
|
|
58
|
-
const lines = content
|
|
59
|
+
const lines = preprocessBlockLines(content);
|
|
59
60
|
let inBlock = false;
|
|
60
61
|
const blockLines = [];
|
|
61
62
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* moc-staleness.mjs — Parser for the top-level `moc-staleness:` YAML block.
|
|
@@ -31,7 +32,7 @@ export function _parseMocStaleness(content) {
|
|
|
31
32
|
mode: 'warn',
|
|
32
33
|
};
|
|
33
34
|
|
|
34
|
-
const lines = content
|
|
35
|
+
const lines = preprocessBlockLines(content);
|
|
35
36
|
let inBlock = false;
|
|
36
37
|
const blockLines = [];
|
|
37
38
|
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
import { parseThreshold } from '../persona-panel/threshold.mjs';
|
|
21
21
|
import { ALLOWED_MODEL_ALIASES, MODEL_ID_RE } from '../agent-frontmatter.mjs';
|
|
22
22
|
import { matchBlockHeader } from './block-header.mjs';
|
|
23
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
23
24
|
|
|
24
25
|
const ALLOWED_AFTER = new Set(['quality', 'impl-polish']);
|
|
25
26
|
const ALLOWED_MODE = new Set(['off', 'warn', 'strict']);
|
|
@@ -169,7 +170,7 @@ export function _normalizePersonaGateWave(parsed) {
|
|
|
169
170
|
* @returns {string[]}
|
|
170
171
|
*/
|
|
171
172
|
function _extractBlock(content, key) {
|
|
172
|
-
const lines = content
|
|
173
|
+
const lines = preprocessBlockLines(content);
|
|
173
174
|
const blockLines = [];
|
|
174
175
|
let inBlock = false;
|
|
175
176
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* private-config-dir.mjs — THE resolver for the host-private config directory (#1223).
|
|
3
|
+
*
|
|
4
|
+
* Every per-host artefact below that directory (`host-private.json`,
|
|
5
|
+
* `owner.yaml`, the self-alias ledger) moves with it, so the precedence has to
|
|
6
|
+
* live in exactly ONE place. Before #1223 three copies with three different
|
|
7
|
+
* precedences existed: `owner-yaml.mjs`'s import-time homedir-only
|
|
8
|
+
* `OWNER_YAML_PATH`, `owner-config-loader.mjs`'s XDG-only + untrimmed
|
|
9
|
+
* `resolveOwnerConfigPath()`, and `host-identity.mjs`'s `_privateDir()`. The
|
|
10
|
+
* live consequence: `SO_CONFIG_HOME=<sandbox>` moved the alias ledger but NOT
|
|
11
|
+
* owner.yaml, which kept being read from the operator's REAL home — the
|
|
12
|
+
* CLAUDE.md (Codex CLI alias: AGENTS.md) "vault-dir resolves HOST-LOCALLY"
|
|
13
|
+
* hazard class.
|
|
14
|
+
*
|
|
15
|
+
* ── Why this is a standalone ZERO-IMPORT leaf ────────────────────────────────
|
|
16
|
+
*
|
|
17
|
+
* Two independent consumers constrain it, and neither tolerates the other's
|
|
18
|
+
* import graph:
|
|
19
|
+
*
|
|
20
|
+
* 1. `host-identity.mjs` is reachable from LIVE hooks (via `session-lock.mjs`),
|
|
21
|
+
* `hooks/on-stop.mjs` among them. on-stop must degrade with one actionable
|
|
22
|
+
* line when `node_modules` is absent (GH#63), so nothing on ITS subgraph —
|
|
23
|
+
* this leaf included — may pull a bare specifier. Putting the resolver in
|
|
24
|
+
* `owner-yaml.mjs` dragged `js-yaml` onto that subgraph and turned the GH#63
|
|
25
|
+
* contract red with `ERR_MODULE_NOT_FOUND: Cannot find package 'js-yaml'`.
|
|
26
|
+
* Since GitLab #1230 (2026-09-06) `owner-yaml.mjs` resolves `js-yaml`
|
|
27
|
+
* lazily, so that particular collision can no longer recur — but the
|
|
28
|
+
* constraint on THIS file is unchanged, because it is what let the resolver
|
|
29
|
+
* be shared in the first place. Measured 2026-09-06 over a `hooks/` +
|
|
30
|
+
* `scripts/` copy with no `node_modules`, the four hooks that reach
|
|
31
|
+
* `owner-yaml.mjs` (on-session-start, on-session-end, post-edit-validate,
|
|
32
|
+
* skill-invocation-telemetry) now load instead of throwing.
|
|
33
|
+
* 2. `tests/husky/pre-commit-owner-leakage.test.mjs` copies the CP11 scanner's
|
|
34
|
+
* import chain FILE BY FILE into a tmp repo. Every repo-local import added
|
|
35
|
+
* to a file on that chain must be added to the copied-file list there.
|
|
36
|
+
*
|
|
37
|
+
* Hence: `node:os` + `node:path` only. No repo-local imports, no bare
|
|
38
|
+
* specifiers beyond the two Node builtins.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
import { homedir } from 'node:os';
|
|
42
|
+
import { join } from 'node:path';
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Resolve the host-private config directory.
|
|
46
|
+
*
|
|
47
|
+
* Precedence, most specific first: `SO_CONFIG_HOME` names the private dir
|
|
48
|
+
* ITSELF; `XDG_CONFIG_HOME` names its PARENT (the `session-orchestrator`
|
|
49
|
+
* segment is appended); without either, `~/.config/session-orchestrator`.
|
|
50
|
+
*
|
|
51
|
+
* `.trim() || fallback` throughout — a whitespace-only env var is truthy and
|
|
52
|
+
* would short-circuit a bare `||`, returning the spaces verbatim
|
|
53
|
+
* (`.claude/rules/development.md` § Error Handling, env-var fallback
|
|
54
|
+
* whitespace trap).
|
|
55
|
+
*
|
|
56
|
+
* Reads env at CALL time, so a test may stub `process.env` after import.
|
|
57
|
+
*
|
|
58
|
+
* @param {{ env?: Record<string, string|undefined> }} [opts]
|
|
59
|
+
* @returns {string} absolute path to the host-private config directory
|
|
60
|
+
*/
|
|
61
|
+
export function resolvePrivateConfigDir({ env = process.env } = {}) {
|
|
62
|
+
const own = (env.SO_CONFIG_HOME || '').trim();
|
|
63
|
+
if (own) return own;
|
|
64
|
+
const xdg = (env.XDG_CONFIG_HOME || '').trim();
|
|
65
|
+
if (xdg) return join(xdg, 'session-orchestrator');
|
|
66
|
+
return join(homedir(), '.config', 'session-orchestrator');
|
|
67
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* reconcile.mjs — Parser for the top-level `reconcile:` YAML block.
|
|
@@ -169,7 +170,7 @@ export function _parseReconcile(content) {
|
|
|
169
170
|
'max-proposals-per-run': 10,
|
|
170
171
|
};
|
|
171
172
|
|
|
172
|
-
const lines = content
|
|
173
|
+
const lines = preprocessBlockLines(content);
|
|
173
174
|
let inBlock = false;
|
|
174
175
|
const blockLines = [];
|
|
175
176
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLinesNoDash } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* remote-hosts.mjs — Parser for the `remote-hosts:` Session Config block (#1160).
|
|
@@ -73,7 +74,7 @@ const SAFE_PATH_RE = /^[A-Za-z0-9._~/][A-Za-z0-9._~/-]*$/;
|
|
|
73
74
|
* @returns {Array<{alias: string, 'roles-allowed': string[], 'repo-path': string|null, 'claude-path': string|null}>}
|
|
74
75
|
*/
|
|
75
76
|
export function _parseRemoteHosts(content) {
|
|
76
|
-
const lines = String(content ?? '')
|
|
77
|
+
const lines = preprocessBlockLinesNoDash(String(content ?? ''));
|
|
77
78
|
let inBlock = false;
|
|
78
79
|
const blockLines = [];
|
|
79
80
|
|
|
@@ -214,10 +214,16 @@ function isCodeFence(line) {
|
|
|
214
214
|
* this repo's own convention encourages. Revisit if a fleet CLAUDE.md is ever
|
|
215
215
|
* measured opening a multi-line comment after a value.
|
|
216
216
|
*
|
|
217
|
+
* EXPORTED since #1162 for a third consumer: `block-preprocess.mjs`, which
|
|
218
|
+
* gives the ~36 block parsers under `scripts/lib/config/` the same
|
|
219
|
+
* commented-out-is-not-live-config semantics. Same argument as the export of
|
|
220
|
+
* `isSessionConfigHeading` — a fourth copy of this state machine that drifts
|
|
221
|
+
* loose is worse than no check at all. Behaviour is unchanged by the export.
|
|
222
|
+
*
|
|
217
223
|
* @returns {(line: string) => boolean} true when the line is inside (or opens)
|
|
218
224
|
* a multi-line HTML comment and must be ignored by both consumers.
|
|
219
225
|
*/
|
|
220
|
-
function htmlCommentSkipper() {
|
|
226
|
+
export function htmlCommentSkipper() {
|
|
221
227
|
let inComment = false;
|
|
222
228
|
return function skipHtmlComment(line) {
|
|
223
229
|
if (inComment) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* skill-evolution.mjs — Parser for the top-level `skill-evolution:` YAML block
|
|
@@ -39,7 +40,7 @@ export function _parseSkillEvolution(content) {
|
|
|
39
40
|
'judge-budget-tokens': 8000,
|
|
40
41
|
};
|
|
41
42
|
|
|
42
|
-
const lines = content
|
|
43
|
+
const lines = preprocessBlockLines(content);
|
|
43
44
|
let inBlock = false;
|
|
44
45
|
const blockLines = [];
|
|
45
46
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* slopcheck.mjs — Parser for the top-level `slopcheck:` YAML block
|
|
@@ -36,7 +37,7 @@ export function _parseSlopcheck(content) {
|
|
|
36
37
|
sources: [...DEFAULT_SOURCES],
|
|
37
38
|
};
|
|
38
39
|
|
|
39
|
-
const lines = content
|
|
40
|
+
const lines = preprocessBlockLines(content);
|
|
40
41
|
let inBlock = false;
|
|
41
42
|
const blockLines = [];
|
|
42
43
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* state-md-lock.mjs — Parser for the top-level `state-md-lock:` YAML block
|
|
@@ -30,7 +31,7 @@ export function _parseStateMdLock(content) {
|
|
|
30
31
|
'timeout-ms': 10000,
|
|
31
32
|
};
|
|
32
33
|
|
|
33
|
-
const lines = content
|
|
34
|
+
const lines = preprocessBlockLines(content);
|
|
34
35
|
let inBlock = false;
|
|
35
36
|
const blockLines = [];
|
|
36
37
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* templates-first.mjs — Parser for the top-level `templates-first:` YAML block
|
|
@@ -34,7 +35,7 @@ export function _parseTemplatesFirst(content) {
|
|
|
34
35
|
hosts: [...DEFAULT_HOSTS],
|
|
35
36
|
};
|
|
36
37
|
|
|
37
|
-
const lines = content
|
|
38
|
+
const lines = preprocessBlockLines(content);
|
|
38
39
|
let inBlock = false;
|
|
39
40
|
const blockLines = [];
|
|
40
41
|
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
import { validatePathInsideProject } from '../path-utils.mjs';
|
|
10
10
|
import { matchBlockHeader } from './block-header.mjs';
|
|
11
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* Parse the top-level `test:` YAML block from markdown content.
|
|
@@ -27,7 +28,7 @@ export function _parseTest(content) {
|
|
|
27
28
|
'retention-days': 30,
|
|
28
29
|
};
|
|
29
30
|
|
|
30
|
-
const lines = content
|
|
31
|
+
const lines = preprocessBlockLines(content);
|
|
31
32
|
let inBlock = false;
|
|
32
33
|
const blockLines = [];
|
|
33
34
|
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
import { _coerceBoolean, _coerceInteger } from './coercers.mjs';
|
|
24
24
|
import { matchBlockHeader } from './block-header.mjs';
|
|
25
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
25
26
|
|
|
26
27
|
// ---------------------------------------------------------------------------
|
|
27
28
|
// vault-integration
|
|
@@ -68,7 +69,12 @@ export function _parseVaultIntegration(content) {
|
|
|
68
69
|
const defaults = { enabled: false, 'vault-dir': null, mode: 'warn', 'vault-name': null };
|
|
69
70
|
if (typeof content !== 'string' || content === '') return defaults;
|
|
70
71
|
|
|
71
|
-
|
|
72
|
+
// #1162: NOT a raw split. `preprocessBlockLines` drops HTML-commented lines
|
|
73
|
+
// (a commented-out block was read as live config) and rewrites bold-bullet
|
|
74
|
+
// sub-keys (`- **enabled:** true` fell back to the `false` default). This
|
|
75
|
+
// parser has no dash-RECORD body, so the bold pass is safe here — see the
|
|
76
|
+
// named risk in block-preprocess.mjs.
|
|
77
|
+
const lines = preprocessBlockLines(content);
|
|
72
78
|
|
|
73
79
|
// Pass 1: inline-object form. Matches `vault-integration: { ... }` with or
|
|
74
80
|
// without a leading `- ` (baseline list-item form per #497).
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* vault-mirror-quality.mjs — Parser for the top-level `vault-mirror:` YAML block,
|
|
@@ -30,7 +31,7 @@ export function _parseVaultMirrorQuality(content) {
|
|
|
30
31
|
},
|
|
31
32
|
};
|
|
32
33
|
|
|
33
|
-
const lines = content
|
|
34
|
+
const lines = preprocessBlockLines(content);
|
|
34
35
|
let inBlock = false;
|
|
35
36
|
const blockLines = [];
|
|
36
37
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* vault-staleness.mjs — Parser for the top-level `vault-staleness:` YAML block.
|
|
@@ -17,7 +18,7 @@ export function _parseVaultStaleness(content) {
|
|
|
17
18
|
mode: 'warn',
|
|
18
19
|
};
|
|
19
20
|
|
|
20
|
-
const lines = content
|
|
21
|
+
const lines = preprocessBlockLines(content);
|
|
21
22
|
let inBlock = false;
|
|
22
23
|
const blockLines = [];
|
|
23
24
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* vault-sync.mjs — Parser for the top-level `vault-sync:` YAML block.
|
|
@@ -16,7 +17,7 @@ import { matchBlockHeader } from './block-header.mjs';
|
|
|
16
17
|
export function _parseVaultSync(content) {
|
|
17
18
|
const defaults = { enabled: false, mode: 'warn', 'vault-dir': null, exclude: [] };
|
|
18
19
|
|
|
19
|
-
const lines = content
|
|
20
|
+
const lines = preprocessBlockLines(content);
|
|
20
21
|
let inBlock = false;
|
|
21
22
|
const blockLines = [];
|
|
22
23
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* verification-auto-fix.mjs — Parser for the top-level `verification-auto-fix:`
|
|
@@ -31,7 +32,7 @@ export function _parseVerificationAutoFix(content) {
|
|
|
31
32
|
'max-retries': 2,
|
|
32
33
|
};
|
|
33
34
|
|
|
34
|
-
const lines = content
|
|
35
|
+
const lines = preprocessBlockLines(content);
|
|
35
36
|
let inBlock = false;
|
|
36
37
|
const blockLines = [];
|
|
37
38
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* wave-reviewers.mjs — Parser for the `wave-reviewers` / `persona-reviewers` sub-block.
|
|
@@ -58,7 +59,7 @@ export function _parseWaveReviewers(content) {
|
|
|
58
59
|
* @returns {string[]}
|
|
59
60
|
*/
|
|
60
61
|
function _extractBlock(content, key) {
|
|
61
|
-
const lines = content
|
|
62
|
+
const lines = preprocessBlockLines(content);
|
|
62
63
|
const blockLines = [];
|
|
63
64
|
let inBlock = false;
|
|
64
65
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { matchBlockHeader } from './block-header.mjs';
|
|
2
|
+
import { preprocessBlockLines } from './block-preprocess.mjs';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* worktree-orphans.mjs — Parser for the top-level `worktree-orphans:` YAML block.
|
|
@@ -85,7 +86,7 @@ export function _parseWorktreeOrphans(content) {
|
|
|
85
86
|
|
|
86
87
|
if (typeof content !== 'string' || content === '') return defaults;
|
|
87
88
|
|
|
88
|
-
const lines = content
|
|
89
|
+
const lines = preprocessBlockLines(content);
|
|
89
90
|
let inBlock = false;
|
|
90
91
|
const blockLines = [];
|
|
91
92
|
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
* @property {number} waveNumber
|
|
40
40
|
* @property {number | null} filesChanged
|
|
41
41
|
* @property {number | null} testPassed
|
|
42
|
+
* @property {number | null} testFailed
|
|
42
43
|
* @property {number | null} agentDispatchCount
|
|
43
44
|
*/
|
|
44
45
|
|
|
@@ -143,21 +144,56 @@ function tailRead(absPath, prevOffset) {
|
|
|
143
144
|
* Event types this monitor is meant to classify. Anything else is ignored even
|
|
144
145
|
* when it carries a wave number.
|
|
145
146
|
*
|
|
146
|
-
* The allowlist is a wave-LIFECYCLE prefix
|
|
147
|
-
* i.e. exactly the records that can carry the
|
|
148
|
-
* `evaluateSignals` compares (`files_changed`,
|
|
149
|
-
*
|
|
150
|
-
* gains a `wave_number` field must be added here consciously.
|
|
147
|
+
* The allowlist is a wave-LIFECYCLE prefix, the agent-dispatch/-stop counters,
|
|
148
|
+
* and the quality-gate envelope — i.e. exactly the records that can carry the
|
|
149
|
+
* three measurements `evaluateSignals` compares (`files_changed`, the test
|
|
150
|
+
* pass count, the per-wave agent count). It is deliberately fail-CLOSED: a new
|
|
151
|
+
* event type that gains a `wave_number` field must be added here consciously.
|
|
152
|
+
*
|
|
153
|
+
* The gate admission is a TYPE-AND-SHAPE gate, never a bare prefix widening —
|
|
154
|
+
* see `isWaveScopedEvent` for why.
|
|
151
155
|
*/
|
|
152
156
|
const WAVE_EVENT_PREFIX = 'orchestrator.wave.';
|
|
153
157
|
const WAVE_EVENT_NAMES = new Set(['agent.dispatched', 'orchestrator.agent.dispatched']);
|
|
158
|
+
const AGENT_STOPPED_EVENT = 'orchestrator.agent.stopped';
|
|
159
|
+
const GATE_EVENT_PREFIX = 'orchestrator.quality_gate.';
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* True when a record carries a `counts` object this monitor can fold, i.e. a
|
|
163
|
+
* plain object with a numeric `passed`. `counts: null`, an array, or a string
|
|
164
|
+
* payload are all rejected — the shape half of the type-and-shape gate.
|
|
165
|
+
*
|
|
166
|
+
* @param {Record<string, unknown>} rec
|
|
167
|
+
* @returns {boolean}
|
|
168
|
+
*/
|
|
169
|
+
function hasFoldableCounts(rec) {
|
|
170
|
+
const counts = rec.counts;
|
|
171
|
+
if (counts === null || typeof counts !== 'object' || Array.isArray(counts)) return false;
|
|
172
|
+
return pickInt(/** @type {Record<string, unknown>} */ (counts).passed) !== null;
|
|
173
|
+
}
|
|
154
174
|
|
|
155
175
|
/**
|
|
176
|
+
* Type-AND-shape gate: admit a record only when its event type is one this
|
|
177
|
+
* monitor classifies AND the record actually carries a measurement `classify`
|
|
178
|
+
* can fold. A bare prefix widening for `orchestrator.quality_gate.*` would
|
|
179
|
+
* re-open the #966 trap — the gate is the single highest-volume record type in
|
|
180
|
+
* `events.jsonl`, and admitting the session-level runs (no `wave_number`, or an
|
|
181
|
+
* envelope without `counts`) would instantiate a `WaveSummary` per gate run,
|
|
182
|
+
* advance `latestWave`, and burn the once-per-wave `alreadyEmitted` keys before
|
|
183
|
+
* the real wave record arrives. Hence the discriminator: a gate record is
|
|
184
|
+
* wave-scoped only when it has BOTH `wave_number` and a well-formed `counts`.
|
|
185
|
+
*
|
|
156
186
|
* @param {string} evType
|
|
187
|
+
* @param {Record<string, unknown>} rec
|
|
157
188
|
* @returns {boolean}
|
|
158
189
|
*/
|
|
159
|
-
function isWaveScopedEvent(evType) {
|
|
160
|
-
|
|
190
|
+
function isWaveScopedEvent(evType, rec = {}) {
|
|
191
|
+
if (evType.startsWith(WAVE_EVENT_PREFIX)) return true;
|
|
192
|
+
if (WAVE_EVENT_NAMES.has(evType) || evType === AGENT_STOPPED_EVENT) return true;
|
|
193
|
+
if (evType.startsWith(GATE_EVENT_PREFIX)) {
|
|
194
|
+
return pickInt(rec.wave_number) !== null && hasFoldableCounts(rec);
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
161
197
|
}
|
|
162
198
|
|
|
163
199
|
/**
|
|
@@ -179,12 +215,29 @@ function isWaveScopedEvent(evType) {
|
|
|
179
215
|
* `wave_number`, every gate run would have instantiated or refreshed a
|
|
180
216
|
* `WaveSummary`, advanced `latestWave`, and burnt the once-per-wave
|
|
181
217
|
* `alreadyEmitted` keys — suppressing the genuine signal when the real wave
|
|
182
|
-
* record arrived later. Several other high-volume types (`
|
|
183
|
-
* `
|
|
218
|
+
* record arrived later. Several other high-volume types (`turn.stopped` — and its
|
|
219
|
+
* deprecated alias `session.stopped`, GitLab #1234 — plus `memory.propose_invoked`)
|
|
220
|
+
* already carry a wave and sat in the same trap. The gate is an ALLOWLIST
|
|
221
|
+
* (`isWaveRelevantType`), so the rename needed no edit here: a new name is
|
|
222
|
+
* ignored by default, which is the correct default for this classifier.
|
|
184
223
|
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
224
|
+
* ## Where the pass count actually comes from (#980)
|
|
225
|
+
*
|
|
226
|
+
* Two independent paths, deliberately not merged:
|
|
227
|
+
* - the FLAT `rec['test.passed']` alias, kept for a future direct emitter on
|
|
228
|
+
* a wave-lifecycle record — no producer writes it today;
|
|
229
|
+
* - the gate envelope's NESTED `counts.passed`, folded ONLY for
|
|
230
|
+
* `orchestrator.quality_gate.*` records that also carry `wave_number`.
|
|
231
|
+
* That gating is what keeps the #966 invariant intact: an ungated record
|
|
232
|
+
* (a `wave.completed` carrying `counts`, or a session-level gate run with
|
|
233
|
+
* no `wave_number`) still folds NOTHING, so a gate run cannot manufacture a
|
|
234
|
+
* `WaveSummary` and burn the once-per-wave emit keys.
|
|
235
|
+
*
|
|
236
|
+
* `orchestrator.agent.stopped` is counted per record toward the wave's agent
|
|
237
|
+
* count, the same way `agent.dispatched` is — it is the only per-agent record
|
|
238
|
+
* this repo actually emits with a wave number (11,754 records measured
|
|
239
|
+
* 2026-09-05 in `.orchestrator/metrics/events.jsonl`, against 0 for
|
|
240
|
+
* `agent.dispatched`).
|
|
188
241
|
*
|
|
189
242
|
* @param {Record<string, unknown>} rec
|
|
190
243
|
* @param {Map<number, WaveSummary>} state
|
|
@@ -192,7 +245,7 @@ function isWaveScopedEvent(evType) {
|
|
|
192
245
|
*/
|
|
193
246
|
function classify(rec, state) {
|
|
194
247
|
const evType = String(rec.event_type ?? rec.event ?? '');
|
|
195
|
-
if (!isWaveScopedEvent(evType)) return null;
|
|
248
|
+
if (!isWaveScopedEvent(evType, rec)) return null;
|
|
196
249
|
|
|
197
250
|
const waveNumber = pickInt(rec.wave_number ?? rec.wave ?? rec.waveId);
|
|
198
251
|
if (waveNumber === null) return null;
|
|
@@ -202,6 +255,7 @@ function classify(rec, state) {
|
|
|
202
255
|
waveNumber,
|
|
203
256
|
filesChanged: null,
|
|
204
257
|
testPassed: null,
|
|
258
|
+
testFailed: null,
|
|
205
259
|
agentDispatchCount: null,
|
|
206
260
|
};
|
|
207
261
|
state.set(waveNumber, summary);
|
|
@@ -210,8 +264,17 @@ function classify(rec, state) {
|
|
|
210
264
|
if (filesChanged !== null) summary.filesChanged = filesChanged;
|
|
211
265
|
const testPassed = pickInt(rec['test.passed'] ?? rec.test_passed ?? rec.testsPassed);
|
|
212
266
|
if (testPassed !== null) summary.testPassed = testPassed;
|
|
213
|
-
//
|
|
214
|
-
|
|
267
|
+
// Nested gate envelope — admitted by isWaveScopedEvent only WITH wave_number,
|
|
268
|
+
// so the ungated #966 invariant (no fold) survives for every other record.
|
|
269
|
+
if (evType.startsWith(GATE_EVENT_PREFIX)) {
|
|
270
|
+
const counts = /** @type {Record<string, unknown>} */ (rec.counts);
|
|
271
|
+
const gatePassed = pickInt(counts.passed);
|
|
272
|
+
if (gatePassed !== null) summary.testPassed = gatePassed;
|
|
273
|
+
const gateFailed = pickInt(counts.failed);
|
|
274
|
+
if (gateFailed !== null) summary.testFailed = gateFailed;
|
|
275
|
+
}
|
|
276
|
+
// Count one dispatched/stopped agent record toward this wave's agent count.
|
|
277
|
+
if (WAVE_EVENT_NAMES.has(evType) || evType === AGENT_STOPPED_EVENT) {
|
|
215
278
|
summary.agentDispatchCount = (summary.agentDispatchCount ?? 0) + 1;
|
|
216
279
|
} else {
|
|
217
280
|
const dispatched = pickInt(rec.agents_dispatched ?? rec.agentsDispatched);
|
|
@@ -443,4 +506,7 @@ if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.a
|
|
|
443
506
|
main();
|
|
444
507
|
}
|
|
445
508
|
|
|
446
|
-
export
|
|
509
|
+
// `_evaluateSignals` is a test-only export (leading `_` per the repo convention,
|
|
510
|
+
// cf. `_clearCompileCache` in scripts/lib/agent-output-schema.mjs): the signal
|
|
511
|
+
// firing is otherwise reachable only through the live tail loop.
|
|
512
|
+
export { classify, isWaveScopedEvent, evaluateSignals as _evaluateSignals };
|