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,37 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# checker.sh — POSIX wrapper for claude-md-drift-check.
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# bash checker.sh [VAULT_DIR] [--mode warn|hard|off] [--include-path <glob>]... [--skip-* ...]
|
|
6
|
+
# VAULT_DIR=/path/to/vault bash checker.sh [--mode warn]
|
|
7
|
+
#
|
|
8
|
+
# Exit codes mirror checker.mjs:
|
|
9
|
+
# 0 — no errors, or warn mode, or skipped
|
|
10
|
+
# 1 — errors present and mode=hard
|
|
11
|
+
# 2 — invocation or infra error
|
|
12
|
+
#
|
|
13
|
+
# Output: JSON report on stdout.
|
|
14
|
+
|
|
15
|
+
set -euo pipefail
|
|
16
|
+
|
|
17
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
18
|
+
CHECKER_MJS="${SCRIPT_DIR}/checker.mjs"
|
|
19
|
+
|
|
20
|
+
if [[ $# -ge 1 && -n "${1:-}" && "${1:-}" != --* ]]; then
|
|
21
|
+
export VAULT_DIR="$1"
|
|
22
|
+
shift
|
|
23
|
+
fi
|
|
24
|
+
: "${VAULT_DIR:=$PWD}"
|
|
25
|
+
|
|
26
|
+
if ! command -v node >/dev/null 2>&1; then
|
|
27
|
+
echo '{"status":"infra-error","reason":"node not found in PATH"}' >&2
|
|
28
|
+
exit 2
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
if [[ ! -f "$CHECKER_MJS" ]]; then
|
|
32
|
+
echo "{\"status\":\"infra-error\",\"reason\":\"checker.mjs not found at $CHECKER_MJS\"}" >&2
|
|
33
|
+
exit 2
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
export VAULT_DIR
|
|
37
|
+
exec node "$CHECKER_MJS" "$@"
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@session-orchestrator/claude-md-drift-check",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "Narrative drift checker for CLAUDE.md and _meta/*.md. Path-resolver + project-count-sync + issue-reference-freshness + session-file-existence. Pure Node, no runtime deps.",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=18"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"test": "vitest run"
|
|
12
|
+
},
|
|
13
|
+
"devDependencies": {
|
|
14
|
+
"vitest": "^4.1.0"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# convergence-monitoring
|
|
2
|
+
|
|
3
|
+
Monitors iterative improvement loops (autoresearch, multi-wave sessions) for convergence.
|
|
4
|
+
Answers: **"should this loop keep running?"** — distinct from `/evolve` (retrospective
|
|
5
|
+
learning) and `quality-gates` (correctness verification).
|
|
6
|
+
|
|
7
|
+
## Attribution
|
|
8
|
+
|
|
9
|
+
Inspired by cavekit's documented convergence-monitoring concept (MIT, Julius Brussee).
|
|
10
|
+
Implemented from spec since upstream skill not yet published as of 2026-04-30.
|
|
11
|
+
|
|
12
|
+
## File Inventory
|
|
13
|
+
|
|
14
|
+
| File | Purpose |
|
|
15
|
+
|--------------|----------------------------------------------------------------------------------|
|
|
16
|
+
| `SKILL.md` | Full skill spec — phases, decision table, diagnosis, recovery suggestions |
|
|
17
|
+
| `SIGNALS.md` | Signal reference — computation, thresholds, false positives, event schema |
|
|
18
|
+
| `README.md` | This file |
|
|
19
|
+
|
|
20
|
+
## Invocation
|
|
21
|
+
|
|
22
|
+
**Explicit:** `/convergence-monitoring` — standalone assessment from current session history.
|
|
23
|
+
|
|
24
|
+
**Embedded:** Set `convergence-monitoring: true` in Session Config. `wave-executor` and
|
|
25
|
+
`/autoresearch` will call this skill automatically after each Impl-Core/Impl-Polish wave.
|
|
26
|
+
|
|
27
|
+
## Verdicts
|
|
28
|
+
|
|
29
|
+
| Verdict | Meaning |
|
|
30
|
+
|---------------|-----------------------------------------------|
|
|
31
|
+
| `STOP` | Loop has converged — declare done |
|
|
32
|
+
| `CONTINUE` | Still making progress — run next wave |
|
|
33
|
+
| `INVESTIGATE` | Signals ambiguous or degrading — diagnose |
|
|
34
|
+
| `SKIP` | Not enough data or monitoring disabled |
|
|
35
|
+
|
|
36
|
+
## See Also
|
|
37
|
+
|
|
38
|
+
`skills/wave-executor/wave-loop.md` · `skills/evolve/SKILL.md` ·
|
|
39
|
+
`skills/quality-gates/SKILL.md`
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# Convergence-Monitoring — Signal Reference
|
|
2
|
+
|
|
3
|
+
Companion to `SKILL.md`. Defines each signal precisely: how to compute it, what threshold
|
|
4
|
+
means what, and what false positives look like. Consume this when implementing callers or
|
|
5
|
+
debugging unexpected verdicts.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Signal 1: Shrinking Diff (SD)
|
|
10
|
+
|
|
11
|
+
**What it measures:** Is the volume of change still decreasing wave-over-wave?
|
|
12
|
+
|
|
13
|
+
A well-converging loop should produce progressively smaller diffs — large changes early
|
|
14
|
+
(scaffold, core logic), shrinking to fixes and polish, approaching zero at completion.
|
|
15
|
+
|
|
16
|
+
### Computation
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# For wave N (run after wave completes):
|
|
20
|
+
WAVE_START_REF="<git SHA of wave N start>"
|
|
21
|
+
WAVE_END_REF="<git SHA of wave N end>"
|
|
22
|
+
|
|
23
|
+
# Lines added in this wave (insertions only — deletions tracked separately)
|
|
24
|
+
INSERTIONS=$(git diff --shortstat "$WAVE_START_REF" "$WAVE_END_REF" \
|
|
25
|
+
| grep -oE '[0-9]+ insertion' | awk '{print $1}')
|
|
26
|
+
DELETIONS=$(git diff --shortstat "$WAVE_START_REF" "$WAVE_END_REF" \
|
|
27
|
+
| grep -oE '[0-9]+ deletion' | awk '{print $1}')
|
|
28
|
+
WAVE_DIFF_SIZE=$((${INSERTIONS:-0} + ${DELETIONS:-0}))
|
|
29
|
+
|
|
30
|
+
# Ratio against peak diff (peak = max diff_size across all waves in session)
|
|
31
|
+
PEAK_DIFF_SIZE=$(jq -s 'map(.diff_size) | max' <<< "$WAVE_HISTORY_JSON")
|
|
32
|
+
SD_VALUE=$(echo "scale=3; $WAVE_DIFF_SIZE / $PEAK_DIFF_SIZE" | bc)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Thresholds
|
|
36
|
+
|
|
37
|
+
| SD value | Interpretation |
|
|
38
|
+
|-----------|--------------------------------------------------------|
|
|
39
|
+
| > 1.0 | This wave is larger than any previous — churn alert |
|
|
40
|
+
| 0.6–1.0 | Still substantial work; loop is active |
|
|
41
|
+
| 0.15–0.6 | Shrinking — healthy progression |
|
|
42
|
+
| 0.0–0.15 | Near-zero change — plateau (convergence or stall) |
|
|
43
|
+
|
|
44
|
+
### Trend Mapping
|
|
45
|
+
|
|
46
|
+
| Condition | Trend |
|
|
47
|
+
|--------------------------------------------------------|--------------|
|
|
48
|
+
| SD_VALUE < 0.6 AND less than prior wave's value | `improving` |
|
|
49
|
+
| SD_VALUE within ±15% of prior wave for 2+ waves | `plateau` |
|
|
50
|
+
| SD_VALUE > prior wave's SD_VALUE | `regressing` |
|
|
51
|
+
|
|
52
|
+
### False Positives
|
|
53
|
+
|
|
54
|
+
- **Refactor-heavy waves** produce large diffs (file moves, renames) that look like
|
|
55
|
+
regressions. Mitigation: if `git diff --name-only | grep -c '/dev/null'` is high
|
|
56
|
+
(files deleted/renamed), discount the diff size by 40%.
|
|
57
|
+
- **Test-only waves** often produce large line counts with zero functional change.
|
|
58
|
+
The quality-gates pass-rate signal compensates for this.
|
|
59
|
+
- **Plateau at large diff** does NOT mean convergence — it means oscillation. Always
|
|
60
|
+
cross-check velocity before issuing a STOP verdict on a large-diff plateau.
|
|
61
|
+
|
|
62
|
+
### Confidence Formula
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
SD_confidence = min(1.0, completed_waves / 3)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Minimum 3 waves before the ratio is meaningful. Below 3 waves: `confidence < 1.0`,
|
|
69
|
+
verdict is downgraded per Phase 2 confidence gate.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Signal 2: Pass-Rate Plateau (PR)
|
|
74
|
+
|
|
75
|
+
**What it measures:** Has the test pass-rate stabilized?
|
|
76
|
+
|
|
77
|
+
Pass-rate is the most direct quality signal. An improving trend confirms the loop is
|
|
78
|
+
fixing real defects. A plateau at ≥ 0.95 is the desired end-state. A plateau below
|
|
79
|
+
0.90 is a ceiling — the loop cannot fix what it's breaking.
|
|
80
|
+
|
|
81
|
+
### Computation
|
|
82
|
+
|
|
83
|
+
Read from `.orchestrator/metrics/events.jsonl`, filtering `event_type: quality.incremental`
|
|
84
|
+
for the current session:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Extract pass-rate per wave:
|
|
88
|
+
PASS_RATES=$(jq -s --arg session "$SESSION_START_REF" '
|
|
89
|
+
[.[] | select(.session_start_ref == $session and .event_type == "quality.incremental")
|
|
90
|
+
| (.test.passed // 0) / ((.test.total // 1) | if . == 0 then 1 else . end)]
|
|
91
|
+
' events.jsonl)
|
|
92
|
+
|
|
93
|
+
# Latest value:
|
|
94
|
+
PR_VALUE=$(echo "$PASS_RATES" | jq 'last')
|
|
95
|
+
# Prior value:
|
|
96
|
+
PR_PRIOR=$(echo "$PASS_RATES" | jq '.[length - 2] // 0')
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
If `quality.incremental` events are absent (test runner not configured), set
|
|
100
|
+
`PR_confidence = 0.0` and trend = `plateau` (neutral; do not block on missing data).
|
|
101
|
+
|
|
102
|
+
### Thresholds
|
|
103
|
+
|
|
104
|
+
| PR value | Interpretation |
|
|
105
|
+
|-----------|------------------------------------------------------------|
|
|
106
|
+
| ≥ 0.95 | Target zone — loop should stop unless diff still large |
|
|
107
|
+
| 0.90–0.95 | Acceptable; continue if improving |
|
|
108
|
+
| < 0.90 | Below target — investigate if no improving trend |
|
|
109
|
+
| Δ > +0.05 | Large improvement — continue regardless of other signals |
|
|
110
|
+
| Δ < -0.03 | Regression — issue INVESTIGATE regardless of other signals |
|
|
111
|
+
|
|
112
|
+
### Trend Mapping
|
|
113
|
+
|
|
114
|
+
| Condition | Trend |
|
|
115
|
+
|------------------------------------------------------------|--------------|
|
|
116
|
+
| PR_VALUE > PR_PRIOR by > 0.02 | `improving` |
|
|
117
|
+
| PR_VALUE within ±0.02 of PR_PRIOR for 2+ consecutive waves | `plateau` |
|
|
118
|
+
| PR_VALUE < PR_PRIOR by > 0.03 | `regressing` |
|
|
119
|
+
|
|
120
|
+
### False Positives
|
|
121
|
+
|
|
122
|
+
- **New tests added mid-loop** temporarily lower pass-rate as they're written before
|
|
123
|
+
the implementation is complete. Look for `test.total` growing while `test.passed` is
|
|
124
|
+
stable — this is healthy, not a regression.
|
|
125
|
+
- **Flaky tests** produce oscillating pass-rate without real quality change. If pass-rate
|
|
126
|
+
alternates between two values (e.g., 0.97 / 0.94 / 0.97), classify as plateau at the
|
|
127
|
+
higher value and emit a `flaky-tests-suspected` note.
|
|
128
|
+
- **Missing test runner** produces no events; default to neutral (plateau at 1.0 with
|
|
129
|
+
confidence 0.0) — never block the loop on missing instrumentation.
|
|
130
|
+
|
|
131
|
+
### Confidence Formula
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
PR_confidence = min(1.0, quality_events_count / 2)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Minimum 2 `quality.incremental` events in this session before the trend is meaningful.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Signal 3: Velocity (VEL)
|
|
142
|
+
|
|
143
|
+
**What it measures:** Is the agent still producing commits and changes?
|
|
144
|
+
|
|
145
|
+
Declining velocity is *expected and healthy* as a loop nears completion — early waves
|
|
146
|
+
scaffold and wire, later waves polish and fix. Zero velocity for 2+ waves means the loop
|
|
147
|
+
has stopped making progress, whether or not quality gates pass.
|
|
148
|
+
|
|
149
|
+
### Computation
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# Commits in this wave:
|
|
153
|
+
VEL_COMMITS=$(git rev-list --count "$WAVE_START_REF".."$WAVE_END_REF")
|
|
154
|
+
|
|
155
|
+
# Lines changed in this wave:
|
|
156
|
+
VEL_LINES=$(git diff --shortstat "$WAVE_START_REF" "$WAVE_END_REF" \
|
|
157
|
+
| awk '{gsub(/[^0-9 ]/,"",$0); print $1+$3}')
|
|
158
|
+
|
|
159
|
+
# Prior wave lines (for trend):
|
|
160
|
+
VEL_LINES_PRIOR=<read from events.jsonl for wave N-1>
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Thresholds
|
|
164
|
+
|
|
165
|
+
| Condition | Interpretation |
|
|
166
|
+
|----------------------------------|------------------------------------------------|
|
|
167
|
+
| VEL_COMMITS = 0, VEL_LINES < 5 | Stall — loop made no progress this wave |
|
|
168
|
+
| VEL_LINES < 20, declining | Normal wind-down — approaching completion |
|
|
169
|
+
| VEL_LINES stable (not declining) | Oscillation risk — check for churn |
|
|
170
|
+
| VEL_LINES increasing | Scope expansion or churn — flag for review |
|
|
171
|
+
|
|
172
|
+
### Trend Mapping
|
|
173
|
+
|
|
174
|
+
| Condition | Trend |
|
|
175
|
+
|----------------------------------------------------|--------------|
|
|
176
|
+
| VEL_LINES > prior wave by > 20% for 2+ waves | `improving` |
|
|
177
|
+
| VEL_COMMITS = 0 AND VEL_LINES < 5 | `plateau` |
|
|
178
|
+
| VEL_LINES declining monotonically | `regressing` |
|
|
179
|
+
|
|
180
|
+
### False Positives
|
|
181
|
+
|
|
182
|
+
- **Finalization waves** (git commit, SSOT updates, CHANGELOG) produce velocity after
|
|
183
|
+
an implementation plateau. This looks like `improving` but is actually loop close-out.
|
|
184
|
+
If `git log --oneline | head -5` shows only chore/docs commits, classify as `plateau`.
|
|
185
|
+
- **Empty waves** (all agents dispatched but none committed) show zero velocity. This is
|
|
186
|
+
a hard stall, not a convergence — always cross-check with PR signal.
|
|
187
|
+
- **Large refactor waves** appear as high velocity with SD also high — the loop is
|
|
188
|
+
rewriting, not progressing. The SD + VEL combination triggers INVESTIGATE in the
|
|
189
|
+
decision table.
|
|
190
|
+
|
|
191
|
+
### Confidence Formula
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
VEL_confidence = min(1.0, completed_waves / 2)
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Composite Confidence
|
|
200
|
+
|
|
201
|
+
When producing the final verdict, the composite confidence is:
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
composite_confidence = (SD_confidence + PR_confidence + VEL_confidence) / 3
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
If `composite_confidence < 0.5`:
|
|
208
|
+
- STOP → downgraded to CONTINUE
|
|
209
|
+
- INVESTIGATE → downgraded to CONTINUE
|
|
210
|
+
|
|
211
|
+
The caller must surface `low_confidence: [<signal>, ...]` in the report so the user
|
|
212
|
+
can decide whether to trust the CONTINUE verdict or force a decision.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Event Schema (convergence.checkpoint)
|
|
217
|
+
|
|
218
|
+
Written to `.orchestrator/metrics/events.jsonl` after each Phase 2 evaluation:
|
|
219
|
+
|
|
220
|
+
```json
|
|
221
|
+
{
|
|
222
|
+
"schema_version": 1,
|
|
223
|
+
"ts": "<ISO 8601 UTC>",
|
|
224
|
+
"session_start_ref": "<git SHA>",
|
|
225
|
+
"wave_number": 3,
|
|
226
|
+
"event_type": "convergence.checkpoint",
|
|
227
|
+
"verdict": "CONTINUE",
|
|
228
|
+
"signals": {
|
|
229
|
+
"shrinking_diff": { "trend": "improving", "value": 0.42, "confidence": 0.67 },
|
|
230
|
+
"pass_rate": { "trend": "plateau", "value": 0.97, "confidence": 1.0 },
|
|
231
|
+
"velocity": { "trend": "regressing","value": 48, "confidence": 1.0 }
|
|
232
|
+
},
|
|
233
|
+
"composite_confidence": 0.89,
|
|
234
|
+
"low_confidence": [],
|
|
235
|
+
"notes": []
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
All fields required. `notes` is a string array (empty when no anomalies detected).
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## See Also
|
|
244
|
+
|
|
245
|
+
`skills/convergence-monitoring/SKILL.md` · `skills/wave-executor/wave-loop.md` ·
|
|
246
|
+
`.orchestrator/metrics/events.jsonl` schema
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: convergence-monitoring
|
|
3
|
+
user-invocable: true
|
|
4
|
+
tags: [autoresearch, convergence, loop-control, wave-executor]
|
|
5
|
+
model: haiku
|
|
6
|
+
model-preference: sonnet
|
|
7
|
+
model-preference-codex: gpt-5.4-mini
|
|
8
|
+
model-preference-cursor: claude-sonnet-4-6
|
|
9
|
+
description: >
|
|
10
|
+
Monitor iterative improvement loops for convergence. Three signals — shrinking diff,
|
|
11
|
+
pass-rate plateau, velocity — drive a Stop/Continue/Investigate decision at each
|
|
12
|
+
inter-wave checkpoint. Distinct from /evolve (retrospective) and session-reviewer
|
|
13
|
+
(wave output review): convergence-monitoring answers "are we making progress?" not
|
|
14
|
+
"was the last wave correct?". Primary consumer: /autoresearch loops and wave-executor
|
|
15
|
+
inter-wave checkpoints.
|
|
16
|
+
attribution: >
|
|
17
|
+
Inspired by cavekit's documented convergence-monitoring concept (MIT, Julius Brussee).
|
|
18
|
+
Implemented from spec since upstream skill not yet published as of 2026-04-30.
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
> **Platform Note:** State files use the platform's native directory: `.claude/` (Claude Code),
|
|
22
|
+
> `.codex/` (Codex CLI), or `.cursor/` (Cursor IDE). Shared metrics live in
|
|
23
|
+
> `.orchestrator/metrics/`. See `skills/_shared/platform-tools.md`.
|
|
24
|
+
|
|
25
|
+
# Convergence-Monitoring Skill
|
|
26
|
+
|
|
27
|
+
## Platform-native (CC 2.1.105+)
|
|
28
|
+
|
|
29
|
+
This skill's watcher is registered as a plugin monitor via `.claude-plugin/plugin.json`'s `experimental.monitors` reference to `monitors/monitors.json`. Each session that loads this plugin auto-starts the watcher in the background (see `scripts/lib/convergence-monitor.mjs`). Each NDJSON stdout line from the watcher becomes a `<task_notification>` event Claude sees mid-session.
|
|
30
|
+
|
|
31
|
+
For harness < 2.1.105 (no monitor support), the skill's manual probes documented below serve as the fallback path.
|
|
32
|
+
|
|
33
|
+
## When to Invoke
|
|
34
|
+
|
|
35
|
+
**Explicit invocation (`/convergence-monitoring`):** Standalone assessment — reads wave
|
|
36
|
+
history from `.orchestrator/metrics/events.jsonl`, computes all three signals, reports
|
|
37
|
+
verdict + recovery options.
|
|
38
|
+
|
|
39
|
+
**Embedded (loop context):** `/autoresearch` and `wave-executor` invoke this skill after
|
|
40
|
+
each Impl-Core or Impl-Polish wave when `convergence-monitoring: true` is set in Session
|
|
41
|
+
Config. The skill returns a structured verdict that the caller uses to gate the next wave.
|
|
42
|
+
|
|
43
|
+
**NOT a substitute for quality gates.** Quality-gates verify correctness (typecheck, test,
|
|
44
|
+
lint). Convergence-monitoring verifies *progress direction* — whether the work is moving
|
|
45
|
+
toward done or oscillating/stalling.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Phase 0: Activation Gate
|
|
50
|
+
|
|
51
|
+
### 0.1 Explicit Invocation
|
|
52
|
+
|
|
53
|
+
If invoked via `/convergence-monitoring`, skip to Phase 1 unconditionally.
|
|
54
|
+
|
|
55
|
+
### 0.2 Embedded Invocation
|
|
56
|
+
|
|
57
|
+
When called from `wave-executor` or `/autoresearch`, check:
|
|
58
|
+
|
|
59
|
+
1. Read Session Config per `skills/_shared/config-reading.md`. Store as `$CONFIG`.
|
|
60
|
+
2. Check `$CONFIG."convergence-monitoring"`. If the field is absent or `false`, return
|
|
61
|
+
verdict `SKIP` immediately — the caller MUST NOT block on a skipped monitoring call.
|
|
62
|
+
3. Require `$WAVE_NUMBER` (integer, current wave) and `$SESSION_START_REF` (git SHA) to
|
|
63
|
+
be provided by the caller. If either is absent, emit warning and return `SKIP`.
|
|
64
|
+
4. Require at least **2 completed waves** of history. If `$WAVE_NUMBER < 2`, return
|
|
65
|
+
`SKIP` — not enough data to assess trend.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Phase 1: Signal Collection
|
|
70
|
+
|
|
71
|
+
Read wave history from `.orchestrator/metrics/events.jsonl`. Filter to records matching
|
|
72
|
+
`$SESSION_START_REF` and `event_type` in `{wave.start, wave.end, quality.incremental}`.
|
|
73
|
+
|
|
74
|
+
Compute the three signals in parallel. Each signal produces:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
{ signal: "<name>", value: <float>, trend: "improving" | "plateau" | "regressing", confidence: 0.0-1.0 }
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Signal 1 — Shrinking Diff (SD)
|
|
81
|
+
|
|
82
|
+
Measures: is the diff still shrinking, or has it reached noise level?
|
|
83
|
+
|
|
84
|
+
**Computation:**
|
|
85
|
+
```
|
|
86
|
+
diff_sizes[] = [git diff --stat $wave_N_start_ref $wave_N_end_ref | tail -1 | grep -oE '[0-9]+ insertion' | awk '{print $1}']
|
|
87
|
+
for each completed wave in this session
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
- `value` = ratio of latest wave diff to peak diff (0.0 = unchanged, 1.0 = as large as ever)
|
|
91
|
+
- `trend`:
|
|
92
|
+
- `improving` — diff_sizes shrinking monotonically for last 2 waves (value < 0.6)
|
|
93
|
+
- `plateau` — diff_sizes stable within ±15% for 2+ consecutive waves (value 0.0–0.15)
|
|
94
|
+
- `regressing` — diff_sizes growing (value > 1.0 relative to prior wave)
|
|
95
|
+
- `confidence` = min(1.0, completed_waves / 3) — unreliable below 3 waves
|
|
96
|
+
|
|
97
|
+
**False positive flag:** A plateau on diff size with a *large* diff is not convergence —
|
|
98
|
+
it may be an oscillation. Cross-check with Signal 3 (velocity) before concluding.
|
|
99
|
+
|
|
100
|
+
### Signal 2 — Pass-Rate Plateau (PR)
|
|
101
|
+
|
|
102
|
+
Measures: has the test pass-rate stabilized at a level (high or low)?
|
|
103
|
+
|
|
104
|
+
**Computation:** Read `quality.incremental` events from `events.jsonl` for this session.
|
|
105
|
+
Extract `test.passed / test.total` per wave where the field is present.
|
|
106
|
+
|
|
107
|
+
- `value` = latest pass-rate (0.0–1.0)
|
|
108
|
+
- `trend`:
|
|
109
|
+
- `improving` — pass-rate strictly increasing across last 2 waves
|
|
110
|
+
- `plateau` — pass-rate within ±2% for 2+ consecutive waves
|
|
111
|
+
- `regressing` — pass-rate decreasing
|
|
112
|
+
- `confidence` = min(1.0, quality_events_count / 2)
|
|
113
|
+
|
|
114
|
+
**False positive flag:** A plateau at 1.0 (100% pass) is the desired end-state.
|
|
115
|
+
A plateau at < 0.9 with no improving trend is a ceiling signal — see Phase 3.
|
|
116
|
+
|
|
117
|
+
### Signal 3 — Velocity (VEL)
|
|
118
|
+
|
|
119
|
+
Measures: commits and modified-line count per wave — declining velocity is normal
|
|
120
|
+
as work nears completion; zero velocity for 2+ waves is a stall.
|
|
121
|
+
|
|
122
|
+
**Computation:**
|
|
123
|
+
```
|
|
124
|
+
commits_per_wave[] = [git rev-list --count $wave_N_start_ref..$wave_N_end_ref]
|
|
125
|
+
lines_per_wave[] = [git diff --shortstat $wave_N_start_ref $wave_N_end_ref | awk '{print $4+$6}']
|
|
126
|
+
for each completed wave in this session
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
- `value` = lines changed in latest wave (raw integer, not ratio)
|
|
130
|
+
- `trend`:
|
|
131
|
+
- `improving` — commits or lines increasing (unusual mid-loop; flag for review)
|
|
132
|
+
- `plateau` — < 5 lines + 0 commits in latest wave
|
|
133
|
+
- `regressing` — lines declining (normal trajectory near convergence)
|
|
134
|
+
- `confidence` = min(1.0, completed_waves / 2)
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Phase 2: Convergence Decision Table
|
|
139
|
+
|
|
140
|
+
Aggregate signal trends into a single verdict. Apply the table top-to-bottom; use the
|
|
141
|
+
first matching row.
|
|
142
|
+
|
|
143
|
+
| SD trend | PR trend | VEL trend | Verdict | Rationale |
|
|
144
|
+
|------------|------------|------------|---------------|--------------------------------------------------------------|
|
|
145
|
+
| plateau | plateau | plateau | **STOP** | All three signals stable — loop has converged. |
|
|
146
|
+
| plateau | plateau | regressing | **STOP** | Velocity decline + stable quality — natural wind-down. |
|
|
147
|
+
| improving | improving | regressing | **CONTINUE** | Still making progress. Velocity decline is expected. |
|
|
148
|
+
| improving | plateau | regressing | **CONTINUE** | Diff still shrinking; pass-rate already high. |
|
|
149
|
+
| plateau | improving | regressing | **CONTINUE** | Pass-rate catching up; diff mostly stable — finishing work. |
|
|
150
|
+
| regressing | *any* | improving | **INVESTIGATE** | Diff growing and velocity up — scope expansion or churn. |
|
|
151
|
+
| *any* | regressing | *any* | **INVESTIGATE** | Pass-rate declining — regressions introduced. |
|
|
152
|
+
| plateau | plateau | improving | **INVESTIGATE** | Stable diff + stable quality but velocity up — odd state. |
|
|
153
|
+
| *any* | *any* | plateau | **INVESTIGATE** | Velocity zero for 2+ waves — stall or early plateau. |
|
|
154
|
+
|
|
155
|
+
**Confidence gate:** If any signal has confidence < 0.5, downgrade STOP → CONTINUE and
|
|
156
|
+
INVESTIGATE → CONTINUE (not enough data to act confidently on a Stop or Investigate).
|
|
157
|
+
Emit a note: `low-confidence: <signal-names>`.
|
|
158
|
+
|
|
159
|
+
### Verdict Output (structured)
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"verdict": "STOP | CONTINUE | INVESTIGATE | SKIP",
|
|
164
|
+
"signals": {
|
|
165
|
+
"shrinking_diff": { "trend": "...", "value": 0.0, "confidence": 0.0 },
|
|
166
|
+
"pass_rate": { "trend": "...", "value": 0.0, "confidence": 0.0 },
|
|
167
|
+
"velocity": { "trend": "...", "value": 0, "confidence": 0.0 }
|
|
168
|
+
},
|
|
169
|
+
"low_confidence": [],
|
|
170
|
+
"notes": []
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Emit verdict JSON to stdout. Append one JSONL record to
|
|
175
|
+
`.orchestrator/metrics/events.jsonl` with `event_type: convergence.checkpoint`.
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Phase 3: Non-Convergence Diagnosis
|
|
180
|
+
|
|
181
|
+
Execute this phase when `verdict == INVESTIGATE`. Skip if `verdict` is STOP or CONTINUE.
|
|
182
|
+
|
|
183
|
+
The core question: **ceiling or convergence?**
|
|
184
|
+
|
|
185
|
+
- **Convergence** — the work is done; signals stabilized at the desired state (pass-rate ~1.0,
|
|
186
|
+
diff ~0). Stop is the right action but signals were ambiguous.
|
|
187
|
+
- **Ceiling** — progress has halted but the desired state has NOT been reached. Something
|
|
188
|
+
is blocking further improvement.
|
|
189
|
+
|
|
190
|
+
### 3.1 Ceiling vs Convergence Dichotomy
|
|
191
|
+
|
|
192
|
+
| Observable | Classification |
|
|
193
|
+
|-----------------------------------------------|------------------|
|
|
194
|
+
| pass-rate plateau ≥ 0.95, diff plateau ≈ 0 | Convergence |
|
|
195
|
+
| pass-rate plateau < 0.90 with no trend | Ceiling |
|
|
196
|
+
| diff growing (SD regressing) for 2+ waves | Churn / Ceiling |
|
|
197
|
+
| velocity plateau with large outstanding diff | Stall / Ceiling |
|
|
198
|
+
| velocity plateau with near-zero diff | Convergence |
|
|
199
|
+
|
|
200
|
+
### 3.2 Ceiling Root-Cause Probes
|
|
201
|
+
|
|
202
|
+
Run these read-only probes to characterize the ceiling. Each probe takes < 5 seconds.
|
|
203
|
+
|
|
204
|
+
1. **Recurring failures:** `git log --oneline $SESSION_START_REF..HEAD -- '*.test.*' | wc -l`
|
|
205
|
+
— high churn in test files with no new commits to production files suggests a test-fix loop.
|
|
206
|
+
|
|
207
|
+
2. **Oscillating files:** identify files that appear in 3+ wave diffs in this session.
|
|
208
|
+
These are the **fragile modules** (see architecture.md Module/Seam vocabulary) — their
|
|
209
|
+
seam is leaking complexity into the loop.
|
|
210
|
+
|
|
211
|
+
3. **Stagnation events:** read `stagnation_events` from the latest session record in
|
|
212
|
+
`sessions.jsonl`. A non-empty list confirms the loop is repeating edit-format-friction
|
|
213
|
+
rather than making functional progress.
|
|
214
|
+
|
|
215
|
+
4. **Scope drift:** compare `$CONFIG."plan-prd-location"` PRD's in-scope items against
|
|
216
|
+
`git diff --name-only $SESSION_START_REF..HEAD`. Files outside PRD scope indicate
|
|
217
|
+
the loop has expanded beyond its brief.
|
|
218
|
+
|
|
219
|
+
Report the probe results in Phase 4.
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Phase 4: Recovery Suggestions
|
|
224
|
+
|
|
225
|
+
Present options based on the Phase 3 diagnosis. Do NOT auto-apply any recovery action —
|
|
226
|
+
present to the user and await confirmation.
|
|
227
|
+
|
|
228
|
+
| Diagnosis | Recovery Option | When to Use |
|
|
229
|
+
|------------------|---------------------------------------------------------------|-----------------------------------------------------------|
|
|
230
|
+
| Convergence | **Accept and stop** — declare loop done | pass-rate ≥ 0.95, all scope items addressed |
|
|
231
|
+
| Ceiling / Stall | **Rollback to last-known-good wave** — `git reset --soft` | Loop is chasing a regression it introduced |
|
|
232
|
+
| Ceiling / Churn | **Scope reduction** — remove non-PRD files from agent brief | Loop has drifted outside its brief |
|
|
233
|
+
| Stall (fragile) | **Agent-count adjustment** — reduce agents per wave by 50% | Too many agents editing the same fragile module |
|
|
234
|
+
| Stall (format) | **Stagnation break** — inject pre-edit grounding prompt | `stagnation_events` present; loop repeating format errors |
|
|
235
|
+
| Ceiling (test) | **Test-fix isolation** — spawn dedicated fix wave** | Pass-rate < 0.90 but diff near zero |
|
|
236
|
+
|
|
237
|
+
**Rollback caveat:** Present the exact command (`git reset --soft <wave_N-1_end_ref>`)
|
|
238
|
+
and require explicit user confirmation. Never execute it automatically.
|
|
239
|
+
|
|
240
|
+
### 4.1 Recovery Report Format
|
|
241
|
+
|
|
242
|
+
```
|
|
243
|
+
## Convergence Report — Wave N
|
|
244
|
+
|
|
245
|
+
Verdict: INVESTIGATE
|
|
246
|
+
Diagnosis: Ceiling (pass-rate stuck at 0.82, 3 oscillating files)
|
|
247
|
+
|
|
248
|
+
Oscillating modules: src/lib/parser.ts, src/lib/tokenizer.ts, tests/parser.test.ts
|
|
249
|
+
Stagnation events: 2 (edit-format-friction in src/lib/parser.ts)
|
|
250
|
+
|
|
251
|
+
Recovery options:
|
|
252
|
+
[A] Scope reduction — remove src/lib/tokenizer.ts from agent brief (outside PRD scope)
|
|
253
|
+
[B] Agent-count adjustment — reduce from 6 to 3 agents next wave (shared fragile module)
|
|
254
|
+
[C] Rollback — git reset --soft <wave_3_end_ref> (destructive, requires confirmation)
|
|
255
|
+
[D] Continue anyway — override monitoring and proceed to next wave
|
|
256
|
+
|
|
257
|
+
Select option or type 'continue' to override.
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Anti-Patterns
|
|
263
|
+
|
|
264
|
+
- **Treating STOP as a quality gate.** Convergence-monitoring answers "are we done making
|
|
265
|
+
progress?" not "is the code correct?" Full Gate quality checks are required separately
|
|
266
|
+
even when verdict is STOP.
|
|
267
|
+
- **Acting on low-confidence verdicts without the confidence note.** Below 3 waves of
|
|
268
|
+
history the signals are unreliable. The confidence gate in Phase 2 exists for this reason.
|
|
269
|
+
- **Conflating convergence with correctness.** A loop can converge to a broken state
|
|
270
|
+
(pass-rate plateau at 0.6). Always cross-check the pass-rate value, not just the trend.
|
|
271
|
+
- **Auto-applying rollback.** Phase 4 recovery options are presented to the user, never
|
|
272
|
+
auto-applied. Rollback is destructive and may discard valid work across parallel sessions
|
|
273
|
+
(PSA-003).
|
|
274
|
+
- **Confusing convergence-monitoring with /evolve.** evolve is retrospective (what patterns
|
|
275
|
+
should we learn from finished sessions?). convergence-monitoring is prospective (should the
|
|
276
|
+
current loop continue?).
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## See Also
|
|
281
|
+
|
|
282
|
+
- `skills/wave-executor/wave-loop.md` — intended consumer (inter-wave hook integration pending in a follow-up issue)
|
|
283
|
+
- `skills/evolve/SKILL.md` — retrospective learning; complements but does not replace
|
|
284
|
+
- `skills/quality-gates/SKILL.md` — correctness gate; runs independently of convergence verdict
|
|
285
|
+
- `convergence-monitoring/SIGNALS.md` — signal computation reference + threshold rationale
|