session-orchestrator 3.23.0 → 4.0.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/.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 +1 -1
- 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 +13 -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 +1401 -0
- package/NOTICE +11 -6
- package/README.md +127 -92
- package/agents/db-specialist.md +0 -1
- 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 +249 -48
- package/docs/codex-setup.md +66 -22
- package/docs/components.md +37 -16
- package/docs/cursor-setup.md +6 -2
- package/docs/events-schema.md +51 -10
- package/docs/instruction-delivery.md +62 -0
- package/{agents/memory-proposal-collector.md → docs/memory-proposal-flow.md} +1 -8
- package/docs/migration-v4.md +341 -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 +8 -8
- package/docs/session-config-reference.md +120 -61
- package/docs/session-config-template.md +40 -33
- package/docs/telemetry/telemetry-claims.md +11 -10
- package/docs/telemetry.md +187 -4
- package/docs/vault-docs-architecture.md +50 -11
- package/hooks/_lib/atomic-json.mjs +111 -0
- package/hooks/_lib/hook-import-set.json +1487 -0
- package/hooks/_lib/subagent-paths.mjs +143 -0
- package/hooks/_lib/subagent-transcript.mjs +562 -0
- package/hooks/config-protection.mjs +2 -2
- package/hooks/cwd-change-restore.mjs +11 -31
- package/hooks/enforce-commands.mjs +69 -0
- package/hooks/enforce-scope.mjs +35 -6
- 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 +280 -14
- package/hooks/on-session-start.mjs +153 -4
- package/hooks/on-stop.mjs +371 -17
- package/hooks/operator-steer.mjs +2 -2
- package/hooks/post-bash-write-verify.mjs +189 -4
- package/hooks/post-edit-import-probe.mjs +344 -0
- package/hooks/post-subagent-discovery-validator.mjs +278 -392
- package/hooks/post-tool-batch-wave-signal.mjs +272 -44
- package/hooks/post-tool-failure-corrective-context.mjs +11 -34
- package/hooks/post-tooluse-frontend-slop.mjs +3 -3
- package/hooks/pre-bash-destructive-guard.mjs +39 -13
- package/hooks/pre-bash-memory-propose-audit.mjs +13 -7
- package/hooks/skill-invocation-telemetry.mjs +17 -5
- package/hooks/subagent-telemetry.mjs +24 -30
- package/monitors/monitors.json +3 -3
- package/package.json +9 -1
- package/pi/prompts/session.md +2 -2
- package/plugin.json +27 -0
- package/scripts/autopilot.mjs +26 -12
- package/scripts/backfill-abandoned-sessions.mjs +130 -15
- package/scripts/backfill-learnings-from-vault.mjs +9 -3
- package/scripts/dialectic-deriver.mjs +73 -8
- package/scripts/emit-event.mjs +10 -2
- package/scripts/export-hw-learnings.mjs +113 -1
- package/scripts/generate-agents-skills.mjs +378 -0
- package/scripts/generate-cursor-adapter.mjs +45 -8
- package/scripts/generate-hook-import-set.mjs +249 -0
- package/scripts/lib/agent-status.mjs +13 -2
- package/scripts/lib/auq/parse.mjs +5 -29
- package/scripts/lib/auto-dialectic.mjs +68 -0
- 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/autopilot/worktree-pipeline.mjs +82 -6
- package/scripts/lib/build-live-signals.mjs +25 -22
- package/scripts/lib/ci-status-banner.mjs +220 -75
- package/scripts/lib/codex/plugin-contract.mjs +82 -6
- package/scripts/lib/cold-start-detector.mjs +23 -14
- package/scripts/lib/config/auto-dream.mjs +2 -1
- package/scripts/lib/config/block-header.mjs +63 -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 +9 -3
- 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 +388 -0
- 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 +234 -0
- 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/config.mjs +31 -3
- package/scripts/lib/convergence-monitor.mjs +82 -16
- package/scripts/lib/dispatcher/enumerate.mjs +2 -17
- 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-schema.mjs +48 -0
- package/scripts/lib/events.mjs +256 -7
- package/scripts/lib/evolve/autonomy-verdict.mjs +9 -4
- package/scripts/lib/evolve/autopilot-effectiveness.mjs +18 -1
- package/scripts/lib/frontmatter-guard.mjs +131 -13
- package/scripts/lib/gates/gate-full.mjs +26 -0
- package/scripts/lib/gates/gate-helpers.mjs +76 -0
- package/scripts/lib/gitlab-portfolio/cli.mjs +3 -15
- package/scripts/lib/hardware-pattern-detector.mjs +18 -1
- package/scripts/lib/harness-audit/categories/category1.mjs +17 -6
- 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-banner.mjs +20 -8
- package/scripts/lib/memory-proposals/store.mjs +30 -22
- package/scripts/lib/owner-config-banner.mjs +43 -6
- package/scripts/lib/owner-config-loader.mjs +21 -10
- package/scripts/lib/owner-interview.mjs +3 -3
- package/scripts/lib/owner-yaml.mjs +207 -14
- package/scripts/lib/peer-discovery.mjs +20 -2
- package/scripts/lib/platform.mjs +108 -15
- package/scripts/lib/plugin-update-banner.mjs +406 -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 +249 -9
- package/scripts/lib/reconcile/idempotency.mjs +37 -4
- package/scripts/lib/reconcile/writer.mjs +40 -18
- package/scripts/lib/scope-gate.mjs +36 -0
- package/scripts/lib/session-close-backfill.mjs +125 -18
- package/scripts/lib/session-discovery.mjs +57 -3
- package/scripts/lib/session-end/phase-skip.mjs +2 -2
- package/scripts/lib/session-id.mjs +12 -23
- package/scripts/lib/session-identity/own-session.mjs +187 -11
- 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 +36 -2
- package/scripts/lib/session-schema/validator.mjs +38 -4
- package/scripts/lib/session-start-probes.mjs +18 -1
- package/scripts/lib/session-transition.mjs +1 -1
- package/scripts/lib/sessions-canonical.mjs +446 -0
- 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 +255 -17
- package/scripts/lib/telemetry/sync.mjs +417 -24
- package/scripts/lib/tmux-layout/telemetry.mjs +14 -2
- package/scripts/lib/validate/check-agents-skills.mjs +327 -0
- package/scripts/lib/validate/check-agents.mjs +3 -3
- package/scripts/lib/validate/check-cursor-adapter.mjs +234 -72
- package/scripts/lib/validate/check-doc-cli-commands.mjs +9 -33
- package/scripts/lib/validate/check-hooks-emit-event-guard.mjs +370 -0
- package/scripts/lib/validate/check-hooks-symmetry.mjs +45 -16
- package/scripts/lib/validate/check-owner-leakage.mjs +281 -20
- package/scripts/lib/validate/check-skill-links.mjs +163 -0
- package/scripts/lib/validate/check-skill-script-paths.mjs +455 -0
- package/scripts/lib/validate/check-untracked-test-deps.mjs +10 -0
- package/scripts/lib/validate/check-unwired-features.mjs +0 -9
- package/scripts/lib/validate/check-validator-registration.mjs +254 -0
- package/scripts/lib/validate/check-vcs-repo-flag.mjs +6 -28
- package/scripts/lib/validate/enumerate-repo-files.mjs +317 -0
- package/scripts/lib/validate/markdown-fences.mjs +196 -0
- 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/board-lock.mjs +185 -0
- package/scripts/lib/vault-status/board-writer.mjs +174 -135
- package/scripts/lib/vault-status/narrative-mirror.mjs +129 -37
- 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 +502 -0
- package/scripts/lib/wave-resource-gate.mjs +133 -7
- package/scripts/lib/wave-sizing.mjs +4 -1
- package/scripts/lib/wave-transcript-tail.mjs +142 -8
- package/scripts/materialize-wave-scope.mjs +32 -9
- package/scripts/memory-propose.mjs +146 -8
- package/scripts/migrate-cold-start-seed.mjs +4 -1
- package/scripts/parse-config.mjs +60 -3
- package/scripts/promote-vault-strict.mjs +4 -15
- package/scripts/release.mjs +337 -29
- package/scripts/repair-invalid-sessions.mjs +3 -3
- package/scripts/run-quality-gate.mjs +128 -11
- package/scripts/site-numbers.mjs +36 -4
- 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 +187 -0
- package/scripts/validate-wave-scope.mjs +28 -8
- package/scripts/vault-consolidate.mjs +3 -11
- package/scripts/vault-integration-watcher.mjs +2 -4
- package/scripts/vault-mirror.mjs +111 -26
- package/scripts/wave-scope-binding.mjs +215 -0
- package/skills/_shared/instruction-file-resolution.md +10 -0
- package/skills/_shared/parallel-aware-auq.md +31 -2
- package/skills/_shared/parallel-aware-preamble.md +18 -4
- 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/ecosystem-health/SKILL.md +4 -1
- package/skills/ecosystem-health/wizard.md +5 -0
- package/skills/evolve/SKILL.md +87 -11
- package/skills/frontmatter-guard/SKILL.md +11 -5
- package/skills/npm-publish/SKILL.md +1 -1
- package/skills/reconcile/SKILL.md +38 -2
- package/skills/remote-offload/SKILL.md +89 -0
- package/skills/session-end/SKILL.md +18 -905
- package/skills/session-end/phase-3-6-tail.md +19 -9
- 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 +41 -900
- 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 +155 -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/validator.mjs +21 -27
- package/skills/wave-executor/SKILL.md +16 -2
- 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 -1271
- 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 -269
- 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
|
@@ -42,7 +42,7 @@ if (!shouldRunHook('on-session-start')) process.exit(0);
|
|
|
42
42
|
import { emitEvent, eventsFilePath } from '../scripts/lib/events.mjs';
|
|
43
43
|
import { maybeRotate } from '../scripts/lib/events-rotation.mjs';
|
|
44
44
|
import { readConfigFile, parseSessionConfig } from '../scripts/lib/config.mjs';
|
|
45
|
-
import {
|
|
45
|
+
import { getPlatform, resolveProjectDir } from '../scripts/lib/platform.mjs';
|
|
46
46
|
import {
|
|
47
47
|
registerSelf,
|
|
48
48
|
detectPeers,
|
|
@@ -124,6 +124,30 @@ function shortSessionId(id) {
|
|
|
124
124
|
return id.length > 24 ? id.slice(0, 8) : id;
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
+
/**
|
|
128
|
+
* GH#67 — render the provenance marker for ONE mechanically-detected peer.
|
|
129
|
+
*
|
|
130
|
+
* `discoverActiveSessions()` annotates registry-sourced peers additively
|
|
131
|
+
* (`registryOnly` / `lockSuperseded` / `lockOwnerId`); lock-sourced peers carry
|
|
132
|
+
* none of the three, so they render byte-identically to the pre-GH#67 banner.
|
|
133
|
+
*
|
|
134
|
+
* `lockSuperseded: true` means a LIVE lock at THIS root is held by a different
|
|
135
|
+
* raw session_id than the registry entry — the common cause is a finished task
|
|
136
|
+
* whose SessionEnd never ran, leaving a fresh-but-orphaned registry record.
|
|
137
|
+
* It is a HINT, never a verdict: the session lock is advisory, so the entry may
|
|
138
|
+
* equally be a live peer that lost the acquire race (#1085). The marker is
|
|
139
|
+
* therefore purely additive — it never removes the peer, and never changes the
|
|
140
|
+
* count or the WARN decision (HR-106).
|
|
141
|
+
*
|
|
142
|
+
* @param {{registryOnly?:boolean, lockSuperseded?:boolean, lockOwnerId?:string|null}} peer
|
|
143
|
+
* @returns {string} '' for a lock-sourced peer, else a bracketed marker.
|
|
144
|
+
*/
|
|
145
|
+
function supersessionMarker(peer) {
|
|
146
|
+
if (!peer || peer.registryOnly !== true) return '';
|
|
147
|
+
if (peer.lockSuperseded === true) return ' [registry-only, superseded]';
|
|
148
|
+
return ' [registry-only]';
|
|
149
|
+
}
|
|
150
|
+
|
|
127
151
|
/**
|
|
128
152
|
* Queue the ONE `additionalContext` string for the single end-of-hook flush.
|
|
129
153
|
* Last writer wins; there is deliberately no accumulation, because every
|
|
@@ -380,6 +404,19 @@ async function resolveSessionId(input, projectRoot) {
|
|
|
380
404
|
if (Object.prototype.hasOwnProperty.call(prev, 'last_batch')) {
|
|
381
405
|
preserved.last_batch = prev.last_batch;
|
|
382
406
|
}
|
|
407
|
+
// #1193 — the final-wave completion marker must survive a
|
|
408
|
+
// clear/compact too: dropping it re-arms a duplicate SessionEnd
|
|
409
|
+
// `orchestrator.wave.completed` for a wave already closed.
|
|
410
|
+
if (Object.prototype.hasOwnProperty.call(prev, 'last_wave_completed')) {
|
|
411
|
+
preserved.last_wave_completed = prev.last_wave_completed;
|
|
412
|
+
}
|
|
413
|
+
// #980 — the OPEN half of the wave-diff pair, written by
|
|
414
|
+
// post-tool-batch-wave-signal.mjs. Dropping it across a /clear leaves
|
|
415
|
+
// the running wave with no start point, so the next
|
|
416
|
+
// `orchestrator.wave.completed` silently omits `files_changed`.
|
|
417
|
+
if (Object.prototype.hasOwnProperty.call(prev, 'wave_start_sha')) {
|
|
418
|
+
preserved.wave_start_sha = prev.wave_start_sha;
|
|
419
|
+
}
|
|
383
420
|
}
|
|
384
421
|
} catch { /* absent / unparseable → no preservation (reset) */ }
|
|
385
422
|
}
|
|
@@ -675,7 +712,15 @@ async function main() {
|
|
|
675
712
|
// must never break the hook, which is informational-only.
|
|
676
713
|
const input = await stdinPromise;
|
|
677
714
|
const { sessionId, semanticSessionId, mode } = await resolveSessionId(input, projectRoot);
|
|
678
|
-
|
|
715
|
+
// getPlatform() ALREADY implements the SO_PLATFORM override as step 1 of its
|
|
716
|
+
// precedence — and, unlike a bare `??`, it validates the value against the
|
|
717
|
+
// four-platform allowlist and trims it. The former `process.env.SO_PLATFORM ??
|
|
718
|
+
// getPlatform()` therefore added nothing except the empty-string trap
|
|
719
|
+
// (`.claude/rules/development.md` § Env-var fallback whitespace trap): a key
|
|
720
|
+
// exported as `SO_PLATFORM=` is not nullish, so `??` short-circuited and this
|
|
721
|
+
// hook stamped `platform: ''` on the session event and handed '' down to the
|
|
722
|
+
// update probe. Measured 2026-09-06 by the codex test below.
|
|
723
|
+
const platform = getPlatform();
|
|
679
724
|
|
|
680
725
|
// Epic #583 P3 — mechanical session.lock writer (closes D1+D2+D4 gaps).
|
|
681
726
|
// Bootstrap the session-lock so discoverActiveSessions() picks us up even
|
|
@@ -738,6 +783,11 @@ async function main() {
|
|
|
738
783
|
} catch { /* hook must remain non-blocking */ }
|
|
739
784
|
|
|
740
785
|
let peers = [];
|
|
786
|
+
// GH#67 consumer half — how many mechanically-detected peers were registry-
|
|
787
|
+
// sourced entries that a LIVE lock at this root supersedes. Counted for the
|
|
788
|
+
// session.started payload below; NEVER subtracted from any peer count
|
|
789
|
+
// (HR-106: the banner reports the number the verdict judged).
|
|
790
|
+
let mechanicalPeersSuperseded = 0;
|
|
741
791
|
try {
|
|
742
792
|
await sweepZombies().catch(() => ({ removed: [], logged: 0 }));
|
|
743
793
|
try {
|
|
@@ -839,6 +889,7 @@ async function main() {
|
|
|
839
889
|
const { discoverActiveSessions } = await import('../scripts/lib/session-discovery.mjs');
|
|
840
890
|
const allActive = await discoverActiveSessions(projectRoot);
|
|
841
891
|
const mechanicalPeers = allActive.filter((s) => s.sessionId !== sessionId);
|
|
892
|
+
mechanicalPeersSuperseded = mechanicalPeers.filter((p) => p.lockSuperseded === true).length;
|
|
842
893
|
if (mechanicalPeers.length > 0) {
|
|
843
894
|
// #1137 part 1 — say WHERE, not just how many. discoverActiveSessions()
|
|
844
895
|
// walks EVERY path `git worktree list` reports, which includes worktrees
|
|
@@ -862,11 +913,14 @@ async function main() {
|
|
|
862
913
|
// a lock written without the field yields undefined here, while
|
|
863
914
|
// sessionFromRegistryEntry() always defaults it to 'session'.
|
|
864
915
|
const mode = typeof p.mode === 'string' && p.mode.length > 0 ? `:${p.mode}` : '';
|
|
865
|
-
return `${where}:${shortSessionId(p.sessionId)}${mode}`;
|
|
916
|
+
return `${where}:${shortSessionId(p.sessionId)}${mode}${supersessionMarker(p)}`;
|
|
866
917
|
})
|
|
867
918
|
.join(', ');
|
|
868
919
|
const overflow = mechanicalPeers.length > 3 ? ` +${mechanicalPeers.length - 3} more` : '';
|
|
869
920
|
pushBanner(`🔍 Mechanical peer-detection: ${mechanicalPeers.length} active in this repo's worktree set (${summary}${overflow})`);
|
|
921
|
+
if (mechanicalPeersSuperseded > 0) {
|
|
922
|
+
pushBanner(` ${mechanicalPeersSuperseded} of them registry-only and superseded by this root's live lock — likely a finished task without SessionEnd (GH#67). Still counted above: the session lock is advisory.`);
|
|
923
|
+
}
|
|
870
924
|
}
|
|
871
925
|
} catch { /* best effort — banner is informational, never blocks */ }
|
|
872
926
|
}
|
|
@@ -908,13 +962,79 @@ async function main() {
|
|
|
908
962
|
} catch { /* hook must remain non-blocking */ }
|
|
909
963
|
}
|
|
910
964
|
|
|
965
|
+
// Plugin-update probe (#nnn, d7 R2) — "is the plugin that is RUNNING behind
|
|
966
|
+
// the plugin that is PUBLISHED?".
|
|
967
|
+
//
|
|
968
|
+
// MEASURED 2026-09-06: this host ran the marketplace-cache copy at 3.19.0
|
|
969
|
+
// (installed 2026-08-09) while repo and npm stood at the 3.24 line — five minors,
|
|
970
|
+
// four weeks, zero warnings, because NO code anywhere compared installed
|
|
971
|
+
// against available (`grep -rln "registry.npmjs.org\|dist-tags" scripts/
|
|
972
|
+
// hooks/ skills/` → only scripts/release.mjs, the publisher).
|
|
973
|
+
//
|
|
974
|
+
// Placement mirrors the probe block above: BEFORE the payload (the event
|
|
975
|
+
// carries both versions) and BEFORE flushBanner(), so the line rides the ONE
|
|
976
|
+
// systemMessage envelope. A second stdout object would be silently discarded
|
|
977
|
+
// (HR-106) — the failure mode the bannerLines docstring describes.
|
|
978
|
+
//
|
|
979
|
+
// Same measurement/display split as the probes: the request and the event
|
|
980
|
+
// fields happen regardless, `pushBanner` is gated on `bannerData`. Network,
|
|
981
|
+
// cache and kill-switch behaviour live in the module.
|
|
982
|
+
let pluginUpdate = null;
|
|
983
|
+
try {
|
|
984
|
+
const { checkPluginUpdate } = await import('../scripts/lib/plugin-update-banner.mjs');
|
|
985
|
+
pluginUpdate = await checkPluginUpdate({
|
|
986
|
+
cacheDir: path.join(projectRoot, '.orchestrator', 'runtime'),
|
|
987
|
+
// The probe's own fallback is env-only (SO_PLATFORM, then each harness's
|
|
988
|
+
// compat var) and cannot run detectPlatform()'s third step, the marker-
|
|
989
|
+
// directory walk from cwd. This hook already resolved the platform at the
|
|
990
|
+
// top of run() through exactly that full precedence, so handing it over
|
|
991
|
+
// makes the remedy instruction MEASURED rather than guessed — a Codex or
|
|
992
|
+
// Cursor consumer with no compat var set would otherwise be told to run
|
|
993
|
+
// `/plugin update`, a command its harness does not have.
|
|
994
|
+
platform,
|
|
995
|
+
});
|
|
996
|
+
if (pluginUpdate && bannerData) pushBanner(pluginUpdate.message);
|
|
997
|
+
} catch { /* hook must remain non-blocking */ }
|
|
998
|
+
|
|
911
999
|
const payload = {
|
|
912
1000
|
platform,
|
|
913
1001
|
project: projectName,
|
|
914
1002
|
branch,
|
|
915
1003
|
session_id: sessionId,
|
|
916
1004
|
peer_count: peers.length,
|
|
1005
|
+
// GH#67 — additive: how many mechanically-detected peers a live lock at
|
|
1006
|
+
// this root supersedes. `peer_count` is deliberately unchanged; this field
|
|
1007
|
+
// makes the supersession rate measurable instead of inferred (HR-105).
|
|
1008
|
+
peers_superseded: mechanicalPeersSuperseded,
|
|
917
1009
|
};
|
|
1010
|
+
|
|
1011
|
+
// #nnn — installed/latest plugin version on the session record.
|
|
1012
|
+
//
|
|
1013
|
+
// HR-105: a verdict nothing records is unfalsifiable. `installed` is stamped
|
|
1014
|
+
// on EVERY start (it is a local file read that cannot fail for network
|
|
1015
|
+
// reasons), and `latest` whenever it is known — including the runs where
|
|
1016
|
+
// checkPluginUpdate() stayed silent because the versions matched. Those runs
|
|
1017
|
+
// are the DENOMINATOR of the probe's firing rate; without them the fleet can
|
|
1018
|
+
// only ever see how often it warned, never how often it could have.
|
|
1019
|
+
//
|
|
1020
|
+
// Both keys are OMITTED rather than nulled when unknown (docs/events-schema.md
|
|
1021
|
+
// optional-field convention: absent ≠ zero) — a kill-switched or offline
|
|
1022
|
+
// session must not read as "latest is 0/unknown-but-measured".
|
|
1023
|
+
try {
|
|
1024
|
+
const { readInstalledPluginVersion, readCachedLatest, isUpdateCheckDisabled } =
|
|
1025
|
+
await import('../scripts/lib/plugin-update-banner.mjs');
|
|
1026
|
+
const installedVersion = readInstalledPluginVersion();
|
|
1027
|
+
if (installedVersion) payload.plugin_version_installed = installedVersion;
|
|
1028
|
+
// `latest` is gated on the kill switch, `installed` is not: reading this
|
|
1029
|
+
// repo's own package.json is not the thing an operator switched off.
|
|
1030
|
+
if (!isUpdateCheckDisabled()) {
|
|
1031
|
+
const latestVersion =
|
|
1032
|
+
pluginUpdate?.latest
|
|
1033
|
+
?? readCachedLatest({ cacheDir: path.join(projectRoot, '.orchestrator', 'runtime') })?.version
|
|
1034
|
+
?? null;
|
|
1035
|
+
if (latestVersion) payload.plugin_version_latest = latestVersion;
|
|
1036
|
+
}
|
|
1037
|
+
} catch { /* telemetry never blocks the hook */ }
|
|
918
1038
|
if (bannerData) {
|
|
919
1039
|
payload.host_class = bannerData.host.host_class;
|
|
920
1040
|
payload.ram_free_gb = bannerData.resources.ram_free_gb;
|
|
@@ -935,7 +1055,12 @@ async function main() {
|
|
|
935
1055
|
payload.memory_pressure_pct_free = bannerData.resources.memory_pressure_pct_free ?? null;
|
|
936
1056
|
payload.peer_sessions_count = bannerData.resources.peer_sessions_count ?? null;
|
|
937
1057
|
}
|
|
938
|
-
|
|
1058
|
+
// #1183 — a malformed record throws EventValidationError BEFORE any side
|
|
1059
|
+
// effect (scripts/lib/events.mjs); this hook must never abort on that, so
|
|
1060
|
+
// the emit is wrapped rather than left to propagate.
|
|
1061
|
+
try {
|
|
1062
|
+
await emitEvent('orchestrator.session.started', payload);
|
|
1063
|
+
} catch { /* telemetry never blocks the hook (#1183) */ }
|
|
939
1064
|
|
|
940
1065
|
// #1138 — one-time telemetry-consent nudge. Queued (never written) here so it
|
|
941
1066
|
// rides the single stdout envelope below.
|
|
@@ -945,6 +1070,30 @@ async function main() {
|
|
|
945
1070
|
// only stdout write in the hook.
|
|
946
1071
|
flushBanner();
|
|
947
1072
|
|
|
1073
|
+
// #1229 — refresh the session-lock heartbeat at the END of this hook's run.
|
|
1074
|
+
//
|
|
1075
|
+
// MEASURED (STATE.md deviation 2026-09-05T06:08:46Z): session-20's lock was
|
|
1076
|
+
// reaped as stale at 06:06Z by an UNRELATED session's SessionEnd, its
|
|
1077
|
+
// heartbeat 11.3 h old against a 4 h TTL. The session was not idle — it was
|
|
1078
|
+
// still inside session-start / session-plan, where no heartbeat writer
|
|
1079
|
+
// existed: `updateHeartbeat()` was called only from the wave loop, from
|
|
1080
|
+
// on-stop and from session-end. A session that never reached /go therefore
|
|
1081
|
+
// aged out of its own lock while working.
|
|
1082
|
+
//
|
|
1083
|
+
// bootstrapLock() above stamps `last_heartbeat = started_at` at LOCK GENESIS,
|
|
1084
|
+
// i.e. before the peer scan, the backfill and the Phase-4 probes have run.
|
|
1085
|
+
// Stamping again here moves the clock to the end of the hook and — more
|
|
1086
|
+
// importantly — makes session-start a heartbeat CALL SITE at all, so the
|
|
1087
|
+
// cadence no longer begins only when the first wave starts.
|
|
1088
|
+
//
|
|
1089
|
+
// `updateHeartbeat()` already carries the same-session guard this needs (it
|
|
1090
|
+
// returns false without writing when the lock belongs to another session),
|
|
1091
|
+
// so no `touchIfOwn()` wrapper is warranted — see scripts/lib/session-lock.mjs.
|
|
1092
|
+
try {
|
|
1093
|
+
const { updateHeartbeat } = await import('../scripts/lib/session-lock.mjs');
|
|
1094
|
+
updateHeartbeat({ repoRoot: projectRoot, sessionId });
|
|
1095
|
+
} catch { /* hook must remain non-blocking */ }
|
|
1096
|
+
|
|
948
1097
|
// Size-based rotation of events.jsonl (#251). Session-start is the single
|
|
949
1098
|
// rotation trigger — per-append overhead is rejected design. Any failure
|
|
950
1099
|
// is swallowed: rotation must NEVER block the hook.
|