session-orchestrator 5.2.0 → 5.4.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 +3 -1
- package/.agents/skills/autopilot/SKILL.md +5 -1
- package/.agents/skills/autopilot/agents/openai.yaml +5 -0
- package/.agents/skills/bootstrap/SKILL.md +5 -1
- package/.agents/skills/bootstrap/agents/openai.yaml +5 -0
- package/.agents/skills/brainstorm/SKILL.md +5 -1
- package/.agents/skills/brainstorm/agents/openai.yaml +5 -0
- package/.agents/skills/claude-md-drift-check/SKILL.md +4 -2
- package/.agents/skills/close/SKILL.md +5 -1
- package/.agents/skills/close/agents/openai.yaml +5 -0
- package/.agents/skills/convergence-monitoring/SKILL.md +4 -2
- package/.agents/skills/debug/SKILL.md +5 -1
- package/.agents/skills/debug/agents/openai.yaml +5 -0
- package/.agents/skills/discovery/SKILL.md +5 -1
- package/.agents/skills/discovery/agents/openai.yaml +5 -0
- package/.agents/skills/dispatcher/SKILL.md +5 -1
- package/.agents/skills/dispatcher/agents/openai.yaml +5 -0
- package/.agents/skills/docs-orchestrator/SKILL.md +3 -1
- package/.agents/skills/ecosystem-health/SKILL.md +3 -1
- package/.agents/skills/eli5/SKILL.md +5 -1
- package/.agents/skills/eli5/agents/openai.yaml +5 -0
- package/.agents/skills/eval/SKILL.md +6 -2
- package/.agents/skills/eval/agents/openai.yaml +5 -0
- package/.agents/skills/evolve/SKILL.md +6 -2
- package/.agents/skills/evolve/agents/openai.yaml +5 -0
- package/.agents/skills/frontmatter-guard/SKILL.md +3 -1
- package/.agents/skills/gitlab-ops/SKILL.md +3 -1
- package/.agents/skills/gitlab-portfolio/SKILL.md +3 -1
- package/.agents/skills/go/SKILL.md +5 -1
- package/.agents/skills/go/agents/openai.yaml +5 -0
- package/.agents/skills/grill/SKILL.md +5 -1
- package/.agents/skills/grill/agents/openai.yaml +5 -0
- package/.agents/skills/harness-audit/SKILL.md +5 -1
- package/.agents/skills/harness-audit/agents/openai.yaml +5 -0
- package/.agents/skills/hook-development/SKILL.md +3 -1
- package/.agents/skills/mcp-builder/SKILL.md +3 -1
- package/.agents/skills/memory-cleanup/SKILL.md +5 -1
- package/.agents/skills/memory-cleanup/agents/openai.yaml +5 -0
- package/.agents/skills/mode-selector/SKILL.md +3 -1
- package/.agents/skills/navigator/SKILL.md +22 -0
- package/.agents/skills/navigator/agents/openai.yaml +5 -0
- package/.agents/skills/npm-publish/SKILL.md +4 -2
- package/.agents/skills/peekaboo-driver/SKILL.md +3 -1
- package/.agents/skills/persona-panel/SKILL.md +5 -1
- package/.agents/skills/persona-panel/agents/openai.yaml +5 -0
- package/.agents/skills/plan/SKILL.md +5 -1
- package/.agents/skills/plan/agents/openai.yaml +5 -0
- package/.agents/skills/playwright-driver/SKILL.md +3 -1
- package/.agents/skills/portfolio/SKILL.md +5 -1
- package/.agents/skills/portfolio/agents/openai.yaml +5 -0
- package/.agents/skills/quality-gates/SKILL.md +3 -1
- package/.agents/skills/reconcile/SKILL.md +5 -1
- package/.agents/skills/reconcile/agents/openai.yaml +5 -0
- package/.agents/skills/release/SKILL.md +5 -1
- package/.agents/skills/release/agents/openai.yaml +5 -0
- package/.agents/skills/remote-offload/SKILL.md +3 -1
- package/.agents/skills/repo-audit/SKILL.md +5 -1
- package/.agents/skills/repo-audit/agents/openai.yaml +5 -0
- package/.agents/skills/session/SKILL.md +21 -0
- package/.agents/skills/session/agents/openai.yaml +5 -0
- package/.agents/skills/session-end/SKILL.md +3 -1
- package/.agents/skills/session-plan/SKILL.md +3 -1
- package/.agents/skills/session-start/SKILL.md +3 -1
- package/.agents/skills/spinout/SKILL.md +5 -1
- package/.agents/skills/spinout/agents/openai.yaml +5 -0
- package/.agents/skills/sunset-review/SKILL.md +5 -1
- package/.agents/skills/sunset-review/agents/openai.yaml +5 -0
- package/.agents/skills/templates-ack/SKILL.md +21 -0
- package/.agents/skills/templates-ack/agents/openai.yaml +5 -0
- package/.agents/skills/test/SKILL.md +5 -1
- package/.agents/skills/test/agents/openai.yaml +5 -0
- package/.agents/skills/test-audit/SKILL.md +21 -0
- package/.agents/skills/test-audit/agents/openai.yaml +5 -0
- package/.agents/skills/test-runner/SKILL.md +3 -1
- package/.agents/skills/tmux-layout/SKILL.md +3 -1
- package/.agents/skills/using-orchestrator/SKILL.md +3 -1
- package/.agents/skills/ux-grill/SKILL.md +5 -1
- package/.agents/skills/ux-grill/agents/openai.yaml +5 -0
- package/.agents/skills/vault-mirror/SKILL.md +3 -1
- package/.agents/skills/vault-sync/SKILL.md +3 -1
- package/.agents/skills/wave-executor/SKILL.md +3 -1
- package/.agents/skills/write-executable-plan/SKILL.md +3 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +4 -4
- package/.codex-plugin/skills/claude-md-drift-check/SKILL.md +1 -1
- package/.codex-plugin/skills/convergence-monitoring/SKILL.md +1 -3
- package/.codex-plugin/skills/eval/SKILL.md +1 -1
- package/.codex-plugin/skills/evolve/SKILL.md +1 -1
- package/.codex-plugin/skills/navigator/SKILL.md +22 -0
- package/.codex-plugin/skills/{convergence-monitoring → navigator}/agents/openai.yaml +2 -2
- package/.codex-plugin/skills/npm-publish/SKILL.md +1 -3
- package/.codex-plugin/skills/session/SKILL.md +1 -1
- package/.codex-plugin/skills/test-audit/SKILL.md +21 -0
- package/.codex-plugin/skills/{npm-publish → test-audit}/agents/openai.yaml +1 -1
- package/.cursor/commands/eval.md +1 -1
- package/.cursor/commands/navigator.md +15 -0
- package/.cursor/commands/session.md +1 -1
- package/.cursor/commands/test-audit.md +14 -0
- package/.cursor/rules/000-session-orchestrator.mdc +0 -2
- package/.cursor/rules/050-plan.mdc +1 -1
- package/.cursor/rules/060-evolve.mdc +27 -12
- package/.cursor/skills/claude-md-drift-check/SKILL.md +1 -1
- package/.cursor/skills/convergence-monitoring/SKILL.md +1 -0
- package/.cursor/skills/eval/SKILL.md +1 -1
- package/.cursor/skills/navigator/SKILL.md +13 -0
- package/.cursor/skills/npm-publish/SKILL.md +1 -0
- package/.cursor/skills/test-audit/SKILL.md +12 -0
- package/.cursor-plugin/plugin.json +1 -1
- package/.orchestrator/policy/blocked-commands.json +12 -3
- package/AGENTS.md +9 -30
- package/CHANGELOG.md +206 -0
- package/README.md +13 -9
- package/SECURITY.md +12 -0
- package/agents/dialectic-deriver.md +13 -10
- package/agents/eval-judge.md +67 -45
- package/agents/skill-applied-judge.md +34 -19
- package/commands/session.md +7 -3
- package/docs/agent-authoring.md +2 -2
- package/docs/baseline.md +22 -7
- package/docs/ci-setup.md +57 -4
- package/docs/codex-setup.md +14 -2
- package/docs/components.md +12 -10
- package/docs/events-schema.md +65 -15
- package/docs/persona-panel.md +5 -4
- package/docs/rule-authoring.md +84 -17
- package/docs/scope-collision-guard.md +26 -4
- package/docs/session-config-reference.md +154 -12
- package/docs/session-config-template.md +41 -3
- package/docs/telemetry.md +2 -0
- package/hooks/_lib/hook-import-set.json +87 -6
- package/hooks/_lib/subagent-transcript.mjs +582 -31
- package/hooks/config-protection.mjs +11 -3
- package/hooks/cwd-change-restore.mjs +11 -3
- package/hooks/enforce-commands.mjs +70 -23
- package/hooks/enforce-scope.mjs +143 -33
- package/hooks/hooks-codex.json +1 -1
- package/hooks/hooks-cursor.json +5 -0
- package/hooks/hooks-pi.json +5 -0
- package/hooks/hooks.json +6 -1
- package/hooks/loop-guard.mjs +11 -3
- package/hooks/on-session-end.mjs +58 -23
- package/hooks/on-session-start.mjs +101 -11
- package/hooks/on-stop.mjs +170 -22
- package/hooks/operator-steer.mjs +11 -3
- package/hooks/post-bash-issue-budget-refund.mjs +18 -8
- package/hooks/post-bash-write-verify.mjs +3 -2
- package/hooks/post-edit-import-probe.mjs +17 -9
- package/hooks/post-edit-validate.mjs +13 -5
- package/hooks/post-subagent-discovery-validator.mjs +98 -13
- package/hooks/post-tool-batch-wave-signal.mjs +202 -38
- package/hooks/post-tool-failure-corrective-context.mjs +11 -5
- package/hooks/post-tooluse-frontend-slop.mjs +10 -4
- package/hooks/pre-auq-clarity.mjs +15 -2
- package/hooks/pre-bash-destructive-guard.mjs +80 -9
- package/hooks/pre-bash-issue-budget.mjs +16 -11
- package/hooks/pre-bash-memory-propose-audit.mjs +137 -56
- package/hooks/pre-bash-sessions-ledger-guard.mjs +419 -22
- package/hooks/pre-bash-staging-fence.mjs +335 -31
- package/hooks/pre-bash-templates-first.mjs +19 -14
- package/hooks/pre-edit-sessions-ledger-guard.mjs +162 -0
- package/hooks/pre-task-scope-disjoint.mjs +792 -74
- package/hooks/subagent-telemetry.mjs +111 -38
- package/hooks/wave-scope-commit-guard.mjs +197 -100
- package/monitors/monitors.json +1 -1
- package/output-styles/wave-summary.md +1 -1
- package/package.json +3 -3
- package/pi/prompts/eval.md +1 -1
- package/pi/prompts/navigator.md +12 -0
- package/pi/prompts/session.md +1 -1
- package/pi/prompts/test-audit.md +12 -0
- package/rules/README.md +7 -2
- package/rules/_index.md +3 -3
- package/rules/always-on/bash-harness-pitfalls.md +7 -1
- package/rules/opt-in-domain/prompt-caching.md +6 -2
- package/rules/opt-in-stack/backend-data.md +10 -2
- package/rules/opt-in-stack/backend.md +10 -4
- package/rules/opt-in-stack/frontend.md +7 -2
- package/rules/opt-in-stack/security-web.md +10 -4
- package/rules/opt-in-stack/swift.md +6 -2
- package/scripts/apply-session-learnings.mjs +492 -0
- package/scripts/archive-closed-prds.mjs +2 -1
- package/scripts/autopilot.mjs +70 -53
- package/scripts/backfill-abandoned-sessions.mjs +118 -16
- package/scripts/baseline-archetypes.mjs +1 -1
- package/scripts/check-package-manager.mjs +62 -5
- package/scripts/check-sessions-integrity.mjs +300 -0
- package/scripts/cursor-install.mjs +1 -4
- package/scripts/dialectic-deriver.mjs +50 -13
- package/scripts/emit-session.mjs +371 -31
- package/scripts/eval-session.mjs +65 -3
- package/scripts/export-hw-learnings.mjs +22 -3
- package/scripts/fleet-checkin.mjs +147 -0
- package/scripts/generate-agents-skills.mjs +102 -29
- package/scripts/generate-cursor-adapter.mjs +61 -16
- package/scripts/lib/agent-frontmatter.mjs +3 -3
- package/scripts/lib/agent-status.mjs +2 -31
- package/scripts/lib/auq/clarity.mjs +10 -2
- package/scripts/lib/auq/parse.mjs +12 -31
- package/scripts/lib/auq/schema.mjs +56 -41
- package/scripts/lib/auto-dialectic.mjs +304 -15
- package/scripts/lib/auto-dream.mjs +7 -6
- package/scripts/lib/autopilot/flags.mjs +18 -2
- package/scripts/lib/autopilot/kill-switches.mjs +6 -3
- package/scripts/lib/autopilot/loop.mjs +19 -2
- package/scripts/lib/autopilot/stall-sampler.mjs +80 -23
- package/scripts/lib/baseline-archetypes.mjs +41 -22
- package/scripts/lib/ci-status-banner.mjs +376 -16
- package/scripts/lib/command-blocker.mjs +275 -28
- package/scripts/lib/config/dialectic.mjs +12 -3
- package/scripts/lib/config/gate.mjs +74 -0
- package/scripts/lib/config/host-paths.mjs +79 -0
- package/scripts/lib/config/persona-gate-wave.mjs +3 -3
- package/scripts/lib/config/reaper.mjs +163 -0
- package/scripts/lib/config-schema.mjs +13 -0
- package/scripts/lib/config.mjs +85 -10
- package/scripts/lib/convergence-monitor.mjs +74 -11
- package/scripts/lib/ecosystem-health.mjs +11 -0
- package/scripts/lib/eval/engine.mjs +421 -53
- package/scripts/lib/eval/judge.mjs +463 -40
- package/scripts/lib/eval/schema.mjs +10 -1
- package/scripts/lib/events-rotation.mjs +221 -25
- package/scripts/lib/events-schema.mjs +114 -0
- package/scripts/lib/events.mjs +545 -7
- package/scripts/lib/fleet-protocol.mjs +270 -0
- package/scripts/lib/frontmatter-guard.mjs +21 -10
- package/scripts/lib/gates/gate-baseline.mjs +40 -5
- package/scripts/lib/gates/gate-full.mjs +35 -5
- package/scripts/lib/gates/gate-helpers.mjs +336 -23
- package/scripts/lib/gates/gate-incremental.mjs +49 -23
- package/scripts/lib/gates/gate-per-file.mjs +42 -8
- package/scripts/lib/gitlab-portfolio/markdown-writer.mjs +6 -1
- package/scripts/lib/instruction-budget-guard.mjs +208 -8
- package/scripts/lib/io.mjs +42 -8
- package/scripts/lib/issue-close-strip-labels.mjs +207 -49
- package/scripts/lib/js-mask.mjs +197 -0
- package/scripts/lib/learnings/evolve-telemetry.mjs +11 -7
- package/scripts/lib/learnings/expiry-sweep.mjs +34 -3
- package/scripts/lib/learnings/io.mjs +154 -26
- package/scripts/lib/learnings/schema.mjs +163 -15
- package/scripts/lib/learnings/sizing-subject.mjs +2 -2
- package/scripts/lib/maintenance-due-banner.mjs +53 -88
- package/scripts/lib/memory-proposals/schema.mjs +11 -5
- package/scripts/lib/named-baseline-resolver.mjs +53 -28
- package/scripts/lib/named-vault-resolver.mjs +104 -5
- package/scripts/lib/orphan-reaper/defaults.mjs +41 -0
- package/scripts/lib/orphan-reaper/ps-snapshot.mjs +181 -0
- package/scripts/lib/orphan-reaper/reaper-audit.mjs +291 -0
- package/scripts/lib/orphan-reaper/reaper-decide.mjs +395 -0
- package/scripts/lib/orphan-reaper/scan-throttle.mjs +92 -0
- package/scripts/lib/orphan-reaper/scan.mjs +506 -0
- package/scripts/lib/orphan-reaper.mjs +316 -0
- package/scripts/lib/owner-yaml.mjs +104 -6
- package/scripts/lib/peer-cards/merger.mjs +48 -10
- package/scripts/lib/peer-cards/reader.mjs +78 -2
- package/scripts/lib/persona-panel/catalog-loader.mjs +1 -1
- package/scripts/lib/process-group.mjs +950 -0
- package/scripts/lib/project-hygiene.mjs +21 -1
- package/scripts/lib/quality-gate.mjs +152 -33
- package/scripts/lib/reconcile/backlog.mjs +368 -0
- package/scripts/lib/reconcile/engine.mjs +55 -188
- package/scripts/lib/reconcile/rule-expiry-sweep.mjs +302 -60
- package/scripts/lib/reconcile/sanitize.mjs +69 -3
- package/scripts/lib/reconcile-nudge-banner.mjs +138 -45
- package/scripts/lib/resource-probe/parsers.mjs +31 -0
- package/scripts/lib/resource-probe.mjs +1 -1
- package/scripts/lib/rule-loader.mjs +141 -74
- package/scripts/lib/rules-sync.mjs +27 -12
- package/scripts/lib/scope-baseline.mjs +3 -4
- package/scripts/lib/scope-echo.mjs +39 -2
- package/scripts/lib/scope-gate.mjs +605 -1
- package/scripts/lib/session-close-backfill.mjs +33 -6
- package/scripts/lib/session-id.mjs +9 -20
- package/scripts/lib/session-invocation.mjs +20 -0
- package/scripts/lib/session-record-repair.mjs +183 -26
- package/scripts/lib/session-registry.mjs +27 -2
- package/scripts/lib/session-schema/constants.mjs +56 -2
- package/scripts/lib/session-schema/normalizer.mjs +56 -4
- package/scripts/lib/session-schema/validator.mjs +28 -1
- package/scripts/lib/session-schema.mjs +8 -3
- package/scripts/lib/session-start-probes.mjs +95 -10
- package/scripts/lib/session-token-rollup.mjs +245 -52
- package/scripts/lib/sessions-canonical.mjs +118 -4
- package/scripts/lib/sessions-integrity-banner.mjs +7 -1
- package/scripts/lib/sessions-staleness-banner.mjs +193 -51
- package/scripts/lib/sh-quote.mjs +29 -0
- package/scripts/lib/skill-evidence-window.mjs +891 -0
- package/scripts/lib/skill-evolution/candidate-intake.mjs +133 -12
- package/scripts/lib/skill-evolution/engine.mjs +18 -9
- package/scripts/lib/skill-judge.mjs +45 -3
- package/scripts/lib/subagents-schema.mjs +30 -3
- package/scripts/lib/tail-window.mjs +56 -0
- package/scripts/lib/telemetry/pricing.mjs +118 -71
- package/scripts/lib/telemetry/schema.mjs +30 -0
- package/scripts/lib/telemetry/sync.mjs +61 -6
- package/scripts/lib/telemetry-flush-health-banner.mjs +4 -22
- package/scripts/lib/test-runner/issue-reconcile.mjs +48 -16
- package/scripts/lib/tests-src-ratio.mjs +140 -23
- package/scripts/lib/tmux-layout/layouts.mjs +1 -11
- package/scripts/lib/tmux-layout/telemetry-stats.mjs +72 -13
- package/scripts/lib/tmux-layout/tmux-shell.mjs +2 -11
- package/scripts/lib/user-invocable-skills.mjs +23 -3
- package/scripts/lib/ux-grill/reconcile.mjs +48 -22
- package/scripts/lib/validate/check-agents-skills.mjs +26 -15
- package/scripts/lib/validate/check-agents.mjs +1 -1
- package/scripts/lib/validate/check-cursor-adapter.mjs +1 -0
- package/scripts/lib/validate/check-entry-guard.mjs +13 -50
- package/scripts/lib/validate/check-hook-entry-guards.mjs +636 -0
- package/scripts/lib/validate/check-hooks-symmetry.mjs +5 -0
- package/scripts/lib/validate/check-learnings-shell-writes.mjs +214 -0
- package/scripts/lib/validate/check-pi-prompts.mjs +1 -0
- package/scripts/lib/validate/check-rules.mjs +7 -5
- package/scripts/lib/validate/check-skill-links.mjs +9 -1
- package/scripts/lib/validate/check-skill-script-paths.mjs +239 -27
- package/scripts/lib/validate/check-test-git-config-target.mjs +24 -34
- package/scripts/lib/validate/check-test-value-bans.mjs +87 -14
- package/scripts/lib/validate/check-unicode-safety.mjs +1 -0
- package/scripts/lib/validate/check-untracked-test-deps.mjs +7 -102
- package/scripts/lib/validate/check-unwired-features.mjs +130 -27
- package/scripts/lib/validate/check-validator-registration.mjs +34 -10
- package/scripts/lib/validate/confidential-names.mjs +10 -0
- package/scripts/lib/validate-vendored-rules.mjs +210 -84
- package/scripts/lib/vault-mirror/namespace.mjs +46 -8
- package/scripts/lib/vault-mirror/process.mjs +10 -3
- package/scripts/lib/vault-mirror/render-sessions.mjs +12 -2
- package/scripts/lib/vault-mirror/telemetry.mjs +8 -1
- package/scripts/lib/vault-status/board-writer.mjs +48 -11
- package/scripts/lib/vault-status/narrative-mirror.mjs +71 -16
- package/scripts/lib/vault-yaml.mjs +118 -0
- package/scripts/lib/wave-executor/dispatch-common.mjs +10 -18
- package/scripts/lib/wave-executor/foreign-dispatch.mjs +1 -1
- package/scripts/lib/wave-executor/remote-dispatch.mjs +1 -1
- package/scripts/lib/wave-resource-gate.mjs +34 -8
- package/scripts/lib/worktree/lifecycle.mjs +153 -1
- package/scripts/memory-propose.mjs +18 -5
- package/scripts/release-session-lock.mjs +306 -0
- package/scripts/release.mjs +40 -8
- package/scripts/repair-invalid-sessions.mjs +37 -4
- package/scripts/resolve-session-invocation.mjs +59 -0
- package/scripts/run-migrate-v2-cross-repo.mjs +158 -30
- package/scripts/run-quality-gate.mjs +357 -197
- package/scripts/site-numbers.mjs +163 -5
- package/scripts/sweep-expired-learnings.mjs +56 -5
- package/scripts/sweep-expired-rules.mjs +16 -4
- package/scripts/validate-plugin.mjs +19 -0
- package/scripts/validate-wave-scope.mjs +32 -105
- package/scripts/vault-integration-watcher.mjs +2 -1
- package/scripts/vault-mirror.mjs +81 -47
- package/scripts/wave-scope-binding.mjs +2 -1
- package/skills/_shared/config-reading.md +3 -3
- package/skills/_shared/fleet-protocol.md +131 -0
- package/skills/_shared/platform-tools.md +23 -11
- package/skills/_shared/state-ownership.md +5 -0
- package/skills/autopilot/SKILL.md +47 -18
- package/skills/bootstrap/SKILL.md +1 -1
- package/skills/bootstrap/_shared-template.md +1 -1
- package/skills/bootstrap/fast-template.md +1 -1
- package/skills/bootstrap/private-contract.md +2 -1
- package/skills/bootstrap/public-fallback.md +6 -3
- package/skills/bootstrap/references/bootstrap-retroactive-flow.md +2 -1
- package/skills/claude-md-drift-check/SKILL.md +10 -10
- package/skills/claude-md-drift-check/checker.mjs +26 -18
- package/skills/convergence-monitoring/README.md +8 -1
- package/skills/convergence-monitoring/SIGNALS.md +50 -6
- package/skills/convergence-monitoring/SKILL.md +15 -6
- package/skills/eval/SKILL.md +39 -24
- package/skills/eval/rubric-v1.md +1 -0
- package/skills/eval/rubric-v2.md +457 -0
- package/skills/evolve/SKILL.md +3 -3
- package/skills/evolve/references/evolve-analyze-mode.md +10 -6
- package/skills/evolve/references/evolve-dialectic-mode.md +42 -25
- package/skills/gitlab-ops/SKILL.md +3 -2
- package/skills/memory-cleanup/SKILL.md +1 -1
- package/skills/navigator/SKILL.md +193 -0
- package/skills/navigator/references/account-check.sh +87 -0
- package/skills/navigator/references/fleet-decisions.mjs +231 -0
- package/skills/navigator/references/slot-check.sh +114 -0
- package/skills/npm-publish/SKILL.md +1 -1
- package/skills/persona-panel/SKILL.md +2 -2
- package/skills/persona-panel/persona-format.md +2 -2
- package/skills/persona-panel/presets/designer-lens.md +1 -1
- package/skills/persona-panel/presets/engineer-lens.md +1 -1
- package/skills/persona-panel/presets/pm-lens.md +1 -1
- package/skills/plan/mode-retro.md +19 -4
- package/skills/quality-gates/SKILL.md +6 -4
- package/skills/reconcile/SKILL.md +11 -0
- package/skills/remote-offload/SKILL.md +4 -2
- package/skills/session-end/SKILL.md +13 -16
- package/skills/session-end/discovery-scan.md +1 -1
- package/skills/session-end/learning-patterns.md +22 -12
- package/skills/session-end/metrics-collection.md +5 -6
- package/skills/session-end/phase-3-6-tail.md +55 -9
- package/skills/session-end/references/phase-3-documentation-updates.md +2 -2
- package/skills/session-end/references/phase-4a-worktree-cleanup.md +2 -0
- package/skills/session-end/references/phase-5-issue-cleanup.md +9 -14
- package/skills/session-end/references/session-summary-template.md +1 -1
- package/skills/session-end/session-metrics-write.md +32 -60
- package/skills/session-plan/SKILL.md +17 -8
- package/skills/session-plan/references/session-plan-task-classification.md +2 -2
- package/skills/session-start/SKILL.md +6 -0
- package/skills/session-start/references/operations-contract.md +4 -0
- package/skills/session-start/references/phase-1-7-vault-status-board.md +1 -1
- package/skills/session-start/references/phase-4-ssot-environment-check.md +4 -3
- package/skills/test-audit/SKILL.md +152 -0
- package/skills/test-audit/references/campaign.md +111 -0
- package/skills/test-audit/references/mutate.sh +50 -0
- package/skills/ux-grill/SKILL.md +1 -1
- package/skills/wave-executor/SKILL.md +9 -5
- package/skills/wave-executor/circuit-breaker.md +2 -0
- package/skills/wave-executor/references/wave-executor-state-init.md +8 -3
- package/skills/wave-executor/references/wave-loop-dispatch.md +5 -2
- package/skills/wave-executor/references/wave-loop-review.md +3 -5
- package/templates/personas/README.md +5 -5
- package/templates/personas/accounting-compliance.v1.md +1 -1
- package/templates/personas/accounting-tax-advisor.v1.md +1 -1
- package/templates/personas/buyer-p1-cto.v1.md +1 -1
- package/templates/personas/buyer-p2-kanzlei.v1.md +1 -1
- package/templates/personas/buyer-p3-build.v1.md +1 -1
- package/templates/personas/buyer-p4-tech-veto.v1.md +1 -1
- package/templates/personas/buyer-p5-solo.v1.md +1 -1
- package/templates/personas/buyer-p6-ld.v1.md +1 -1
- package/templates/personas/klima-ai-expert.v1.md +1 -1
- package/templates/personas/klima-physicist.v1.md +1 -1
- package/.cursor/commands/convergence-monitoring.md +0 -13
- package/.cursor/commands/npm-publish.md +0 -13
- package/pi/prompts/convergence-monitoring.md +0 -11
- package/pi/prompts/npm-publish.md +0 -11
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
* Imports: constants.mjs. No imports from siblings (validator, timestamps,
|
|
6
6
|
* aliases) or parent barrel.
|
|
7
7
|
*
|
|
8
|
-
* Exports: normalizeSession
|
|
8
|
+
* Exports: normalizeSession, normalizeWaveKeys
|
|
9
9
|
* Module-private: _warnedMissingSchemaVersion (Set, per-process dedupe),
|
|
10
|
-
* isPlainObject, _canonicalizeExpressPath
|
|
10
|
+
* isPlainObject, _canonicalizeExpressPath, _aliasWaves
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import { SESSION_KEY_ALIASES } from './constants.mjs';
|
|
13
|
+
import { SESSION_KEY_ALIASES, WAVE_KEY_ALIASES } from './constants.mjs';
|
|
14
14
|
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
16
16
|
// Module-level state
|
|
@@ -79,12 +79,61 @@ function _canonicalizeExpressPath(next) {
|
|
|
79
79
|
next.express_path = raw.activated;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Apply WAVE_KEY_ALIASES to every plain-object wave, mirroring the top-level
|
|
84
|
+
* SESSION_KEY_ALIASES rule: the legacy key is preserved, and an existing
|
|
85
|
+
* canonical key is never clobbered. Copy-on-write — the caller's wave objects
|
|
86
|
+
* are never mutated (normalizeSession's `{ ...entry }` is shallow, so `waves`
|
|
87
|
+
* is still the caller's array).
|
|
88
|
+
*
|
|
89
|
+
* @param {any[]} waves
|
|
90
|
+
* @returns {any[]} the same array reference when no wave needed an alias
|
|
91
|
+
*/
|
|
92
|
+
function _aliasWaves(waves) {
|
|
93
|
+
let changed = false;
|
|
94
|
+
const out = waves.map((w) => {
|
|
95
|
+
if (!isPlainObject(w)) return w;
|
|
96
|
+
let copy = null;
|
|
97
|
+
for (const [oldKey, newKey] of Object.entries(WAVE_KEY_ALIASES)) {
|
|
98
|
+
if (oldKey in w && !(newKey in w)) {
|
|
99
|
+
copy ??= { ...w };
|
|
100
|
+
copy[newKey] = w[oldKey];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (copy === null) return w;
|
|
104
|
+
changed = true;
|
|
105
|
+
return copy;
|
|
106
|
+
});
|
|
107
|
+
return changed ? out : waves;
|
|
108
|
+
}
|
|
109
|
+
|
|
82
110
|
// ---------------------------------------------------------------------------
|
|
83
111
|
// Public API
|
|
84
112
|
// ---------------------------------------------------------------------------
|
|
85
113
|
|
|
86
114
|
/**
|
|
87
|
-
*
|
|
115
|
+
* Apply ONLY the per-wave key aliases (WAVE_KEY_ALIASES) to a session entry —
|
|
116
|
+
* the subset of normalizeSession that is safe on the WRITE path
|
|
117
|
+
* (scripts/emit-session.mjs, #1390 P1). The rest of normalizeSession is not:
|
|
118
|
+
* it tags a missing `schema_version` as 0 where validateSession stamps the
|
|
119
|
+
* current version, and applies top-level aliases the write-path contract
|
|
120
|
+
* explicitly excludes.
|
|
121
|
+
*
|
|
122
|
+
* Never throws. Non-objects and entries without a `waves` array are returned
|
|
123
|
+
* unchanged; so is an entry none of whose waves needs an alias (same reference).
|
|
124
|
+
*
|
|
125
|
+
* @param {any} entry
|
|
126
|
+
* @returns {any} a new entry with aliased waves, or the input unchanged
|
|
127
|
+
*/
|
|
128
|
+
export function normalizeWaveKeys(entry) {
|
|
129
|
+
if (!isPlainObject(entry) || !Array.isArray(entry.waves)) return entry;
|
|
130
|
+
const waves = _aliasWaves(entry.waves);
|
|
131
|
+
return waves === entry.waves ? entry : { ...entry, waves };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Normalize a session entry read from disk. Applies SAFE key aliases (top-level
|
|
136
|
+
* SESSION_KEY_ALIASES and per-wave WAVE_KEY_ALIASES), collapses
|
|
88
137
|
* the legacy object form of `express_path` onto its canonical boolean, and tags
|
|
89
138
|
* legacy entries without `schema_version` as 0 (distinct from
|
|
90
139
|
* CURRENT_SESSION_SCHEMA_VERSION=2 which is stamped on new writes; bumped
|
|
@@ -112,6 +161,9 @@ export function normalizeSession(entry) {
|
|
|
112
161
|
}
|
|
113
162
|
}
|
|
114
163
|
|
|
164
|
+
// Per-wave aliases (#1390 P1) — same non-clobber rule, one level down.
|
|
165
|
+
if (Array.isArray(next.waves)) next.waves = _aliasWaves(next.waves);
|
|
166
|
+
|
|
115
167
|
// express_path — same key, two shapes. Collapse onto the canonical boolean.
|
|
116
168
|
_canonicalizeExpressPath(next);
|
|
117
169
|
|
|
@@ -386,7 +386,9 @@ function _validateOptionalFields(entry) {
|
|
|
386
386
|
}
|
|
387
387
|
// #1244 — cache buckets, cost estimate and the token-contract marker.
|
|
388
388
|
// Same non-negative-finite-or-null contract as the two totals above;
|
|
389
|
-
// total_cost_usd is fractional
|
|
389
|
+
// total_cost_usd is fractional; null means "cost unknown" — at least one
|
|
390
|
+
// subagent record could not be priced (#1475: unknown model, no model, or no
|
|
391
|
+
// tokens; see cost_records_* below) — never 0.
|
|
390
392
|
for (const field of [
|
|
391
393
|
'total_token_input_uncached',
|
|
392
394
|
'total_token_cache_read',
|
|
@@ -417,6 +419,31 @@ function _validateOptionalFields(entry) {
|
|
|
417
419
|
}
|
|
418
420
|
}
|
|
419
421
|
|
|
422
|
+
// #1436 — the session-level token total and the rollup's record count, merged
|
|
423
|
+
// by emit-session from subagents.jsonl. Same contract as subagents_with_tokens:
|
|
424
|
+
// a non-negative integer, null/absent = not measured. Before this, neither was
|
|
425
|
+
// checked and `total_tokens: "abc"` validated — the field the autopilot token
|
|
426
|
+
// budget reads. #1475 adds the rollup's cost-coverage counters under the same
|
|
427
|
+
// contract, plus the one relation between them: priced never exceeds total.
|
|
428
|
+
for (const field of ['total_tokens', 'matched_records', 'cost_records_priced', 'cost_records_total']) {
|
|
429
|
+
const value = entry[field];
|
|
430
|
+
if (value !== undefined && value !== null) {
|
|
431
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {
|
|
432
|
+
throw new ValidationError(`${field} must be a non-negative integer, got: ${value}`);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
if (
|
|
437
|
+
Number.isInteger(entry.cost_records_priced) &&
|
|
438
|
+
Number.isInteger(entry.cost_records_total) &&
|
|
439
|
+
entry.cost_records_priced > entry.cost_records_total
|
|
440
|
+
) {
|
|
441
|
+
throw new ValidationError(
|
|
442
|
+
`cost_records_priced must not exceed cost_records_total, got: ` +
|
|
443
|
+
`${entry.cost_records_priced} > ${entry.cost_records_total}`
|
|
444
|
+
);
|
|
445
|
+
}
|
|
446
|
+
|
|
420
447
|
// Epic #724 C1 — SessionEnd close-through backfill provenance fields.
|
|
421
448
|
// All additive-optional; null/absent passes without further checks so that
|
|
422
449
|
// pre-#724 records (and every normally-closed record) validate cleanly.
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
* SESSION_KEY_ALIASES, VALID_SESSION_TYPES,
|
|
60
60
|
* REQUIRED_FIELDS, AGENT_SUMMARY_FIELDS
|
|
61
61
|
* session-schema/validator.mjs — ValidationError, validateSession
|
|
62
|
-
* session-schema/normalizer.mjs — normalizeSession
|
|
62
|
+
* session-schema/normalizer.mjs — normalizeSession, normalizeWaveKeys
|
|
63
63
|
* session-schema/timestamps.mjs — clampTimestampsMonotonic
|
|
64
64
|
* session-schema/aliases.mjs — aliasLegacyEndedAt
|
|
65
65
|
*/
|
|
@@ -67,7 +67,12 @@
|
|
|
67
67
|
export { CURRENT_SESSION_SCHEMA_VERSION, SESSION_KEY_ALIASES } from './session-schema/constants.mjs';
|
|
68
68
|
export { ValidationError, validateSession } from './session-schema/validator.mjs';
|
|
69
69
|
export { serializeSessionLineChecked } from './session-schema/serializer.mjs';
|
|
70
|
-
export { normalizeSession } from './session-schema/normalizer.mjs';
|
|
70
|
+
export { normalizeSession, normalizeWaveKeys } from './session-schema/normalizer.mjs';
|
|
71
71
|
export { clampTimestampsMonotonic } from './session-schema/timestamps.mjs';
|
|
72
72
|
export { aliasLegacyEndedAt } from './session-schema/aliases.mjs';
|
|
73
|
-
export {
|
|
73
|
+
export {
|
|
74
|
+
isRealSession,
|
|
75
|
+
filterRealSessions,
|
|
76
|
+
tailRealSessions,
|
|
77
|
+
isCoordinatorDirectHousekeeping,
|
|
78
|
+
} from './session-schema/filters.mjs';
|
|
@@ -70,11 +70,22 @@ const local = (rel) => pathToFileURL(path.join(import.meta.dirname, rel)).href;
|
|
|
70
70
|
const CI_UNKNOWN_HINT_DEFAULT = 'run `glab ci status` on demand';
|
|
71
71
|
|
|
72
72
|
/**
|
|
73
|
-
* `ci-status` "no
|
|
74
|
-
* worth asking about: GitLab's `no-pipeline-for-head-sha
|
|
75
|
-
* `no-check-runs-for-head` (
|
|
73
|
+
* `ci-status` "no usable reading for HEAD" reasons after which the last PUSHED
|
|
74
|
+
* commit is worth asking about: GitLab's `no-pipeline-for-head-sha`, GitHub's
|
|
75
|
+
* `no-check-runs-for-head`, and GitLab's `pipeline-unmatched-ref` (all emitted
|
|
76
|
+
* by `checkCiStatus`).
|
|
77
|
+
*
|
|
78
|
+
* `pipeline-unmatched-ref` (#857) is not a "no data" state — pipelines EXIST for
|
|
79
|
+
* the sha, they just all sit on a foreign ref, so the reading stays `unknown`.
|
|
80
|
+
* For this consumer that is the same DARK outcome: the operator learns nothing
|
|
81
|
+
* about HEAD. Routing it to the pushed-commit re-query at least yields the
|
|
82
|
+
* pushed sha's own verdict instead of an unactionable line.
|
|
76
83
|
*/
|
|
77
|
-
const PUSHED_FOLLOW_UP_REASONS = new Set([
|
|
84
|
+
const PUSHED_FOLLOW_UP_REASONS = new Set([
|
|
85
|
+
'no-pipeline-for-head-sha',
|
|
86
|
+
'no-check-runs-for-head',
|
|
87
|
+
'pipeline-unmatched-ref',
|
|
88
|
+
]);
|
|
78
89
|
|
|
79
90
|
/**
|
|
80
91
|
* Full SHAs for `refs`, in order, from ONE `git rev-parse` — or `null` when
|
|
@@ -190,6 +201,22 @@ function pushedVerdictText(v) {
|
|
|
190
201
|
return `CI ${v.status}${parts.length > 0 ? ` (${parts.join(', ')})` : ''}`;
|
|
191
202
|
}
|
|
192
203
|
|
|
204
|
+
/**
|
|
205
|
+
* On-demand command listing every CI run of ONE commit, in the CLI that read
|
|
206
|
+
* CI — a glab command cannot answer in a GitHub repo (#1339 P1).
|
|
207
|
+
*
|
|
208
|
+
* Takes the FULL sha. Measured 2026-09-19, glab 1.117.0: `glab ci status` has
|
|
209
|
+
* no `--ref` flag ("Unknown flag: --ref.", exit 1), and `glab ci list --sha`
|
|
210
|
+
* matches exactly, so a short sha lists nothing.
|
|
211
|
+
*
|
|
212
|
+
* @param {boolean} gh The reading came from the gh CLI
|
|
213
|
+
* @param {string} sha Full commit sha
|
|
214
|
+
* @returns {string}
|
|
215
|
+
*/
|
|
216
|
+
function commitRunsCommand(gh, sha) {
|
|
217
|
+
return gh ? `gh run list --commit ${sha}` : `glab ci list --sha ${sha}`;
|
|
218
|
+
}
|
|
219
|
+
|
|
193
220
|
/**
|
|
194
221
|
* Hint text for a `status: 'unknown'` ci-status reading.
|
|
195
222
|
*
|
|
@@ -212,8 +239,7 @@ function ciUnknownHint(result, ctx) {
|
|
|
212
239
|
if (pushed?.sameAsHead) return `last pushed: ${short} = HEAD — ${onDemand}`;
|
|
213
240
|
const verdict = pushedVerdictText(pushed?.verdict);
|
|
214
241
|
if (verdict) return `last pushed: ${short} — ${verdict}`;
|
|
215
|
-
|
|
216
|
-
return `last pushed: ${short} (pipeline not checked; run \`${check}\`)`;
|
|
242
|
+
return `last pushed: ${short} (pipeline not checked; run \`${commitRunsCommand(gh, sha)}\`)`;
|
|
217
243
|
}
|
|
218
244
|
|
|
219
245
|
/**
|
|
@@ -229,6 +255,53 @@ function hasFailedAllowFailureJobs(r) {
|
|
|
229
255
|
return Array.isArray(r?.allowFailureJobs) && r.allowFailureJobs.length > 0;
|
|
230
256
|
}
|
|
231
257
|
|
|
258
|
+
/**
|
|
259
|
+
* How many same-commit pipelines the ref preference SET ASIDE ended `failed`
|
|
260
|
+
* (#1390 P5) — the ONE predicate the `ci-status` renderer and its `severityOf`
|
|
261
|
+
* share, for the reason {@link hasFailedAllowFailureJobs} records (#1333).
|
|
262
|
+
* Only `failed` counts: a set-aside `canceled`/`skipped` run says nothing about
|
|
263
|
+
* the commit, and a line that fires on those would teach the operator to skip
|
|
264
|
+
* the banner (HR-101).
|
|
265
|
+
*
|
|
266
|
+
* @param {*} r
|
|
267
|
+
* @returns {number}
|
|
268
|
+
*/
|
|
269
|
+
function droppedFailedCount(r) {
|
|
270
|
+
const statuses = r?.details?.droppedStatuses;
|
|
271
|
+
return Array.isArray(statuses) ? statuses.filter((s) => s === 'failed').length : 0;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Banner line for a `green` reading beside a FAILED pipeline of the same
|
|
276
|
+
* commit that the ref preference set aside (#1390 P5). The verdict stays the
|
|
277
|
+
* #857 ref-preference result; this only stops the failure from vanishing
|
|
278
|
+
* behind a silent green.
|
|
279
|
+
*
|
|
280
|
+
* NAMED CEILING (BV-004): one `git rev-parse HEAD` (2s timeout), run only on
|
|
281
|
+
* this branch — a green reading WITH a set-aside `failed` run, behind the
|
|
282
|
+
* network opt-in. The reading carries no sha, and the GitLab path read the
|
|
283
|
+
* local HEAD, so HEAD is the commit it spoke for. REVISIT TRIGGER: once
|
|
284
|
+
* `checkCiStatus` publishes the sha it read, take it from the reading.
|
|
285
|
+
*
|
|
286
|
+
* Only the GitLab path publishes `droppedStatuses` today (`candidateEvidence`
|
|
287
|
+
* is called from `checkGitlab` alone); the gh form exists so a GitHub producer
|
|
288
|
+
* can never print a glab command (#1339 P1 class) — see {@link commitRunsCommand}.
|
|
289
|
+
*
|
|
290
|
+
* @param {*} r A green reading with `droppedFailedCount(r) > 0`
|
|
291
|
+
* @param {{repoRoot?: string}} [ctx]
|
|
292
|
+
* @returns {string}
|
|
293
|
+
*/
|
|
294
|
+
function droppedFailedLine(r, ctx) {
|
|
295
|
+
const sha = revParseShas(ctx?.repoRoot, ['HEAD'])?.[0] ?? null;
|
|
296
|
+
const gh = r.details.cliUsed === 'gh';
|
|
297
|
+
let check;
|
|
298
|
+
if (sha) check = commitRunsCommand(gh, sha);
|
|
299
|
+
else check = gh ? 'gh run list' : 'glab ci list --status=failed';
|
|
300
|
+
const ref = r.details.matchedRef ?? 'HEAD';
|
|
301
|
+
const on = sha ? `${ref} for ${sha.slice(0, 8)}` : ref;
|
|
302
|
+
return `⚠ CI green on ${on}, but ${droppedFailedCount(r)} other pipeline(s) for the same commit FAILED (set-aside statuses: ${r.details.droppedStatuses.join(', ')}) — check \`${check}\``;
|
|
303
|
+
}
|
|
304
|
+
|
|
232
305
|
// ---------------------------------------------------------------------------
|
|
233
306
|
// Budget
|
|
234
307
|
// ---------------------------------------------------------------------------
|
|
@@ -476,9 +549,17 @@ export const PROBES = [
|
|
|
476
549
|
const job = r.failingJobName ? ` Failing job: ${r.failingJobName}` : '';
|
|
477
550
|
return `🚨 CI RED on HEAD (pipeline #${pid})${green}.${job}`;
|
|
478
551
|
}
|
|
479
|
-
if (r.status === 'green'
|
|
480
|
-
const
|
|
481
|
-
|
|
552
|
+
if (r.status === 'green') {
|
|
553
|
+
const lines = [];
|
|
554
|
+
if (hasFailedAllowFailureJobs(r)) {
|
|
555
|
+
const names = r.allowFailureJobs.map((j) => j?.name ?? String(j)).join(', ');
|
|
556
|
+
lines.push(`⚠ CI green on HEAD, but ${r.allowFailureJobs.length} allow_failure job(s) FAILED: ${names}. A pipeline reports success regardless of these.`);
|
|
557
|
+
}
|
|
558
|
+
// #1390 P5: a failed same-commit pipeline the ref preference set aside.
|
|
559
|
+
if (droppedFailedCount(r) > 0) lines.push(droppedFailedLine(r, ctx));
|
|
560
|
+
// Both findings can hold at once; `pushBanner` takes a multi-line
|
|
561
|
+
// string verbatim, so neither swallows the other.
|
|
562
|
+
return lines.length > 0 ? lines.join('\n') : null;
|
|
482
563
|
}
|
|
483
564
|
return null;
|
|
484
565
|
},
|
|
@@ -493,7 +574,11 @@ export const PROBES = [
|
|
|
493
574
|
if (!r || typeof r !== 'object') return 'ok';
|
|
494
575
|
if (r.degraded) return 'warn';
|
|
495
576
|
if (r.status === 'red') return 'alert';
|
|
496
|
-
|
|
577
|
+
// A set-aside failed run (#1390 P5) is `warn`, never `alert`: the reading
|
|
578
|
+
// itself is green, and `alert` is what a red pipeline scores.
|
|
579
|
+
if (r.status === 'green') {
|
|
580
|
+
return hasFailedAllowFailureJobs(r) || droppedFailedCount(r) > 0 ? 'warn' : 'ok';
|
|
581
|
+
}
|
|
497
582
|
// #1337: HEAD undetermined but the pushed commit's pipeline is red —
|
|
498
583
|
// the code on origin is broken, so this is an alert, not a warning.
|
|
499
584
|
if (r.pushed?.verdict?.status === 'red') return 'alert';
|