@cohortapp/agent-sdk 2.16.0 → 2.18.4
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/settings.json +18 -0
- package/.env.example +23 -7
- package/README.md +1 -0
- package/bin/maestro.mjs +62 -0
- package/docs/guides/billing-console-keys.md +60 -0
- package/docs/guides/front-door-session.md +54 -9
- package/docs/guides/mac-mini.md +20 -25
- package/docs/guides/poller-daemon-setup.md +4 -1
- package/docs/guides/setup-wizard.md +1 -1
- package/docs/runbooks/fleet-rollout.md +156 -0
- package/docs/runbooks/mac-mini-bootstrap.md +12 -14
- package/lib/action-executor.js +19 -3
- package/lib/budget-guard.mjs +279 -3
- package/lib/channels/base-adapter.mjs +3 -1
- package/lib/channels/contract.mjs +2 -1
- package/lib/channels/inbox-item.mjs +8 -0
- package/lib/claude-bin.mjs +5 -6
- package/lib/cli/doctor-checks.mjs +141 -10
- package/lib/cli/global-setup-extras.mjs +5 -1
- package/lib/cli/inbox.mjs +100 -15
- package/lib/cli/seat-auth.mjs +463 -0
- package/lib/cli/session.mjs +80 -12
- package/lib/collective/capture.mjs +8 -6
- package/lib/collective/global-config.mjs +63 -1
- package/lib/collective/presence.mjs +142 -5
- package/lib/comms/send-gate.mjs +559 -1
- package/lib/context/budget.mjs +327 -0
- package/lib/context/history-scope.mjs +138 -0
- package/lib/diagnostics/alerts.mjs +49 -0
- package/lib/diagnostics/cadence-output-freshness.mjs +288 -0
- package/lib/engine/agents/definitions.mjs +343 -0
- package/lib/engine/agents/persist.mjs +275 -0
- package/lib/engine/agents/runtime.mjs +748 -0
- package/lib/engine/agents/usage.mjs +95 -0
- package/lib/engine/auth-status.mjs +139 -0
- package/lib/engine/budget.mjs +194 -0
- package/lib/engine/cli.mjs +1204 -0
- package/lib/engine/commands/index.mjs +269 -0
- package/lib/engine/context/budget.mjs +219 -0
- package/lib/engine/context/cache.mjs +125 -0
- package/lib/engine/context/child-env.mjs +215 -0
- package/lib/engine/context/compaction.mjs +342 -0
- package/lib/engine/context/images.mjs +90 -0
- package/lib/engine/context/instructions.mjs +327 -0
- package/lib/engine/context/lazy-instructions.mjs +169 -0
- package/lib/engine/context/manager.mjs +182 -0
- package/lib/engine/context/real-path.mjs +91 -0
- package/lib/engine/context/secret-values.mjs +163 -0
- package/lib/engine/context/settings.mjs +274 -0
- package/lib/engine/context/stream-input.mjs +159 -0
- package/lib/engine/guard.mjs +152 -0
- package/lib/engine/hooks.mjs +713 -0
- package/lib/engine/loop.mjs +560 -0
- package/lib/engine/mcp/client.mjs +254 -0
- package/lib/engine/mcp/config.mjs +301 -0
- package/lib/engine/mcp/http.mjs +201 -0
- package/lib/engine/mcp/index.mjs +146 -0
- package/lib/engine/mcp/jsonrpc.mjs +147 -0
- package/lib/engine/mcp/naming.mjs +66 -0
- package/lib/engine/mcp/resources.mjs +89 -0
- package/lib/engine/mcp/results.mjs +133 -0
- package/lib/engine/mcp/stdio.mjs +137 -0
- package/lib/engine/mcp/supervisor.mjs +116 -0
- package/lib/engine/messages.mjs +104 -0
- package/lib/engine/output/json.mjs +164 -0
- package/lib/engine/output/stream-json.mjs +266 -0
- package/lib/engine/permissions.mjs +845 -0
- package/lib/engine/process-identity.mjs +164 -0
- package/lib/engine/process-tree.mjs +551 -0
- package/lib/engine/prompt.mjs +60 -0
- package/lib/engine/session/store.mjs +299 -0
- package/lib/engine/session-runtime/args.mjs +97 -0
- package/lib/engine/session-runtime/host.mjs +143 -0
- package/lib/engine/session-runtime/inbox.mjs +122 -0
- package/lib/engine/session-runtime/notifications.mjs +129 -0
- package/lib/engine/session-runtime/registry.mjs +328 -0
- package/lib/engine/session-runtime/runner.mjs +344 -0
- package/lib/engine/session-runtime/socket.mjs +212 -0
- package/lib/engine/session-runtime/wakeup.mjs +115 -0
- package/lib/engine/skills/index.mjs +321 -0
- package/lib/engine/tools/bash-background.mjs +533 -0
- package/lib/engine/tools/bash.mjs +216 -0
- package/lib/engine/tools/edit.mjs +97 -0
- package/lib/engine/tools/glob.mjs +81 -0
- package/lib/engine/tools/grep.mjs +224 -0
- package/lib/engine/tools/index.mjs +84 -0
- package/lib/engine/tools/list-agents.mjs +32 -0
- package/lib/engine/tools/ls.mjs +127 -0
- package/lib/engine/tools/monitor.mjs +82 -0
- package/lib/engine/tools/notebook-edit.mjs +218 -0
- package/lib/engine/tools/read.mjs +103 -0
- package/lib/engine/tools/schedule-wakeup.mjs +45 -0
- package/lib/engine/tools/schema.mjs +144 -0
- package/lib/engine/tools/send-message.mjs +77 -0
- package/lib/engine/tools/session.mjs +70 -0
- package/lib/engine/tools/todo.mjs +144 -0
- package/lib/engine/tools/toolsearch.mjs +217 -0
- package/lib/engine/tools/walk.mjs +193 -0
- package/lib/engine/tools/web-switch.mjs +31 -0
- package/lib/engine/tools/webfetch-html.mjs +387 -0
- package/lib/engine/tools/webfetch-net.mjs +340 -0
- package/lib/engine/tools/webfetch.mjs +198 -0
- package/lib/engine/tools/websearch.mjs +91 -0
- package/lib/engine/tools/workflow.mjs +95 -0
- package/lib/engine/tools/write.mjs +76 -0
- package/lib/engine/tui/line-editor.mjs +137 -0
- package/lib/engine/tui/render.mjs +86 -0
- package/lib/engine/tui/tui.mjs +274 -0
- package/lib/engine/wire/anthropic-messages.mjs +263 -0
- package/lib/engine/wire/effort.mjs +36 -0
- package/lib/engine/wire/errors.mjs +496 -0
- package/lib/engine/wire/http.mjs +441 -0
- package/lib/engine/wire/index.mjs +76 -0
- package/lib/engine/wire/openai-chat.mjs +332 -0
- package/lib/engine/wire/prompt-cache.mjs +79 -0
- package/lib/engine/wire/search.mjs +140 -0
- package/lib/engine/wire/sse.mjs +114 -0
- package/lib/engine/wire/stall.mjs +349 -0
- package/lib/engine/wire/token-provider.mjs +175 -0
- package/lib/engine/wire/usage.mjs +192 -0
- package/lib/engine/workflow/host.mjs +524 -0
- package/lib/engine/workflow/journal.mjs +188 -0
- package/lib/engine/workflow/json-schema.mjs +171 -0
- package/lib/engine/workflow/meta.mjs +329 -0
- package/lib/engine/workflow/notifications.mjs +52 -0
- package/lib/engine/workflow/runtime.mjs +447 -0
- package/lib/engine/workflow/sandbox.mjs +534 -0
- package/lib/engine/workflow/worker.mjs +141 -0
- package/lib/engine/workflow/worktree.mjs +74 -0
- package/lib/execution/disposition.mjs +1 -1
- package/lib/execution/intake.mjs +10 -0
- package/lib/execution/surface-policy.mjs +15 -0
- package/lib/learning/curator.mjs +8 -6
- package/lib/learning/reflect.mjs +8 -6
- package/lib/model-router/catalog/cohort.yaml +137 -0
- package/lib/model-router/catalog.mjs +118 -1
- package/lib/model-router/economics.mjs +9 -0
- package/lib/model-router/failover.mjs +67 -16
- package/lib/model-router/llm-task.mjs +39 -3
- package/lib/model-router/resolve.mjs +95 -3
- package/lib/model-router/spawn.mjs +46 -47
- package/lib/model-router/taxonomy.mjs +126 -4
- package/lib/org/cost-sync.mjs +141 -11
- package/lib/org/inbound/broadcast.mjs +289 -0
- package/lib/org/inbound/collective.mjs +375 -0
- package/lib/org/inbound/directedness.mjs +96 -8
- package/lib/org/inbound/facts.mjs +82 -4
- package/lib/org/inbound/hydrate.mjs +555 -51
- package/lib/org/inbound/project.mjs +22 -0
- package/lib/org/inbound/surfaces.mjs +14 -0
- package/lib/org/llm-token.mjs +879 -0
- package/lib/org/mesh.mjs +61 -0
- package/lib/org/messaging.mjs +3 -1
- package/lib/org/protocol.checksum +1 -1
- package/lib/org/protocol.mjs +15 -0
- package/lib/org/quota.mjs +520 -0
- package/lib/org/tool-surface.mjs +104 -16
- package/lib/org/ui-parity.mjs +16 -1
- package/lib/org/work-ledger.mjs +37 -6
- package/lib/rate-guard.mjs +114 -1
- package/lib/resource-governor.mjs +41 -6
- package/lib/runtime/adapter.mjs +823 -0
- package/lib/runtime/child-env.mjs +191 -0
- package/lib/runtime/legacy-shell-guard.mjs +97 -0
- package/lib/runtime/seat-engine.mjs +162 -0
- package/lib/session/ask-ledger.mjs +271 -0
- package/lib/session/current-work.mjs +676 -0
- package/lib/session/feed-core.mjs +40 -3
- package/lib/session/launch-args.mjs +56 -4
- package/lib/session/status-summary.mjs +26 -9
- package/lib/session/upgrade-notice.mjs +42 -0
- package/lib/setup/claude-probe.mjs +117 -13
- package/lib/setup/enrich.mjs +13 -10
- package/lib/setup/sections/model.mjs +39 -13
- package/lib/telemetry/collect.mjs +208 -9
- package/lib/upgrade/ignored-drift.mjs +105 -0
- package/lib/voice/post-call-brief.mjs +30 -17
- package/package.json +15 -3
- package/plugins/maestro-skills/skills/board-work.md +5 -0
- package/plugins/maestro-skills/skills/inbound-triage.md +56 -15
- package/plugins/maestro-skills/skills/main-session.md +18 -7
- package/scripts/ci/check-tarball-fidelity.mjs +126 -2
- package/scripts/ci/run-tests.mjs +47 -19
- package/scripts/cohort-llm/api-key-helper.mjs +92 -0
- package/scripts/collective/hook-runner.mjs +29 -2
- package/scripts/continuous-monitor.sh +13 -0
- package/scripts/cost/track-claude-usage.mjs +15 -0
- package/scripts/daemon/agent-daemon.mjs +408 -20
- package/scripts/daemon/assurance.mjs +48 -12
- package/scripts/daemon/cadence-consumer.mjs +218 -68
- package/scripts/daemon/cadence-handlers.mjs +73 -4
- package/scripts/daemon/classifier.mjs +75 -26
- package/scripts/daemon/context-compiler.mjs +104 -59
- package/scripts/daemon/deliver.mjs +30 -1
- package/scripts/daemon/dispatcher.mjs +804 -157
- package/scripts/daemon/health.mjs +14 -1
- package/scripts/daemon/lib/session-router.mjs +310 -42
- package/scripts/daemon/maestro-daemon.mjs +11 -0
- package/scripts/daemon/prompt-builder.mjs +121 -12
- package/scripts/daemon/responder.mjs +315 -146
- package/scripts/daemon/sdk-version.mjs +98 -16
- package/scripts/eval/probe-gateway.mjs +635 -0
- package/scripts/eval/replay/extract.mjs +270 -0
- package/scripts/eval/replay/grade.mjs +260 -0
- package/scripts/eval/replay/lib/config.mjs +50 -0
- package/scripts/eval/replay/lib/effects.mjs +65 -0
- package/scripts/eval/replay/lib/fixture.mjs +188 -0
- package/scripts/eval/replay/lib/judge.mjs +72 -0
- package/scripts/eval/replay/lib/redact.mjs +136 -0
- package/scripts/eval/replay/lib/sandbox.mjs +170 -0
- package/scripts/eval/replay/lib/schema-check.mjs +63 -0
- package/scripts/eval/replay/lib/transcript.mjs +76 -0
- package/scripts/eval/replay/mcp-replay-stub.mjs +101 -0
- package/scripts/eval/replay/report.mjs +185 -0
- package/scripts/eval/replay/run.mjs +404 -0
- package/scripts/fleet/rollout.mjs +1094 -0
- package/scripts/hooks/pre-send-audit.sh +36 -245
- package/scripts/hooks/pre-write-yaml-validate.mjs +275 -0
- package/scripts/hooks/validate-state-yaml.sh +190 -0
- package/scripts/huddle/huddle-llm.mjs +361 -0
- package/scripts/huddle/huddle-server.mjs +46 -121
- package/scripts/local-triggers/autoupdate.sh +448 -78
- package/scripts/local-triggers/run-trigger.sh +13 -0
- package/scripts/maintenance/pin-integrity.mjs +364 -0
- package/scripts/poll-slack-events.sh +41 -9
- package/scripts/poller/slack-socket-mode.mjs +28 -3
- package/scripts/session/supervisor.mjs +80 -13
- package/scripts/spawn-session.sh +13 -0
- package/bin/maestro.test.mjs +0 -1574
- package/lib/action-executor.test.mjs +0 -871
- package/lib/archetype.test.mjs +0 -132
- package/lib/assurance/plan-note.test.mjs +0 -234
- package/lib/assurance/room-budget.test.mjs +0 -486
- package/lib/assurance/tier.test.mjs +0 -174
- package/lib/autonomy.test.mjs +0 -66
- package/lib/backlog.test.mjs +0 -302
- package/lib/backup/policy.test.mjs +0 -305
- package/lib/budget-escalate.test.mjs +0 -232
- package/lib/budget-guard.envelope.test.mjs +0 -476
- package/lib/budget-guard.test.mjs +0 -427
- package/lib/cadence-bus-requeue.test.mjs +0 -83
- package/lib/cadence-bus-schedule.test.mjs +0 -194
- package/lib/cadence-bus.test.mjs +0 -720
- package/lib/cadences.test.mjs +0 -230
- package/lib/capability/inventory.test.mjs +0 -232
- package/lib/capability.test.mjs +0 -78
- package/lib/channels/base-adapter.test.mjs +0 -590
- package/lib/channels/channels.test.mjs +0 -371
- package/lib/channels/contract.test.mjs +0 -162
- package/lib/channels/inbox-item.test.mjs +0 -368
- package/lib/channels/orgmail/adapter.test.mjs +0 -448
- package/lib/channels/pairing.test.mjs +0 -270
- package/lib/channels/repeat-suppressor.test.mjs +0 -134
- package/lib/channels/slack-adapter.test.mjs +0 -212
- package/lib/channels/telegram-adapter.test.mjs +0 -306
- package/lib/channels/voice/adapter.test.mjs +0 -278
- package/lib/channels/whatsapp/adapter-baileys.test.mjs +0 -359
- package/lib/channels/whatsapp/baileys-typing.test.mjs +0 -154
- package/lib/charter.test.mjs +0 -89
- package/lib/claude-bin.test.mjs +0 -131
- package/lib/cli/board.test.mjs +0 -227
- package/lib/cli/design.test.mjs +0 -270
- package/lib/cli/doctor-checks.test.mjs +0 -336
- package/lib/cli/global-setup-extras.test.mjs +0 -462
- package/lib/cli/inbox.test.mjs +0 -230
- package/lib/cli/session-ack.test.mjs +0 -63
- package/lib/cli/session.test.mjs +0 -613
- package/lib/collective/capture.test.mjs +0 -121
- package/lib/collective/cards.test.mjs +0 -114
- package/lib/collective/config.test.mjs +0 -123
- package/lib/collective/global-config.test.mjs +0 -220
- package/lib/collective/global-skills.test.mjs +0 -126
- package/lib/collective/presence.test.mjs +0 -95
- package/lib/collective/recall.test.mjs +0 -116
- package/lib/collective/vendor-skills.test.mjs +0 -306
- package/lib/comms/send-gate.test.mjs +0 -770
- package/lib/comms.test.mjs +0 -41
- package/lib/cost/ledger-row.test.mjs +0 -183
- package/lib/design/design-md.test.mjs +0 -318
- package/lib/design/fixtures/DESIGN.golden.md +0 -238
- package/lib/design/fixtures/PRODUCT.golden.md +0 -67
- package/lib/design/fixtures/foundation.json +0 -133
- package/lib/design/refresh-gate.test.mjs +0 -144
- package/lib/design/write.test.mjs +0 -241
- package/lib/diagnostics/alerts.test.mjs +0 -318
- package/lib/diagnostics/backup-freshness.test.mjs +0 -185
- package/lib/diagnostics/counters.test.mjs +0 -206
- package/lib/diagnostics/events.test.mjs +0 -290
- package/lib/diagnostics/otel.test.mjs +0 -196
- package/lib/diagnostics/trace.test.mjs +0 -251
- package/lib/env-compat.test.mjs +0 -104
- package/lib/execution/disposition.test.mjs +0 -553
- package/lib/execution/drive.test.mjs +0 -270
- package/lib/execution/effects.test.mjs +0 -344
- package/lib/execution/intake.test.mjs +0 -389
- package/lib/execution/journal.test.mjs +0 -261
- package/lib/execution/match.test.mjs +0 -235
- package/lib/execution/pipeline.test.mjs +0 -392
- package/lib/execution/route.test.mjs +0 -186
- package/lib/execution/surface-policy.test.mjs +0 -162
- package/lib/fs-atomic.test.mjs +0 -72
- package/lib/fs-ownership.test.mjs +0 -158
- package/lib/goals/admission.test.mjs +0 -164
- package/lib/goals/classify.test.mjs +0 -167
- package/lib/goals/collaborate.test.mjs +0 -336
- package/lib/goals/gaps.test.mjs +0 -284
- package/lib/goals/loop.test.mjs +0 -845
- package/lib/hooks/bus.test.mjs +0 -387
- package/lib/identity/persona.test.mjs +0 -142
- package/lib/kpi-sensors.test.mjs +0 -278
- package/lib/kpi.test.mjs +0 -244
- package/lib/learning/config.test.mjs +0 -75
- package/lib/learning/counters.test.mjs +0 -69
- package/lib/learning/curator-consolidate.test.mjs +0 -238
- package/lib/learning/curator.test.mjs +0 -106
- package/lib/learning/reflect.test.mjs +0 -0
- package/lib/learning/session-index.test.mjs +0 -125
- package/lib/learning/skill-writer.test.mjs +0 -210
- package/lib/mandate/audit.test.mjs +0 -195
- package/lib/mandate/contract.test.mjs +0 -185
- package/lib/mandate/derive.test.mjs +0 -274
- package/lib/mandate/model.test.mjs +0 -164
- package/lib/mandate/refresh.test.mjs +0 -389
- package/lib/mcp/server.test.mjs +0 -426
- package/lib/model-router/auth-profiles.test.mjs +0 -580
- package/lib/model-router/catalog.test.mjs +0 -385
- package/lib/model-router/economics.test.mjs +0 -438
- package/lib/model-router/failover.test.mjs +0 -439
- package/lib/model-router/health.test.mjs +0 -338
- package/lib/model-router/integration-coverage.test.mjs +0 -831
- package/lib/model-router/integration.test.mjs +0 -564
- package/lib/model-router/ledger.test.mjs +0 -415
- package/lib/model-router/llm-task.test.mjs +0 -392
- package/lib/model-router/org-credentials.test.mjs +0 -265
- package/lib/model-router/pricing-refresh.test.mjs +0 -286
- package/lib/model-router/reconcile.test.mjs +0 -316
- package/lib/model-router/repair.test.mjs +0 -180
- package/lib/model-router/spawn.test.mjs +0 -446
- package/lib/model-router/taxonomy.test.mjs +0 -410
- package/lib/model-router.test.mjs +0 -1207
- package/lib/org/activity.test.mjs +0 -134
- package/lib/org/approvals.test.mjs +0 -216
- package/lib/org/awareness.test.mjs +0 -159
- package/lib/org/board-mine-cache.test.mjs +0 -53
- package/lib/org/board.test.mjs +0 -187
- package/lib/org/bootstrap-context.test.mjs +0 -153
- package/lib/org/client.test.mjs +0 -1206
- package/lib/org/cohort-client.test.mjs +0 -126
- package/lib/org/cost-sync.test.mjs +0 -153
- package/lib/org/doctor.test.mjs +0 -346
- package/lib/org/engagement-ledger.test.mjs +0 -112
- package/lib/org/engagement.test.mjs +0 -739
- package/lib/org/handoff.test.mjs +0 -269
- package/lib/org/inbound/directedness.test.mjs +0 -668
- package/lib/org/inbound/facts.test.mjs +0 -471
- package/lib/org/inbound/hydrate.test.mjs +0 -453
- package/lib/org/inbound/index.test.mjs +0 -429
- package/lib/org/inbound/project.test.mjs +0 -287
- package/lib/org/integration-tools.test.mjs +0 -160
- package/lib/org/keys.test.mjs +0 -92
- package/lib/org/knowledge.test.mjs +0 -326
- package/lib/org/leases.test.mjs +0 -235
- package/lib/org/mesh-directives.test.mjs +0 -110
- package/lib/org/mesh-integration.test.mjs +0 -127
- package/lib/org/mesh.test.mjs +0 -400
- package/lib/org/messaging.test.mjs +0 -471
- package/lib/org/param-contract.test.mjs +0 -477
- package/lib/org/policy.test.mjs +0 -237
- package/lib/org/protocol.checksum.test.mjs +0 -90
- package/lib/org/protocol.test.mjs +0 -323
- package/lib/org/push.test.mjs +0 -792
- package/lib/org/registry.test.mjs +0 -100
- package/lib/org/resource-tools.test.mjs +0 -361
- package/lib/org/tool-access.test.mjs +0 -144
- package/lib/org/tool-surface-integration.test.mjs +0 -120
- package/lib/org/tool-surface.test.mjs +0 -1268
- package/lib/org/typing.test.mjs +0 -291
- package/lib/org/ui-parity.test.mjs +0 -560
- package/lib/org/verify.test.mjs +0 -194
- package/lib/org/work-ledger.test.mjs +0 -273
- package/lib/plan/adoption-e2e.test.mjs +0 -366
- package/lib/plan/budget-enforcement.test.mjs +0 -400
- package/lib/plan/compile.test.mjs +0 -382
- package/lib/plan/emit.test.mjs +0 -269
- package/lib/plan/explain.test.mjs +0 -188
- package/lib/prompts/parallelism.test.mjs +0 -177
- package/lib/rag/rag.test.mjs +0 -505
- package/lib/rate-guard.test.mjs +0 -272
- package/lib/reactive-gate.test.mjs +0 -57
- package/lib/render.test.mjs +0 -68
- package/lib/resource-governor.test.mjs +0 -488
- package/lib/scheduling/dynamic-jobs.test.mjs +0 -344
- package/lib/scheduling/jitter.test.mjs +0 -140
- package/lib/secrets/broker.test.mjs +0 -280
- package/lib/secrets/providers.test.mjs +0 -274
- package/lib/security/audit-engine.test.mjs +0 -424
- package/lib/security/coerce-args.test.mjs +0 -281
- package/lib/security/dangerous-tools.test.mjs +0 -68
- package/lib/security/external-content.test.mjs +0 -84
- package/lib/security/redact.test.mjs +0 -441
- package/lib/security/secret-equal.test.mjs +0 -55
- package/lib/session/config.test.mjs +0 -92
- package/lib/session/feed-core.test.mjs +0 -198
- package/lib/session/first-run.test.mjs +0 -121
- package/lib/session/frontdoor.test.mjs +0 -205
- package/lib/session/handoffs.test.mjs +0 -183
- package/lib/session/identity.test.mjs +0 -180
- package/lib/session/inbox-claims.test.mjs +0 -286
- package/lib/session/launch-args.test.mjs +0 -157
- package/lib/session/liveness.test.mjs +0 -100
- package/lib/session/status-summary.test.mjs +0 -118
- package/lib/session-permissions.test.mjs +0 -120
- package/lib/setup/claude-probe.test.mjs +0 -187
- package/lib/setup/completeness.test.mjs +0 -110
- package/lib/setup/context-pack.test.mjs +0 -89
- package/lib/setup/enrich.test.mjs +0 -115
- package/lib/setup/enroll-from-cohort.test.mjs +0 -300
- package/lib/setup/integration.test.mjs +0 -162
- package/lib/setup/io.test.mjs +0 -77
- package/lib/setup/runner.test.mjs +0 -132
- package/lib/setup/sections/identity.test.mjs +0 -234
- package/lib/setup/sections/inventory.test.mjs +0 -198
- package/lib/setup/sections/learning.test.mjs +0 -81
- package/lib/setup/sections/mandate.test.mjs +0 -388
- package/lib/setup/sections/messaging.test.mjs +0 -127
- package/lib/setup/sections/model.test.mjs +0 -240
- package/lib/setup/sections/org.test.mjs +0 -346
- package/lib/setup/sections/orgmail.test.mjs +0 -118
- package/lib/setup/sections/recovery.test.mjs +0 -98
- package/lib/setup/sections/subagents.test.mjs +0 -429
- package/lib/setup/sections/verify.test.mjs +0 -175
- package/lib/setup/sot.test.mjs +0 -81
- package/lib/setup/state.test.mjs +0 -115
- package/lib/singleton.test.mjs +0 -151
- package/lib/subagents/cli.test.mjs +0 -389
- package/lib/subagents/client.test.mjs +0 -309
- package/lib/subagents/gap.test.mjs +0 -234
- package/lib/subagents/lock.test.mjs +0 -248
- package/lib/subagents/manifest.test.mjs +0 -175
- package/lib/subagents/refs.test.mjs +0 -204
- package/lib/subagents/resolve.test.mjs +0 -422
- package/lib/subagents/schema.test.mjs +0 -328
- package/lib/telemetry/alerts.test.mjs +0 -109
- package/lib/telemetry/collect.test.mjs +0 -1274
- package/lib/tool-definitions-integration.test.mjs +0 -83
- package/lib/tool-definitions.test.mjs +0 -437
- package/lib/upgrade/global-refresh.test.mjs +0 -65
- package/lib/upgrade/launchd-reconcile.test.mjs +0 -272
- package/lib/upgrade/post-steps.test.mjs +0 -200
- package/lib/upgrade/verify.test.mjs +0 -164
- package/lib/util/fetch-timeout.test.mjs +0 -202
- package/lib/util/reconnect.test.mjs +0 -369
- package/lib/util/unhandled.test.mjs +0 -216
- package/lib/voice/outbound.test.mjs +0 -69
- package/lib/voice/session-rotation.test.mjs +0 -114
- package/lib/voice/stt.test.mjs +0 -226
- package/lib/voice/voice.test.mjs +0 -990
- package/scripts/cadence/enqueue-cadence-tick.test.mjs +0 -187
- package/scripts/ci/check-docs-accuracy.test.mjs +0 -409
- package/scripts/ci/check-durable-write-seam.test.mjs +0 -90
- package/scripts/ci/check-no-build-artifacts.test.mjs +0 -71
- package/scripts/ci/check-no-residual-identity.test.mjs +0 -202
- package/scripts/ci/check-skill-packs.test.mjs +0 -495
- package/scripts/ci/check-subagent-frontmatter.test.mjs +0 -124
- package/scripts/ci/check.test.mjs +0 -194
- package/scripts/ci/conformance-org-api.test.mjs +0 -425
- package/scripts/cloud-relay/voice/relay-identity.test.mjs +0 -96
- package/scripts/collective/hook-runner.test.mjs +0 -173
- package/scripts/cost/fleet-digest.test.mjs +0 -207
- package/scripts/cost/track-claude-usage-pricing.test.mjs +0 -183
- package/scripts/cost/track-claude-usage.test.mjs +0 -148
- package/scripts/daemon/agent-daemon-board-mine.test.mjs +0 -96
- package/scripts/daemon/agent-daemon-design.test.mjs +0 -238
- package/scripts/daemon/agent-daemon-frontdoor.test.mjs +0 -60
- package/scripts/daemon/agent-daemon.test.mjs +0 -995
- package/scripts/daemon/assurance-e2e.test.mjs +0 -613
- package/scripts/daemon/assurance.test.mjs +0 -1791
- package/scripts/daemon/board-mirror.test.mjs +0 -165
- package/scripts/daemon/cadence-consumer-frontdoor.test.mjs +0 -393
- package/scripts/daemon/cadence-consumer-governance.test.mjs +0 -276
- package/scripts/daemon/cadence-consumer.test.mjs +0 -776
- package/scripts/daemon/cadence-handlers.test.mjs +0 -837
- package/scripts/daemon/classifier-identity.test.mjs +0 -137
- package/scripts/daemon/classifier.test.mjs +0 -266
- package/scripts/daemon/classify-kind.test.mjs +0 -40
- package/scripts/daemon/context-compiler.test.mjs +0 -300
- package/scripts/daemon/deliver.test.mjs +0 -564
- package/scripts/daemon/dispatcher-cooldown.test.mjs +0 -122
- package/scripts/daemon/dispatcher-governance.test.mjs +0 -1013
- package/scripts/daemon/dispatcher-resume.test.mjs +0 -166
- package/scripts/daemon/execution-ladder.test.mjs +0 -470
- package/scripts/daemon/goal-steward-cadence.test.mjs +0 -312
- package/scripts/daemon/inbox-deferral-session.test.mjs +0 -49
- package/scripts/daemon/inbox-deferral.test.mjs +0 -336
- package/scripts/daemon/inbox-wake.test.mjs +0 -199
- package/scripts/daemon/integration.test.mjs +0 -149
- package/scripts/daemon/lib/self-echo.test.mjs +0 -153
- package/scripts/daemon/lib/session-router.test.mjs +0 -295
- package/scripts/daemon/prompt-builder-preamble.test.mjs +0 -210
- package/scripts/daemon/prompt-builder.test.mjs +0 -344
- package/scripts/daemon/responder-cost.test.mjs +0 -68
- package/scripts/daemon/responder-history.test.mjs +0 -185
- package/scripts/daemon/sdk-version.test.mjs +0 -31
- package/scripts/daemon/session-lock.test.mjs +0 -252
- package/scripts/daemon/session-outcomes.test.mjs +0 -533
- package/scripts/daemon/typing-registry.test.mjs +0 -102
- package/scripts/hooks/pre-send-audit.test.mjs +0 -354
- package/scripts/huddle/huddle-prompt.test.mjs +0 -176
- package/scripts/local-triggers/autoupdate.test.mjs +0 -518
- package/scripts/local-triggers/generate-plists.test.mjs +0 -456
- package/scripts/media-generation/brand-clause.test.mjs +0 -135
- package/scripts/org/send-orgmail.first-contact.test.mjs +0 -102
- package/scripts/poller/inbox-privilege-injection.test.mjs +0 -167
- package/scripts/poller/inbox-scan-poller.test.mjs +0 -295
- package/scripts/poller/lib/cloud-relay-dedup.test.mjs +0 -133
- package/scripts/poller/slack-socket-mode.test.mjs +0 -805
- package/scripts/poller-launchd/install.test.mjs +0 -243
- package/scripts/restore-from-backup.test.mjs +0 -181
- package/scripts/session/feed.test.mjs +0 -196
- package/scripts/session/supervisor-sh.test.mjs +0 -218
- package/scripts/session/supervisor.test.mjs +0 -482
- package/scripts/setup/configure-macos.test.mjs +0 -306
- package/scripts/setup/gen-subagent-manifest.test.mjs +0 -124
- package/scripts/setup/generate-agent-package-json.test.mjs +0 -143
- package/scripts/setup/generate-capability.test.mjs +0 -134
- package/scripts/setup/init-agent.test.mjs +0 -370
- package/scripts/setup/init-skill-marketplace.test.mjs +0 -193
- package/scripts/vendor/sync-skill-packs.test.mjs +0 -103
- package/scripts/watchdog/memory-watchdog.test.mjs +0 -64
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* cadence-consumer-governance.test.mjs — WS4 coverage for the consumer's
|
|
3
|
-
* resource-governor / 429-breaker admission gate on the escalation path.
|
|
4
|
-
*
|
|
5
|
-
* Proves the two invariants for the cadence path:
|
|
6
|
-
* (1) A governor DEFER / open breaker REQUEUES the tick (decision:"deferred")
|
|
7
|
-
* and does NOT call failTick — the event stays in inbox/ with its attempt
|
|
8
|
-
* count UNCHANGED, so a busy box never DLQs a perfectly good cadence.
|
|
9
|
-
* (2) When pressure clears, the same event escalates normally — no work lost.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { test } from "node:test";
|
|
13
|
-
import assert from "node:assert/strict";
|
|
14
|
-
import { promises as fsp } from "node:fs";
|
|
15
|
-
import { writeFileSync, mkdirSync, readFileSync, existsSync } from "node:fs";
|
|
16
|
-
import { tmpdir } from "node:os";
|
|
17
|
-
import { join, dirname } from "node:path";
|
|
18
|
-
|
|
19
|
-
import { enqueueTick, busDepth, listInbox, getBusPaths } from "../../lib/cadence-bus.mjs";
|
|
20
|
-
import { startConsumer } from "./cadence-consumer.mjs";
|
|
21
|
-
import { obligationAllowedUnderPosture } from "../../lib/plan/compile.mjs";
|
|
22
|
-
import { postureForBand } from "../../lib/budget-guard.mjs";
|
|
23
|
-
import { isHumanLaneCadence } from "../../lib/cadences.mjs";
|
|
24
|
-
|
|
25
|
-
async function makeAgentRoot() {
|
|
26
|
-
const path = join(tmpdir(), `consumer-gov-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
|
|
27
|
-
await fsp.mkdir(path, { recursive: true });
|
|
28
|
-
return path;
|
|
29
|
-
}
|
|
30
|
-
async function rmRoot(path) { try { await fsp.rm(path, { recursive: true, force: true }); } catch { /* */ } }
|
|
31
|
-
function plantPrompt(root, cadence) {
|
|
32
|
-
const p = join(root, "schedules/triggers", `${cadence}.md`);
|
|
33
|
-
mkdirSync(dirname(p), { recursive: true });
|
|
34
|
-
writeFileSync(p, `# ${cadence}`);
|
|
35
|
-
}
|
|
36
|
-
async function waitFor(pred, { timeoutMs = 5_000, intervalMs = 20 } = {}) {
|
|
37
|
-
const deadline = Date.now() + timeoutMs;
|
|
38
|
-
while (Date.now() < deadline) { if (await pred()) return true; await new Promise((r) => setTimeout(r, intervalMs)); }
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const DEFER_GOV = { admit: () => ({ decision: "DEFER", reason: "low free memory (test)", snapshot: {} }), defaultDeps: () => ({}) };
|
|
43
|
-
const ADMIT_GOV = { admit: () => ({ decision: "ADMIT", reason: "ok", snapshot: {} }), defaultDeps: () => ({}) };
|
|
44
|
-
const RATE_OK = { checkRateLimit: () => ({ allowed: true, retryAt: null }), classifyStderr: () => false, recordRateLimit: () => {}, recordSuccess: () => {} };
|
|
45
|
-
const RATE_OPEN = { checkRateLimit: () => ({ allowed: false, retryAt: Date.now() + 60_000 }), classifyStderr: () => false, recordRateLimit: () => {}, recordSuccess: () => {} };
|
|
46
|
-
const BUDGET_OK = { dailyStatus: () => ({ essentialOnly: false }) };
|
|
47
|
-
|
|
48
|
-
// ---------------------------------------------------------------------------
|
|
49
|
-
// governor DEFER → requeue, never failTick, attempts unchanged
|
|
50
|
-
// ---------------------------------------------------------------------------
|
|
51
|
-
|
|
52
|
-
test("governor DEFER requeues the tick without spawning or burning retry budget", async () => {
|
|
53
|
-
const root = await makeAgentRoot();
|
|
54
|
-
plantPrompt(root, "weekly-strategic-memo");
|
|
55
|
-
let spawnCalls = 0;
|
|
56
|
-
const consumer = startConsumer({
|
|
57
|
-
agentRoot: root,
|
|
58
|
-
pollMs: 30,
|
|
59
|
-
governor: DEFER_GOV,
|
|
60
|
-
rateGuard: RATE_OK,
|
|
61
|
-
budgetGuard: BUDGET_OK,
|
|
62
|
-
spawnSession: async () => { spawnCalls++; return { ok: true, exit_code: 0 }; },
|
|
63
|
-
});
|
|
64
|
-
try {
|
|
65
|
-
enqueueTick({ cadence: "weekly-strategic-memo", source: "launchd", agentRoot: root });
|
|
66
|
-
// Let several poll cycles run — under DEFER the event must keep being
|
|
67
|
-
// requeued, never spawned, never DLQ'd.
|
|
68
|
-
await waitFor(() => consumer.getStats().retries >= 1);
|
|
69
|
-
await new Promise((r) => setTimeout(r, 200));
|
|
70
|
-
const stats = consumer.getStats();
|
|
71
|
-
assert.equal(spawnCalls, 0, "DEFER must not spawn a sub-session");
|
|
72
|
-
assert.equal(stats.dlq, 0, "DEFER must never DLQ the cadence");
|
|
73
|
-
assert.equal(stats.spawn_failures, 0, "DEFER is not a spawn failure");
|
|
74
|
-
assert.equal(stats.last_decision, "deferred");
|
|
75
|
-
// The event is back in inbox/ with attempts STILL 0 (no retry budget burned).
|
|
76
|
-
assert.equal(busDepth(root).inbox, 1, "event requeued to inbox");
|
|
77
|
-
const id = listInbox(root)[0];
|
|
78
|
-
const ev = JSON.parse(readFileSync(join(getBusPaths(root).inbox, `${id}.json`), "utf-8"));
|
|
79
|
-
assert.equal(ev.attempts, 0, "DEFER must not increment attempts (failTick never called)");
|
|
80
|
-
} finally { await consumer.stop(); await rmRoot(root); }
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
test("open 429 breaker defers the cadence the same way", async () => {
|
|
84
|
-
const root = await makeAgentRoot();
|
|
85
|
-
plantPrompt(root, "weekly-strategic-memo");
|
|
86
|
-
let spawnCalls = 0;
|
|
87
|
-
const consumer = startConsumer({
|
|
88
|
-
agentRoot: root,
|
|
89
|
-
pollMs: 30,
|
|
90
|
-
governor: ADMIT_GOV, // governor would admit…
|
|
91
|
-
rateGuard: RATE_OPEN, // …but the shared breaker is open.
|
|
92
|
-
budgetGuard: BUDGET_OK,
|
|
93
|
-
spawnSession: async () => { spawnCalls++; return { ok: true, exit_code: 0 }; },
|
|
94
|
-
});
|
|
95
|
-
try {
|
|
96
|
-
enqueueTick({ cadence: "weekly-strategic-memo", source: "launchd", agentRoot: root });
|
|
97
|
-
await waitFor(() => consumer.getStats().retries >= 1);
|
|
98
|
-
await new Promise((r) => setTimeout(r, 150));
|
|
99
|
-
assert.equal(spawnCalls, 0, "rate-limited cadence must not spawn");
|
|
100
|
-
assert.equal(consumer.getStats().dlq, 0);
|
|
101
|
-
assert.equal(busDepth(root).inbox, 1);
|
|
102
|
-
} finally { await consumer.stop(); await rmRoot(root); }
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
// ---------------------------------------------------------------------------
|
|
106
|
-
// recovery: once pressure clears, the same event escalates (no work lost)
|
|
107
|
-
// ---------------------------------------------------------------------------
|
|
108
|
-
|
|
109
|
-
test("a deferred tick escalates once the governor admits again (work not lost)", async () => {
|
|
110
|
-
const root = await makeAgentRoot();
|
|
111
|
-
plantPrompt(root, "weekly-strategic-memo");
|
|
112
|
-
let admitNow = false;
|
|
113
|
-
const flipGov = { admit: () => ({ decision: admitNow ? "ADMIT" : "DEFER", reason: "flip", snapshot: {} }), defaultDeps: () => ({}) };
|
|
114
|
-
const spawns = [];
|
|
115
|
-
const consumer = startConsumer({
|
|
116
|
-
agentRoot: root,
|
|
117
|
-
pollMs: 30,
|
|
118
|
-
governor: flipGov,
|
|
119
|
-
rateGuard: RATE_OK,
|
|
120
|
-
budgetGuard: BUDGET_OK,
|
|
121
|
-
spawnSession: async (o) => { spawns.push(o.cadence); return { ok: true, exit_code: 0 }; },
|
|
122
|
-
});
|
|
123
|
-
try {
|
|
124
|
-
enqueueTick({ cadence: "weekly-strategic-memo", source: "launchd", agentRoot: root });
|
|
125
|
-
// Initially deferred.
|
|
126
|
-
await waitFor(() => consumer.getStats().retries >= 1);
|
|
127
|
-
assert.equal(spawns.length, 0);
|
|
128
|
-
// Pressure clears → next poll escalates the SAME event.
|
|
129
|
-
admitNow = true;
|
|
130
|
-
const ran = await waitFor(() => consumer.getStats().escalated >= 1);
|
|
131
|
-
assert.ok(ran, "the deferred tick must escalate once admitted");
|
|
132
|
-
assert.equal(spawns[0], "weekly-strategic-memo");
|
|
133
|
-
assert.equal(busDepth(root).inbox, 0);
|
|
134
|
-
} finally { await consumer.stop(); await rmRoot(root); }
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
// ---------------------------------------------------------------------------
|
|
138
|
-
// 429 from the sub-session itself → open breaker + requeue (not failTick)
|
|
139
|
-
// ---------------------------------------------------------------------------
|
|
140
|
-
|
|
141
|
-
test("a 429 in sub-session stderr opens the breaker and requeues (does not DLQ)", async () => {
|
|
142
|
-
const root = await makeAgentRoot();
|
|
143
|
-
plantPrompt(root, "weekly-strategic-memo");
|
|
144
|
-
let opened = 0;
|
|
145
|
-
const rate429 = {
|
|
146
|
-
checkRateLimit: () => ({ allowed: true, retryAt: null }), // breaker closed at gate time
|
|
147
|
-
classifyStderr: (t) => /429|rate limit|overloaded/i.test(t || ""),
|
|
148
|
-
recordRateLimit: () => { opened++; return { openUntil: Date.now() + 60_000, consecutive429: 1 }; },
|
|
149
|
-
recordSuccess: () => {},
|
|
150
|
-
};
|
|
151
|
-
const consumer = startConsumer({
|
|
152
|
-
agentRoot: root,
|
|
153
|
-
pollMs: 30,
|
|
154
|
-
maxAttempts: 1, // would DLQ on first failTick — proves we DON'T failTick here
|
|
155
|
-
governor: ADMIT_GOV,
|
|
156
|
-
rateGuard: rate429,
|
|
157
|
-
budgetGuard: BUDGET_OK,
|
|
158
|
-
spawnSession: async () => ({ ok: false, exit_code: 1, stderr_tail: "HTTP 429 rate limit exceeded", duration_ms: 1 }),
|
|
159
|
-
});
|
|
160
|
-
try {
|
|
161
|
-
enqueueTick({ cadence: "weekly-strategic-memo", source: "launchd", agentRoot: root });
|
|
162
|
-
await waitFor(() => opened >= 1);
|
|
163
|
-
await new Promise((r) => setTimeout(r, 120));
|
|
164
|
-
assert.ok(opened >= 1, "429 stderr must open the shared breaker");
|
|
165
|
-
assert.equal(consumer.getStats().dlq, 0, "a 429 must NOT DLQ the cadence even at maxAttempts=1");
|
|
166
|
-
// Event requeued, attempts not bumped (no failTick on the rate path).
|
|
167
|
-
assert.equal(busDepth(root).inbox, 1);
|
|
168
|
-
const id = listInbox(root)[0];
|
|
169
|
-
const ev = JSON.parse(readFileSync(join(getBusPaths(root).inbox, `${id}.json`), "utf-8"));
|
|
170
|
-
assert.equal(ev.attempts, 0, "rate-limit requeue must not burn retry budget");
|
|
171
|
-
} finally { await consumer.stop(); await rmRoot(root); }
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
// ---------------------------------------------------------------------------
|
|
175
|
-
// L2 — a 429 is a SHARED rate-limit signal, NOT evidence this cadence is
|
|
176
|
-
// broken. It must requeue WITHOUT tripping the per-cadence circuit, so a good
|
|
177
|
-
// cadence isn't left circuit-open after the shared breaker clears.
|
|
178
|
-
// ---------------------------------------------------------------------------
|
|
179
|
-
|
|
180
|
-
test("L2: a 429 sub-session failure does NOT trip the per-cadence circuit", async () => {
|
|
181
|
-
const root = await makeAgentRoot();
|
|
182
|
-
plantPrompt(root, "weekly-strategic-memo");
|
|
183
|
-
let recordedRateLimit = 0;
|
|
184
|
-
const rate429 = {
|
|
185
|
-
checkRateLimit: () => ({ allowed: true, retryAt: null }),
|
|
186
|
-
classifyStderr: (t) => /429|rate limit|overloaded/i.test(t || ""),
|
|
187
|
-
recordRateLimit: () => { recordedRateLimit++; return { openUntil: Date.now() + 60_000, consecutive429: 1 }; },
|
|
188
|
-
recordSuccess: () => {},
|
|
189
|
-
};
|
|
190
|
-
const consumer = startConsumer({
|
|
191
|
-
agentRoot: root,
|
|
192
|
-
pollMs: 30,
|
|
193
|
-
maxAttempts: 5,
|
|
194
|
-
// circuitThreshold:1 means a SINGLE recordSubsessionFailure would open the
|
|
195
|
-
// circuit. The fix must therefore NOT call it on the 429 path — if it did,
|
|
196
|
-
// one rate-limit would wrongly circuit-open a healthy cadence.
|
|
197
|
-
circuitThreshold: 1,
|
|
198
|
-
circuitDurationMs: 60_000,
|
|
199
|
-
governor: ADMIT_GOV,
|
|
200
|
-
rateGuard: rate429,
|
|
201
|
-
budgetGuard: BUDGET_OK,
|
|
202
|
-
spawnSession: async () => ({ ok: false, exit_code: 1, stderr_tail: "HTTP 429 rate limit exceeded", duration_ms: 1 }),
|
|
203
|
-
});
|
|
204
|
-
try {
|
|
205
|
-
enqueueTick({ cadence: "weekly-strategic-memo", source: "launchd", agentRoot: root });
|
|
206
|
-
await waitFor(() => recordedRateLimit >= 1);
|
|
207
|
-
// Give the consumer a beat to (not) write the circuit file.
|
|
208
|
-
await new Promise((r) => setTimeout(r, 120));
|
|
209
|
-
|
|
210
|
-
const stats = consumer.getStats();
|
|
211
|
-
assert.ok(recordedRateLimit >= 1, "the shared breaker was opened (429 throttles all cadences)");
|
|
212
|
-
assert.equal(stats.skipped_circuit_open, 0, "the per-cadence circuit must NOT block this cadence");
|
|
213
|
-
// The SoT the operator/doctor reads: circuit-open.json is written only when a
|
|
214
|
-
// cadence circuit actually opens. A 429 must not create it.
|
|
215
|
-
assert.equal(
|
|
216
|
-
existsSync(join(root, "state/cadence-bus/circuit-open.json")), false,
|
|
217
|
-
"no per-cadence circuit may open from a shared rate-limit signal",
|
|
218
|
-
);
|
|
219
|
-
// And it was requeued (deferred), not DLQ'd.
|
|
220
|
-
assert.equal(stats.dlq, 0, "429 never DLQs");
|
|
221
|
-
assert.ok(stats.retries >= 1, "the tick was requeued");
|
|
222
|
-
} finally { await consumer.stop(); await rmRoot(root); }
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
test("band 150 does not silence the inbox at EITHER gate", async () => {
|
|
226
|
-
// Two gates sit between a cadence tick and a spawn, and the 150% rung has to
|
|
227
|
-
// agree with itself across both:
|
|
228
|
-
// 1. `obligationAllowedUnderPosture` — was `kind !== "REACT"`, so every
|
|
229
|
-
// cadence (all SCHEDULEs) was refused, including `messaging-inbound`, the
|
|
230
|
-
// only puller of org DMs into the inbox pipeline.
|
|
231
|
-
// 2. `resource-governor.admit` — treats only `source:"inbox"` as a human
|
|
232
|
-
// reply, and every cadence tick arrives as `source:"cadence"`, so fixing
|
|
233
|
-
// gate 1 alone just moves the silence one hop down.
|
|
234
|
-
const posture = postureForBand(150);
|
|
235
|
-
const gov = await import("../../lib/resource-governor.mjs");
|
|
236
|
-
// An IDLE, roomy machine, injected. `defaultDeps` reads real freemem/loadavg/
|
|
237
|
-
// live-process counts, so asserting against it makes the test a measure of
|
|
238
|
-
// whatever else is running — this test is about the BUDGET rung, nothing else.
|
|
239
|
-
const deps = {
|
|
240
|
-
totalmem: 64 * 1024 ** 3,
|
|
241
|
-
freemem: 48 * 1024 ** 3,
|
|
242
|
-
cpus: 10,
|
|
243
|
-
loadavg: [0.1],
|
|
244
|
-
liveClaude: { count: 0, rssMB: 0 },
|
|
245
|
-
throttleCeiling: Infinity,
|
|
246
|
-
};
|
|
247
|
-
|
|
248
|
-
for (const id of ["inbox-processor", "messaging-inbound"]) {
|
|
249
|
-
assert.equal(
|
|
250
|
-
obligationAllowedUnderPosture(
|
|
251
|
-
{ kind: "SCHEDULE", mode: "guarded", status: "active", human_lane: isHumanLaneCadence(id) },
|
|
252
|
-
posture
|
|
253
|
-
).allowed,
|
|
254
|
-
true,
|
|
255
|
-
`${id} passes the obligation gate`
|
|
256
|
-
);
|
|
257
|
-
assert.notEqual(
|
|
258
|
-
gov.admit({ source: "cadence", mode: posture.mode, humanReply: isHumanLaneCadence(id) }, deps).decision,
|
|
259
|
-
"DEFER",
|
|
260
|
-
`${id} is not deferred by the spawn governor either`
|
|
261
|
-
);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// And discretionary cadences ARE still deferred, at both gates.
|
|
265
|
-
assert.equal(
|
|
266
|
-
obligationAllowedUnderPosture(
|
|
267
|
-
{ kind: "SCHEDULE", mode: "guarded", status: "active", human_lane: isHumanLaneCadence("backlog-executor") },
|
|
268
|
-
posture
|
|
269
|
-
).allowed,
|
|
270
|
-
false
|
|
271
|
-
);
|
|
272
|
-
assert.equal(
|
|
273
|
-
gov.admit({ source: "cadence", mode: posture.mode, humanReply: isHumanLaneCadence("backlog-executor") }, deps).decision,
|
|
274
|
-
"DEFER"
|
|
275
|
-
);
|
|
276
|
-
});
|