session-orchestrator 5.1.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/architecture/SKILL.md +3 -1
- package/.agents/skills/autopilot/SKILL.md +6 -1
- package/.agents/skills/autopilot/agents/openai.yaml +5 -0
- package/.agents/skills/bootstrap/SKILL.md +7 -1
- package/.agents/skills/bootstrap/agents/openai.yaml +5 -0
- package/.agents/skills/brainstorm/SKILL.md +8 -1
- package/.agents/skills/brainstorm/agents/openai.yaml +5 -0
- package/.agents/skills/claude-md-drift-check/SKILL.md +3 -1
- package/.agents/skills/close/SKILL.md +21 -0
- package/.agents/skills/close/agents/openai.yaml +5 -0
- package/.agents/skills/convergence-monitoring/SKILL.md +4 -2
- package/.agents/skills/debug/SKILL.md +7 -1
- package/.agents/skills/debug/agents/openai.yaml +5 -0
- package/.agents/skills/discovery/SKILL.md +7 -2
- package/.agents/skills/discovery/agents/openai.yaml +5 -0
- package/.agents/skills/dispatcher/SKILL.md +7 -1
- package/.agents/skills/dispatcher/agents/openai.yaml +5 -0
- package/.agents/skills/docs-orchestrator/SKILL.md +3 -1
- package/.agents/skills/ecosystem-health/SKILL.md +3 -1
- package/.agents/skills/eli5/SKILL.md +7 -1
- package/.agents/skills/eli5/agents/openai.yaml +5 -0
- package/.agents/skills/eval/SKILL.md +7 -2
- package/.agents/skills/eval/agents/openai.yaml +5 -0
- package/.agents/skills/evolve/SKILL.md +8 -3
- package/.agents/skills/evolve/agents/openai.yaml +5 -0
- package/.agents/skills/frontmatter-guard/SKILL.md +3 -1
- package/.agents/skills/gitlab-ops/SKILL.md +3 -1
- package/.agents/skills/gitlab-portfolio/SKILL.md +3 -1
- package/.agents/skills/go/SKILL.md +22 -0
- package/.agents/skills/go/agents/openai.yaml +5 -0
- package/.agents/skills/grill/SKILL.md +7 -1
- package/.agents/skills/grill/agents/openai.yaml +5 -0
- package/.agents/skills/harness-audit/SKILL.md +20 -0
- package/.agents/skills/harness-audit/agents/openai.yaml +5 -0
- package/.agents/skills/hook-development/SKILL.md +3 -1
- package/.agents/skills/mcp-builder/SKILL.md +3 -1
- package/.agents/skills/memory-cleanup/SKILL.md +6 -1
- package/.agents/skills/memory-cleanup/agents/openai.yaml +5 -0
- package/.agents/skills/mode-selector/SKILL.md +3 -1
- package/.agents/skills/npm-publish/SKILL.md +4 -2
- package/.agents/skills/peekaboo-driver/SKILL.md +3 -1
- package/.agents/skills/persona-panel/SKILL.md +6 -1
- package/.agents/skills/persona-panel/agents/openai.yaml +5 -0
- package/.agents/skills/plan/SKILL.md +8 -2
- package/.agents/skills/plan/agents/openai.yaml +5 -0
- package/.agents/skills/playwright-driver/SKILL.md +3 -1
- package/.agents/skills/portfolio/SKILL.md +21 -0
- package/.agents/skills/portfolio/agents/openai.yaml +5 -0
- package/.agents/skills/quality-gates/SKILL.md +3 -1
- package/.agents/skills/reconcile/SKILL.md +6 -1
- package/.agents/skills/reconcile/agents/openai.yaml +5 -0
- package/.agents/skills/release/SKILL.md +22 -0
- package/.agents/skills/release/agents/openai.yaml +5 -0
- package/.agents/skills/remote-offload/SKILL.md +3 -1
- package/.agents/skills/repo-audit/SKILL.md +6 -1
- package/.agents/skills/repo-audit/agents/openai.yaml +5 -0
- package/.agents/skills/session/SKILL.md +21 -0
- package/.agents/skills/session/agents/openai.yaml +5 -0
- package/.agents/skills/session-end/SKILL.md +3 -1
- package/.agents/skills/session-plan/SKILL.md +3 -1
- package/.agents/skills/session-start/SKILL.md +3 -1
- package/.agents/skills/spinout/SKILL.md +6 -1
- package/.agents/skills/spinout/agents/openai.yaml +5 -0
- package/.agents/skills/sunset-review/SKILL.md +7 -1
- package/.agents/skills/sunset-review/agents/openai.yaml +5 -0
- package/.agents/skills/templates-ack/SKILL.md +21 -0
- package/.agents/skills/templates-ack/agents/openai.yaml +5 -0
- package/.agents/skills/test/SKILL.md +21 -0
- package/.agents/skills/test/agents/openai.yaml +5 -0
- package/.agents/skills/test-runner/SKILL.md +3 -1
- package/.agents/skills/tmux-layout/SKILL.md +3 -1
- package/.agents/skills/using-orchestrator/SKILL.md +3 -1
- package/.agents/skills/ux-grill/SKILL.md +7 -1
- package/.agents/skills/ux-grill/agents/openai.yaml +5 -0
- package/.agents/skills/vault-mirror/SKILL.md +3 -1
- package/.agents/skills/vault-sync/SKILL.md +3 -1
- package/.agents/skills/wave-executor/SKILL.md +3 -1
- package/.agents/skills/write-executable-plan/SKILL.md +3 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +4 -4
- package/.codex-plugin/skills/autopilot/SKILL.md +5 -4
- package/.codex-plugin/skills/bootstrap/SKILL.md +8 -4
- package/.codex-plugin/skills/brainstorm/SKILL.md +11 -4
- package/.codex-plugin/skills/close/SKILL.md +3 -3
- package/.codex-plugin/skills/convergence-monitoring/SKILL.md +1 -1
- package/.codex-plugin/skills/debug/SKILL.md +11 -4
- package/.codex-plugin/skills/discovery/SKILL.md +8 -4
- package/.codex-plugin/skills/dispatcher/SKILL.md +4 -4
- package/.codex-plugin/skills/eli5/SKILL.md +9 -4
- package/.codex-plugin/skills/eval/SKILL.md +9 -4
- package/.codex-plugin/skills/evolve/SKILL.md +9 -4
- package/.codex-plugin/skills/go/SKILL.md +3 -3
- package/.codex-plugin/skills/grill/SKILL.md +11 -4
- package/.codex-plugin/skills/harness-audit/SKILL.md +4 -3
- package/.codex-plugin/skills/memory-cleanup/SKILL.md +9 -4
- package/.codex-plugin/skills/npm-publish/SKILL.md +1 -1
- package/.codex-plugin/skills/persona-panel/SKILL.md +5 -5
- package/.codex-plugin/skills/plan/SKILL.md +8 -4
- package/.codex-plugin/skills/portfolio/SKILL.md +3 -3
- package/.codex-plugin/skills/reconcile/SKILL.md +9 -4
- package/.codex-plugin/skills/release/SKILL.md +3 -3
- package/.codex-plugin/skills/repo-audit/SKILL.md +6 -4
- package/.codex-plugin/skills/session/SKILL.md +1 -1
- package/.codex-plugin/skills/spinout/SKILL.md +4 -4
- package/.codex-plugin/skills/sunset-review/SKILL.md +5 -4
- package/.codex-plugin/skills/test/SKILL.md +3 -3
- package/.codex-plugin/skills/ux-grill/SKILL.md +11 -4
- package/.cursor/commands/autopilot.md +4 -4
- package/.cursor/commands/bootstrap.md +5 -4
- package/.cursor/commands/brainstorm.md +5 -4
- package/.cursor/commands/close.md +4 -3
- package/.cursor/commands/debug.md +4 -4
- package/.cursor/commands/discovery.md +4 -4
- package/.cursor/commands/dispatcher.md +4 -4
- package/.cursor/commands/eli5.md +4 -4
- package/.cursor/commands/eval.md +4 -4
- package/.cursor/commands/evolve.md +4 -4
- package/.cursor/commands/go.md +4 -3
- package/.cursor/commands/grill.md +4 -4
- package/.cursor/commands/harness-audit.md +3 -3
- package/.cursor/commands/memory-cleanup.md +4 -4
- package/.cursor/commands/persona-panel.md +4 -4
- package/.cursor/commands/plan.md +5 -4
- package/.cursor/commands/portfolio.md +3 -3
- package/.cursor/commands/reconcile.md +4 -4
- package/.cursor/commands/release.md +4 -3
- package/.cursor/commands/repo-audit.md +4 -4
- package/.cursor/commands/session.md +1 -1
- package/.cursor/commands/spinout.md +4 -4
- package/.cursor/commands/sunset-review.md +4 -4
- package/.cursor/commands/test.md +3 -3
- package/.cursor/commands/ux-grill.md +4 -4
- package/.cursor/rules/000-session-orchestrator.mdc +0 -2
- package/.cursor/rules/010-session-workflow.mdc +2 -2
- package/.cursor/rules/050-plan.mdc +1 -1
- package/.cursor/skills/bootstrap/SKILL.md +1 -0
- package/.cursor/skills/close/SKILL.md +13 -0
- package/.cursor/skills/convergence-monitoring/SKILL.md +1 -0
- package/.cursor/skills/debug/SKILL.md +0 -1
- package/.cursor/skills/discovery/SKILL.md +0 -1
- package/.cursor/skills/dispatcher/SKILL.md +0 -1
- package/.cursor/skills/eli5/SKILL.md +0 -1
- package/.cursor/skills/eval/SKILL.md +1 -1
- package/.cursor/skills/evolve/SKILL.md +0 -1
- package/.cursor/skills/go/SKILL.md +13 -0
- package/.cursor/skills/grill/SKILL.md +0 -1
- package/.cursor/skills/harness-audit/SKILL.md +12 -0
- package/.cursor/skills/npm-publish/SKILL.md +1 -0
- package/.cursor/skills/portfolio/SKILL.md +12 -0
- package/.cursor/skills/release/SKILL.md +13 -0
- package/.cursor/skills/repo-audit/SKILL.md +0 -1
- package/.cursor/skills/sunset-review/SKILL.md +0 -1
- package/.cursor/skills/test/SKILL.md +12 -0
- package/.cursor/skills/ux-grill/SKILL.md +0 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/.orchestrator/policy/blocked-commands.json +13 -4
- package/AGENTS.md +3 -2
- package/CHANGELOG.md +197 -0
- package/README.md +11 -9
- package/SECURITY.md +12 -0
- package/agents/dialectic-deriver.md +13 -10
- package/agents/eval-judge.md +67 -45
- package/agents/skill-applied-judge.md +34 -19
- package/commands/session.md +17 -3
- package/docs/baseline.md +12 -6
- package/docs/ci-setup.md +53 -0
- package/docs/codex-setup.md +15 -3
- package/docs/components.md +13 -6
- package/docs/events-schema.md +59 -9
- package/docs/install.md +16 -0
- package/docs/persona-panel.md +1 -1
- package/docs/pi-setup.md +1 -1
- package/docs/rule-authoring.md +135 -14
- package/docs/scope-collision-guard.md +2 -0
- package/docs/session-config-reference.md +106 -11
- package/docs/session-config-template.md +31 -2
- package/docs/telemetry.md +2 -0
- package/hooks/_lib/hook-import-set.json +125 -8
- package/hooks/_lib/subagent-paths.mjs +15 -0
- package/hooks/_lib/subagent-transcript.mjs +582 -31
- package/hooks/_lib/vcs-create-matcher.mjs +217 -62
- package/hooks/config-protection.mjs +11 -3
- package/hooks/cwd-change-restore.mjs +11 -3
- package/hooks/enforce-commands.mjs +70 -23
- package/hooks/enforce-scope.mjs +143 -33
- package/hooks/hooks-codex.json +1 -1
- package/hooks/hooks.json +1 -1
- package/hooks/loop-guard.mjs +11 -3
- package/hooks/on-session-end.mjs +72 -25
- package/hooks/on-session-start.mjs +48 -11
- package/hooks/on-stop.mjs +211 -23
- package/hooks/operator-steer.mjs +11 -3
- package/hooks/post-bash-issue-budget-refund.mjs +18 -8
- package/hooks/post-bash-write-verify.mjs +6 -2
- package/hooks/post-edit-import-probe.mjs +17 -9
- package/hooks/post-edit-validate.mjs +13 -5
- package/hooks/post-subagent-discovery-validator.mjs +98 -13
- package/hooks/post-tool-batch-wave-signal.mjs +200 -38
- package/hooks/post-tool-failure-corrective-context.mjs +11 -5
- package/hooks/post-tooluse-frontend-slop.mjs +10 -4
- package/hooks/pre-auq-clarity.mjs +18 -2
- package/hooks/pre-bash-destructive-guard.mjs +80 -9
- package/hooks/pre-bash-issue-budget.mjs +119 -28
- package/hooks/pre-bash-memory-propose-audit.mjs +86 -54
- package/hooks/pre-bash-sessions-ledger-guard.mjs +391 -20
- package/hooks/pre-bash-staging-fence.mjs +335 -31
- package/hooks/pre-bash-templates-first.mjs +19 -14
- package/hooks/pre-task-scope-disjoint.mjs +385 -5
- package/hooks/skill-invocation-telemetry.mjs +2 -1
- package/hooks/subagent-telemetry.mjs +15 -19
- package/hooks/wave-scope-commit-guard.mjs +197 -100
- package/monitors/monitors.json +1 -1
- package/output-styles/wave-summary.md +1 -1
- package/package.json +2 -1
- package/pi/prompts/autopilot.md +3 -3
- package/pi/prompts/bootstrap.md +3 -3
- package/pi/prompts/brainstorm.md +3 -3
- package/pi/prompts/close.md +2 -2
- package/pi/prompts/debug.md +3 -3
- package/pi/prompts/discovery.md +3 -3
- package/pi/prompts/dispatcher.md +3 -3
- package/pi/prompts/eli5.md +3 -3
- package/pi/prompts/eval.md +3 -3
- package/pi/prompts/evolve.md +3 -3
- package/pi/prompts/go.md +2 -2
- package/pi/prompts/grill.md +3 -3
- package/pi/prompts/harness-audit.md +2 -3
- package/pi/prompts/memory-cleanup.md +3 -3
- package/pi/prompts/persona-panel.md +3 -3
- package/pi/prompts/plan.md +3 -3
- package/pi/prompts/portfolio.md +2 -2
- package/pi/prompts/reconcile.md +3 -3
- package/pi/prompts/release.md +3 -3
- package/pi/prompts/repo-audit.md +3 -4
- package/pi/prompts/session.md +2 -2
- package/pi/prompts/spinout.md +3 -3
- package/pi/prompts/sunset-review.md +3 -3
- package/pi/prompts/templates-ack.md +1 -1
- package/pi/prompts/test.md +3 -3
- package/pi/prompts/ux-grill.md +3 -3
- package/rules/README.md +1 -1
- package/rules/opt-in-domain/prompt-caching.md +1 -1
- package/rules/opt-in-stack/backend-data.md +1 -1
- package/rules/opt-in-stack/backend.md +3 -3
- package/rules/opt-in-stack/frontend.md +1 -1
- package/rules/opt-in-stack/security-web.md +3 -3
- package/rules/opt-in-stack/swift.md +1 -1
- package/scripts/archive-closed-prds.mjs +2 -2
- package/scripts/auq-audit.mjs +2 -3
- package/scripts/autopilot.mjs +23 -2
- package/scripts/backfill-abandoned-sessions.mjs +171 -15
- package/scripts/backfill-evidence-digest.mjs +2 -1
- package/scripts/backfill-learnings-from-vault.mjs +2 -2
- package/scripts/check-package-manager.mjs +2 -2
- package/scripts/check-sessions-integrity.mjs +300 -0
- package/scripts/ci/assert-vitest-green.mjs +2 -1
- package/scripts/dialectic-deriver.mjs +50 -13
- package/scripts/emit-session.mjs +77 -32
- package/scripts/eval-session.mjs +65 -3
- package/scripts/export-hw-learnings.mjs +2 -1
- package/scripts/express-path.mjs +1 -1
- package/scripts/gc-stale-worktrees.mjs +2 -1
- package/scripts/generate-agents-skills.mjs +102 -29
- package/scripts/generate-codex-skills.mjs +48 -4
- package/scripts/generate-cursor-adapter.mjs +220 -11
- package/scripts/generate-hook-import-set.mjs +12 -27
- package/scripts/generate-pi-prompts.mjs +183 -13
- package/scripts/github-protection-audit.mjs +2 -3
- package/scripts/lib/agent-frontmatter.mjs +23 -1
- package/scripts/lib/agent-status.mjs +2 -31
- package/scripts/lib/auq/clarity.mjs +10 -2
- package/scripts/lib/auq/parse.mjs +12 -31
- package/scripts/lib/auq/schema.mjs +56 -41
- package/scripts/lib/auto-dialectic.mjs +304 -15
- package/scripts/lib/autopilot/flags.mjs +12 -1
- package/scripts/lib/autopilot/kill-switches.mjs +6 -3
- package/scripts/lib/autopilot/loop.mjs +14 -1
- package/scripts/lib/autopilot/stall-sampler.mjs +80 -23
- package/scripts/lib/ci-status-banner.mjs +376 -16
- package/scripts/lib/claude-md-budget-lint.mjs +2 -5
- package/scripts/lib/command-blocker.mjs +408 -33
- package/scripts/lib/config/dialectic.mjs +12 -3
- package/scripts/lib/config/drift-check.mjs +19 -0
- package/scripts/lib/config/gate.mjs +74 -0
- package/scripts/lib/config/reaper.mjs +162 -0
- package/scripts/lib/config.mjs +14 -0
- package/scripts/lib/convergence-monitor.mjs +76 -13
- package/scripts/lib/cursor-hook-bridge.mjs +2 -2
- package/scripts/lib/description-surface.mjs +2 -5
- package/scripts/lib/dispatcher/cli.mjs +2 -1
- package/scripts/lib/ecosystem-health.mjs +11 -0
- package/scripts/lib/ecosystem-wizard.mjs +2 -1
- package/scripts/lib/eval/engine.mjs +421 -53
- package/scripts/lib/eval/judge.mjs +463 -40
- package/scripts/lib/eval/schema.mjs +10 -1
- package/scripts/lib/events-rotation.mjs +221 -25
- package/scripts/lib/events-schema.mjs +114 -0
- package/scripts/lib/events.mjs +524 -5
- package/scripts/lib/fetch-baseline.mjs +3 -8
- package/scripts/lib/frontmatter-guard.mjs +21 -10
- package/scripts/lib/gates/gate-baseline.mjs +27 -2
- package/scripts/lib/gates/gate-full.mjs +28 -3
- package/scripts/lib/gates/gate-helpers.mjs +243 -21
- package/scripts/lib/gates/gate-incremental.mjs +28 -3
- package/scripts/lib/gates/gate-per-file.mjs +27 -2
- package/scripts/lib/gitlab-ops/stale-mr-sweep.mjs +2 -1
- package/scripts/lib/gitlab-portfolio/cli.mjs +2 -1
- package/scripts/lib/gitlab-portfolio/markdown-writer.mjs +6 -1
- package/scripts/lib/instruction-budget-guard.mjs +332 -50
- package/scripts/lib/io.mjs +42 -8
- package/scripts/lib/is-main-module.mjs +82 -0
- package/scripts/lib/issue-close-strip-labels.mjs +207 -49
- package/scripts/lib/js-mask.mjs +197 -0
- package/scripts/lib/learnings/evolve-telemetry.mjs +11 -7
- package/scripts/lib/locks/index.mjs +32 -25
- package/scripts/lib/maintenance-due-banner.mjs +122 -91
- package/scripts/lib/orphan-reaper.mjs +1588 -0
- package/scripts/lib/peer-cards/merger.mjs +48 -10
- package/scripts/lib/peer-cards/reader.mjs +78 -2
- package/scripts/lib/peer-discovery.mjs +2 -5
- package/scripts/lib/playwright-driver/runner.mjs +2 -1
- package/scripts/lib/process-group.mjs +899 -0
- package/scripts/lib/quality-gate.mjs +107 -28
- package/scripts/lib/reconcile/backlog.mjs +368 -0
- package/scripts/lib/reconcile/engine.mjs +55 -188
- package/scripts/lib/reconcile/rule-expiry-sweep.mjs +884 -0
- package/scripts/lib/reconcile/sanitize.mjs +69 -3
- package/scripts/lib/reconcile-nudge-banner.mjs +138 -45
- package/scripts/lib/resource-probe/parsers.mjs +31 -0
- package/scripts/lib/rule-loader.mjs +41 -12
- package/scripts/lib/rules-sync.mjs +2 -5
- package/scripts/lib/scope-echo.mjs +429 -7
- package/scripts/lib/scope-gate.mjs +605 -1
- package/scripts/lib/session-close-backfill.mjs +91 -12
- package/scripts/lib/session-id.mjs +9 -20
- package/scripts/lib/session-invocation.mjs +20 -0
- package/scripts/lib/session-schema/constants.mjs +30 -2
- package/scripts/lib/session-schema/normalizer.mjs +56 -4
- package/scripts/lib/session-schema.mjs +8 -3
- package/scripts/lib/session-start-probes.mjs +95 -10
- package/scripts/lib/sessions-canonical.mjs +23 -0
- package/scripts/lib/sessions-integrity-banner.mjs +7 -1
- package/scripts/lib/sessions-staleness-banner.mjs +193 -51
- package/scripts/lib/skill-evidence-window.mjs +891 -0
- package/scripts/lib/skill-evolution/candidate-intake.mjs +133 -12
- package/scripts/lib/skill-evolution/engine.mjs +18 -9
- package/scripts/lib/skill-judge.mjs +45 -3
- package/scripts/lib/state-md.mjs +84 -3
- package/scripts/lib/sunset/walker.mjs +31 -4
- package/scripts/lib/tail-window.mjs +56 -0
- package/scripts/lib/telemetry/schema.mjs +30 -0
- package/scripts/lib/telemetry/sync.mjs +61 -6
- package/scripts/lib/telemetry-flush-health-banner.mjs +4 -22
- package/scripts/lib/test-runner/issue-reconcile.mjs +48 -16
- package/scripts/lib/tests-src-ratio.mjs +2 -6
- package/scripts/lib/tmux-layout/telemetry-stats.mjs +74 -14
- package/scripts/lib/user-invocable-skills.mjs +205 -0
- package/scripts/lib/ux-grill/reconcile.mjs +48 -22
- package/scripts/lib/validate/check-agents-skills.mjs +26 -15
- package/scripts/lib/validate/check-banner-parity.mjs +2 -2
- package/scripts/lib/validate/check-cursor-adapter.mjs +3 -2
- package/scripts/lib/validate/check-dead-bridge.mjs +2 -2
- package/scripts/lib/validate/check-doc-cli-commands.mjs +2 -2
- package/scripts/lib/validate/check-entry-guard.mjs +329 -0
- package/scripts/lib/validate/check-guard-requires-parity.mjs +2 -2
- package/scripts/lib/validate/check-hook-entry-guards.mjs +636 -0
- package/scripts/lib/validate/check-hooks-emit-event-guard.mjs +2 -2
- package/scripts/lib/validate/check-learning-provenance.mjs +2 -2
- package/scripts/lib/validate/check-pi-prompts.mjs +1 -0
- package/scripts/lib/validate/check-rules.mjs +7 -5
- package/scripts/lib/validate/check-skill-links.mjs +35 -6
- package/scripts/lib/validate/check-skill-script-paths.mjs +241 -29
- package/scripts/lib/validate/check-test-git-config-target.mjs +26 -36
- package/scripts/lib/validate/check-unicode-safety.mjs +2 -2
- package/scripts/lib/validate/check-untracked-test-deps.mjs +9 -104
- package/scripts/lib/validate/check-unwired-features.mjs +220 -33
- package/scripts/lib/validate/check-validator-registration.mjs +36 -12
- package/scripts/lib/validate/check-vcs-repo-flag.mjs +2 -2
- package/scripts/lib/validate/confidential-names.mjs +10 -0
- package/scripts/lib/validate-vendored-rules.mjs +39 -12
- package/scripts/lib/vault-mirror/namespace.mjs +46 -8
- package/scripts/lib/vault-mirror/process.mjs +10 -3
- package/scripts/lib/vault-mirror/render-sessions.mjs +12 -2
- package/scripts/lib/vault-status/narrative-mirror.mjs +31 -7
- package/scripts/lib/vault-yaml.mjs +118 -0
- package/scripts/lib/wave-transcript-tail.mjs +2 -2
- package/scripts/lib/worktree/lifecycle.mjs +153 -1
- package/scripts/lock-reaper.mjs +2 -1
- package/scripts/materialize-wave-scope.mjs +87 -4
- package/scripts/migrate-sessions-jsonl.mjs +2 -1
- package/scripts/migrate-vault-paths.mjs +2 -3
- package/scripts/release-session-lock.mjs +305 -0
- package/scripts/release.mjs +109 -39
- package/scripts/relocate-vault-corpus.mjs +2 -3
- package/scripts/repair-invalid-sessions.mjs +2 -2
- package/scripts/resolve-session-invocation.mjs +59 -0
- package/scripts/run-quality-gate.mjs +156 -17
- package/scripts/session-shape.mjs +2 -2
- package/scripts/site-numbers.mjs +35 -11
- package/scripts/sweep-expired-rules.mjs +227 -0
- package/scripts/validate-plugin.mjs +21 -0
- package/scripts/validate-wave-scope.mjs +32 -105
- package/scripts/vault-consolidate.mjs +2 -2
- package/scripts/vault-mirror.mjs +11 -4
- package/scripts/wave-scope-binding.mjs +2 -3
- package/skills/_shared/bootstrap-gate.md +1 -1
- package/skills/_shared/monitor-patterns.md +1 -1
- package/skills/_shared/platform-tools.md +23 -11
- package/skills/_shared/research-evidence.md +53 -0
- package/skills/_shared/state-ownership.md +3 -0
- package/skills/autopilot/SKILL.md +80 -11
- package/skills/bootstrap/SKILL.md +51 -1
- package/skills/brainstorm/SKILL.md +16 -0
- package/skills/claude-md-drift-check/SKILL.md +1 -1
- package/skills/claude-md-drift-check/checker.mjs +49 -11
- package/{commands/close.md → skills/close/SKILL.md} +9 -3
- package/skills/convergence-monitoring/README.md +8 -1
- package/skills/convergence-monitoring/SIGNALS.md +50 -6
- package/skills/convergence-monitoring/SKILL.md +15 -6
- package/skills/debug/SKILL.md +10 -0
- package/skills/discovery/SKILL.md +24 -1
- package/skills/discovery/probes-session.md +2 -2
- package/skills/dispatcher/SKILL.md +38 -7
- package/skills/eli5/SKILL.md +11 -0
- package/skills/eval/SKILL.md +52 -23
- package/skills/eval/rubric-v1.md +1 -0
- package/skills/eval/rubric-v2.md +457 -0
- package/skills/evolve/SKILL.md +9 -2
- package/skills/evolve/references/evolve-dialectic-mode.md +46 -25
- package/skills/gitlab-ops/SKILL.md +3 -2
- package/{commands/go.md → skills/go/SKILL.md} +9 -1
- package/skills/grill/SKILL.md +19 -0
- package/{commands/harness-audit.md → skills/harness-audit/SKILL.md} +7 -2
- package/skills/hook-development/SKILL.md +46 -41
- package/skills/memory-cleanup/SKILL.md +7 -0
- package/skills/npm-publish/SKILL.md +2 -2
- package/skills/persona-panel/SKILL.md +56 -1
- package/skills/persona-panel/persona-format.md +1 -1
- package/skills/plan/SKILL.md +28 -1
- package/{commands/portfolio.md → skills/portfolio/SKILL.md} +8 -2
- package/skills/reconcile/SKILL.md +21 -0
- package/{commands/release.md → skills/release/SKILL.md} +16 -2
- package/skills/repo-audit/SKILL.md +7 -0
- package/skills/session-end/SKILL.md +13 -16
- package/skills/session-end/discovery-scan.md +1 -1
- package/skills/session-end/phase-3-6-tail.md +55 -9
- package/skills/session-end/plan-verification.md +2 -2
- package/skills/session-end/references/phase-5-issue-cleanup.md +9 -14
- package/skills/session-end/session-metrics-write.md +10 -0
- package/skills/session-plan/SKILL.md +18 -6
- package/skills/session-plan/references/session-plan-task-classification.md +2 -2
- package/skills/session-start/SKILL.md +5 -4
- package/skills/session-start/phase-8-5-express-path.md +6 -6
- package/skills/session-start/references/phase-1-5-session-continuity.md +1 -1
- package/skills/session-start/references/phase-2-7-portfolio-snapshot.md +1 -1
- package/skills/session-start/references/phase-4-ssot-environment-check.md +6 -4
- package/skills/spinout/SKILL.md +12 -1
- package/skills/sunset-review/SKILL.md +13 -0
- package/{commands/test.md → skills/test/SKILL.md} +10 -4
- package/skills/ux-grill/SKILL.md +20 -2
- package/skills/wave-executor/SKILL.md +14 -7
- package/skills/wave-executor/circuit-breaker.md +2 -0
- package/skills/wave-executor/references/wave-executor-state-init.md +18 -4
- package/skills/wave-executor/references/wave-loop-dispatch.md +5 -2
- package/skills/wave-executor/references/wave-loop-review.md +17 -1
- package/commands/autopilot.md +0 -80
- package/commands/bootstrap.md +0 -56
- package/commands/brainstorm.md +0 -48
- package/commands/debug.md +0 -36
- package/commands/discovery.md +0 -32
- package/commands/dispatcher.md +0 -59
- package/commands/eli5.md +0 -33
- package/commands/eval.md +0 -28
- package/commands/evolve.md +0 -10
- package/commands/grill.md +0 -45
- package/commands/memory-cleanup.md +0 -26
- package/commands/persona-panel.md +0 -121
- package/commands/plan.md +0 -15
- package/commands/reconcile.md +0 -23
- package/commands/repo-audit.md +0 -24
- package/commands/spinout.md +0 -15
- package/commands/sunset-review.md +0 -27
- package/commands/ux-grill.md +0 -51
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* ## Design constraints it is written against
|
|
21
21
|
*
|
|
22
22
|
* - **HR-101 (a signal may only warn if it is rare).** Nothing is due ⇒ the
|
|
23
|
-
* probe is SILENT.
|
|
23
|
+
* probe is SILENT. Seven independent signals are ANDed with a cooldown, not
|
|
24
24
|
* ORed into a permanent warning: a repo that ran `/session housekeeping`
|
|
25
25
|
* within the last {@link HOUSEKEEPING_COOLDOWN_DAYS} days says nothing at
|
|
26
26
|
* all, because the operator already did the thing the banner would ask for.
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
* an existing module constant. Same posture as `reconcile-nudge-banner.mjs`
|
|
34
34
|
* and `loop-readiness-banner.mjs`: an advisory banner needs no switch.
|
|
35
35
|
*
|
|
36
|
-
* ## The
|
|
36
|
+
* ## The seven signals
|
|
37
37
|
*
|
|
38
38
|
* | id | due when | source |
|
|
39
39
|
* |-------------------|-----------------------------------------------------------------------|--------|
|
|
@@ -43,6 +43,20 @@
|
|
|
43
43
|
* | `dialectic` | `shouldDispatchAutoDialectic().trigger === true` | `auto-dialectic.mjs` |
|
|
44
44
|
* | `memory-cleanup` | `shouldDispatchAutoDream().trigger === true` | `auto-dream.mjs` |
|
|
45
45
|
* | `pending-sidecar` | a pending dream/dialectic proposal younger than 14 days is unapplied | `.orchestrator/*-pending*.md` |
|
|
46
|
+
* | `generated-rules-expiring` | a machine-generated rule is expired or expires within {@link GENERATED_RULE_EXPIRY_HORIZON_DAYS} days | `instruction-budget-guard.mjs` |
|
|
47
|
+
*
|
|
48
|
+
* ### Why the expiry alarm is HERE and not in the test suite (#1372 follow-up)
|
|
49
|
+
*
|
|
50
|
+
* The invariant "no generated rule file sits expired in `.claude/rules/`" was
|
|
51
|
+
* first written as a vitest case comparing `expires-at` against TODAY. That is
|
|
52
|
+
* a calendar time-bomb in a BLOCKING gate: with nothing committed and nothing
|
|
53
|
+
* broken, `npm test` — pre-push hook and CI alike — turns red on the morning
|
|
54
|
+
* after the earliest date and blocks every unrelated hotfix, while the repair
|
|
55
|
+
* (consolidate the file, move its provenance pairs, delete it) is a human
|
|
56
|
+
* decision no test run can take. HR-101/HR-105: a signal must fire when
|
|
57
|
+
* something CHANGED, at a moment the operator can act, and be repairable by the
|
|
58
|
+
* thing that fires it. Session start, recommending `/session housekeeping`, is
|
|
59
|
+
* that moment; the predicate itself is still tested, against an INJECTED clock.
|
|
46
60
|
*
|
|
47
61
|
* Only SIDE-EFFECT-FREE signal functions are called — never a variant that
|
|
48
62
|
* advances `.orchestrator/dialectic-last-run`, because a probe that writes the
|
|
@@ -56,9 +70,10 @@
|
|
|
56
70
|
* @module scripts/lib/maintenance-due-banner
|
|
57
71
|
*/
|
|
58
72
|
|
|
59
|
-
import {
|
|
73
|
+
import { existsSync, statSync } from 'node:fs';
|
|
60
74
|
import path from 'node:path';
|
|
61
75
|
|
|
76
|
+
import { SCAN_CHUNK_BYTES, scanEventsBackwards } from './events.mjs';
|
|
62
77
|
import { computeReconcileNudge } from './reconcile-nudge-banner.mjs';
|
|
63
78
|
import { sweepExpiredLearnings } from './learnings/expiry-sweep.mjs';
|
|
64
79
|
import { shouldDispatchAutoDialectic } from './auto-dialectic.mjs';
|
|
@@ -66,13 +81,32 @@ import { shouldDispatchAutoDream } from './auto-dream.mjs';
|
|
|
66
81
|
import { resolveMemoryDir } from './memory-paths.mjs';
|
|
67
82
|
import { readCanonicalSessions } from './sessions-canonical.mjs';
|
|
68
83
|
import { filterRealSessions } from './session-schema.mjs';
|
|
84
|
+
import {
|
|
85
|
+
daysUntilGeneratedRuleExpiry,
|
|
86
|
+
listMachineGeneratedRules,
|
|
87
|
+
} from './instruction-budget-guard.mjs';
|
|
69
88
|
|
|
70
89
|
/**
|
|
71
90
|
* How many signals this probe knows about. The banner denominator is this
|
|
72
91
|
* number MINUS the signals a kill-switch skipped on this host — see the
|
|
73
92
|
* `skipped` array in {@link computeMaintenanceDue}'s result.
|
|
74
93
|
*/
|
|
75
|
-
export const MAINTENANCE_TOTAL_SIGNALS =
|
|
94
|
+
export const MAINTENANCE_TOTAL_SIGNALS = 7;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* How far ahead the `generated-rules-expiring` signal looks.
|
|
98
|
+
*
|
|
99
|
+
* NAMED CEILING (BV-004): 7 days is one week of sessions — long enough that the
|
|
100
|
+
* operator meets the warning before the loader silently starts dropping the
|
|
101
|
+
* rule, short enough that it is not standing noise (HR-104: a signal that is
|
|
102
|
+
* essentially always present is no signal). On this repo's corpus at
|
|
103
|
+
* 2026-09-16 the earliest `expires-at` was 14 days out, so the row is silent.
|
|
104
|
+
*
|
|
105
|
+
* REVISIT TRIGGER: if the row is due on more than ~1 session start in 10, the
|
|
106
|
+
* horizon is measuring the reconcile engine's 30-day default TTL rather than an
|
|
107
|
+
* overdue consolidation — re-aim it (HR-101), never widen it.
|
|
108
|
+
*/
|
|
109
|
+
export const GENERATED_RULE_EXPIRY_HORIZON_DAYS = 7;
|
|
76
110
|
|
|
77
111
|
/**
|
|
78
112
|
* Active-learning floor for the `evolve` signal. Deliberately the SAME number
|
|
@@ -119,104 +153,64 @@ function isoDay(ts) {
|
|
|
119
153
|
}
|
|
120
154
|
|
|
121
155
|
/**
|
|
122
|
-
* Backwards-scan chunk size (#1290 item 2)
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* handful of reads instead of loading the whole 7.9 MB file. The scan is
|
|
127
|
-
* UNBOUNDED in the worst case ON PURPOSE: "never ran" is a claim about every
|
|
128
|
-
* line and cannot be made from a tail, so a repo with no `evolve.completed`
|
|
129
|
-
* record still walks the file to its start — just in chunks, never all at once
|
|
130
|
-
* in one string.
|
|
131
|
-
*
|
|
132
|
-
* REVISIT TRIGGER: the maintenance probe's median passes 1000 ms (half
|
|
133
|
-
* `PROBE_BUDGET_MS`), or one repo's `events.jsonl` passes 50 MB. Either means
|
|
134
|
-
* the "never ran" walk has become the cost that matters and the answer needs an
|
|
135
|
-
* index rather than a scan.
|
|
156
|
+
* Backwards-scan chunk size (#1290 item 2) — the shared reader's constant, kept
|
|
157
|
+
* under this module's own name because it is the number this probe's cost is
|
|
158
|
+
* reasoned about in. NAMED CEILING + revisit trigger live at
|
|
159
|
+
* {@link SCAN_CHUNK_BYTES}.
|
|
136
160
|
*/
|
|
137
|
-
export const TAIL_CHUNK_BYTES =
|
|
161
|
+
export const TAIL_CHUNK_BYTES = SCAN_CHUNK_BYTES;
|
|
138
162
|
|
|
139
163
|
/**
|
|
140
|
-
*
|
|
164
|
+
* Wall-clock budget for the "did /evolve ever run?" walk (#1414).
|
|
165
|
+
*
|
|
166
|
+
* NAMED CEILING (BV-004): 1000 ms is half of `PROBE_BUDGET_MS` (2000 ms in
|
|
167
|
+
* `session-start-probes.mjs`), which this probe shares with six other signals.
|
|
168
|
+
* The walk is UNBOUNDED in principle — "never ran" is a claim about every line
|
|
169
|
+
* of every source — so it needs an own limit now that it spans the archives
|
|
170
|
+
* too, and running out must report `truncated`, never a clean "never".
|
|
141
171
|
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
172
|
+
* REVISIT TRIGGER: a repo where this reports `truncated` more than rarely. That
|
|
173
|
+
* means the answer needs an index rather than a scan, not a bigger budget
|
|
174
|
+
* (HR-101).
|
|
144
175
|
*/
|
|
145
|
-
|
|
146
|
-
if (buf.length === 0) return null;
|
|
147
|
-
const lines = buf.toString('utf8').split('\n');
|
|
148
|
-
for (let i = lines.length - 1; i >= 0; i -= 1) {
|
|
149
|
-
const line = lines[i];
|
|
150
|
-
if (!line || !line.includes(EVOLVE_EVENT)) continue; // cheap pre-filter before JSON.parse
|
|
151
|
-
try {
|
|
152
|
-
const rec = JSON.parse(line);
|
|
153
|
-
if (rec?.event !== EVOLVE_EVENT) continue;
|
|
154
|
-
return { lastAt: typeof rec.timestamp === 'string' ? rec.timestamp : null };
|
|
155
|
-
} catch {
|
|
156
|
-
continue; // a malformed line is not evidence either way — keep scanning
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return null;
|
|
160
|
-
}
|
|
176
|
+
export const EVOLVE_SCAN_BUDGET_MS = 1000;
|
|
161
177
|
|
|
162
178
|
/**
|
|
163
|
-
* Find the most recent `orchestrator.evolve.completed` record
|
|
164
|
-
*
|
|
165
|
-
* Reads the ledger BACKWARDS in {@link TAIL_CHUNK_BYTES} chunks and stops at
|
|
166
|
-
* the first hit, because the interesting answer is the LAST occurrence. The
|
|
167
|
-
* former implementation `readFileSync`-ed the whole file (7.9 MB here, 30–44 ms)
|
|
168
|
-
* to answer a question the last few kilobytes usually settle.
|
|
179
|
+
* Find the most recent `orchestrator.evolve.completed` record — across ROTATION
|
|
180
|
+
* boundaries (#1414).
|
|
169
181
|
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
182
|
+
* Walks the ledger backwards through every source, newest first, and stops at
|
|
183
|
+
* the first hit, because the interesting answer is the LAST occurrence. Reading
|
|
184
|
+
* the active file alone was the bug: "never ran" is a claim about EVERY line
|
|
185
|
+
* ever written, and after a rotation the only `evolve.completed` record on the
|
|
186
|
+
* host can sit in `_archive/` — the probe then nags a repo that has run
|
|
187
|
+
* /evolve, which is the HR-101 failure mode this module exists to avoid.
|
|
175
188
|
*
|
|
176
189
|
* @param {string} repoRoot
|
|
177
|
-
* @returns {{ok: boolean, lastAt: string|null}} `ok: false`
|
|
178
|
-
* but could not be read
|
|
190
|
+
* @returns {{ok: boolean, lastAt: string|null, truncated: boolean}} `ok: false`
|
|
191
|
+
* ⇒ a source exists but could not be read; `truncated: true` ⇒ the budget ran
|
|
192
|
+
* out before the walk finished. In BOTH cases the caller must record
|
|
193
|
+
* `undeterminable`, never clean — a walk that did not finish has not proven
|
|
194
|
+
* "never".
|
|
179
195
|
*/
|
|
180
196
|
function readLastEvolveRun(repoRoot) {
|
|
181
197
|
const file = path.join(repoRoot, '.orchestrator', 'metrics', 'events.jsonl');
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
carry = block; // no complete line yet — a line longer than one chunk
|
|
199
|
-
continue;
|
|
200
|
-
}
|
|
201
|
-
const hit = scanEvolveLines(block.subarray(firstNewline + 1));
|
|
202
|
-
if (hit) return { ok: true, lastAt: hit.lastAt };
|
|
203
|
-
carry = block.subarray(0, firstNewline);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// pos === 0: the carry is the file's FIRST line, complete by construction.
|
|
207
|
-
const hit = scanEvolveLines(carry);
|
|
208
|
-
return { ok: true, lastAt: hit ? hit.lastAt : null };
|
|
209
|
-
} catch {
|
|
210
|
-
return { ok: false, lastAt: null };
|
|
211
|
-
} finally {
|
|
212
|
-
if (fd !== undefined) {
|
|
213
|
-
try {
|
|
214
|
-
closeSync(fd);
|
|
215
|
-
} catch {
|
|
216
|
-
/* best-effort */
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
198
|
+
let lastAt = null;
|
|
199
|
+
const scan = scanEventsBackwards({
|
|
200
|
+
filePath: file,
|
|
201
|
+
chunkBytes: TAIL_CHUNK_BYTES,
|
|
202
|
+
budgetMs: EVOLVE_SCAN_BUDGET_MS,
|
|
203
|
+
// Cheap substring pre-filter before JSON.parse — the property the previous
|
|
204
|
+
// hand-rolled scan was written for, kept here rather than re-derived.
|
|
205
|
+
filter: EVOLVE_EVENT,
|
|
206
|
+
onRecord: (rec) => {
|
|
207
|
+
if (rec?.event !== EVOLVE_EVENT) return false;
|
|
208
|
+
lastAt = typeof rec.timestamp === 'string' ? rec.timestamp : null;
|
|
209
|
+
return true;
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
if (scan.unreadable.length > 0) return { ok: false, lastAt: null, truncated: false };
|
|
213
|
+
return { ok: true, lastAt, truncated: scan.truncated };
|
|
220
214
|
}
|
|
221
215
|
|
|
222
216
|
/**
|
|
@@ -302,7 +296,9 @@ export async function computeMaintenanceDue(opts = {}) {
|
|
|
302
296
|
} else {
|
|
303
297
|
// --- evolve (S1) -------------------------------------------------------
|
|
304
298
|
const evolve = readLastEvolveRun(repoRoot);
|
|
305
|
-
|
|
299
|
+
// `truncated` is NOT "not found": a walk that ran out of budget proves
|
|
300
|
+
// nothing about the lines it never reached (#1414).
|
|
301
|
+
if (!evolve.ok || evolve.truncated) {
|
|
306
302
|
undeterminable.push('evolve');
|
|
307
303
|
} else if (evolve.lastAt === null && nudge.activeLearnings >= MAINTENANCE_MIN_LEARNINGS) {
|
|
308
304
|
markDue('evolve', `never, ${nudge.activeLearnings} active learnings`);
|
|
@@ -311,7 +307,9 @@ export async function computeMaintenanceDue(opts = {}) {
|
|
|
311
307
|
// --- reconcile (S3) ----------------------------------------------------
|
|
312
308
|
if (nudge.nudge === true) {
|
|
313
309
|
// HR-106: report what the rule JUDGED. `computeReconcileNudge` nudges on
|
|
314
|
-
// a BACKLOG
|
|
310
|
+
// a BACKLOG — rule-eligible learnings minus those already materialized
|
|
311
|
+
// in the sidecar or `.claude/rules/` (`countReconcileBacklog`, #1380;
|
|
312
|
+
// before #1380 it counted all eligible ones) — never on a date — so
|
|
315
313
|
// printing `lastRunAt` here put today's date next to the word "due" and
|
|
316
314
|
// read as "last run today and already due again". Measured 2026-09-09
|
|
317
315
|
// (learning 013a45ba): with 108 learnings capped under
|
|
@@ -391,6 +389,39 @@ export async function computeMaintenanceDue(opts = {}) {
|
|
|
391
389
|
undeterminable.push('pending-sidecar');
|
|
392
390
|
}
|
|
393
391
|
|
|
392
|
+
// --- generated-rules-expiring (S7) ---------------------------------------
|
|
393
|
+
// The predicate and the population both come from `instruction-budget-guard`,
|
|
394
|
+
// which is where the generated corpus is DEFINED (its byte ceiling judges the
|
|
395
|
+
// same set). A local re-implementation would be a second definition of
|
|
396
|
+
// "machine-generated" that agrees only until one of the two is edited.
|
|
397
|
+
try {
|
|
398
|
+
const listed = listMachineGeneratedRules({ repoRoot });
|
|
399
|
+
if (!listed.ok) {
|
|
400
|
+
// The directory is there but unreadable — not knowing is not clean.
|
|
401
|
+
undeterminable.push('generated-rules-expiring');
|
|
402
|
+
} else {
|
|
403
|
+
const expiring = listed.rules
|
|
404
|
+
.map((r) => ({ ...r, days: daysUntilGeneratedRuleExpiry({ meta: r.meta, now }) }))
|
|
405
|
+
.filter((r) => r.days !== null && r.days <= GENERATED_RULE_EXPIRY_HORIZON_DAYS)
|
|
406
|
+
.sort((a, b) => a.days - b.days);
|
|
407
|
+
if (expiring.length > 0) {
|
|
408
|
+
// HR-106: name the files and the dates the verdict was computed from —
|
|
409
|
+
// the operator has to open exactly those files to repair this.
|
|
410
|
+
// HR-106 again, one step further: name the REPAIR, not only the
|
|
411
|
+
// finding. The sweep (#1377) is the mechanical half — prose out, the
|
|
412
|
+
// provenance pair kept as `markers only` — and an operator who is told
|
|
413
|
+
// only which files expired has to rediscover that the command exists.
|
|
414
|
+
markDue(
|
|
415
|
+
'generated-rules-expiring',
|
|
416
|
+
`${expiring.map((r) => `${r.file} ${r.expiresAt}`).join(', ')} → ` +
|
|
417
|
+
'node scripts/sweep-expired-rules.mjs (dry-run first)',
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
} catch {
|
|
422
|
+
undeterminable.push('generated-rules-expiring');
|
|
423
|
+
}
|
|
424
|
+
|
|
394
425
|
return {
|
|
395
426
|
due,
|
|
396
427
|
// HR-106: the denominator counts the signals this host actually EVALUATED.
|