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,495 @@
|
|
|
1
|
+
> See probes-intro.md for confidence scoring reference.
|
|
2
|
+
|
|
3
|
+
## Category: `session`
|
|
4
|
+
|
|
5
|
+
### Probe: gap-analysis
|
|
6
|
+
|
|
7
|
+
**Activation:** Active session exists (session plan in CLAUDE.md or AGENTS.md or memory).
|
|
8
|
+
|
|
9
|
+
**Detection Method:**
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Step 1: Extract planned items from session plan
|
|
13
|
+
# Parse the wave plan for task descriptions and acceptance criteria
|
|
14
|
+
|
|
15
|
+
# Step 2: Get all changes in current session
|
|
16
|
+
git diff --name-only HEAD~<session_commit_count>
|
|
17
|
+
git diff --stat HEAD~<session_commit_count>
|
|
18
|
+
|
|
19
|
+
# Step 3: For each planned item, verify corresponding changes exist
|
|
20
|
+
# Match task descriptions against changed files and diff content
|
|
21
|
+
git diff HEAD~<session_commit_count> -- <relevant_files>
|
|
22
|
+
|
|
23
|
+
# Step 4: Check acceptance criteria
|
|
24
|
+
# For each acceptance criterion, verify it can be confirmed from the diff
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Evidence Format:**
|
|
28
|
+
```
|
|
29
|
+
Planned Item: <task description>
|
|
30
|
+
Status: completed | partial | missing
|
|
31
|
+
Evidence: <files changed or NONE>
|
|
32
|
+
Acceptance Criteria Met: <list of criteria with pass/fail>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Default Severity:** High.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
### Probe: hallucination-check
|
|
40
|
+
|
|
41
|
+
**Activation:** Active session exists.
|
|
42
|
+
|
|
43
|
+
**Detection Method:**
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Step 1: Read recent commit messages
|
|
47
|
+
git log --oneline -20
|
|
48
|
+
|
|
49
|
+
# Step 2: For each commit message, extract claims:
|
|
50
|
+
# "Added X" -> verify X exists in the codebase
|
|
51
|
+
Grep pattern: <claimed_addition>
|
|
52
|
+
--glob "*.{ts,tsx,js,jsx,py,go,rs}"
|
|
53
|
+
|
|
54
|
+
# "Fixed Y" -> verify the fix is present in the diff
|
|
55
|
+
git show <commit_hash> -- <relevant_files>
|
|
56
|
+
|
|
57
|
+
# "Closes #N" -> verify acceptance criteria from issue #N are met
|
|
58
|
+
gh issue view <N> --json body -q '.body'
|
|
59
|
+
# or
|
|
60
|
+
glab issue view <N>
|
|
61
|
+
|
|
62
|
+
# Step 3: Cross-reference claims against actual changes
|
|
63
|
+
git diff <commit_hash>~1..<commit_hash>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Evidence Format:**
|
|
67
|
+
```
|
|
68
|
+
Commit: <hash> <message>
|
|
69
|
+
Claim: <extracted claim>
|
|
70
|
+
Verification: confirmed | UNVERIFIED | contradicted
|
|
71
|
+
Evidence: <what was found or not found>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Default Severity:** Critical.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
### Probe: stale-issues
|
|
79
|
+
|
|
80
|
+
**Activation:** VCS configured (git remote exists).
|
|
81
|
+
|
|
82
|
+
**Detection Method:**
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
# GitLab: list open issues sorted by last update
|
|
86
|
+
glab issue list --per-page 100 | head -50
|
|
87
|
+
|
|
88
|
+
# GitHub: list open issues sorted by last update
|
|
89
|
+
gh issue list --limit 100 --json number,title,labels,updatedAt,assignees --jq '.[] | select(.updatedAt < "<30_days_ago_iso>")'
|
|
90
|
+
|
|
91
|
+
# Flag:
|
|
92
|
+
# - Issues with no activity in stale-issue-days (default: 30 days)
|
|
93
|
+
# - Issues assigned but with no associated branch
|
|
94
|
+
# - Issues labeled priority:high or priority:critical that are stale
|
|
95
|
+
|
|
96
|
+
# Check for associated branches:
|
|
97
|
+
git branch -r | grep -i "<issue_number>"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Session Config field: `stale-issue-days` (default: 30).
|
|
101
|
+
|
|
102
|
+
**Evidence Format:**
|
|
103
|
+
```
|
|
104
|
+
Issue: #<number> <title>
|
|
105
|
+
Last Updated: <date>
|
|
106
|
+
Days Stale: <count>
|
|
107
|
+
Assigned To: <assignee or UNASSIGNED>
|
|
108
|
+
Has Branch: true | false
|
|
109
|
+
Priority: <priority label or NONE>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Default Severity:** Low. Medium if `priority:high` or `priority:critical` is stale.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
### Probe: issue-dependency-chains
|
|
117
|
+
|
|
118
|
+
**Activation:** VCS configured (git remote exists).
|
|
119
|
+
|
|
120
|
+
**Detection Method:**
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# GitLab: fetch issue descriptions and look for cross-references
|
|
124
|
+
glab api "projects/<project_id>/issues?state=opened&per_page=100" | python3 -c "
|
|
125
|
+
import json, sys, re
|
|
126
|
+
issues = json.load(sys.stdin)
|
|
127
|
+
for issue in issues:
|
|
128
|
+
refs = re.findall(r'(blocks|depends on|relates to|blocked by)\s+#(\d+)', issue.get('description',''), re.I)
|
|
129
|
+
if refs:
|
|
130
|
+
print(f'#{issue[\"iid\"]}: {refs}')
|
|
131
|
+
"
|
|
132
|
+
|
|
133
|
+
# GitHub: fetch issue bodies and parse cross-references
|
|
134
|
+
gh issue list --limit 100 --json number,body --jq '.[] | {number, body}' | python3 -c "
|
|
135
|
+
import json, sys, re
|
|
136
|
+
for line in sys.stdin:
|
|
137
|
+
issue = json.loads(line)
|
|
138
|
+
refs = re.findall(r'(blocks|depends on|relates to|blocked by)\s+#(\d+)', issue.get('body',''), re.I)
|
|
139
|
+
if refs:
|
|
140
|
+
print(f'#{issue[\"number\"]}: {refs}')
|
|
141
|
+
"
|
|
142
|
+
|
|
143
|
+
# Build dependency graph from parsed relationships
|
|
144
|
+
# Detect:
|
|
145
|
+
# - Circular chains (A blocks B, B blocks A)
|
|
146
|
+
# - Deep chains (>3 levels: A -> B -> C -> D -> ...)
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Evidence Format:**
|
|
150
|
+
```
|
|
151
|
+
Chain: #<a> -> #<b> -> #<c> [-> ...]
|
|
152
|
+
Type: circular | deep-chain
|
|
153
|
+
Depth: <level count>
|
|
154
|
+
Issues Involved:
|
|
155
|
+
- #<number>: <title>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Default Severity:** Medium.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
### Probe: claude-md-audit
|
|
163
|
+
|
|
164
|
+
**Activation:** CLAUDE.md or AGENTS.md exists in project root.
|
|
165
|
+
|
|
166
|
+
**Detection Method:**
|
|
167
|
+
|
|
168
|
+
1. Session Config completeness (if session-orchestrator plugin is installed):
|
|
169
|
+
```bash
|
|
170
|
+
# Check if ## Session Config section exists
|
|
171
|
+
Grep pattern: ^## Session Config
|
|
172
|
+
--glob "{CLAUDE,AGENTS}.md"
|
|
173
|
+
|
|
174
|
+
# If section exists, validate referenced paths:
|
|
175
|
+
# Extract file paths from Session Config values (pencil, cross-repos, ssot-files)
|
|
176
|
+
# For each referenced path:
|
|
177
|
+
test -e <path>
|
|
178
|
+
# Flag paths that don't exist
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
2. Rules freshness:
|
|
182
|
+
```bash
|
|
183
|
+
# List all <state-dir>/rules/ files
|
|
184
|
+
Glob pattern: "<state-dir>/rules/*.md"
|
|
185
|
+
|
|
186
|
+
# For each rule file:
|
|
187
|
+
# a) Extract key identifiers (function names, file paths, patterns mentioned)
|
|
188
|
+
# b) Grep for those identifiers in source code
|
|
189
|
+
Grep pattern: <extracted_identifier>
|
|
190
|
+
--glob "*.{ts,tsx,js,jsx,py,go,rs}" --glob "!**/node_modules/**"
|
|
191
|
+
# Flag rules whose referenced patterns/functions/files no longer exist in the codebase
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
3. CLAUDE.md staleness:
|
|
195
|
+
```bash
|
|
196
|
+
# Check last modification date
|
|
197
|
+
# macOS:
|
|
198
|
+
stat -f "%Sm" -t "%Y-%m-%d" CLAUDE.md
|
|
199
|
+
# Linux:
|
|
200
|
+
stat -c "%y" CLAUDE.md
|
|
201
|
+
|
|
202
|
+
# Compare against ssot-freshness-days from Session Config (default: 5)
|
|
203
|
+
# Flag if CLAUDE.md is older than threshold
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
4. Technology references:
|
|
207
|
+
```bash
|
|
208
|
+
# Extract technology/framework mentions from CLAUDE.md
|
|
209
|
+
# Common patterns: "uses X", "built with X", framework names, library names
|
|
210
|
+
# Cross-reference against package.json dependencies:
|
|
211
|
+
cat package.json | python3 -c "
|
|
212
|
+
import json, sys
|
|
213
|
+
pkg = json.load(sys.stdin)
|
|
214
|
+
deps = set(pkg.get('dependencies', {}).keys()) | set(pkg.get('devDependencies', {}).keys())
|
|
215
|
+
print('\n'.join(sorted(deps)))
|
|
216
|
+
"
|
|
217
|
+
# Flag technologies mentioned in CLAUDE.md but absent from dependencies
|
|
218
|
+
# Also flag major dependencies NOT mentioned in CLAUDE.md (potential documentation gap)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Evidence Format:**
|
|
222
|
+
```
|
|
223
|
+
File: CLAUDE.md or AGENTS.md (or <state-dir>/rules/<name>.md)
|
|
224
|
+
Issue: missing-session-config | invalid-path-reference | stale-rule | stale-claude-md | phantom-technology | undocumented-dependency
|
|
225
|
+
Detail: <specific finding>
|
|
226
|
+
Referenced: <what was referenced>
|
|
227
|
+
Actual: <what was found or NOT found>
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**Default Severity:** Medium (staleness, phantom tech, undocumented deps), High (invalid paths, stale rules with no codebase match).
|
|
231
|
+
|
|
232
|
+
5. Token efficiency — CLAUDE.md size:
|
|
233
|
+
```bash
|
|
234
|
+
# Count lines in CLAUDE.md
|
|
235
|
+
wc -l CLAUDE.md
|
|
236
|
+
|
|
237
|
+
# Flag if > 150 lines (warning) or > 250 lines (high)
|
|
238
|
+
# Identify sections > 30 lines that could move to <state-dir>/rules/ or <state-dir>/docs/
|
|
239
|
+
# Check for inline code blocks > 10 lines (should be in separate files)
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
6. Token efficiency — .claudeignore coverage:
|
|
243
|
+
```bash
|
|
244
|
+
# Check if .claudeignore exists
|
|
245
|
+
test -f .claudeignore
|
|
246
|
+
|
|
247
|
+
# If not, scan for common excludable patterns:
|
|
248
|
+
# - Large binary/data directories (> 10MB total)
|
|
249
|
+
# - Test fixture directories with > 50 files
|
|
250
|
+
# Flag projects without .claudeignore that have > 500 files
|
|
251
|
+
find . -type f -not -path '*/node_modules/*' -not -path '*/.git/*' | wc -l
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
7. Token efficiency — state directory hygiene:
|
|
255
|
+
```bash
|
|
256
|
+
# Check state directory total size (platform-aware: .claude/, .codex/, .cursor/)
|
|
257
|
+
STATE_DIR="${SO_STATE_DIR:-.claude}"
|
|
258
|
+
du -sh "$STATE_DIR/" 2>/dev/null
|
|
259
|
+
|
|
260
|
+
# Flag if > 10MB
|
|
261
|
+
# Check for stale directories: backups/, screenshots/, temp-*
|
|
262
|
+
# Check for files not modified in > 90 days
|
|
263
|
+
find "$STATE_DIR/" -maxdepth 1 -type d -name "backups" -o -name "screenshots" -o -name "temp-*" 2>/dev/null
|
|
264
|
+
find "$STATE_DIR/" -type f -mtime +90 2>/dev/null | head -10
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
8. Token efficiency — duplicate pattern detection:
|
|
268
|
+
```bash
|
|
269
|
+
# Hash the ## Session Config section across repos
|
|
270
|
+
# If cross-repos is configured, compare CLAUDE.md patterns
|
|
271
|
+
# Flag identical sections that could be consolidated into per-project rules at `<state-dir>/rules/`
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**Evidence Format (token efficiency):**
|
|
275
|
+
```
|
|
276
|
+
File: CLAUDE.md (or <state-dir>/)
|
|
277
|
+
Issue: oversized-claude-md | missing-claudeignore | bloated-state-dir | stale-state-artifacts | duplicate-patterns
|
|
278
|
+
Detail: <specific finding>
|
|
279
|
+
Current: <size/count>
|
|
280
|
+
Threshold: <limit>
|
|
281
|
+
Recommendation: <action>
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
**Default Severity:** Medium (oversized CLAUDE.md, missing .claudeignore), Low (stale artifacts, duplicate patterns), High (state dir > 50MB).
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
### Probe: cross-repo-duplicate-implementation
|
|
289
|
+
|
|
290
|
+
**Activation:** Discovery finding recommends implementing something that lives in a known plugin repo (session-orchestrator, projects-baseline, claude-code-skills). Specifically: the finding mentions a path under `session-orchestrator/skills/`, `session-orchestrator/scripts/`, or `session-orchestrator/hooks/`, OR proposes creating a new skill/script whose name could already be in flight upstream.
|
|
291
|
+
|
|
292
|
+
**Motivation:** A discovery finding that says "implement skill X" is only useful if X does not already exist on the plugin repo. Without a cross-repo check, a consumer repo can spend hours rebuilding work that already sits in an open MR or on a feature branch. First observed in the vault session on 2026-04-19 (session-orchestrator issue #179): vault#58 was filed ~7 h after the feature already existed as MR !11 — the next vault session began rebuilding the same work from scratch before catching the duplication mid-wave.
|
|
293
|
+
|
|
294
|
+
**Detection Method:**
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
# Identify the plugin repo project path. Prefer the Session Config `cross-repos`
|
|
298
|
+
# entry that points at session-orchestrator; fall back to the hardcoded default.
|
|
299
|
+
PLUGIN_REPO="${SO_PLUGIN_REPO:-infrastructure/session-orchestrator}"
|
|
300
|
+
|
|
301
|
+
# SKILL_NAME is extracted from the finding text (path segment after skills/,
|
|
302
|
+
# or the proposed new skill name).
|
|
303
|
+
SKILL_NAME="<extracted from finding>"
|
|
304
|
+
|
|
305
|
+
# 1) Open MRs whose title mentions the skill/script name.
|
|
306
|
+
glab mr list --repo "$PLUGIN_REPO" --state opened 2>/dev/null \
|
|
307
|
+
| grep -i "$SKILL_NAME"
|
|
308
|
+
|
|
309
|
+
# 2) Feature branches matching `feat/<skill>` or containing the name.
|
|
310
|
+
glab api "projects/${PLUGIN_REPO//\//%2F}/repository/branches?search=$SKILL_NAME" 2>/dev/null \
|
|
311
|
+
| jq -r '.[].name' 2>/dev/null
|
|
312
|
+
|
|
313
|
+
# 3) Recently closed issues referencing the skill/script name.
|
|
314
|
+
glab issue list --repo "$PLUGIN_REPO" --closed --search "$SKILL_NAME" 2>/dev/null | head -10
|
|
315
|
+
|
|
316
|
+
# If any query returns a match → flag as pre-existing-work.
|
|
317
|
+
# If glab is offline / unauthenticated → degrade to SKIP with evidence note, do not fabricate findings.
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
**Evidence Format:**
|
|
321
|
+
```
|
|
322
|
+
Finding (original): <discovery finding that triggered this probe>
|
|
323
|
+
Cross-repo target: <PLUGIN_REPO>
|
|
324
|
+
Candidate name: <SKILL_NAME>
|
|
325
|
+
Matches:
|
|
326
|
+
- MR !NN <title> (opened <date>) # when open MR matches
|
|
327
|
+
- branch feat/<name> (last commit <date>) # when branch matches
|
|
328
|
+
- issue #NN <title> (closed <date>) # when closed issue matches
|
|
329
|
+
Recommendation: STOP before opening a new issue — inspect the existing work. If
|
|
330
|
+
duplicate, close this finding with a reference. If complementary, scope the
|
|
331
|
+
new issue against the existing implementation.
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**Default Severity:** High when an open MR or active feature branch matches (wasted work is imminent); Medium when only closed issues match (historical context).
|
|
335
|
+
|
|
336
|
+
**Dependencies:** Requires `glab` (GitLab CLI) for the three queries; `gh` equivalent for GitHub-hosted plugin repos. Auto-degrade to SKIP with a note when CLI unavailable or unauthenticated — never fabricate matches.
|
|
337
|
+
|
|
338
|
+
**Scope:** Runs after any other probe surfaces a finding of the form "add/create/implement [skill|script|hook] …" that could live in the plugin repo. Not a standalone probe — it validates other probes' output before a new issue is filed.
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
### Probe: state-md-staleness
|
|
343
|
+
|
|
344
|
+
**Activation:** `<state-dir>/STATE.md` exists AND Session Config `persistence: true`.
|
|
345
|
+
|
|
346
|
+
**Detection Method:**
|
|
347
|
+
|
|
348
|
+
Read STATE.md frontmatter and compare `updated` timestamp against today. The `updated` field is optional (added in #184, schema-version 1). When absent, fall back to file mtime.
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
STATE_FILE="$(git rev-parse --show-toplevel)/.claude/STATE.md"
|
|
352
|
+
[[ -f "$STATE_FILE" ]] || exit 0
|
|
353
|
+
# Prefer the frontmatter `updated:` field; fall back to file mtime.
|
|
354
|
+
UPDATED="$(node --input-type=module -e "
|
|
355
|
+
import {readFileSync} from 'node:fs';
|
|
356
|
+
import {parseStateMd} from '${PLUGIN_ROOT}/scripts/lib/state-md.mjs';
|
|
357
|
+
try {
|
|
358
|
+
const p = parseStateMd(readFileSync('$STATE_FILE', 'utf8'));
|
|
359
|
+
if (p && p.frontmatter.updated) process.stdout.write(p.frontmatter.updated);
|
|
360
|
+
} catch {}
|
|
361
|
+
" 2>/dev/null)"
|
|
362
|
+
if [[ -z "$UPDATED" ]]; then
|
|
363
|
+
# Fallback: file mtime (cross-platform)
|
|
364
|
+
UPDATED_EPOCH=$(stat -f %m "$STATE_FILE" 2>/dev/null || stat -c %Y "$STATE_FILE" 2>/dev/null)
|
|
365
|
+
else
|
|
366
|
+
UPDATED_EPOCH=$(date -j -f "%Y-%m-%dT%H:%M:%SZ" "$UPDATED" +%s 2>/dev/null \
|
|
367
|
+
|| date -d "$UPDATED" +%s 2>/dev/null)
|
|
368
|
+
fi
|
|
369
|
+
NOW_EPOCH=$(date +%s)
|
|
370
|
+
AGE_DAYS=$(( (NOW_EPOCH - UPDATED_EPOCH) / 86400 ))
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
**Thresholds:**
|
|
374
|
+
- `AGE_DAYS >= 7` → **warn** ("stale — last updated N days ago")
|
|
375
|
+
- `2 <= AGE_DAYS < 7` → **info** ("stale-ish — last updated N days ago")
|
|
376
|
+
- `AGE_DAYS < 2` → no finding
|
|
377
|
+
|
|
378
|
+
**Evidence Format:**
|
|
379
|
+
|
|
380
|
+
```
|
|
381
|
+
File: <state-dir>/STATE.md
|
|
382
|
+
Issue: state-md-staleness
|
|
383
|
+
Detail: STATE.md last updated <UPDATED> (<AGE_DAYS> days ago)
|
|
384
|
+
Source: <frontmatter.updated | file-mtime-fallback>
|
|
385
|
+
Recommendation: Run /session to refresh state, or delete the file if work has been abandoned.
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
**Default Severity:** Medium when `AGE_DAYS >= 7` (warn); Low when `2 <= AGE_DAYS < 7` (info).
|
|
389
|
+
|
|
390
|
+
**Rationale (#184):** Consumer repos with long-dormant STATE.md files risk the next session-start resuming a ghost session. The probe surfaces this before it becomes a resume-prompt surprise. Uses the optional `updated` frontmatter field introduced in #184; degrades to file mtime for backward compatibility.
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
### Probe: bootstrap-lock-freshness
|
|
395
|
+
|
|
396
|
+
**Activation:** Every session-start on a bootstrapped repo (`.orchestrator/bootstrap.lock` exists).
|
|
397
|
+
|
|
398
|
+
**Motivation:** Plugin upgrades between releases can change templates/rules/hooks that an older lock does not reflect. Silent drift between harness version and repo scaffold. All 6/6 Advanced-adoption repos have the lock but none validate its freshness. Issue #186 (Epic #181 harness-retro promotion list #5).
|
|
399
|
+
|
|
400
|
+
**Detection Method:**
|
|
401
|
+
|
|
402
|
+
```bash
|
|
403
|
+
LOCK_FILE="$(git rev-parse --show-toplevel)/.orchestrator/bootstrap.lock"
|
|
404
|
+
[[ -f "$LOCK_FILE" ]] || exit 0
|
|
405
|
+
CURRENT_VERSION="$(node -e "process.stdout.write(require('${PLUGIN_ROOT}/package.json').version)")"
|
|
406
|
+
node --input-type=module -e "
|
|
407
|
+
import { checkBootstrapLockFreshness } from '${PLUGIN_ROOT}/scripts/lib/bootstrap-lock-freshness.mjs';
|
|
408
|
+
const result = checkBootstrapLockFreshness({
|
|
409
|
+
repoRoot: '$(git rev-parse --show-toplevel)',
|
|
410
|
+
currentPluginVersion: '${CURRENT_VERSION}',
|
|
411
|
+
});
|
|
412
|
+
if (result.severity !== 'info') {
|
|
413
|
+
process.stdout.write(JSON.stringify(result, null, 2));
|
|
414
|
+
process.exit(result.severity === 'alert' ? 2 : 1);
|
|
415
|
+
}
|
|
416
|
+
" 2>/dev/null
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Evidence Format:**
|
|
420
|
+
|
|
421
|
+
```
|
|
422
|
+
Severity: info | warn | alert
|
|
423
|
+
Message: bootstrap.lock: age=<N>d, plugin-version=<lock-ver> (current=<plugin-ver>)
|
|
424
|
+
Details:
|
|
425
|
+
ageDays: <integer or null>
|
|
426
|
+
pluginVersion: <version in lock or "unknown">
|
|
427
|
+
currentPluginVersion: <running plugin version>
|
|
428
|
+
bootstrappedAt: <ISO timestamp used for age calculation — ORIGINAL provenance, unchanged by a refresh>
|
|
429
|
+
refreshedAt: <ISO timestamp of the last /bootstrap --refresh-lock, or null>
|
|
430
|
+
versionMismatch: true | false
|
|
431
|
+
reason: missing-repoRoot | missing | read-error | stale-age | unparseable-timestamp
|
|
432
|
+
| version-mismatch-major | version-mismatch-unparseable | null (#57)
|
|
433
|
+
Remediation: reason-aware (#57) — see below.
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
**Default Severity:** info <30d, warn 30–89d or version-mismatch, alert ≥90d or unparseable.
|
|
437
|
+
|
|
438
|
+
**Remediation (reason-aware, #57):** `/bootstrap --retroactive` only helps when the lock is missing entirely (`reason: 'missing'`) — once a lock already has valid `version`/`tier` fields, re-running `--retroactive` is an idempotent no-op (see the Retroactive Flow's idempotency guard in `skills/bootstrap/SKILL.md`) and never actually refreshes anything. For a present-but-stale/drifted lock, branch on `result.details.reason`:
|
|
439
|
+
- `stale-age` or `unparseable-timestamp` → `/bootstrap --refresh-lock` to acknowledge and reset the freshness clock.
|
|
440
|
+
- `version-mismatch-major` or `version-mismatch-unparseable` → check for a plugin update first (git pull / marketplace update), then `/bootstrap --refresh-lock` to acknowledge the current version.
|
|
441
|
+
- `missing` → `/bootstrap --retroactive` (or `/bootstrap` for a fresh scaffold) — this is the one case where no lock exists to refresh.
|
|
442
|
+
|
|
443
|
+
**Dependencies:** Requires `${PLUGIN_ROOT}/scripts/lib/bootstrap-lock-freshness.mjs` (issue #186). Degrades gracefully when the helper is absent (pre-#186 plugin install) — skip with a note, do not fabricate findings.
|
|
444
|
+
|
|
445
|
+
---
|
|
446
|
+
|
|
447
|
+
### Probe: agent-frontmatter-invalid
|
|
448
|
+
|
|
449
|
+
**Activation:** `.claude/agents/*.md` files exist in the repo.
|
|
450
|
+
|
|
451
|
+
**Motivation:** Claude Code agent frontmatter has fragile YAML rules (tools as comma-string not array, description single-line not block-scalar, required fields per CLAUDE.md). Broken frontmatter causes silent "agents: Invalid input" validation failures at session start. Issue #189 (Epic #181 harness-retro promotion list #3).
|
|
452
|
+
|
|
453
|
+
**Detection Method:**
|
|
454
|
+
|
|
455
|
+
```bash
|
|
456
|
+
AGENTS_DIR="$(git rev-parse --show-toplevel)/.claude/agents"
|
|
457
|
+
[[ -d "$AGENTS_DIR" ]] || exit 0
|
|
458
|
+
node --input-type=module -e "
|
|
459
|
+
import { validateAgentFile } from '${PLUGIN_ROOT}/scripts/lib/agent-frontmatter.mjs';
|
|
460
|
+
import { readdirSync } from 'node:fs';
|
|
461
|
+
import { join } from 'node:path';
|
|
462
|
+
const dir = '${AGENTS_DIR}';
|
|
463
|
+
const files = readdirSync(dir).filter(f => f.endsWith('.md'));
|
|
464
|
+
let hasErrors = false;
|
|
465
|
+
for (const f of files) {
|
|
466
|
+
const result = validateAgentFile(join(dir, f));
|
|
467
|
+
if (!result.ok) {
|
|
468
|
+
hasErrors = true;
|
|
469
|
+
console.log('INVALID: ' + f);
|
|
470
|
+
for (const e of result.errors) {
|
|
471
|
+
console.log(' - ' + e.path + ' (' + e.rule + '): ' + e.message);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
if (!hasErrors) console.log('OK: all agent files passed validation');
|
|
476
|
+
" 2>/dev/null
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
**Evidence Format:**
|
|
480
|
+
|
|
481
|
+
```
|
|
482
|
+
File: .claude/agents/<filename>.md
|
|
483
|
+
Issue: agent-frontmatter-invalid
|
|
484
|
+
Violations:
|
|
485
|
+
- tools (no-json-array): tools must be a comma-separated string, not a JSON array
|
|
486
|
+
- description (no-block-scalar): description must be inline, not a block scalar
|
|
487
|
+
- color (enum): color must be one of "blue"|"cyan"|"green"|"yellow"|"magenta"|"red"
|
|
488
|
+
Recommendation: Run /bootstrap --retroactive to auto-surface violations, or manually fix per CLAUDE.md Agent Authoring Rules.
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
**Default Severity:** High — broken agents fail at runtime silently.
|
|
492
|
+
|
|
493
|
+
**Remediation:** Run `/bootstrap --retroactive` (validator auto-surfaces violations) or manually fix per CLAUDE.md Agent Authoring Rules.
|
|
494
|
+
|
|
495
|
+
**Dependencies:** Requires `${PLUGIN_ROOT}/scripts/lib/agent-frontmatter.mjs` (issue #189). Degrades gracefully when the helper is absent — skip with a note, do not fabricate findings.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
> See probes-intro.md for confidence scoring reference.
|
|
2
|
+
|
|
3
|
+
## Category: `supply-chain`
|
|
4
|
+
|
|
5
|
+
### Probe: supply-chain-slopcheck
|
|
6
|
+
|
|
7
|
+
**Activation:** One or more package manifests present (`package.json`, `requirements.txt`, or `Cargo.toml` in the repo root) **AND** Session Config `slopcheck.enabled: true` **AND** `slopcheck.sources` includes `"discovery"`.
|
|
8
|
+
|
|
9
|
+
When `slopcheck.enabled: false` (the default), this probe is silently skipped regardless of manifest presence.
|
|
10
|
+
|
|
11
|
+
**Detection Method:**
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Step 1: Verify gating conditions are met; skip otherwise
|
|
15
|
+
node -e "
|
|
16
|
+
const cfg = JSON.parse(process.env.SO_CONFIG || '{}');
|
|
17
|
+
const sc = cfg.slopcheck ?? {};
|
|
18
|
+
if (!sc.enabled) { console.log('SKIPPED: supply-chain-slopcheck -- slopcheck.enabled is false'); process.exit(0); }
|
|
19
|
+
const sources = Array.isArray(sc.sources) ? sc.sources : ['plan', 'discovery'];
|
|
20
|
+
if (!sources.includes('discovery')) { console.log('SKIPPED: supply-chain-slopcheck -- \"discovery\" not in slopcheck.sources'); process.exit(0); }
|
|
21
|
+
"
|
|
22
|
+
|
|
23
|
+
# Step 2: Run the probe
|
|
24
|
+
test -f skills/discovery/probes/supply-chain-slopcheck.mjs || { echo "SKIPPED: supply-chain-slopcheck -- probe file not found"; exit 0; }
|
|
25
|
+
|
|
26
|
+
node --input-type=module -e "
|
|
27
|
+
import probe from './skills/discovery/probes/supply-chain-slopcheck.mjs';
|
|
28
|
+
const r = await probe({ repoRoot: process.cwd() });
|
|
29
|
+
for (const f of r.findings) {
|
|
30
|
+
console.log('FINDING:', JSON.stringify(f));
|
|
31
|
+
}
|
|
32
|
+
console.log('SUMMARY:', JSON.stringify(r.summary));
|
|
33
|
+
"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Output:** one `FINDING:` line per non-LEGITIMATE package (up to `MAX_PACKAGES=100` sampled), one `SUMMARY:` line with counts. No external metrics file is written — findings are consumed directly by the discovery skill's Phase 4 aggregator.
|
|
37
|
+
|
|
38
|
+
**Classification → Severity mapping:**
|
|
39
|
+
|
|
40
|
+
| Classification | Severity | Meaning |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| `SLOP` | critical | Package not found in registry — likely a hallucinated name or typosquat target |
|
|
43
|
+
| `ASSUMED` | medium | Registry probe could not definitively classify (timeout, new package, unsupported registry) |
|
|
44
|
+
| `LEGITIMATE` | _(no finding)_ | Package exists in registry with published versions |
|
|
45
|
+
| `SUS` | _(reserved — never emitted in MVP)_ | See note below |
|
|
46
|
+
|
|
47
|
+
> **NOTE on SUS:** The `SUS` classification is defined in `CLASSIFICATIONS` (see `scripts/lib/slopcheck.mjs`) but is **never emitted** in the MVP. The npm-deprecated-flag and audit-warning detection paths that would produce SUS findings are not yet implemented. Do not rely on SUS findings until a future wave wires up that detection. See PRD § 5 in "gsd Pattern Adoption Quick-Wins" (#520; archived in the private Meta-Vault) for the full design intent.
|
|
48
|
+
|
|
49
|
+
**Supported manifest formats:**
|
|
50
|
+
|
|
51
|
+
| File | Registry | Notes |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| `package.json` | npm | `dependencies` + `devDependencies` |
|
|
54
|
+
| `requirements.txt` | pip | Name-only extraction; skips VCS/path deps |
|
|
55
|
+
| `Cargo.toml` | cargo | `[dependencies]` + `[dev-dependencies]`; skips `path =` and `git =` deps |
|
|
56
|
+
|
|
57
|
+
**Registry support matrix (MVP):**
|
|
58
|
+
|
|
59
|
+
| Registry | Classification | Status |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| npm | Full (`LEGITIMATE` / `SLOP` / `ASSUMED`) | Implemented — `npm view <pkg> versions --json` |
|
|
62
|
+
| pip | Always `ASSUMED` | Skeleton — full probe out-of-scope for MVP |
|
|
63
|
+
| cargo | Always `ASSUMED` | Skeleton — full probe out-of-scope for MVP |
|
|
64
|
+
|
|
65
|
+
**Fail-soft contract:**
|
|
66
|
+
|
|
67
|
+
- Missing manifest → silently skipped (no finding)
|
|
68
|
+
- `scripts/lib/slopcheck.mjs` unavailable → low-severity informational finding + summary note
|
|
69
|
+
- `classifyPackages()` throws → zero findings, error in summary `skipped_reason`
|
|
70
|
+
- >100 packages in repo → sample first 100, warn to stderr
|
|
71
|
+
|
|
72
|
+
**Output shape (from probe module):**
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"probe": "supply-chain-slopcheck",
|
|
77
|
+
"findings": [
|
|
78
|
+
{
|
|
79
|
+
"severity": "critical",
|
|
80
|
+
"title": "Package \"hallucinated-pkg\" (npm) classified as SLOP",
|
|
81
|
+
"evidence": { "name": "hallucinated-pkg", "registry": "npm", "classification": "SLOP", "file": "/repo/package.json" },
|
|
82
|
+
"recommendation": "Package not found in registry. Verify the exact package name..."
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"summary": { "total": 42, "legitimate": 38, "assumed": 3, "sus": 0, "slop": 1, "sampled": false, "errors": 0 }
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Module:** `skills/discovery/probes/supply-chain-slopcheck.mjs` (default export `async function supplyChainSlopcheck({ repoRoot })`).
|
|
90
|
+
Classifier: `scripts/lib/slopcheck.mjs` → `classifyPackages()`. Cache at `.orchestrator/runtime/slopcheck-cache.json` (24 h TTL).
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
**Session-end integration:** This probe is invoked only on-demand via `/discovery` (scope `all` or `supply-chain`). There is no automatic session-end invocation. The gating logic (`slopcheck.enabled: true` + `slopcheck.sources` includes `discovery`) is enforced by the probe itself — the discovery skill does not need separate gating logic beyond the stack-detection table in Phase 2.
|