session-orchestrator 3.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +29 -0
- package/.claude-plugin/plugin.json +18 -0
- package/.codex-plugin/agents/explorer.toml +14 -0
- package/.codex-plugin/agents/session-reviewer.toml +23 -0
- package/.codex-plugin/agents/wave-worker.toml +15 -0
- package/.codex-plugin/config.toml +20 -0
- package/.codex-plugin/plugin.json +37 -0
- package/.cursor/rules/000-session-orchestrator.mdc +73 -0
- package/.cursor/rules/010-session-workflow.mdc +170 -0
- package/.cursor/rules/020-quality-gates.mdc +128 -0
- package/.cursor/rules/030-wave-execution.mdc +216 -0
- package/.cursor/rules/040-discovery.mdc +242 -0
- package/.cursor/rules/050-plan.mdc +235 -0
- package/.cursor/rules/060-evolve.mdc +232 -0
- package/.cursor/rules/070-gitlab-ops.mdc +246 -0
- package/.cursor/rules/080-ecosystem-health.mdc +145 -0
- package/.mcp.json +8 -0
- package/CHANGELOG.md +1544 -0
- package/LICENSE +21 -0
- package/NOTICE +64 -0
- package/README.md +242 -0
- package/SECURITY.md +90 -0
- package/agents/AGENTS.md +136 -0
- package/agents/analyst.md +99 -0
- package/agents/architect-reviewer.md +93 -0
- package/agents/code-implementer.md +106 -0
- package/agents/db-specialist.md +104 -0
- package/agents/dialectic-deriver.md +139 -0
- package/agents/docs-writer.md +113 -0
- package/agents/eval-judge.md +146 -0
- package/agents/memory-proposal-collector.md +297 -0
- package/agents/qa-strategist.md +102 -0
- package/agents/schemas/analyst.schema.json +46 -0
- package/agents/schemas/architect-reviewer.schema.json +50 -0
- package/agents/schemas/code-implementer.schema.json +61 -0
- package/agents/schemas/db-specialist.schema.json +80 -0
- package/agents/schemas/docs-writer.schema.json +56 -0
- package/agents/schemas/persona-panel-sidecar.schema.json +245 -0
- package/agents/schemas/qa-strategist.schema.json +46 -0
- package/agents/schemas/security-reviewer.schema.json +86 -0
- package/agents/schemas/session-reviewer.schema.json +69 -0
- package/agents/schemas/test-writer.schema.json +69 -0
- package/agents/schemas/ui-developer.schema.json +90 -0
- package/agents/schemas/ux-evaluator.schema.json +51 -0
- package/agents/security-reviewer.md +236 -0
- package/agents/session-reviewer.md +201 -0
- package/agents/skill-applied-judge.md +122 -0
- package/agents/test-writer.md +123 -0
- package/agents/ui-developer.md +109 -0
- package/agents/ux-evaluator.md +161 -0
- package/assets/icon.svg +11 -0
- package/assets/og-card.png +0 -0
- package/assets/og-card.svg +47 -0
- package/commands/autopilot-multi.md +74 -0
- package/commands/autopilot.md +80 -0
- package/commands/bootstrap.md +56 -0
- package/commands/brainstorm.md +48 -0
- package/commands/close.md +24 -0
- package/commands/debug.md +36 -0
- package/commands/discovery.md +32 -0
- package/commands/dispatcher.md +59 -0
- package/commands/eval.md +28 -0
- package/commands/evolve.md +10 -0
- package/commands/go.md +41 -0
- package/commands/grill.md +45 -0
- package/commands/harness-audit.md +26 -0
- package/commands/memory-cleanup.md +25 -0
- package/commands/persona-panel.md +121 -0
- package/commands/plan.md +15 -0
- package/commands/portfolio.md +97 -0
- package/commands/reconcile.md +23 -0
- package/commands/repo-audit.md +24 -0
- package/commands/session.md +30 -0
- package/commands/spinout.md +15 -0
- package/commands/sunset-review.md +27 -0
- package/commands/templates-ack.md +96 -0
- package/commands/test.md +97 -0
- package/docs/README.md +105 -0
- package/docs/USER-GUIDE.md +1403 -0
- package/docs/ci-setup.md +81 -0
- package/docs/codex-setup.md +142 -0
- package/docs/components.md +74 -0
- package/docs/cursor-setup.md +104 -0
- package/docs/events-schema.md +81 -0
- package/docs/migration-v3.md +148 -0
- package/docs/owner-config-schema.md +154 -0
- package/docs/persona-panel.md +433 -0
- package/docs/pi-setup.md +115 -0
- package/docs/plugin-architecture-v3.md +296 -0
- package/docs/pm-skills-marketplace.md +114 -0
- package/docs/policy-cache-validation-2026-04-28.md +118 -0
- package/docs/rule-authoring.md +316 -0
- package/docs/session-config-reference.md +1439 -0
- package/docs/session-config-template.md +961 -0
- package/docs/vault-docs-architecture.md +297 -0
- package/hooks/_lib/lock-bootstrap.mjs +272 -0
- package/hooks/_lib/lock-reconcile.mjs +93 -0
- package/hooks/_lib/profile-gate.mjs +95 -0
- package/hooks/_lib/transcript-history.mjs +211 -0
- package/hooks/agent-teams-h3-test.sh +362 -0
- package/hooks/config-protection.mjs +0 -0
- package/hooks/cwd-change-restore.mjs +131 -0
- package/hooks/enforce-commands.mjs +179 -0
- package/hooks/enforce-scope.mjs +273 -0
- package/hooks/hooks-codex.json +60 -0
- package/hooks/hooks-cursor.json +15 -0
- package/hooks/hooks-pi.json +115 -0
- package/hooks/hooks.json +215 -0
- package/hooks/loop-guard.mjs +260 -0
- package/hooks/on-session-end.mjs +217 -0
- package/hooks/on-session-start.mjs +660 -0
- package/hooks/on-stop.mjs +294 -0
- package/hooks/operator-steer.mjs +64 -0
- package/hooks/post-edit-validate.mjs +225 -0
- package/hooks/post-subagent-discovery-validator.mjs +398 -0
- package/hooks/post-tool-batch-wave-signal.mjs +328 -0
- package/hooks/post-tool-failure-corrective-context.mjs +248 -0
- package/hooks/post-tooluse-frontend-slop.mjs +184 -0
- package/hooks/pre-bash-destructive-guard.mjs +515 -0
- package/hooks/pre-bash-memory-propose-audit.mjs +206 -0
- package/hooks/pre-bash-staging-fence.mjs +223 -0
- package/hooks/pre-bash-templates-first.mjs +404 -0
- package/hooks/run-node.sh +72 -0
- package/hooks/skill-invocation-telemetry.mjs +99 -0
- package/hooks/subagent-telemetry.mjs +249 -0
- package/hooks/wave-scope-commit-guard.mjs +191 -0
- package/monitors/monitors.json +14 -0
- package/output-styles/finding-report.md +48 -0
- package/output-styles/session-report.md +53 -0
- package/output-styles/wave-summary.md +38 -0
- package/package.json +94 -0
- package/pi/extensions/session-orchestrator.ts +25 -0
- package/pi/prompts/autopilot-multi.md +12 -0
- package/pi/prompts/autopilot.md +12 -0
- package/pi/prompts/bootstrap.md +12 -0
- package/pi/prompts/brainstorm.md +12 -0
- package/pi/prompts/close.md +11 -0
- package/pi/prompts/debug.md +12 -0
- package/pi/prompts/discovery.md +12 -0
- package/pi/prompts/dispatcher.md +12 -0
- package/pi/prompts/eval.md +12 -0
- package/pi/prompts/evolve.md +12 -0
- package/pi/prompts/go.md +12 -0
- package/pi/prompts/grill.md +12 -0
- package/pi/prompts/harness-audit.md +12 -0
- package/pi/prompts/memory-cleanup.md +12 -0
- package/pi/prompts/persona-panel.md +12 -0
- package/pi/prompts/plan.md +12 -0
- package/pi/prompts/portfolio.md +12 -0
- package/pi/prompts/reconcile.md +12 -0
- package/pi/prompts/repo-audit.md +12 -0
- package/pi/prompts/session.md +12 -0
- package/pi/prompts/spinout.md +12 -0
- package/pi/prompts/sunset-review.md +12 -0
- package/pi/prompts/templates-ack.md +12 -0
- package/pi/prompts/test.md +12 -0
- package/rules/_index.md +51 -0
- package/rules/always-on/commit-discipline.md +26 -0
- package/rules/always-on/npm-quality-gates.md +26 -0
- package/rules/always-on/parallel-sessions.md +43 -0
- package/rules/opt-in-domain/prompt-caching.md +270 -0
- package/rules/opt-in-stack/backend-data.md +188 -0
- package/rules/opt-in-stack/backend.md +390 -0
- package/rules/opt-in-stack/frontend.md +98 -0
- package/rules/opt-in-stack/security-web.md +194 -0
- package/rules/opt-in-stack/swift.md +65 -0
- package/scripts/archive-closed-prds.mjs +416 -0
- package/scripts/autopilot-multi.mjs +802 -0
- package/scripts/autopilot.mjs +383 -0
- package/scripts/backfill-abandoned-sessions.mjs +265 -0
- package/scripts/backfill-learnings-expires.mjs +196 -0
- package/scripts/backfill-learnings.mjs +203 -0
- package/scripts/backfill-sessions.mjs +282 -0
- package/scripts/check-doc-consistency.sh +279 -0
- package/scripts/check-package-manager.mjs +445 -0
- package/scripts/ci/assert-vitest-green.mjs +267 -0
- package/scripts/codex-install.mjs +435 -0
- package/scripts/compute-grounding-injection.sh +186 -0
- package/scripts/cursor-install.mjs +113 -0
- package/scripts/dialectic-deriver.mjs +573 -0
- package/scripts/emit-event.mjs +160 -0
- package/scripts/emit-session.mjs +212 -0
- package/scripts/eval-session.mjs +262 -0
- package/scripts/export-hw-learnings.mjs +437 -0
- package/scripts/gc-stale-worktrees.mjs +666 -0
- package/scripts/generate-pi-prompts.mjs +127 -0
- package/scripts/harness-audit.mjs +287 -0
- package/scripts/lib/agent-frontmatter.mjs +266 -0
- package/scripts/lib/agent-output-schema.mjs +166 -0
- package/scripts/lib/agent-status.mjs +303 -0
- package/scripts/lib/ajv-loader.mjs +34 -0
- package/scripts/lib/auto-dialectic.mjs +382 -0
- package/scripts/lib/auto-dream.mjs +471 -0
- package/scripts/lib/autonomy/suitability.mjs +212 -0
- package/scripts/lib/autopilot/dep-graph.mjs +417 -0
- package/scripts/lib/autopilot/durable-telemetry.mjs +121 -0
- package/scripts/lib/autopilot/flags.mjs +104 -0
- package/scripts/lib/autopilot/kill-switches.mjs +174 -0
- package/scripts/lib/autopilot/loop.mjs +320 -0
- package/scripts/lib/autopilot/mr-draft.mjs +520 -0
- package/scripts/lib/autopilot/multi-killswitch.mjs +184 -0
- package/scripts/lib/autopilot/recent-runs.mjs +106 -0
- package/scripts/lib/autopilot/stall-sampler.mjs +97 -0
- package/scripts/lib/autopilot/telemetry.mjs +224 -0
- package/scripts/lib/autopilot/worktree-pipeline.mjs +605 -0
- package/scripts/lib/autopilot-telemetry.mjs +11 -0
- package/scripts/lib/autopilot.mjs +39 -0
- package/scripts/lib/backlog-scan.mjs +179 -0
- package/scripts/lib/bootstrap-lock-freshness.mjs +260 -0
- package/scripts/lib/bootstrap-lock-refresh.mjs +186 -0
- package/scripts/lib/build-live-signals.mjs +150 -0
- package/scripts/lib/ci-status-banner.mjs +425 -0
- package/scripts/lib/claude-md-budget-lint.mjs +246 -0
- package/scripts/lib/cli-flags.mjs +158 -0
- package/scripts/lib/codex/plugin-contract.mjs +610 -0
- package/scripts/lib/cold-start-detector.mjs +240 -0
- package/scripts/lib/command-blocker.mjs +458 -0
- package/scripts/lib/common.mjs +333 -0
- package/scripts/lib/config/auto-dream.mjs +77 -0
- package/scripts/lib/config/block-header.mjs +94 -0
- package/scripts/lib/config/broken-window.mjs +114 -0
- package/scripts/lib/config/coercers.mjs +248 -0
- package/scripts/lib/config/cold-start.mjs +92 -0
- package/scripts/lib/config/config-protection.mjs +120 -0
- package/scripts/lib/config/cross-repo.mjs +104 -0
- package/scripts/lib/config/custom-phases.mjs +213 -0
- package/scripts/lib/config/dialectic.mjs +92 -0
- package/scripts/lib/config/discovery-validator.mjs +75 -0
- package/scripts/lib/config/dispatcher-autonomy-capture.mjs +240 -0
- package/scripts/lib/config/dispatcher-autonomy.mjs +152 -0
- package/scripts/lib/config/docs-orchestrator.mjs +90 -0
- package/scripts/lib/config/docs-staleness.mjs +96 -0
- package/scripts/lib/config/drift-check.mjs +155 -0
- package/scripts/lib/config/eval.mjs +130 -0
- package/scripts/lib/config/events-rotation.mjs +74 -0
- package/scripts/lib/config/evolve.mjs +308 -0
- package/scripts/lib/config/frontend-slop-hook.mjs +104 -0
- package/scripts/lib/config/gitlab-portfolio.mjs +150 -0
- package/scripts/lib/config/handover-gate.mjs +106 -0
- package/scripts/lib/config/host-paths.mjs +76 -0
- package/scripts/lib/config/io.mjs +54 -0
- package/scripts/lib/config/loop-guard.mjs +117 -0
- package/scripts/lib/config/memory.mjs +150 -0
- package/scripts/lib/config/persona-gate-wave.mjs +258 -0
- package/scripts/lib/config/reconcile.mjs +205 -0
- package/scripts/lib/config/section-extractor.mjs +100 -0
- package/scripts/lib/config/skill-evolution.mjs +112 -0
- package/scripts/lib/config/slopcheck.mjs +99 -0
- package/scripts/lib/config/state-md-lock.mjs +83 -0
- package/scripts/lib/config/templates-first.mjs +94 -0
- package/scripts/lib/config/test.mjs +113 -0
- package/scripts/lib/config/vault-integration.mjs +201 -0
- package/scripts/lib/config/vault-mirror-quality.mjs +99 -0
- package/scripts/lib/config/vault-staleness.mjs +84 -0
- package/scripts/lib/config/vault-sync.mjs +96 -0
- package/scripts/lib/config/verification-auto-fix.mjs +84 -0
- package/scripts/lib/config/wave-reviewers.mjs +133 -0
- package/scripts/lib/config-schema.mjs +345 -0
- package/scripts/lib/config.mjs +474 -0
- package/scripts/lib/convergence-monitor.mjs +389 -0
- package/scripts/lib/coordinator-snapshot.mjs +371 -0
- package/scripts/lib/crypto-digest-utils.mjs +91 -0
- package/scripts/lib/discovery/helpers.mjs +127 -0
- package/scripts/lib/discovery/triage-state.mjs +279 -0
- package/scripts/lib/dispatcher/cli.mjs +257 -0
- package/scripts/lib/dispatcher/enumerate.mjs +243 -0
- package/scripts/lib/dispatcher/rank.mjs +363 -0
- package/scripts/lib/ecosystem-health.mjs +224 -0
- package/scripts/lib/ecosystem-wizard/ci-detector.mjs +18 -0
- package/scripts/lib/ecosystem-wizard/config-parser.mjs +54 -0
- package/scripts/lib/ecosystem-wizard/config-writer.mjs +287 -0
- package/scripts/lib/ecosystem-wizard/package-manager-detector.mjs +42 -0
- package/scripts/lib/ecosystem-wizard/wizard-prompt.mjs +246 -0
- package/scripts/lib/ecosystem-wizard.mjs +48 -0
- package/scripts/lib/env-check.mjs +89 -0
- package/scripts/lib/eval/engine.mjs +605 -0
- package/scripts/lib/eval/judge.mjs +433 -0
- package/scripts/lib/eval/report.mjs +367 -0
- package/scripts/lib/eval/schema.mjs +618 -0
- package/scripts/lib/eval/session-resolve.mjs +137 -0
- package/scripts/lib/eval/sink.mjs +77 -0
- package/scripts/lib/events-rotation.mjs +86 -0
- package/scripts/lib/events-schema.mjs +81 -0
- package/scripts/lib/events.mjs +80 -0
- package/scripts/lib/evolve/autonomy-verdict.mjs +461 -0
- package/scripts/lib/evolve/autopilot-effectiveness.mjs +293 -0
- package/scripts/lib/exclusivity-matrix.mjs +68 -0
- package/scripts/lib/fetch-baseline.mjs +311 -0
- package/scripts/lib/file-lock.mjs +512 -0
- package/scripts/lib/frontend-detect/detect.mjs +138 -0
- package/scripts/lib/frontend-detect/rules.mjs +295 -0
- package/scripts/lib/frontmatter-guard.mjs +241 -0
- package/scripts/lib/gates/echo-stub-detect.mjs +39 -0
- package/scripts/lib/gates/gate-baseline.mjs +42 -0
- package/scripts/lib/gates/gate-full.mjs +85 -0
- package/scripts/lib/gates/gate-helpers.mjs +231 -0
- package/scripts/lib/gates/gate-incremental.mjs +76 -0
- package/scripts/lib/gates/gate-per-file.mjs +55 -0
- package/scripts/lib/gitlab-ops/stale-mr-sweep.mjs +447 -0
- package/scripts/lib/gitlab-portfolio/aggregator.mjs +383 -0
- package/scripts/lib/gitlab-portfolio/cli.mjs +428 -0
- package/scripts/lib/gitlab-portfolio/markdown-writer.mjs +289 -0
- package/scripts/lib/gitlab-portfolio/vcs-detect.mjs +182 -0
- package/scripts/lib/handover-gate.mjs +222 -0
- package/scripts/lib/hardening.mjs +43 -0
- package/scripts/lib/hardware-pattern-detector.mjs +238 -0
- package/scripts/lib/harness-audit/categories/category1.mjs +123 -0
- package/scripts/lib/harness-audit/categories/category2.mjs +145 -0
- package/scripts/lib/harness-audit/categories/category3.mjs +143 -0
- package/scripts/lib/harness-audit/categories/category4.mjs +202 -0
- package/scripts/lib/harness-audit/categories/category5.mjs +152 -0
- package/scripts/lib/harness-audit/categories/category6.mjs +211 -0
- package/scripts/lib/harness-audit/categories/category7.mjs +125 -0
- package/scripts/lib/harness-audit/categories/category8.mjs +328 -0
- package/scripts/lib/harness-audit/categories/category9.mjs +294 -0
- package/scripts/lib/harness-audit/categories/helpers.mjs +165 -0
- package/scripts/lib/harness-audit/categories.mjs +19 -0
- package/scripts/lib/historical-guard.mjs +15 -0
- package/scripts/lib/host-identity.mjs +262 -0
- package/scripts/lib/instruction-budget-guard.mjs +332 -0
- package/scripts/lib/io.mjs +304 -0
- package/scripts/lib/issue-close-strip-labels.mjs +161 -0
- package/scripts/lib/language-mappers/README.md +57 -0
- package/scripts/lib/language-mappers/index.mjs +165 -0
- package/scripts/lib/language-mappers/markdown.mjs +149 -0
- package/scripts/lib/language-mappers/python.mjs +249 -0
- package/scripts/lib/language-mappers/swift.mjs +201 -0
- package/scripts/lib/language-mappers/typescript.mjs +433 -0
- package/scripts/lib/learnings/expiry-sweep.mjs +164 -0
- package/scripts/lib/learnings/filters.mjs +43 -0
- package/scripts/lib/learnings/io.mjs +255 -0
- package/scripts/lib/learnings/schema.mjs +518 -0
- package/scripts/lib/learnings/surface.mjs +207 -0
- package/scripts/lib/learnings.mjs +42 -0
- package/scripts/lib/lock-reaper.mjs +648 -0
- package/scripts/lib/locks/index.mjs +31 -0
- package/scripts/lib/locks/lock-body.mjs +62 -0
- package/scripts/lib/locks/staging-fence-lock.mjs +267 -0
- package/scripts/lib/locks/state-md-lock.mjs +351 -0
- package/scripts/lib/loop-readiness-banner.mjs +144 -0
- package/scripts/lib/memory-banner.mjs +478 -0
- package/scripts/lib/memory-cleanup/worktree-sweep.mjs +108 -0
- package/scripts/lib/memory-cleanup-stamp.mjs +56 -0
- package/scripts/lib/memory-paths.mjs +31 -0
- package/scripts/lib/memory-proposals/collector.mjs +334 -0
- package/scripts/lib/memory-proposals/schema.mjs +289 -0
- package/scripts/lib/memory-proposals/sink.mjs +507 -0
- package/scripts/lib/memory-proposals/store.mjs +441 -0
- package/scripts/lib/mission-status-schema.mjs +114 -0
- package/scripts/lib/mode-selector/alternatives.mjs +64 -0
- package/scripts/lib/mode-selector/constants.mjs +29 -0
- package/scripts/lib/mode-selector/context-pressure.mjs +157 -0
- package/scripts/lib/mode-selector/rationale.mjs +55 -0
- package/scripts/lib/mode-selector/scoring.mjs +221 -0
- package/scripts/lib/mode-selector-accuracy.mjs +121 -0
- package/scripts/lib/mode-selector.mjs +160 -0
- package/scripts/lib/multi-provider-build/providers.mjs +64 -0
- package/scripts/lib/multi-provider-build/templating.mjs +130 -0
- package/scripts/lib/named-baseline-resolver.mjs +233 -0
- package/scripts/lib/named-vault-resolver.mjs +433 -0
- package/scripts/lib/owner-config/coerce.mjs +29 -0
- package/scripts/lib/owner-config/constants.mjs +21 -0
- package/scripts/lib/owner-config/defaults.mjs +50 -0
- package/scripts/lib/owner-config/error.mjs +19 -0
- package/scripts/lib/owner-config/index.mjs +13 -0
- package/scripts/lib/owner-config/merge.mjs +52 -0
- package/scripts/lib/owner-config/validate.mjs +259 -0
- package/scripts/lib/owner-config-banner.mjs +126 -0
- package/scripts/lib/owner-config-loader.mjs +159 -0
- package/scripts/lib/owner-config.example.yaml +72 -0
- package/scripts/lib/owner-config.mjs +28 -0
- package/scripts/lib/owner-interview.mjs +243 -0
- package/scripts/lib/owner-yaml.mjs +571 -0
- package/scripts/lib/package-manager.mjs +160 -0
- package/scripts/lib/path-utils.mjs +217 -0
- package/scripts/lib/peer-cards/merger.mjs +310 -0
- package/scripts/lib/peer-cards/reader.mjs +125 -0
- package/scripts/lib/peer-cards/schema.mjs +230 -0
- package/scripts/lib/peer-cards/staleness-banner.mjs +86 -0
- package/scripts/lib/peer-cards/writer.mjs +138 -0
- package/scripts/lib/peer-discovery.mjs +200 -0
- package/scripts/lib/persona-panel/catalog-loader.mjs +577 -0
- package/scripts/lib/persona-panel/consolidator.mjs +370 -0
- package/scripts/lib/persona-panel/persona-runner.mjs +375 -0
- package/scripts/lib/persona-panel/threshold.mjs +130 -0
- package/scripts/lib/pi-hook-bridge.mjs +328 -0
- package/scripts/lib/platform.mjs +266 -0
- package/scripts/lib/playwright-driver/runner.mjs +297 -0
- package/scripts/lib/plugin-root.mjs +210 -0
- package/scripts/lib/pre-dispatch-check.mjs +126 -0
- package/scripts/lib/product-repo-detect.mjs +121 -0
- package/scripts/lib/profiles/registry.mjs +176 -0
- package/scripts/lib/profiles/schema.mjs +209 -0
- package/scripts/lib/qg-command-drift-banner.mjs +88 -0
- package/scripts/lib/quality-gate/diagnostics.mjs +92 -0
- package/scripts/lib/quality-gate.mjs +536 -0
- package/scripts/lib/quality-gates-cache.mjs +228 -0
- package/scripts/lib/quality-gates-policy.mjs +95 -0
- package/scripts/lib/recommendations-v0.mjs +156 -0
- package/scripts/lib/reconcile/eligibility.mjs +203 -0
- package/scripts/lib/reconcile/emitter.mjs +244 -0
- package/scripts/lib/reconcile/engine.mjs +412 -0
- package/scripts/lib/reconcile/idempotency.mjs +239 -0
- package/scripts/lib/reconcile/renderer.mjs +211 -0
- package/scripts/lib/reconcile/writer.mjs +293 -0
- package/scripts/lib/reconcile-nudge-banner.mjs +284 -0
- package/scripts/lib/resource-probe/evaluate.mjs +190 -0
- package/scripts/lib/resource-probe/parsers.mjs +181 -0
- package/scripts/lib/resource-probe/probe-platform.mjs +300 -0
- package/scripts/lib/resource-probe.mjs +95 -0
- package/scripts/lib/rule-loader.mjs +552 -0
- package/scripts/lib/rules-sync.mjs +439 -0
- package/scripts/lib/scope-gate.mjs +496 -0
- package/scripts/lib/session-close-backfill.mjs +539 -0
- package/scripts/lib/session-discovery.mjs +256 -0
- package/scripts/lib/session-end/phase-skip.mjs +357 -0
- package/scripts/lib/session-end/worktree-cleanup.mjs +112 -0
- package/scripts/lib/session-id.mjs +362 -0
- package/scripts/lib/session-lock.mjs +703 -0
- package/scripts/lib/session-registry.mjs +355 -0
- package/scripts/lib/session-schema/aliases.mjs +71 -0
- package/scripts/lib/session-schema/constants.mjs +115 -0
- package/scripts/lib/session-schema/normalizer.mjs +66 -0
- package/scripts/lib/session-schema/timestamps.mjs +64 -0
- package/scripts/lib/session-schema/validator.mjs +453 -0
- package/scripts/lib/session-schema.mjs +71 -0
- package/scripts/lib/session-token-rollup.mjs +137 -0
- package/scripts/lib/sessions-staleness-banner.mjs +247 -0
- package/scripts/lib/skill-evolution/blast-radius-classifier.mjs +114 -0
- package/scripts/lib/skill-evolution/candidate-intake.mjs +270 -0
- package/scripts/lib/skill-evolution/config-validation-gate.mjs +279 -0
- package/scripts/lib/skill-evolution/engine.mjs +719 -0
- package/scripts/lib/skill-evolution/idempotency.mjs +279 -0
- package/scripts/lib/skill-evolution/mr-opener.mjs +507 -0
- package/scripts/lib/skill-health/join.mjs +181 -0
- package/scripts/lib/skill-health/score.mjs +123 -0
- package/scripts/lib/skill-invocations-schema.mjs +214 -0
- package/scripts/lib/skill-judge.mjs +348 -0
- package/scripts/lib/skill-judgments-schema.mjs +264 -0
- package/scripts/lib/slopcheck.mjs +501 -0
- package/scripts/lib/soul-resolve.mjs +118 -0
- package/scripts/lib/spiral-carryover.mjs +495 -0
- package/scripts/lib/state-md/body-sections.mjs +851 -0
- package/scripts/lib/state-md/frontmatter-mutators.mjs +453 -0
- package/scripts/lib/state-md/mission-status.mjs +247 -0
- package/scripts/lib/state-md/recommendations.mjs +57 -0
- package/scripts/lib/state-md/yaml-parser.mjs +234 -0
- package/scripts/lib/state-md-peer-guard.mjs +232 -0
- package/scripts/lib/state-md.mjs +53 -0
- package/scripts/lib/subagents-schema.mjs +309 -0
- package/scripts/lib/sunset/walker.mjs +1192 -0
- package/scripts/lib/test-runner/artifact-paths.mjs +94 -0
- package/scripts/lib/test-runner/fingerprint.mjs +33 -0
- package/scripts/lib/test-runner/issue-reconcile.mjs +770 -0
- package/scripts/lib/tmux-layout/layouts.mjs +224 -0
- package/scripts/lib/tmux-layout/telemetry-stats.mjs +100 -0
- package/scripts/lib/tmux-layout/telemetry.mjs +88 -0
- package/scripts/lib/tmux-layout/tmux-shell.mjs +82 -0
- package/scripts/lib/tmux-layout/vcs-detector.mjs +88 -0
- package/scripts/lib/validate/check-agents.mjs +457 -0
- package/scripts/lib/validate/check-codex-plugin.mjs +37 -0
- package/scripts/lib/validate/check-commands.mjs +148 -0
- package/scripts/lib/validate/check-component-paths.mjs +112 -0
- package/scripts/lib/validate/check-dead-bridge.mjs +180 -0
- package/scripts/lib/validate/check-hooks-symmetry.mjs +258 -0
- package/scripts/lib/validate/check-json-files.mjs +116 -0
- package/scripts/lib/validate/check-owner-leakage.mjs +1011 -0
- package/scripts/lib/validate/check-path-utils-canary.mjs +175 -0
- package/scripts/lib/validate/check-peekaboo-driver-canary.mjs +201 -0
- package/scripts/lib/validate/check-pi-package.mjs +110 -0
- package/scripts/lib/validate/check-pi-prompts.mjs +43 -0
- package/scripts/lib/validate/check-playwright-mcp-canary.mjs +154 -0
- package/scripts/lib/validate/check-plugin-json.mjs +96 -0
- package/scripts/lib/validate/check-plugin-monitors.mjs +206 -0
- package/scripts/lib/validate/check-plugin-schema.mjs +137 -0
- package/scripts/lib/validate/check-rules.mjs +143 -0
- package/scripts/lib/validate/check-session-plan-routing.mjs +154 -0
- package/scripts/lib/validate/check-test-fixture-shapes.mjs +280 -0
- package/scripts/lib/validate/check-unicode-safety.mjs +533 -0
- package/scripts/lib/validate/confidential-names.mjs +169 -0
- package/scripts/lib/validate/dead-bridge-corpus.mjs +141 -0
- package/scripts/lib/validate/dead-bridge-detectors.mjs +568 -0
- package/scripts/lib/validate/tier-inference.mjs +100 -0
- package/scripts/lib/validate-vendored-rules.mjs +519 -0
- package/scripts/lib/vault-archive.mjs +404 -0
- package/scripts/lib/vault-backfill/glab.mjs +164 -0
- package/scripts/lib/vault-backfill/manifest.mjs +75 -0
- package/scripts/lib/vault-backfill/template.mjs +130 -0
- package/scripts/lib/vault-consolidate-fs.mjs +331 -0
- package/scripts/lib/vault-migration-rules.mjs +155 -0
- package/scripts/lib/vault-mirror/auto-commit.mjs +203 -0
- package/scripts/lib/vault-mirror/namespace.mjs +152 -0
- package/scripts/lib/vault-mirror/process.mjs +567 -0
- package/scripts/lib/vault-mirror/pseudonym-map.mjs +164 -0
- package/scripts/lib/vault-mirror/render-learnings.mjs +201 -0
- package/scripts/lib/vault-mirror/render-sessions.mjs +367 -0
- package/scripts/lib/vault-mirror/render.mjs +8 -0
- package/scripts/lib/vault-mirror/utils.mjs +217 -0
- package/scripts/lib/vault-relocation-rules.mjs +555 -0
- package/scripts/lib/vault-repo-backfill.mjs +235 -0
- package/scripts/lib/vault-staleness-banner.mjs +142 -0
- package/scripts/lib/vault-status/board-writer.mjs +769 -0
- package/scripts/lib/vault-status/narrative-mirror.mjs +544 -0
- package/scripts/lib/vault-sync-baseline.mjs +152 -0
- package/scripts/lib/wave-context.mjs +29 -0
- package/scripts/lib/wave-executor/pool.mjs +248 -0
- package/scripts/lib/wave-resource-gate.mjs +204 -0
- package/scripts/lib/wave-sizing.mjs +75 -0
- package/scripts/lib/webhook-url.mjs +105 -0
- package/scripts/lib/workspace.mjs +198 -0
- package/scripts/lib/worktree/constants.mjs +35 -0
- package/scripts/lib/worktree/index.mjs +17 -0
- package/scripts/lib/worktree/lifecycle.mjs +287 -0
- package/scripts/lib/worktree/listing.mjs +118 -0
- package/scripts/lib/worktree/meta.mjs +64 -0
- package/scripts/lib/worktree-freshness.mjs +313 -0
- package/scripts/lib/worktree.mjs +15 -0
- package/scripts/lifecycle-sim-v6.mjs +347 -0
- package/scripts/lock-reaper.mjs +185 -0
- package/scripts/mcp-server.sh +241 -0
- package/scripts/measure-policy-cache-effectiveness.mjs +427 -0
- package/scripts/memory-propose.mjs +464 -0
- package/scripts/migrate-cold-start-seed.mjs +404 -0
- package/scripts/migrate-learnings-jsonl.mjs +189 -0
- package/scripts/migrate-legacy-learnings.sh +61 -0
- package/scripts/migrate-sessions-jsonl.mjs +448 -0
- package/scripts/migrate-subagents-jsonl.mjs +196 -0
- package/scripts/migrate-vault-paths.mjs +796 -0
- package/scripts/parse-config.mjs +149 -0
- package/scripts/pi-install.mjs +117 -0
- package/scripts/print-applicable-rules.mjs +247 -0
- package/scripts/promote-vault-strict.mjs +496 -0
- package/scripts/relocate-vault-corpus.mjs +1178 -0
- package/scripts/run-migrate-v2-cross-repo.mjs +385 -0
- package/scripts/run-quality-gate.mjs +216 -0
- package/scripts/spikes/h3-agent-teams/preflight.sh +53 -0
- package/scripts/spikes/h3-agent-teams/run-h3.sh +112 -0
- package/scripts/spikes/h3-agent-teams/setup.sh +137 -0
- package/scripts/spikes/h3-agent-teams/toggle.sh +38 -0
- package/scripts/sweep-expired-learnings.mjs +135 -0
- package/scripts/sync-vault-schema.mjs +376 -0
- package/scripts/tests/fixtures/fetch-baseline/sample-rule.md +8 -0
- package/scripts/tmux-layout.mjs +245 -0
- package/scripts/token-audit.sh +191 -0
- package/scripts/typecheck.mjs +42 -0
- package/scripts/upload-social-preview.mjs +316 -0
- package/scripts/validate-config.mjs +46 -0
- package/scripts/validate-plugin-manifests.mjs +163 -0
- package/scripts/validate-plugin.mjs +264 -0
- package/scripts/validate-wave-scope.mjs +289 -0
- package/scripts/vault-backfill.mjs +404 -0
- package/scripts/vault-consolidate.mjs +596 -0
- package/scripts/vault-integration-watcher.mjs +394 -0
- package/scripts/vault-mirror.mjs +430 -0
- package/skills/_shared/bootstrap-gate.md +111 -0
- package/skills/_shared/config-reading.md +226 -0
- package/skills/_shared/instruction-file-resolution.md +79 -0
- package/skills/_shared/model-selection.md +64 -0
- package/skills/_shared/monitor-patterns.md +300 -0
- package/skills/_shared/parallel-aware-auq.md +121 -0
- package/skills/_shared/parallel-aware-preamble.md +185 -0
- package/skills/_shared/platform-tools.md +96 -0
- package/skills/_shared/state-ownership.md +221 -0
- package/skills/architecture/DEEPENING.md +37 -0
- package/skills/architecture/INTERFACE-DESIGN.md +44 -0
- package/skills/architecture/LANGUAGE.md +53 -0
- package/skills/architecture/SKILL.md +92 -0
- package/skills/autopilot/SKILL.md +419 -0
- package/skills/bootstrap/SKILL.md +592 -0
- package/skills/bootstrap/STATE.md.template +24 -0
- package/skills/bootstrap/_shared-template.md +243 -0
- package/skills/bootstrap/deep-template.md +659 -0
- package/skills/bootstrap/fast-template.md +251 -0
- package/skills/bootstrap/intensity-heuristic.md +80 -0
- package/skills/bootstrap/public-fallback.md +342 -0
- package/skills/bootstrap/standard-template.md +736 -0
- package/skills/bootstrap/templates/agents/project-code-review.md +18 -0
- package/skills/bootstrap/templates/agents/project-discovery.md +18 -0
- package/skills/bootstrap/templates/agents/project-quality-gate.md +18 -0
- package/skills/brainstorm/SKILL.md +268 -0
- package/skills/brainstorm/soul.md +49 -0
- package/skills/claude-md-drift-check/SKILL.md +186 -0
- package/skills/claude-md-drift-check/checker.mjs +1380 -0
- package/skills/claude-md-drift-check/checker.sh +37 -0
- package/skills/claude-md-drift-check/package.json +16 -0
- package/skills/convergence-monitoring/README.md +39 -0
- package/skills/convergence-monitoring/SIGNALS.md +246 -0
- package/skills/convergence-monitoring/SKILL.md +285 -0
- package/skills/daily/SKILL.md +222 -0
- package/skills/daily/generate.sh +92 -0
- package/skills/daily/templates/daily.md.tpl +36 -0
- package/skills/debug/SKILL.md +188 -0
- package/skills/debug/soul.md +35 -0
- package/skills/discovery/SKILL.md +567 -0
- package/skills/discovery/issue-templates.md +237 -0
- package/skills/discovery/probes/docs-staleness.mjs +195 -0
- package/skills/discovery/probes/frontend-slop.mjs +186 -0
- package/skills/discovery/probes/ssot-code-diff.mjs +310 -0
- package/skills/discovery/probes/supply-chain-slopcheck.mjs +440 -0
- package/skills/discovery/probes/vault-narrative-staleness.mjs +355 -0
- package/skills/discovery/probes/vault-staleness.mjs +272 -0
- package/skills/discovery/probes-arch.md +252 -0
- package/skills/discovery/probes-audit.md +95 -0
- package/skills/discovery/probes-code.md +329 -0
- package/skills/discovery/probes-docs.md +76 -0
- package/skills/discovery/probes-feature.md +150 -0
- package/skills/discovery/probes-infra.md +138 -0
- package/skills/discovery/probes-intro.md +25 -0
- package/skills/discovery/probes-session.md +495 -0
- package/skills/discovery/probes-supply-chain.md +94 -0
- package/skills/discovery/probes-ui.md +147 -0
- package/skills/discovery/probes-vault.md +64 -0
- package/skills/discovery/slop-patterns.md +115 -0
- package/skills/dispatcher/SKILL.md +173 -0
- package/skills/docs-orchestrator/SKILL.md +362 -0
- package/skills/docs-orchestrator/audience-mapping.md +140 -0
- package/skills/domain-model/ADR-FORMAT.md +47 -0
- package/skills/domain-model/CONTEXT-FORMAT.md +77 -0
- package/skills/domain-model/SKILL.md +85 -0
- package/skills/ecosystem-health/SKILL.md +119 -0
- package/skills/ecosystem-health/wizard.md +193 -0
- package/skills/eval/SKILL.md +293 -0
- package/skills/eval/rubric-v1.md +218 -0
- package/skills/evolve/SKILL.md +546 -0
- package/skills/frontmatter-guard/SKILL.md +126 -0
- package/skills/gitlab-ops/SKILL.md +368 -0
- package/skills/gitlab-portfolio/SKILL.md +196 -0
- package/skills/grill/SKILL.md +185 -0
- package/skills/grill/soul.md +55 -0
- package/skills/hook-development/SKILL.md +413 -0
- package/skills/mcp-builder/SKILL.md +260 -0
- package/skills/memory-cleanup/SKILL.md +310 -0
- package/skills/mode-selector/SKILL.md +226 -0
- package/skills/peekaboo-driver/SKILL.md +237 -0
- package/skills/peekaboo-driver/soul.md +32 -0
- package/skills/persona-panel/SKILL.md +365 -0
- package/skills/persona-panel/persona-format.md +205 -0
- package/skills/persona-panel/presets/designer-lens.md +87 -0
- package/skills/persona-panel/presets/engineer-lens.md +88 -0
- package/skills/persona-panel/presets/pm-lens.md +86 -0
- package/skills/plan/SKILL.md +496 -0
- package/skills/plan/mode-feature.md +141 -0
- package/skills/plan/mode-new.md +297 -0
- package/skills/plan/mode-retro.md +271 -0
- package/skills/plan/prd-feature-template.md +132 -0
- package/skills/plan/prd-full-template.md +151 -0
- package/skills/plan/prd-reviewer-prompt.md +103 -0
- package/skills/plan/retro-template.md +75 -0
- package/skills/plan/soul.md +62 -0
- package/skills/playwright-driver/SKILL.md +226 -0
- package/skills/playwright-driver/soul.md +30 -0
- package/skills/quality-gates/SKILL.md +212 -0
- package/skills/reconcile/SKILL.md +324 -0
- package/skills/repo-audit/SKILL.md +272 -0
- package/skills/session-end/SKILL.md +1044 -0
- package/skills/session-end/discovery-scan.md +37 -0
- package/skills/session-end/drift-operations.md +97 -0
- package/skills/session-end/learning-patterns.md +78 -0
- package/skills/session-end/metrics-collection.md +175 -0
- package/skills/session-end/phase-3-2-docs-verification.md +148 -0
- package/skills/session-end/phase-3-6-tail.md +344 -0
- package/skills/session-end/phase-3-7a-recommendations.md +86 -0
- package/skills/session-end/plan-verification.md +288 -0
- package/skills/session-end/session-metrics-write.md +223 -0
- package/skills/session-end/vault-operations.md +50 -0
- package/skills/session-end/verification-checklist.md +20 -0
- package/skills/session-plan/SKILL.md +554 -0
- package/skills/session-plan/wave-template.md +37 -0
- package/skills/session-start/SKILL.md +1043 -0
- package/skills/session-start/phase-2-5-docs-planning.md +119 -0
- package/skills/session-start/phase-4-5-resource-health.md +49 -0
- package/skills/session-start/phase-7-1-premise-check.md +47 -0
- package/skills/session-start/phase-7-5-mode-selector.md +237 -0
- package/skills/session-start/phase-8-5-express-path.md +61 -0
- package/skills/session-start/presentation-format.md +81 -0
- package/skills/session-start/soul.md +57 -0
- package/skills/skill-creator/SKILL.md +168 -0
- package/skills/spinout/SKILL.md +76 -0
- package/skills/sunset-review/SKILL.md +96 -0
- package/skills/test-runner/SKILL.md +362 -0
- package/skills/test-runner/rubric-v1.md +388 -0
- package/skills/test-runner/soul.md +46 -0
- package/skills/tmux-layout/SKILL.md +104 -0
- package/skills/ubiquitous-language/SKILL.md +97 -0
- package/skills/using-orchestrator/SKILL.md +144 -0
- package/skills/vault-mirror/SKILL.md +234 -0
- package/skills/vault-sync/SKILL.md +319 -0
- package/skills/vault-sync/package-lock.json +40 -0
- package/skills/vault-sync/package.json +11 -0
- package/skills/vault-sync/tests/fixtures/archive-test-vault/90-archive/bad-archived.md +8 -0
- package/skills/vault-sync/tests/fixtures/archive-test-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/archive-test-vault/live-note.md +8 -0
- package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/bad-type.md +8 -0
- package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/good-note.md +8 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/.obsidian/config.md +8 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/01-projects/foo/projects-baseline.md +10 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/03-daily/daily-2026-04-13.md +8 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/README.md +3 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/hello-world.md +11 -0
- package/skills/vault-sync/tests/fixtures/dangling-link-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/dangling-link-vault/has-dangling.md +9 -0
- package/skills/vault-sync/tests/fixtures/dangling-link-vault/real-target.md +8 -0
- package/skills/vault-sync/tests/fixtures/empty-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/missing-field-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/missing-field-vault/missing-id.md +7 -0
- package/skills/vault-sync/tests/fixtures/nested-tag-vault/03-daily/daily-2026-04-13.md +9 -0
- package/skills/vault-sync/tests/fixtures/nested-tag-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/nested-tag-vault/nested-tags-note.md +11 -0
- package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/README.md +3 -0
- package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/_MOC.md +3 -0
- package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/with-moc-vault/_MOC.md +11 -0
- package/skills/vault-sync/tests/fixtures/with-moc-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/with-moc-vault/hello-world.md +11 -0
- package/skills/vault-sync/tests/schema-drift.test.mjs +133 -0
- package/skills/vault-sync/validator.mjs +658 -0
- package/skills/vault-sync/validator.sh +55 -0
- package/skills/wave-executor/SKILL.md +496 -0
- package/skills/wave-executor/circuit-breaker.md +169 -0
- package/skills/wave-executor/wave-loop.md +1043 -0
- package/skills/write-executable-plan/SKILL.md +237 -0
- package/skills/write-executable-plan/plan-template.md +154 -0
- package/templates/_minimal/CLAUDE.md.tmpl +41 -0
- package/templates/_minimal/README.md.tmpl +15 -0
- package/templates/_minimal/gitignore.tmpl +47 -0
- package/templates/_shared/harte-regeln.md +16 -0
- package/templates/_shared/loop.md +90 -0
- package/templates/_shared/rules/parallel-sessions.md +77 -0
- package/templates/nextjs-minimal/README.md +30 -0
- package/templates/nextjs-minimal/app/layout.tsx +18 -0
- package/templates/nextjs-minimal/app/page.tsx +7 -0
- package/templates/nextjs-minimal/eslint.config.mjs +16 -0
- package/templates/nextjs-minimal/next.config.mjs +4 -0
- package/templates/nextjs-minimal/package.json +27 -0
- package/templates/nextjs-minimal/tsconfig.json +23 -0
- package/templates/node-minimal/README.md +33 -0
- package/templates/node-minimal/eslint.config.mjs +10 -0
- package/templates/node-minimal/package.json +21 -0
- package/templates/node-minimal/src/index.ts +1 -0
- package/templates/node-minimal/tests/sanity.test.ts +5 -0
- package/templates/node-minimal/tsconfig.json +17 -0
- package/templates/personas/README.md +150 -0
- package/templates/personas/accounting-compliance.v1.md +120 -0
- package/templates/personas/accounting-tax-advisor.v1.md +116 -0
- package/templates/personas/buyer-p1-cto.v1.md +125 -0
- package/templates/personas/buyer-p2-kanzlei.v1.md +134 -0
- package/templates/personas/buyer-p3-build.v1.md +130 -0
- package/templates/personas/buyer-p4-tech-veto.v1.md +130 -0
- package/templates/personas/buyer-p5-solo.v1.md +132 -0
- package/templates/personas/buyer-p6-ld.v1.md +130 -0
- package/templates/personas/klima-ai-expert.v1.md +114 -0
- package/templates/personas/klima-physicist.v1.md +117 -0
- package/templates/python-uv/README.md +28 -0
- package/templates/python-uv/pyproject.toml +32 -0
- package/templates/python-uv/src/__PROJECT_NAME__/__init__.py +0 -0
- package/templates/python-uv/src/__PROJECT_NAME__/main.py +6 -0
- package/templates/python-uv/tests/test_sanity.py +2 -0
- package/templates/static-html/README.md +19 -0
- package/templates/static-html/index.html +15 -0
- package/templates/static-html/script.js +1 -0
- package/templates/static-html/styles.css +26 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autopilot/recent-runs.mjs — pure, no-throw reader for the per-repo
|
|
3
|
+
* autopilot.jsonl run history (Epic #673 P3, issue #682 verdict-gated launch).
|
|
4
|
+
*
|
|
5
|
+
* `readRecentAutopilotRuns({ repoRoot, limit })` reads
|
|
6
|
+
* `<repoRoot>/.orchestrator/metrics/autopilot.jsonl`, parses each JSONL line
|
|
7
|
+
* (tolerating corrupt/partial lines), and returns the most-recent `limit`
|
|
8
|
+
* records. The ONLY consumer is the dispatcher launch-gate (#682): it feeds the
|
|
9
|
+
* returned array into `computeSuitabilityVerdict({ recentRuns })`
|
|
10
|
+
* (scripts/lib/autonomy/suitability.mjs) whose G2 kill-switch gate counts the
|
|
11
|
+
* records and reads each record's `kill_switch` field.
|
|
12
|
+
*
|
|
13
|
+
* CONTRACT (mirrors the never-throws + tolerant-parse idioms in
|
|
14
|
+
* scripts/lib/autopilot/telemetry.mjs and the trailing-line skip in
|
|
15
|
+
* scripts/lib/dispatcher/rank.mjs `defaultStaleDaysFor`):
|
|
16
|
+
* - PURE READ, NEVER throws — a missing file, an unreadable file, or a
|
|
17
|
+
* wholly-unparseable file all return `[]`. Telemetry/launch-gate failures
|
|
18
|
+
* must never crash the dispatcher.
|
|
19
|
+
* - TRUE COUNT preserved: when ≥ `KILL_SWITCH_MIN_RUNS` (5) valid records
|
|
20
|
+
* exist on disk, the reader returns the true tail count — it does NOT
|
|
21
|
+
* pre-truncate below 5. (NICE-a: pre-truncating would falsely trigger the
|
|
22
|
+
* engine's <5-run omission branch and skip the kill-switch gate.) The
|
|
23
|
+
* `limit` argument is an UPPER BOUND for very large files (default 50) — it
|
|
24
|
+
* caps the tail to keep parse work bounded, it is never a floor. Callers
|
|
25
|
+
* MUST NOT pass `limit < 5` for the launch-gate read: a `limit` below the
|
|
26
|
+
* engine's 5-run floor would silently mask a real ≥5-run history and force
|
|
27
|
+
* the G2 kill-switch gate into its omission branch — exactly the NICE-a
|
|
28
|
+
* failure mode. The default 50 is comfortably above the floor; leave it
|
|
29
|
+
* alone for the verdict path. (A `limit < 5` is still honoured as a literal
|
|
30
|
+
* cap — the reader does not clamp it upward — so the discipline is on the
|
|
31
|
+
* caller, documented here so it is not "fixed" by silently raising it.)
|
|
32
|
+
* - INTEGRITY (NICE-a): `autopilot.jsonl` is NOT subject to size-based
|
|
33
|
+
* events-rotation. `scripts/lib/events-rotation.mjs` (`maybeRotate`) targets
|
|
34
|
+
* `events.jsonl` ONLY — the session-start hook passes that single `logPath`;
|
|
35
|
+
* the rotation module contains zero references to `autopilot.jsonl`. So the
|
|
36
|
+
* autopilot run history this reader sees is never truncated/shifted out from
|
|
37
|
+
* under the launch gate by rotation: the on-disk tail IS the true history
|
|
38
|
+
* (only `autopilot.mjs` itself appends to it; see `skills/autopilot/SKILL.md`
|
|
39
|
+
* / `AGENTS.md` § Telemetry — sole-writer rule).
|
|
40
|
+
* - Ordering is NEWEST-LAST (chronological / file order): the returned array
|
|
41
|
+
* is a tail slice of the file, preserving on-disk append order. The engine
|
|
42
|
+
* only COUNTS records and reads `kill_switch`; order does not affect G2.
|
|
43
|
+
* - Corrupt lines are SKIPPED (not fatal): one malformed JSON line does not
|
|
44
|
+
* discard the rest of the history.
|
|
45
|
+
*
|
|
46
|
+
* No imports beyond node builtins. ESM. eslint-clean (eqeqeq, no-throw).
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
import { readFileSync } from 'node:fs';
|
|
50
|
+
import path from 'node:path';
|
|
51
|
+
|
|
52
|
+
/** Canonical per-repo autopilot telemetry path (relative to repoRoot). */
|
|
53
|
+
const AUTOPILOT_JSONL_RELPATH = path.join('.orchestrator', 'metrics', 'autopilot.jsonl');
|
|
54
|
+
|
|
55
|
+
/** Default tail window — generous; the engine's G2 floor is only 5 runs. */
|
|
56
|
+
const DEFAULT_LIMIT = 50;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Read the most-recent autopilot run records for a repo. Never throws.
|
|
60
|
+
*
|
|
61
|
+
* @param {{ repoRoot?: string, limit?: number }} [opts]
|
|
62
|
+
* @param {string} [opts.repoRoot] Repo whose `.orchestrator/metrics/autopilot.jsonl`
|
|
63
|
+
* to read. Falsy/non-string ⇒ `[]`.
|
|
64
|
+
* @param {number} [opts.limit=50] UPPER BOUND on records returned (the newest
|
|
65
|
+
* `limit`). Non-finite / ≤ 0 ⇒ falls back to the
|
|
66
|
+
* default 50. NICE-a discipline: never pass
|
|
67
|
+
* `limit < 5` on the launch-gate read — a value
|
|
68
|
+
* below the engine's 5-run kill-switch floor
|
|
69
|
+
* masks a real ≥5-run history and forces G2's
|
|
70
|
+
* omission branch. The reader honours a small
|
|
71
|
+
* `limit` literally (it does NOT clamp upward);
|
|
72
|
+
* keeping it ≥ 5 (default 50) is the caller's job.
|
|
73
|
+
* @returns {Array<{ kill_switch?: string|null, [k: string]: unknown }>}
|
|
74
|
+
* Tail slice of parsed records, NEWEST-LAST. `[]` on any failure.
|
|
75
|
+
*/
|
|
76
|
+
export function readRecentAutopilotRuns({ repoRoot, limit = DEFAULT_LIMIT } = {}) {
|
|
77
|
+
if (typeof repoRoot !== 'string' || repoRoot.length === 0) return [];
|
|
78
|
+
|
|
79
|
+
const cap = Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : DEFAULT_LIMIT;
|
|
80
|
+
|
|
81
|
+
let raw;
|
|
82
|
+
try {
|
|
83
|
+
raw = readFileSync(path.join(repoRoot, AUTOPILOT_JSONL_RELPATH), 'utf8');
|
|
84
|
+
} catch {
|
|
85
|
+
// Missing / unreadable file ⇒ no history ⇒ [] (G2 gate omitted with a warning).
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const records = [];
|
|
90
|
+
for (const line of raw.split('\n')) {
|
|
91
|
+
const trimmed = line.trim();
|
|
92
|
+
if (trimmed.length === 0) continue;
|
|
93
|
+
try {
|
|
94
|
+
const parsed = JSON.parse(trimmed);
|
|
95
|
+
// Only keep object records; primitives/arrays are not run records.
|
|
96
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
97
|
+
records.push(parsed);
|
|
98
|
+
}
|
|
99
|
+
} catch {
|
|
100
|
+
// Skip a corrupt/partial line — one bad line never discards the history.
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Return the newest `cap` records, preserving on-disk (newest-last) order.
|
|
105
|
+
return records.length > cap ? records.slice(records.length - cap) : records;
|
|
106
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autopilot/stall-sampler.mjs — Stateless progress sampler for STALL_TIMEOUT
|
|
3
|
+
* kill-switch (ADR-364, issue #371).
|
|
4
|
+
*
|
|
5
|
+
* The sampler reads `autopilot.jsonl` mtime as the progress marker: the
|
|
6
|
+
* autopilot loop writes one record per session atomically (tmp+rename), so the
|
|
7
|
+
* file mtime advances exactly when the loop makes progress. No false-positive
|
|
8
|
+
* churn from in-place writes, no need to parse JSON, microsecond precision.
|
|
9
|
+
*
|
|
10
|
+
* Stateless — single statSync call per invocation, no side effects, no async.
|
|
11
|
+
* Wire-up to the kill-switch + loop is deferred (see #371 follow-up); this
|
|
12
|
+
* module ships in isolation under the ADR-364 thin-slice MVP.
|
|
13
|
+
*
|
|
14
|
+
* Exports:
|
|
15
|
+
* SAMPLE_CADENCE_MS — shared constant (30_000) defining the "fresh" window
|
|
16
|
+
* sampleProgress(opts) — returns progress descriptor; never throws
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { statSync } from 'node:fs';
|
|
20
|
+
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Constants
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Window (ms) within which a marker is considered "fresh". If the autopilot.jsonl
|
|
27
|
+
* mtime is within the last SAMPLE_CADENCE_MS, the sampler reports progressed=true.
|
|
28
|
+
* Exported so the kill-switch caller and tests share the same value.
|
|
29
|
+
*/
|
|
30
|
+
export const SAMPLE_CADENCE_MS = 30_000;
|
|
31
|
+
|
|
32
|
+
const DEFAULT_AUTOPILOT_JSONL = '.orchestrator/metrics/autopilot.jsonl';
|
|
33
|
+
const DEFAULT_STALL_TIMEOUT_SECONDS = 600;
|
|
34
|
+
const MARKER_SUCCESS = 'autopilot.jsonl:mtime';
|
|
35
|
+
const MARKER_MISSING = 'missing';
|
|
36
|
+
const MARKER_INVALID = 'invalid';
|
|
37
|
+
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Progress sampler
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Sample autopilot progress by reading `autopilot.jsonl` mtime.
|
|
44
|
+
*
|
|
45
|
+
* @param {object} [opts]
|
|
46
|
+
* @param {string} [opts.autopilotJsonlPath] — path to autopilot.jsonl (default
|
|
47
|
+
* '.orchestrator/metrics/autopilot.jsonl').
|
|
48
|
+
* @param {number} [opts.stallTimeoutSeconds] — kill-switch threshold (default
|
|
49
|
+
* 600). NOT range-clamped here; caller is responsible for bounds.
|
|
50
|
+
* @param {() => number} [opts.nowMs] — wall-clock supplier (default Date.now).
|
|
51
|
+
* DI seam for deterministic tests.
|
|
52
|
+
* @returns {{
|
|
53
|
+
* progressed: boolean,
|
|
54
|
+
* lastMarker: number | null,
|
|
55
|
+
* stallSeconds: number,
|
|
56
|
+
* marker: string,
|
|
57
|
+
* }}
|
|
58
|
+
*/
|
|
59
|
+
export function sampleProgress(opts = {}) {
|
|
60
|
+
const autopilotJsonlPath = opts.autopilotJsonlPath ?? DEFAULT_AUTOPILOT_JSONL;
|
|
61
|
+
// stallTimeoutSeconds is currently informational — the caller decides if
|
|
62
|
+
// stallSeconds exceeds threshold. We read it (with default) so the signature
|
|
63
|
+
// stays stable when (future) clamp logic moves here. Underscore prefix marks
|
|
64
|
+
// intentional non-use per the project ESLint config.
|
|
65
|
+
const _stallTimeoutSeconds = opts.stallTimeoutSeconds ?? DEFAULT_STALL_TIMEOUT_SECONDS;
|
|
66
|
+
void _stallTimeoutSeconds;
|
|
67
|
+
const nowMs = typeof opts.nowMs === 'function' ? opts.nowMs : Date.now;
|
|
68
|
+
|
|
69
|
+
let mtimeMs;
|
|
70
|
+
try {
|
|
71
|
+
const st = statSync(autopilotJsonlPath);
|
|
72
|
+
mtimeMs = st.mtimeMs;
|
|
73
|
+
} catch (err) {
|
|
74
|
+
const marker = err && err.code === 'ENOENT' ? MARKER_MISSING : MARKER_INVALID;
|
|
75
|
+
return {
|
|
76
|
+
progressed: false,
|
|
77
|
+
lastMarker: null,
|
|
78
|
+
stallSeconds: 0,
|
|
79
|
+
marker,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const now = nowMs();
|
|
84
|
+
const deltaMs = now - mtimeMs;
|
|
85
|
+
// Clamp negative deltas (clock skew, file mtime in the future) to 0.
|
|
86
|
+
const stallSeconds = Math.max(0, Math.round(deltaMs / 1000));
|
|
87
|
+
// Fresh if within the sample cadence window (also covers the clock-skew
|
|
88
|
+
// future-mtime case where deltaMs < SAMPLE_CADENCE_MS).
|
|
89
|
+
const progressed = deltaMs < SAMPLE_CADENCE_MS;
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
progressed,
|
|
93
|
+
lastMarker: mtimeMs,
|
|
94
|
+
stallSeconds,
|
|
95
|
+
marker: MARKER_SUCCESS,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autopilot/telemetry.mjs — Telemetry helpers for the autopilot loop.
|
|
3
|
+
*
|
|
4
|
+
* Relocated from scripts/lib/autopilot-telemetry.mjs as part of the W1A6
|
|
5
|
+
* decomposition. The original path is kept as a thin backward-compat re-export.
|
|
6
|
+
*
|
|
7
|
+
* Leaf module: imports node built-ins only — no circular dependencies.
|
|
8
|
+
*
|
|
9
|
+
* Exports:
|
|
10
|
+
* SCHEMA_VERSION
|
|
11
|
+
* appendJsonlAtomic(record, jsonlPath) — shared atomic tmp+rename helper
|
|
12
|
+
* writeAutopilotJsonl(state, jsonlPath) — atomic tmp+rename JSONL writer
|
|
13
|
+
* defaultRunId(branch, nowMs) — autopilot_run_id builder
|
|
14
|
+
* readHostClass(hostJsonPath) — reads host.json host_class field
|
|
15
|
+
* finalizeState(state, nowMs) — stamps completed_at + duration_seconds
|
|
16
|
+
* writeMultiStoryCoordinatorEntry(entry, jsonlPath) — Phase D coordinator summary entry
|
|
17
|
+
* linkChildLoopToCoordinator(childRunId, parentRunId)— Phase D linkage documentation helper
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { writeFileSync, renameSync, mkdirSync, readFileSync } from 'node:fs';
|
|
21
|
+
import path from 'node:path';
|
|
22
|
+
import crypto from 'node:crypto';
|
|
23
|
+
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Schema version
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
|
|
28
|
+
export const SCHEMA_VERSION = 1;
|
|
29
|
+
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Shared atomic JSONL append helper
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Atomically append a record as a JSONL line to `jsonlPath`.
|
|
36
|
+
* Strategy: read existing file content → append new line in memory →
|
|
37
|
+
* write to a tmp file in the same directory → rename tmp → final path.
|
|
38
|
+
* Crash-safe: a partial tmpfile is never visible at the destination path.
|
|
39
|
+
* POSIX rename(2) is atomic within the same filesystem.
|
|
40
|
+
*
|
|
41
|
+
* The directory must already exist (callers are responsible for mkdirSync).
|
|
42
|
+
*
|
|
43
|
+
* @param {object} record — the record to serialize as a JSONL line
|
|
44
|
+
* @param {string} jsonlPath — destination JSONL path
|
|
45
|
+
*/
|
|
46
|
+
export function appendJsonlAtomic(record, jsonlPath) {
|
|
47
|
+
let existing;
|
|
48
|
+
try {
|
|
49
|
+
existing = readFileSync(jsonlPath, 'utf8');
|
|
50
|
+
} catch {
|
|
51
|
+
existing = '';
|
|
52
|
+
}
|
|
53
|
+
if (existing.length > 0 && !existing.endsWith('\n')) existing += '\n';
|
|
54
|
+
|
|
55
|
+
const line = JSON.stringify(record) + '\n';
|
|
56
|
+
const tmp = `${jsonlPath}.tmp-${process.pid}-${crypto.randomBytes(4).toString('hex')}`;
|
|
57
|
+
writeFileSync(tmp, existing + line, 'utf8');
|
|
58
|
+
renameSync(tmp, jsonlPath);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// JSONL writer (atomic tmp + rename)
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Append-once writer for `autopilot.jsonl`. Writes ONE record per /autopilot
|
|
67
|
+
* invocation atomically: stage to a tmpfile in the same directory, then
|
|
68
|
+
* rename. Existing file contents are preserved (read → append → atomic
|
|
69
|
+
* rewrite). Crash-safe: a partial tmpfile is never visible at the destination.
|
|
70
|
+
*
|
|
71
|
+
* @param {object} state — fully-formed autopilot state record
|
|
72
|
+
* @param {string} jsonlPath — destination JSONL path
|
|
73
|
+
*/
|
|
74
|
+
export function writeAutopilotJsonl(state, jsonlPath) {
|
|
75
|
+
if (!state || typeof state !== 'object') {
|
|
76
|
+
throw new TypeError('writeAutopilotJsonl: state must be an object');
|
|
77
|
+
}
|
|
78
|
+
if (typeof jsonlPath !== 'string' || jsonlPath.length === 0) {
|
|
79
|
+
throw new TypeError('writeAutopilotJsonl: jsonlPath must be a non-empty string');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const dir = path.dirname(jsonlPath);
|
|
83
|
+
mkdirSync(dir, { recursive: true });
|
|
84
|
+
|
|
85
|
+
appendJsonlAtomic(state, jsonlPath);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// Run-id + host class helpers
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Build a default autopilot_run_id from the current branch name and timestamp.
|
|
94
|
+
*
|
|
95
|
+
* @param {string|null|undefined} branch — git branch name
|
|
96
|
+
* @param {number} nowMs — wall-clock milliseconds (Date.now())
|
|
97
|
+
* @returns {string}
|
|
98
|
+
*/
|
|
99
|
+
export function defaultRunId(branch, nowMs) {
|
|
100
|
+
const d = new Date(nowMs);
|
|
101
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
102
|
+
const ymd = `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`;
|
|
103
|
+
const hhmm = `${pad(d.getUTCHours())}${pad(d.getUTCMinutes())}`;
|
|
104
|
+
const safeBranch = (branch ?? 'unknown').replace(/[^A-Za-z0-9._-]+/g, '-');
|
|
105
|
+
return `${safeBranch}-${ymd}-${hhmm}-autopilot`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Read the `host_class` field from `.orchestrator/host.json`. Returns `null`
|
|
110
|
+
* on any parse or I/O error.
|
|
111
|
+
*
|
|
112
|
+
* @param {string} hostJsonPath — absolute or relative path to host.json
|
|
113
|
+
* @returns {string|null}
|
|
114
|
+
*/
|
|
115
|
+
export function readHostClass(hostJsonPath) {
|
|
116
|
+
try {
|
|
117
|
+
const obj = JSON.parse(readFileSync(hostJsonPath, 'utf8'));
|
|
118
|
+
return typeof obj?.host_class === 'string' ? obj.host_class : null;
|
|
119
|
+
} catch {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
// State finalizer
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Stamp `completed_at` and `duration_seconds` onto the autopilot state record
|
|
130
|
+
* in-place. Called once at the end of `runLoop` (and in dry-run) before writing
|
|
131
|
+
* the JSONL record.
|
|
132
|
+
*
|
|
133
|
+
* @param {object} state — mutable autopilot state record
|
|
134
|
+
* @param {() => number} nowMs — wall-clock supplier
|
|
135
|
+
*/
|
|
136
|
+
export function finalizeState(state, nowMs) {
|
|
137
|
+
const completedMs = nowMs();
|
|
138
|
+
const startedMs = Date.parse(state.started_at);
|
|
139
|
+
state.completed_at = new Date(completedMs).toISOString();
|
|
140
|
+
state.duration_seconds = Number.isFinite(startedMs)
|
|
141
|
+
? Math.max(0, Math.round((completedMs - startedMs) / 1000))
|
|
142
|
+
: 0;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
// Phase D — multi-story coordinator helpers
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
|
|
149
|
+
const DEFAULT_AUTOPILOT_JSONL = '.orchestrator/metrics/autopilot.jsonl';
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Write a per-orchestrator-run coordinator entry to autopilot.jsonl.
|
|
153
|
+
* Used by autopilot-multi.mjs to log the multi-story run summary distinct
|
|
154
|
+
* from individual story-loop entries (which are written by runLoop itself).
|
|
155
|
+
*
|
|
156
|
+
* Schema additions (additive, no version bump):
|
|
157
|
+
* - parent_run_id: null (the coordinator IS the parent — its id is the
|
|
158
|
+
* parent_run_id used by children)
|
|
159
|
+
* - kind: 'multi-story-coordinator' (vs 'single-loop' implied for legacy entries)
|
|
160
|
+
* - child_run_ids: string[] of loopIds that this coordinator spawned
|
|
161
|
+
* - cohort_aborted: boolean
|
|
162
|
+
*
|
|
163
|
+
* Fault-tolerant: errors are logged but never thrown — telemetry failures
|
|
164
|
+
* must not crash the orchestrator.
|
|
165
|
+
*
|
|
166
|
+
* @param {object} entry
|
|
167
|
+
* @param {string} entry.run_id - the coordinator's parent_run_id
|
|
168
|
+
* @param {string} entry.started_at - ISO 8601
|
|
169
|
+
* @param {string} entry.ended_at - ISO 8601
|
|
170
|
+
* @param {string} entry.stop_reason - 'first-kill-switch'|'backlog-empty'|'inactivity-timeout'|'max-hours'|'cohort-abort'
|
|
171
|
+
* @param {number} entry.loop_count
|
|
172
|
+
* @param {number} entry.completed_count
|
|
173
|
+
* @param {number} entry.failed_count
|
|
174
|
+
* @param {string[]} entry.child_run_ids
|
|
175
|
+
* @param {boolean} entry.cohort_aborted
|
|
176
|
+
* @param {object} [entry.kill_detail] - optional kill-switch detail when stop_reason is fatal
|
|
177
|
+
* @param {string} [jsonlPath] - defaults to .orchestrator/metrics/autopilot.jsonl
|
|
178
|
+
* @returns {void}
|
|
179
|
+
*/
|
|
180
|
+
export function writeMultiStoryCoordinatorEntry(entry, jsonlPath = DEFAULT_AUTOPILOT_JSONL) {
|
|
181
|
+
// Defensive: ensure metrics directory exists
|
|
182
|
+
const dir = path.dirname(jsonlPath);
|
|
183
|
+
try { mkdirSync(dir, { recursive: true }); } catch { /* idempotent — directory may already exist */ }
|
|
184
|
+
|
|
185
|
+
// Compose canonical record with required field defaults
|
|
186
|
+
const record = {
|
|
187
|
+
schema_version: 1, // additive — coordinator entries are still v1
|
|
188
|
+
run_id: entry.run_id,
|
|
189
|
+
started_at: entry.started_at,
|
|
190
|
+
ended_at: entry.ended_at,
|
|
191
|
+
kind: 'multi-story-coordinator',
|
|
192
|
+
parent_run_id: null, // coordinator is at top of the tree
|
|
193
|
+
child_run_ids: Array.isArray(entry.child_run_ids) ? entry.child_run_ids : [],
|
|
194
|
+
stop_reason: entry.stop_reason,
|
|
195
|
+
loop_count: entry.loop_count ?? 0,
|
|
196
|
+
completed_count: entry.completed_count ?? 0,
|
|
197
|
+
failed_count: entry.failed_count ?? 0,
|
|
198
|
+
cohort_aborted: entry.cohort_aborted ?? false,
|
|
199
|
+
kill_detail: entry.kill_detail ?? null,
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
try {
|
|
203
|
+
appendJsonlAtomic(record, jsonlPath);
|
|
204
|
+
} catch (err) {
|
|
205
|
+
console.error(`[telemetry] writeMultiStoryCoordinatorEntry failed: ${err.message}`);
|
|
206
|
+
// Do NOT throw — telemetry failures must not crash the orchestrator
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Documentation-only helper. The linkage between child loops and the
|
|
212
|
+
* coordinator is established via `state.parent_run_id` set by autopilot-multi
|
|
213
|
+
* before calling runLoop. Children's autopilot.jsonl entries inherit the
|
|
214
|
+
* parent_run_id automatically via the existing writeAutopilotJsonl path.
|
|
215
|
+
*
|
|
216
|
+
* This function exists so call-sites can self-document the contract.
|
|
217
|
+
*
|
|
218
|
+
* @param {string} childRunId - the child's run_id
|
|
219
|
+
* @param {string} parentRunId - the coordinator's run_id
|
|
220
|
+
* @returns {{linked: true, child: string, parent: string}}
|
|
221
|
+
*/
|
|
222
|
+
export function linkChildLoopToCoordinator(childRunId, parentRunId) {
|
|
223
|
+
return { linked: true, child: childRunId, parent: parentRunId };
|
|
224
|
+
}
|