feat: add optional proxy usage and human model-key quotas (row333)

This commit is contained in:
jason.woltje committed 2026-10-26 17:55:26 -05:00
1 parent 09a847edaa
commit 503b91e561
68 files changed
+4229 -40

No files matched your search

+10
View File
@@ -5816,3 +5816,13 @@ Before: agents can read the library; supporting-path and push-credential depende
2026-10-26 | Sage | mos1884/#662 scope after330/331landing | ReadQ222/Q261/Q263 and659/660/662; posted bounded human-only factory settings/triage/defaulttwo-roundmandate/trackedno-exemptionflake scope with10acceptance criteria, task662comment1338 exactwholebody/author13GETverified. No implementation/review/gate launched.660c1335notready(review/merge, noVM); gatefacts1329/1334 retained; target integration/fullrunner confirmation follows readiness, no localfallback. Landedproduct/evidence unchanged;657/658backlog. 2026-10-26 | Sage | mos1884/#662 scope after330/331landing | ReadQ222/Q261/Q263 and659/660/662; posted bounded human-only factory settings/triage/defaulttwo-roundmandate/trackedno-exemptionflake scope with10acceptance criteria, task662comment1338 exactwholebody/author13GETverified. No implementation/review/gate launched.660c1335notready(review/merge, noVM); gatefacts1329/1334 retained; target integration/fullrunner confirmation follows readiness, no localfallback. Landedproduct/evidence unchanged;657/658backlog.
2026-10-26 | Sage | Mos1909/1915/1917 real postlanding reviews | Boyd/Dewey/Filbert/Gladstone real authored candidate52ba verdictfiles independently byte/hash-verified, allAPPROVE scoped; Dewey656broaderPARTIAL retained. Formal330R1/331R4 requests failedpre-send/no comments or approvals; no borrowed/copied/mintedkeys. LegacyhelperGETname jason.woltje is NOT ownJarvis, ownslotabsent; rows tracking-open/#436, files cited via normalqueue. NewFilbertNEW-330-01 filedtask665 exactreadback, notlandingreopen/gate. Repair646-648/652-656 remainOPEN untilactualcomments;1917 conditionalbacklog routing retained. #662scope1338posted;660PR405REVISE/notready. Product1968inputs unchanged; no source/helper/test/gate edits/runs; peerjournal prefixes preserved. 2026-10-26 | Sage | Mos1909/1915/1917 real postlanding reviews | Boyd/Dewey/Filbert/Gladstone real authored candidate52ba verdictfiles independently byte/hash-verified, allAPPROVE scoped; Dewey656broaderPARTIAL retained. Formal330R1/331R4 requests failedpre-send/no comments or approvals; no borrowed/copied/mintedkeys. LegacyhelperGETname jason.woltje is NOT ownJarvis, ownslotabsent; rows tracking-open/#436, files cited via normalqueue. NewFilbertNEW-330-01 filedtask665 exactreadback, notlandingreopen/gate. Repair646-648/652-656 remainOPEN untilactualcomments;1917 conditionalbacklog routing retained. #662scope1338posted;660PR405REVISE/notready. Product1968inputs unchanged; no source/helper/test/gate edits/runs; peerjournal prefixes preserved.
## 2026-10-26 — row333/P5 Mos1961 implementation begins (Codex)
Base 09a847eda on isolated t3/model-proxy-p5-quota-usage includes landed 362893d04. Accepted scope: human-only per-key quotas and optional value-free usage queue polling; no 657/658/662 work, live proxy/accounts/credentials, broad gates, queue mutation or push. Parent owns independent review and landing. Runtime overlap coordinated with Sage: collector wiring/tick/close at createUsage; Fethry owns launcher/proxy context. Evidence: agents/codex/work/queue-333/BUILD.md.
## 2026-10-26 — row333/P5 Mos1961 scoped candidate verified (Codex)
Implemented human-only model-key quota settings and human-only optional usage plugin/poll changes, native per-key accounting with trusted current/retiring run attribution, bounded management queue reads with immediate client/upstream value hashing, append-only telemetry isolated from quota decisions, and proxy-labelled Console numbers. No schema/deadline/role/launcher/harness/session/business-route changes. Parent-authorized additive usage registry inventories retain every old entry/assertion. Original limit-stop exact subject assertion caught an extra-run regression; retained RED18, reported before retry, corrected production through separate internal context without changing that assertion. Further missing-context and supplied-ID bypass tests fail closed.
Final scoped current whole-file proof: 174/174 PASS across 24 files, serial nice19/private config and tmp roots, unchanged budgets. Upstream-value mutant killed (4 failures), restored byte-identically, positive restoration plus final GREEN. Evidence and 202-input source freeze: agents/codex/work/queue-333/BUILD.md, source-inputs.sha256 and receipts/24-final-current-wholefiles-green.txt. Own scratch cleaned; worktree retained. Parent owns fresh review and admitted combined/full/browser gates under1014.Q264. No queue mutation, remote post, push, merge or landing.
+33
View File
@@ -0,0 +1,33 @@
# row333 P5 implementation — Mos1961
Base: 09a847eda. Branch: t3/model-proxy-p5-quota-usage. Actor: Codex.
Accepted brief: docs/plans/2026-10-24_model-proxy-rows.md P5; associated design D18–D20 with mos-1600 correction.
Queue next codex refused a linked worktree; no canonical mutation. Parent supplied accepted assignment/authority and coordinated runtime collector ownership. No remote issue posting or live configuration/credential reads.
Ruling: preserve existing schema by carrying safe modelKeyId in usage cursor metadata; proxy telemetry uses a separate source excluded from turnRecords and every quota check. Existing account limits stay compatible. A model key daily quota is keys.<12-hex-id> with reset/timeZone; unset remains no quota. Human-only protection applies to model-key limit changes and resets. No launcher/session/harness/business route edits.
Verification uses serial nice19 node tests with private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG and unchanged test budgets. Broad/full gates reserved to parent after row334 target returns. Receipts below are actual command outputs; failures retained.
Parent steering receipts: runtime ownership confirmed createUsage/createLimits collector wiring/tick/close exclusively P5; Fethry avoids this area. Broker changes only usage option accepted by human plugins.set and mustStop run identity. No launch/harness/session/business-route bytes changed.
Exact additive old expectation update authorized by parent: kinds.test.mjs old five-entry Object.keys(KINDS) expected array retains all five in their original order and adds usage. loader.test.mjs complete loaded() expected objects retain all original members and add usage:[]. No old assertion was removed, guard relaxed, timeout increased or sleep added.
First RED receipts: 01-token-red (native key limit incorrectly allows); 02-contract-red (daily key quota, key schema and HTTP method absent); 04-integration-red (new collector absent; native attribution and plugins.set config missing); 08-edges-red (lookup fails open, nonhuman usage writer allowed, Console labels absent); 10-lookup-behavior-red (existing runtime lookup extracted unchanged: missing exception for missing/foreign/ambiguous ownership). 09 captured the preceding missing export, not behavior proof. 05 captured duplicate local variable syntax error, fixed before 06. Runtime fixture failures 12/13 were missing required process identity then incorrect cap extraction; corrected fixture follows actual runtime contract. 14 proves actual model-key issue/preflight, native accounting at key quota, stopping, later launch denial and broker human plugin setting path.
Unexpected existing named failure (reported to parent before any rerun): receipt18 was 169/170, failing `REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check` at limit-stop.test.mjs:61. Cause: additional run in the broker's second mustStop argument violated its existing exact subject contract. Fix keeps that argument unchanged; run moves to a separate internal third context and is consumed by host lookup only. The old assertion remains byte-for-byte unchanged. Correction to initial parent message: the quoted name here is the exact failing test name (the first report paraphrased it).
Scoped receipt19: original contract corrected, 170/170 current whole-file tests GREEN. Parent then required direct native-context/no-bypass regression: receipt20 genuinely RED (`stop:false` on a supplied safe-looking modelKeyId when lookup returned null). Removed that fallback entirely and stripped caller modelKeyId/run from the public check subject. Only trusted host resolver can provide the ID; only the separate third internal context provides run. Receipt21: direct context tests, original unmodified limit-stop file and proxy telemetry whole files 15/15 GREEN. Retiring/current mapping rejects wrong business/instance/run and unknown or ambiguous retained IDs.
Final implementation decisions and evidence:
- Native source records carry only the immutable run modelKeyId. New and retained generations resolve from safe Credentials.status metadata; missing, duplicate, foreign or no-longer-retained mappings fail `proxy-key-refused`. Third mustStop context is internal and associated by the broker from its authenticated session, never an agent argument. Missing context is fail-closed (receipt23 genuine RED `stop:false`, fixed in receipt24).
- `tokens.keys.<12hex>` accepts the daily quota shape, uses daily-quota when reset/timeZone are present, and remains unset by default. Existing named account keys and account daily quotas retain their plugins and contracts. All model-key quota/reset changes and usage module/poll changes are fenced at both organization validation points for every writer, tester included.
- Management queue HTTP GET is fixed to loopback with count=100, original 5-second default and 8 MiB response cap, no retries/redirects. Client api_key and upstream source hash immediately to the first 12 SHA-256 hex characters. Fields are whitelisted; malformed batches are atomic. No raw values, upstream body or arbitrary error text reaches product store/log/view/audit.
- Exactly one bus writer owns the collector, shares one management client, drains once and assigns metadata owners, including retained keys. Unknown msk IDs get reconcile receipts; disabled businesses and foreign unmanaged keys get no telemetry. Polling defaults 15 seconds, accepts integer 1..59 and serializes concurrent ticks. `@proxy/cliproxy-queue` records are append-only but excluded before every native turn record/total/limit decision. Availability and account counts are explicitly proxy-reported in the Console.
- Named upstream-value mutant changed `accountId: sha256(event.source).slice(0,12)` to the raw `event.source`: receipt16 exit1, four tests failed. Restoration matched original client SHA256 f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441, receipt17 positive 15/15. Final receipt24 also runs after restoration and is GREEN.
- Final current whole-file verification: `bash agents/codex/work/queue-333/verify-scoped.sh` → 174/174 PASS, 24 explicitly listed whole files, serial nice19, private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG, original test budgets. Raw output: receipts/24-final-current-wholefiles-green.txt SHA256 3358af061c35d42b00d5ee1e001939534c5e7563d4f5418ea85431605d0b9f6d. Runner SHA256 c8a2bf4539bffe38f3198308fd60e9c1ad338841b406af160ab0739c15394290.
- Source freeze: source-inputs.sha256 enumerates all 202 consumed repository inputs (182 modules/scripts plus 20 schema/PIN/other files), traced on final execution and rehashed unchanged after it. Manifest SHA256 b4662dcafb2aeb27a06e5dbd3b9d0b6d184e8624e344fed351ff20e3b255951b. Raw per-process trace is receipts/source-inputs.raw.jsonl. candidate-sourcepaths.txt and candidate-sourcehashes.sha256 list every changed package file for parent combination; receipts.sha256 covers every raw run and source trace. Runner/trace use no content logging.
- Cleanup: original private mktemp root removed and absence verified; scoped runner EXIT trap removes its separate private root. All fixture servers/stores close through test cleanup. Mutant backup and temporary root marker removed. Isolated worktree retained for parent review; no production process, real proxy, account, config, credential path or provider was contacted.
Limits and handoff: scoped GREEN is not the full landing gate. No package/full gates, Chromium/browser gates, acceptance binary, canonical queue mutation, remote issue post, push, merge or landing was run. Full/browser/combined gates remain with the parent under 1014.Q264 after admission; fresh independent Codex review is the parent's next task. No self-approval is claimed. Base remains 09a847eda and no unlanded662/657/658 feature bytes were imported.
@@ -0,0 +1,31 @@
packages/bus/src/broker.mjs: OK
packages/bus/src/limits.mjs: OK
packages/bus/src/proxy-usage.mjs: OK
packages/bus/src/runtime.mjs: OK
packages/bus/src/usage.mjs: OK
packages/bus/tests/limit-checks.test.mjs: OK
packages/bus/tests/p5-key-context.test.mjs: OK
packages/bus/tests/p5-runtime.test.mjs: OK
packages/bus/tests/proxy-usage.test.mjs: OK
packages/bus/tests/usage.test.mjs: OK
packages/business/src/business.mjs: OK
packages/business/src/launch.mjs: OK
packages/business/src/organization.mjs: OK
packages/business/src/plugin-settings.mjs: OK
packages/business/tests/plugin-settings.test.mjs: OK
packages/business/tests/token-limit-settings.test.mjs: OK
packages/model-proxy/README.md: OK
packages/model-proxy/src/client.mjs: OK
packages/model-proxy/tests/usage-client.test.mjs: OK
packages/plugins/README.md: OK
packages/plugins/limit-check/daily-quota/index.mjs: OK
packages/plugins/limit-check/token-limit/index.mjs: OK
packages/plugins/src/kinds.mjs: OK
packages/plugins/tests/daily-quota.test.mjs: OK
packages/plugins/tests/kinds.test.mjs: OK
packages/plugins/tests/loader.test.mjs: OK
packages/plugins/tests/token-limit.test.mjs: OK
packages/plugins/usage/cliproxy-queue/README.md: OK
packages/plugins/usage/cliproxy-queue/index.mjs: OK
packages/webui/src/public/bus.js: OK
packages/webui/tests/usage-render.test.mjs: OK
@@ -0,0 +1,31 @@
c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5 packages/bus/src/broker.mjs
18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3 packages/bus/src/limits.mjs
5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59 packages/bus/src/proxy-usage.mjs
969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6 packages/bus/src/runtime.mjs
4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29 packages/bus/src/usage.mjs
45870a4903d1996915c0086a6beb4d0a4c75b38386b7c5e6d98b5bc811c3b541 packages/bus/tests/limit-checks.test.mjs
e37114eab9c5f21015ea8e429f0574d3ea34b06263f1e42b83b31b8d2df222a7 packages/bus/tests/p5-key-context.test.mjs
241e779016ffd0b54c5646cb4fac7e21ea1167e77afbd652ff4e01f8d238f99c packages/bus/tests/p5-runtime.test.mjs
84c8351029272b6ee05e7fd81b4cc4453553ceeb7a5127a1333dae63d1336ad5 packages/bus/tests/proxy-usage.test.mjs
2613ba0561572a7d4f753066922fddc90cca812cb0ce2b3e0a9a4d249a15e340 packages/bus/tests/usage.test.mjs
aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9 packages/business/src/business.mjs
0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c packages/business/src/launch.mjs
fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7 packages/business/src/organization.mjs
9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50 packages/business/src/plugin-settings.mjs
f0dfe004905dce31317d85d89a05802db878c3472e765e85dc9f1e04166e1df6 packages/business/tests/plugin-settings.test.mjs
bc6b3a31e8918d70aced7151b91ac4b39afec4081054024b162acb0e8f8fae07 packages/business/tests/token-limit-settings.test.mjs
2e97ddcf7deac43002f60c44571056273ddffd4aa0ed0d86f15f550d958a106e packages/model-proxy/README.md
f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441 packages/model-proxy/src/client.mjs
1ad66d56800a31cfbd387939e640653bc72150f4e73822d9e3c777b3bffbf1e1 packages/model-proxy/tests/usage-client.test.mjs
d54d94604d2f8944292fd5a11be8378afc84c06fb6a04137221bfe1a89c5389c packages/plugins/README.md
3749b9f6dd681ef424ee7d7e4d80ccee87b3655df8cd8fe9ccd0d505dcaaee9b packages/plugins/limit-check/daily-quota/index.mjs
4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524 packages/plugins/limit-check/token-limit/index.mjs
eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78 packages/plugins/src/kinds.mjs
3d4fab56fea4c45c6a317ef41121aa5b6da0502a6ef614b7931f91cafdfc1f71 packages/plugins/tests/daily-quota.test.mjs
f3081e1dbdac20ade2246c743bcbb3934be686f79f378af21c365cd1451893ba packages/plugins/tests/kinds.test.mjs
8588ad7eee0c9ce5de3b53e3b88562812a155a3d791a2bd3413bb1754655d78b packages/plugins/tests/loader.test.mjs
6e96bb96278ec754ca1816a24f49ef677771615ab5cf186ae41969fc2f93d8cc packages/plugins/tests/token-limit.test.mjs
e9deb2504741f45645cd52ea6a1daee031cd2d3d44775a1221e76cec73c6b480 packages/plugins/usage/cliproxy-queue/README.md
6096a577cd5d7e8bf84fd6b98ab284e2f47d5facebd027548e07e6aeec442f96 packages/plugins/usage/cliproxy-queue/index.mjs
3c7a35e25b4c1cfda19ac9466d4b2fbc86c880761a1d04ad3ece8bc485f60f93 packages/webui/src/public/bus.js
39f50991578b98594183390a00efbca84fda90ef61617eea4215e2c75f90b82c packages/webui/tests/usage-render.test.mjs
@@ -0,0 +1,31 @@
packages/bus/src/broker.mjs
packages/bus/src/limits.mjs
packages/bus/src/proxy-usage.mjs
packages/bus/src/runtime.mjs
packages/bus/src/usage.mjs
packages/bus/tests/limit-checks.test.mjs
packages/bus/tests/p5-key-context.test.mjs
packages/bus/tests/p5-runtime.test.mjs
packages/bus/tests/proxy-usage.test.mjs
packages/bus/tests/usage.test.mjs
packages/business/src/business.mjs
packages/business/src/launch.mjs
packages/business/src/organization.mjs
packages/business/src/plugin-settings.mjs
packages/business/tests/plugin-settings.test.mjs
packages/business/tests/token-limit-settings.test.mjs
packages/model-proxy/README.md
packages/model-proxy/src/client.mjs
packages/model-proxy/tests/usage-client.test.mjs
packages/plugins/README.md
packages/plugins/limit-check/daily-quota/index.mjs
packages/plugins/limit-check/token-limit/index.mjs
packages/plugins/src/kinds.mjs
packages/plugins/tests/daily-quota.test.mjs
packages/plugins/tests/kinds.test.mjs
packages/plugins/tests/loader.test.mjs
packages/plugins/tests/token-limit.test.mjs
packages/plugins/usage/cliproxy-queue/README.md
packages/plugins/usage/cliproxy-queue/index.mjs
packages/webui/src/public/bus.js
packages/webui/tests/usage-render.test.mjs
@@ -0,0 +1,25 @@
agents/codex/work/queue-333/receipts/01-token-red.txt: OK
agents/codex/work/queue-333/receipts/02-contract-red.txt: OK
agents/codex/work/queue-333/receipts/03-core-green.txt: OK
agents/codex/work/queue-333/receipts/04-integration-red.txt: OK
agents/codex/work/queue-333/receipts/05-collector-green.txt: OK
agents/codex/work/queue-333/receipts/06-collector-green.txt: OK
agents/codex/work/queue-333/receipts/07-wiring-green.txt: OK
agents/codex/work/queue-333/receipts/08-edges-red.txt: OK
agents/codex/work/queue-333/receipts/09-lookup-red.txt: OK
agents/codex/work/queue-333/receipts/10-lookup-behavior-red.txt: OK
agents/codex/work/queue-333/receipts/11-edges-green.txt: OK
agents/codex/work/queue-333/receipts/12-runtime.txt: OK
agents/codex/work/queue-333/receipts/13-runtime.txt: OK
agents/codex/work/queue-333/receipts/14-runtime.txt: OK
agents/codex/work/queue-333/receipts/15-safety-green.txt: OK
agents/codex/work/queue-333/receipts/16-upstream-value-mutant.txt: OK
agents/codex/work/queue-333/receipts/17-mutant-restored-green.txt: OK
agents/codex/work/queue-333/receipts/18-current-wholefiles.txt: OK
agents/codex/work/queue-333/receipts/19-current-wholefiles-green.txt: OK
agents/codex/work/queue-333/receipts/20-context-bypass-red.txt: OK
agents/codex/work/queue-333/receipts/21-context-green.txt: OK
agents/codex/work/queue-333/receipts/22-final-current-wholefiles-green.txt: OK
agents/codex/work/queue-333/receipts/23-missing-context-red.txt: OK
agents/codex/work/queue-333/receipts/24-final-current-wholefiles-green.txt: OK
agents/codex/work/queue-333/receipts/source-inputs.raw.jsonl: OK
@@ -0,0 +1,25 @@
83116bee02980cd12f66b9db2db0dfe4add8c1d2a19b7de3a3b05c18b0cec8cd agents/codex/work/queue-333/receipts/01-token-red.txt
0f21d268ed7777bcfc0290160f30016932f0f3580d9174daf84158833e693e0f agents/codex/work/queue-333/receipts/02-contract-red.txt
9aa1d4feb1924ac45c8fa9af14714aa8c89ef6ba7d711884f415c6473ffe20af agents/codex/work/queue-333/receipts/03-core-green.txt
11ed664ff680750630dd861bc60cc2cc47cba77575cb63e64001e3271162c33a agents/codex/work/queue-333/receipts/04-integration-red.txt
818e3654c49d95ac81200676c46ebecc8155b101352e4e34ed8907a6b4bd93db agents/codex/work/queue-333/receipts/05-collector-green.txt
304d137843363f96eb9b0bfef8a570b5d2c3ee53fc66da4ebb5e18a571f71fce agents/codex/work/queue-333/receipts/06-collector-green.txt
6bb1254ff078de90dac8503c326422180c5c40df7be6aea569ce6f41cf136a49 agents/codex/work/queue-333/receipts/07-wiring-green.txt
0fe51fde4f88bf85d049b26ebfd3048fbc15db3e6785d14f45b987256744def8 agents/codex/work/queue-333/receipts/08-edges-red.txt
e47bc241fe8bfcc8a84e64a274d51383f143b16b95fe5ffaf3fa5ec5030b5d2c agents/codex/work/queue-333/receipts/09-lookup-red.txt
688dff5c657bfb58c8a4125cbfb4decdb62633d0e1be9b2579dea2d2619db009 agents/codex/work/queue-333/receipts/10-lookup-behavior-red.txt
58ac0ed96465af6571b899402e47dc3cd76f420873975e0ca8df091184c9f322 agents/codex/work/queue-333/receipts/11-edges-green.txt
f3be41efca8f65dbf5a69b2ad5541d090db7f1f084b7d95eca5192cf07fcf0b2 agents/codex/work/queue-333/receipts/12-runtime.txt
9aefb96aa52e8baf033eebf14226c74db255b6047f9fd0a46d5bc20b2b75d04e agents/codex/work/queue-333/receipts/13-runtime.txt
9331e56310edd0a8d31807d9f0b7c1092188eb75be44e0c001f001a751b55654 agents/codex/work/queue-333/receipts/14-runtime.txt
d138c2fa4c79ed4bed64fec95c08ec706e092766d5d74c421a26206d7d844ded agents/codex/work/queue-333/receipts/15-safety-green.txt
10a1ad5d5eecfcdef684f35e861fa2903c2598008ce18b05fb56d2d5460f6fa0 agents/codex/work/queue-333/receipts/16-upstream-value-mutant.txt
25f57b7482a0110a8be18e233e2b216b2d99ea826359d60bf1c72c075da036de agents/codex/work/queue-333/receipts/17-mutant-restored-green.txt
aefa2196d51cf0e957bdf03b769757d27a174bd163627c72aa8c8eb2c47a21da agents/codex/work/queue-333/receipts/18-current-wholefiles.txt
31357c2a88cc3a70ed9fa4b79a43715b34493d9abbb816029f6a8ffac72f4db5 agents/codex/work/queue-333/receipts/19-current-wholefiles-green.txt
4fbae7204515aac046c7b782df18c5fba937fdfc536527740ffeffffe0f59226 agents/codex/work/queue-333/receipts/20-context-bypass-red.txt
764db5e9b464d6b070720977c0a62edbd4e9329ca918cedc1ee69419da96d47d agents/codex/work/queue-333/receipts/21-context-green.txt
5d45ed8ea8e79e91c4b41a59239824ef05cfa924a55b3cc6fb163120027ed441 agents/codex/work/queue-333/receipts/22-final-current-wholefiles-green.txt
f6928aae72409ec0e8b13da469c5a957ebc8f6ae1911dfeec8c681359fc4b429 agents/codex/work/queue-333/receipts/23-missing-context-red.txt
3358af061c35d42b00d5ee1e001939534c5e7563d4f5418ea85431605d0b9f6d agents/codex/work/queue-333/receipts/24-final-current-wholefiles-green.txt
9c16aa4b8e6d81aa5b9867fec5e0890b22e90db5c307da55badfcfa9f240aef1 agents/codex/work/queue-333/receipts/source-inputs.raw.jsonl
@@ -0,0 +1,43 @@
✔ REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report (3.955474ms)
✔ REQ-LIMIT-3 each subject kind refuses at its limit and allows under it (1.336324ms)
✔ REQ-LIMIT-3 a limit covers only its own subject's records and launches (0.329981ms)
✔ REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart (0.256881ms)
✔ REQ-LIMIT-3 a reset moves since: records before it no longer count (0.171382ms)
✔ REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named (0.142272ms)
✔ REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) (0.184471ms)
✔ REQ-LIMIT-3 counts past the safe integer range come back as digit strings (0.143936ms)
✔ REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments (0.65868ms)
✔ REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty (0.216805ms)
✔ REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) (0.16854ms)
✖ P5 a model key ID limit counts stack records by key ID without an account (0.661965ms)
ℹ tests 12
ℹ suites 0
ℹ pass 11
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 51.890649
✖ failing tests:
test at packages/plugins/tests/token-limit.test.mjs:153:1
✖ P5 a model key ID limit counts stack records by key ID without an account (0.661965ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
true !== false
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/plugins/tests/token-limit.test.mjs:158:10)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: true,
expected: false,
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,131 @@
✔ REQ-LIMIT-3 schema: each subject kind, limit 0 and no ceiling are accepted; bad limits, times, keys and undeclared instances refuse (18.6933ms)
✔ REQ-LIMIT-3 the writer stamps since: a new limit gets now, a changed one keeps its time, a different time is refused (266.957706ms)
✔ REQ-LIMIT-3 only tokens.* at schema depth holds token limits: agent limits named `limit` save as sent, and a token limit named `limit` is stamped and reset (259.927876ms)
✔ REQ-LIMIT-3 a reset moves since to now, is logged with its actor, and refuses a path that is not a limit (136.121744ms)
✔ REQ-LIMIT-2 schema: launch.account names a credential set; a daily quota needs a reset and an IANA zone and names the account (27.149735ms)
✔ REQ-LIMIT-2 the writer stamps a daily quota's since, keeps its reset and zone, and a reset moves since (147.184856ms)
✖ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (2.663205ms)
✖ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (7.314165ms)
✖ P5 bad envelope refuses safely with no retry (1.407651ms)
✖ P5 over count refuses safely with no retry (0.970003ms)
✖ P5 missing key refuses safely with no retry (0.457173ms)
✖ P5 bad counts refuses safely with no retry (0.970914ms)
✖ P5 redirect refuses safely with no retry (0.566467ms)
✖ P5 refusal refuses safely with no retry (0.492518ms)
✔ REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report (4.119781ms)
✔ REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since (11.801692ms)
✔ REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota (0.304042ms)
✔ REQ-LIMIT-4 an unknown turn adds nothing and is counted apart (0.440258ms)
✔ REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's (0.636362ms)
✔ REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long (0.3629ms)
✔ REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long (0.307097ms)
✔ REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap (1.317847ms)
✔ REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one (0.410965ms)
✔ REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again (1.040865ms)
✔ REQ-LIMIT-2 counts past the safe integer range come back as digit strings (0.338405ms)
✔ REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments (2.143241ms)
✔ REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty (0.174843ms)
✖ P5 daily quota for a model key ID matches stack key records and resets the next day (0.717346ms)
ℹ tests 28
ℹ suites 0
ℹ pass 19
ℹ fail 9
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1055.443581
✖ failing tests:
test at packages/business/tests/token-limit-settings.test.mjs:154:1
✖ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (2.663205ms)
Error [BusinessError]: unsupported /tmp/mosaic-row333-4L4S3o/tmp/mosaic-business-CbuiLR/businesses/acme.json launch.limits.tokens.keys.012345abcdef key: "reset"
at refuse (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/errors.mjs:12:9)
at rejectUnknownKeys (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/util.mjs:17:33)
at tokenLimit (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/launch.mjs:31:3)
at file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/launch.mjs:57:80
at Array.map (<anonymous>)
at tokenMap (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/launch.mjs:57:51)
at checkTokenLimits (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/launch.mjs:71:48)
at checkLimits (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/launch.mjs:112:52)
at checkLaunch (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/business.mjs:196:16)
at validateBusinessDocument (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/business.mjs:310:57) {
exitCode: 2
}
test at packages/model-proxy/tests/usage-client.test.mjs:21:1
✖ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (7.314165ms)
TypeError: f.client.readUsageQueue is not a function
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:23:33)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
test at packages/model-proxy/tests/usage-client.test.mjs:38:4
✖ P5 bad envelope refuses safely with no retry (1.407651ms)
TypeError: f.client.readUsageQueue is not a function
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:40:33)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
test at packages/model-proxy/tests/usage-client.test.mjs:38:4
✖ P5 over count refuses safely with no retry (0.970003ms)
TypeError: f.client.readUsageQueue is not a function
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:40:33)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
test at packages/model-proxy/tests/usage-client.test.mjs:38:4
✖ P5 missing key refuses safely with no retry (0.457173ms)
TypeError: f.client.readUsageQueue is not a function
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:40:33)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
test at packages/model-proxy/tests/usage-client.test.mjs:38:4
✖ P5 bad counts refuses safely with no retry (0.970914ms)
TypeError: f.client.readUsageQueue is not a function
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:40:33)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
test at packages/model-proxy/tests/usage-client.test.mjs:38:4
✖ P5 redirect refuses safely with no retry (0.566467ms)
TypeError: f.client.readUsageQueue is not a function
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:40:33)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
test at packages/model-proxy/tests/usage-client.test.mjs:38:4
✖ P5 refusal refuses safely with no retry (0.492518ms)
TypeError: f.client.readUsageQueue is not a function
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:40:33)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
test at packages/plugins/tests/daily-quota.test.mjs:173:1
✖ P5 daily quota for a model key ID matches stack key records and resets the next day (0.717346ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
true !== false
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/plugins/tests/daily-quota.test.mjs:178:10)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: true,
expected: false,
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,48 @@
✔ REQ-LIMIT-3 schema: each subject kind, limit 0 and no ceiling are accepted; bad limits, times, keys and undeclared instances refuse (12.739299ms)
✔ REQ-LIMIT-3 the writer stamps since: a new limit gets now, a changed one keeps its time, a different time is refused (233.858718ms)
✔ REQ-LIMIT-3 only tokens.* at schema depth holds token limits: agent limits named `limit` save as sent, and a token limit named `limit` is stamped and reset (274.692946ms)
✔ REQ-LIMIT-3 a reset moves since to now, is logged with its actor, and refuses a path that is not a limit (129.01269ms)
✔ REQ-LIMIT-2 schema: launch.account names a credential set; a daily quota needs a reset and an IANA zone and names the account (24.597721ms)
✔ REQ-LIMIT-2 the writer stamps a daily quota's since, keeps its reset and zone, and a reset moves since (146.514468ms)
✔ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (202.85529ms)
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (14.363195ms)
✔ P5 bad envelope refuses safely with no retry (3.275949ms)
✔ P5 over count refuses safely with no retry (1.650709ms)
✔ P5 missing key refuses safely with no retry (1.355454ms)
✔ P5 bad counts refuses safely with no retry (2.028358ms)
✔ P5 redirect refuses safely with no retry (1.385706ms)
✔ P5 refusal refuses safely with no retry (1.027413ms)
✔ REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report (4.002643ms)
✔ REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since (11.703557ms)
✔ REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota (0.285389ms)
✔ REQ-LIMIT-4 an unknown turn adds nothing and is counted apart (0.427944ms)
✔ REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's (0.664291ms)
✔ REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long (0.359593ms)
✔ REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long (0.292084ms)
✔ REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap (1.428363ms)
✔ REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one (0.427054ms)
✔ REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again (1.066274ms)
✔ REQ-LIMIT-2 counts past the safe integer range come back as digit strings (0.329306ms)
✔ REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments (2.160938ms)
✔ REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty (0.172297ms)
✔ P5 daily quota for a model key ID matches stack key records and resets the next day (0.746089ms)
✔ REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report (1.156529ms)
✔ REQ-LIMIT-3 each subject kind refuses at its limit and allows under it (1.303907ms)
✔ REQ-LIMIT-3 a limit covers only its own subject's records and launches (0.353216ms)
✔ REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart (0.2777ms)
✔ REQ-LIMIT-3 a reset moves since: records before it no longer count (0.150391ms)
✔ REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named (0.1377ms)
✔ REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) (0.170332ms)
✔ REQ-LIMIT-3 counts past the safe integer range come back as digit strings (0.135122ms)
✔ REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments (0.635473ms)
✔ REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty (0.62587ms)
✔ REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) (0.130727ms)
✔ P5 a model key ID limit counts stack records by key ID without an account (0.11813ms)
ℹ tests 40
ℹ suites 0
ℹ pass 40
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1270.553008
@@ -0,0 +1,80 @@
node:internal/modules/esm/resolve:272
throw new ERR_MODULE_NOT_FOUND(
^
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/proxy-usage.mjs' imported from /home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/proxy-usage.test.mjs
at finalizeResolution (node:internal/modules/esm/resolve:272:11)
at moduleResolve (node:internal/modules/esm/resolve:879:10)
at defaultResolve (node:internal/modules/esm/resolve:1006:11)
at #cachedDefaultResolve (node:internal/modules/esm/loader:708:20)
at #resolveAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:728:38)
at ModuleLoader.resolveSync (node:internal/modules/esm/loader:766:56)
at #resolve (node:internal/modules/esm/loader:690:17)
at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:610:35)
at ModuleJob.syncLink (node:internal/modules/esm/module_job:277:33)
at ModuleJob.link (node:internal/modules/esm/module_job:389:17) {
code: 'ERR_MODULE_NOT_FOUND',
url: 'file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/proxy-usage.mjs'
}
Node.js v26.8.1
✖ packages/bus/tests/proxy-usage.test.mjs (51.269919ms)
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (51.514952ms)
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (50.36014ms)
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (46.155638ms)
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (40.267126ms)
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (45.725198ms)
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (45.864606ms)
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (40.628929ms)
✔ usage records are append-only (40.809636ms)
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (46.321713ms)
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (56.488827ms)
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (45.994492ms)
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (46.867774ms)
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (55.909721ms)
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (72.188479ms)
✔ row 65 a run bound without a transcript directory records no-transcript (47.882475ms)
✖ P5 immutable stack key attribution survives rotation and restart without key values (46.501339ms)
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (10.169709ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (136.187046ms)
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (158.840283ms)
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.730784ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (19.213042ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.512701ms)
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (56.368217ms)
✖ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (1.972898ms)
ℹ tests 25
ℹ suites 0
ℹ pass 22
ℹ fail 3
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1344.122542
✖ failing tests:
test at packages/bus/tests/proxy-usage.test.mjs:1:1
✖ packages/bus/tests/proxy-usage.test.mjs (51.269919ms)
'test failed'
test at packages/bus/tests/usage.test.mjs:157:1
✖ P5 immutable stack key attribution survives rotation and restart without key values (46.501339ms)
TypeError: Cannot read properties of undefined (reading '0')
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/usage.test.mjs:162:39)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
test at packages/business/tests/plugin-settings.test.mjs:148:1
✖ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (1.972898ms)
Error: invalid-request
at Object.set (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/src/plugin-settings.mjs:22:13)
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/tests/plugin-settings.test.mjs:150:15)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
code: 'invalid-request'
}
@@ -0,0 +1,56 @@
file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/limits.mjs:126
const key = keyForSubject(business, subject);
^
SyntaxError: Identifier 'key' has already been declared
at compileSourceTextModule (node:internal/modules/esm/utils:355:16)
at ModuleLoader.moduleStrategy (node:internal/modules/esm/translators:93:18)
at #translate (node:internal/modules/esm/loader:441:20)
at afterLoad (node:internal/modules/esm/loader:509:29)
at ModuleLoader.loadAndTranslate (node:internal/modules/esm/loader:514:12)
at #getOrCreateModuleJobAfterResolve (node:internal/modules/esm/loader:567:36)
at afterResolve (node:internal/modules/esm/loader:614:52)
at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:620:12)
at ModuleJob.syncLink (node:internal/modules/esm/module_job:277:33)
at ModuleJob.link (node:internal/modules/esm/module_job:389:17)
Node.js v26.8.1
✖ packages/bus/tests/proxy-usage.test.mjs (51.892872ms)
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (50.378772ms)
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (45.234905ms)
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (44.712639ms)
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (38.834227ms)
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (45.613047ms)
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (61.823662ms)
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (39.178221ms)
✔ usage records are append-only (48.911454ms)
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (44.798699ms)
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (74.440531ms)
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (44.272941ms)
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (45.321015ms)
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (50.132554ms)
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (45.271975ms)
✔ row 65 a run bound without a transcript directory records no-transcript (45.784161ms)
✔ P5 immutable stack key attribution survives rotation and restart without key values (46.660026ms)
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (9.948537ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (133.831911ms)
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (204.184755ms)
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.716312ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (21.420971ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.601618ms)
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (51.983097ms)
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (99.930829ms)
ℹ tests 25
ℹ suites 0
ℹ pass 24
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1470.74285
✖ failing tests:
test at packages/bus/tests/proxy-usage.test.mjs:1:1
✖ packages/bus/tests/proxy-usage.test.mjs (51.892872ms)
'test failed'
@@ -0,0 +1,37 @@
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (65.214926ms)
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (52.537861ms)
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (41.558814ms)
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (41.087812ms)
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (47.727536ms)
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (50.881627ms)
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (45.298282ms)
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (44.997351ms)
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (39.610461ms)
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (45.405893ms)
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (45.836002ms)
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (40.248661ms)
✔ usage records are append-only (40.155769ms)
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (45.604899ms)
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (55.889033ms)
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (44.53629ms)
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (45.80935ms)
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (54.81715ms)
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (46.31434ms)
✔ row 65 a run bound without a transcript directory records no-transcript (46.570895ms)
✔ P5 immutable stack key attribution survives rotation and restart without key values (47.523777ms)
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (9.987571ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (141.127286ms)
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (184.625638ms)
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.650477ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (22.208259ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.619398ms)
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (53.382155ms)
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (100.346538ms)
ℹ tests 29
ℹ suites 0
ℹ pass 29
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1701.08968
@@ -0,0 +1,61 @@
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":0}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"0f9af1a6-ff5d-4a03-8deb-ee3d9ff7a587","source":"@none","code":"baseline-unknown"}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max","run":"run1"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":1}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"139909cd-89c9-47ab-8924-fef1d9125ebc","source":"@none","code":"baseline-unknown"}
✔ REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it (160.313054ms)
✔ REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota (141.082402ms)
✔ REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it (118.409041ms)
✔ REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none (60.812376ms)
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (67.249055ms)
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (48.031566ms)
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (46.042815ms)
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (41.173899ms)
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (52.566146ms)
✔ REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket (131.491274ms)
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (52.546321ms)
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (47.077487ms)
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (46.271817ms)
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (40.225039ms)
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (45.02419ms)
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (47.584801ms)
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (40.815955ms)
✔ usage records are append-only (41.122845ms)
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (45.862091ms)
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (57.327879ms)
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (47.939521ms)
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (46.384741ms)
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (98.373431ms)
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (46.863279ms)
✔ row 65 a run bound without a transcript directory records no-transcript (47.359644ms)
✔ P5 immutable stack key attribution survives rotation and restart without key values (51.503418ms)
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list (1.131497ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.214135ms)
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (0.919785ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.136387ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.149287ms)
✔ P5 usage telemetry is optional, single module, separate from enforcing sources (0.136962ms)
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (8.544145ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.570635ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.394552ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.605144ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.314239ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (30.160706ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (3.027836ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.75119ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.412894ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.793659ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.303983ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.5092ms)
✔ REQ-PLUG-1 REQ-LIMIT-3 a version 1 limit check refuses after the bump to 2, and the old setting stays (2.97048ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.870072ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.648634ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.357607ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.14637ms)
ℹ tests 49
ℹ suites 0
ℹ pass 49
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 2281.541817
@@ -0,0 +1,120 @@
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.223541ms)
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.222664ms)
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (52.7698ms)
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (43.539654ms)
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (42.903925ms)
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (55.045959ms)
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (44.040412ms)
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (47.200469ms)
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (43.887012ms)
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (42.425785ms)
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (44.483506ms)
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (43.702967ms)
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.492979ms)
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (85.991456ms)
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (51.829594ms)
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.348009ms)
✖ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (41.10118ms)
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (39.693163ms)
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (9.742544ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (146.282626ms)
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (169.54836ms)
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.751884ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (21.391321ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.677099ms)
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (52.536228ms)
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (94.782042ms)
✖ P5 only human can enable/disable telemetry or change polling, including direct organization writes (50.536153ms)
✖ P5 Console displays stack count per safe key separately from optional proxy account numbers (1.0934ms)
✖ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (0.228091ms)
ℹ tests 29
ℹ suites 0
ℹ pass 25
ℹ fail 4
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1398.637079
✖ failing tests:
test at packages/bus/tests/limit-checks.test.mjs:328:1
✖ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (41.10118ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
{
+ allow: true
- allow: false,
- check: null,
- code: 'proxy-key-refused'
}
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/limit-checks.test.mjs:333:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: { allow: true },
expected: { allow: false, check: null, code: 'proxy-key-refused' },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/business/tests/plugin-settings.test.mjs:161:1
✖ P5 only human can enable/disable telemetry or change polling, including direct organization writes (50.536153ms)
AssertionError [ERR_ASSERTION]: Missing expected exception.
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/business/tests/plugin-settings.test.mjs:163:56)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: undefined,
expected: { code: 'organization-usage-human-only' },
operator: 'throws',
diff: 'simple'
}
test at packages/webui/tests/usage-render.test.mjs:10:1
✖ P5 Console displays stack count per safe key separately from optional proxy account numbers (1.0934ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /Key: 012345abcdef/. Input:
'<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Best reading of session-editable transcripts, not proof. Unknown turns may have used more tokens. Account is unassigned until account tracking is configured.</p><div class="table-wrap"><table id="token-usage-table"><thead><tr><th scope="col">Subject</th><th scope="col">Input</th><th scope="col">Output</th><th scope="col">Cache write</th><th scope="col">Cache read</th><th scope="col">Unknown turns</th></tr></thead><tbody><tr><th scope="row">Total</th><td>2</td><td>3</td><td>4</td><td>5</td><td>0</td></tr></tbody></table></div></section>'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/webui/tests/usage-render.test.mjs:12:34)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.start (node:internal/test_runner/test:1262:17)
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: '<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Best reading of session-editable transcripts, not proof. Unknown turns may have used more tokens. Account is unassigned until account tracking is configured.</p><div class="table-wrap"><table id="token-usage-table"><thead><tr><th scope="col">Subject</th><th scope="col">Input</th><th scope="col">Output</th><th scope="col">Cache write</th><th scope="col">Cache read</th><th scope="col">Unknown turns</th></tr></thead><tbody><tr><th scope="row">Total</th><td>2</td><td>3</td><td>4</td><td>5</td><td>0</td></tr></tbody></table></div></section>',
expected: /Key: 012345abcdef/,
operator: 'match',
diff: 'simple'
}
test at packages/webui/tests/usage-render.test.mjs:17:1
✖ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (0.228091ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /unavailable/. Input:
'<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Best reading of session-editable transcripts, not proof. Unknown turns may have used more tokens. Account is unassigned until account tracking is configured.</p><div class="table-wrap"><table id="token-usage-table"><thead><tr><th scope="col">Subject</th><th scope="col">Input</th><th scope="col">Output</th><th scope="col">Cache write</th><th scope="col">Cache read</th><th scope="col">Unknown turns</th></tr></thead><tbody><tr><th scope="row">Total</th><td>2</td><td>3</td><td>4</td><td>5</td><td>0</td></tr></tbody></table></div></section>'
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/webui/tests/usage-render.test.mjs:19:42)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: '<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Best reading of session-editable transcripts, not proof. Unknown turns may have used more tokens. Account is unassigned until account tracking is configured.</p><div class="table-wrap"><table id="token-usage-table"><thead><tr><th scope="col">Subject</th><th scope="col">Input</th><th scope="col">Output</th><th scope="col">Cache write</th><th scope="col">Cache read</th><th scope="col">Unknown turns</th></tr></thead><tbody><tr><th scope="row">Total</th><td>2</td><td>3</td><td>4</td><td>5</td><td>0</td></tr></tbody></table></div></section>',
expected: /unavailable/,
operator: 'match',
diff: 'simple'
}
@@ -0,0 +1,59 @@
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.351672ms)
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.197022ms)
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (45.900174ms)
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (48.270064ms)
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (46.136204ms)
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (57.022124ms)
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (45.147203ms)
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (47.845585ms)
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (43.247414ms)
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (45.643077ms)
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (37.420192ms)
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (41.526492ms)
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.579005ms)
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (89.130888ms)
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (53.18557ms)
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.432955ms)
✖ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (45.896754ms)
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (40.6658ms)
✖ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.282933ms)
ℹ tests 19
ℹ suites 0
ℹ pass 17
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 767.199722
✖ failing tests:
test at packages/bus/tests/limit-checks.test.mjs:328:1
✖ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (45.896754ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
{
+ allow: true
- allow: false,
- check: null,
- code: 'proxy-key-refused'
}
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/limit-checks.test.mjs:333:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: { allow: true },
expected: { allow: false, check: null, code: 'proxy-key-refused' },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/bus/tests/limit-checks.test.mjs:346:1
✖ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.282933ms)
TypeError: modelUsageKey is not a function
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/limit-checks.test.mjs:351:15)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
@@ -0,0 +1,66 @@
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.471904ms)
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.238869ms)
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (48.889383ms)
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (48.804518ms)
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (47.424391ms)
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (58.732905ms)
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (46.311117ms)
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (52.110899ms)
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (50.032452ms)
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (45.35538ms)
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (45.361587ms)
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (47.343794ms)
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.52398ms)
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (91.231334ms)
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (56.207075ms)
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.2189ms)
✖ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (44.848352ms)
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (43.672096ms)
✖ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.426717ms)
ℹ tests 19
ℹ suites 0
ℹ pass 17
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 816.537108
✖ failing tests:
test at packages/bus/tests/limit-checks.test.mjs:328:1
✖ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (44.848352ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
{
+ allow: true
- allow: false,
- check: null,
- code: 'proxy-key-refused'
}
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/limit-checks.test.mjs:333:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: { allow: true },
expected: { allow: false, check: null, code: 'proxy-key-refused' },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/bus/tests/limit-checks.test.mjs:346:1
✖ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.426717ms)
AssertionError [ERR_ASSERTION]: Missing expected exception.
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/limit-checks.test.mjs:354:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: undefined,
expected: { code: 'proxy-key-refused' },
operator: 'throws',
diff: 'simple'
}
@@ -0,0 +1,38 @@
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.497774ms)
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.231342ms)
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (41.157068ms)
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (47.622762ms)
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (40.772915ms)
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (64.210535ms)
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (41.33012ms)
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (46.47583ms)
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (42.554949ms)
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (42.55839ms)
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (42.856274ms)
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (42.087566ms)
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.540151ms)
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (83.555041ms)
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (50.237156ms)
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.834976ms)
✔ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (41.561579ms)
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (40.600997ms)
✔ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.439799ms)
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (10.470972ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (139.490847ms)
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (177.184056ms)
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.815855ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (21.853399ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.605034ms)
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (52.267349ms)
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (94.963454ms)
✔ P5 only human can enable/disable telemetry or change polling, including direct organization writes (142.850292ms)
✔ P5 Console displays stack count per safe key separately from optional proxy account numbers (0.865798ms)
✔ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (3.686422ms)
ℹ tests 30
ℹ suites 0
ℹ pass 30
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1490.937181
@@ -0,0 +1,30 @@
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["75a1bce4e569"]}
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["75a1bce4e569"]}
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["75a1bce4e569","9e2b7988546b"]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["75a1bce4e569","9e2b7988546b"]}
model-proxy: {"action":"proxy.key.issued","keyIds":["9e2b7988546b"],"instance":"demo/coder"}
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["9e2b7988546b"]}
organization: {"event":"reload-needs-restart","business":"demo"}
✖ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (212.342125ms)
ℹ tests 1
ℹ suites 0
ℹ pass 0
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 343.620467
✖ failing tests:
test at packages/bus/tests/p5-runtime.test.mjs:13:1
✖ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (212.342125ms)
Error: invalid-launch-process
at Object.bindLaunch (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/runtime.mjs:641:15)
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/p5-runtime.test.mjs:41:16)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
code: 'invalid-launch-process'
}
@@ -0,0 +1,32 @@
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["44299c50ade8"]}
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["44299c50ade8"]}
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["44299c50ade8","9f64355841b6"]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["44299c50ade8","9f64355841b6"]}
model-proxy: {"action":"proxy.key.issued","keyIds":["9f64355841b6"],"instance":"demo/coder"}
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["9f64355841b6"]}
organization: {"event":"reload-needs-restart","business":"demo"}
✖ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (218.643013ms)
ℹ tests 1
ℹ suites 0
ℹ pass 0
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 343.099863
✖ failing tests:
test at packages/bus/tests/p5-runtime.test.mjs:14:1
✖ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (218.643013ms)
Error: unauthenticated
at fail (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/broker.mjs:230:9)
at #session (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/broker.mjs:657:39)
at Broker.request (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/src/broker.mjs:4817:28)
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/p5-runtime.test.mjs:43:13)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
code: 'unauthenticated'
}
@@ -0,0 +1,20 @@
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["deae56d6265f"]}
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["deae56d6265f"]}
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["deae56d6265f","f39c9ad3cf05"]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["deae56d6265f","f39c9ad3cf05"]}
model-proxy: {"action":"proxy.key.issued","keyIds":["f39c9ad3cf05"],"instance":"demo/coder"}
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["f39c9ad3cf05"]}
organization: {"event":"reload-needs-restart","business":"demo"}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":null,"model":null,"account":null,"run":"p5-run","modelKeyId":"f39c9ad3cf05"},"path":["tokens","keys","f39c9ad3cf05"],"limit":2,"count":2,"unknownTurns":0}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"fixture","model":"fake","account":null,"modelKeyId":"f39c9ad3cf05"},"path":["tokens","keys","f39c9ad3cf05"],"limit":2,"count":2,"unknownTurns":0}
organization: {"event":"reload-needs-restart","business":"demo"}
✔ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (304.08638ms)
ℹ tests 1
ℹ suites 0
ℹ pass 1
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 420.753441
@@ -0,0 +1,40 @@
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (86.257274ms)
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (54.618111ms)
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (44.583676ms)
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (46.4743ms)
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (56.121284ms)
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (47.108755ms)
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (49.990509ms)
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (56.900609ms)
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (51.730832ms)
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (50.614029ms)
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (44.230231ms)
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (48.44147ms)
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (45.801767ms)
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (39.52636ms)
✔ usage records are append-only (37.948303ms)
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (47.7119ms)
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (55.743022ms)
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (57.173303ms)
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (41.62154ms)
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (46.188396ms)
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (46.675381ms)
✔ row 65 a run bound without a transcript directory records no-transcript (43.283736ms)
✔ P5 immutable stack key attribution survives rotation and restart without key values (46.409665ms)
✔ P5 malformed key metadata is dropped rather than stored or exposed as a key value (45.477235ms)
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (14.43995ms)
✔ P5 bad envelope refuses safely with no retry (2.606864ms)
✔ P5 over count refuses safely with no retry (1.613165ms)
✔ P5 missing key refuses safely with no retry (1.32277ms)
✔ P5 bad counts refuses safely with no retry (2.00608ms)
✔ P5 redirect refuses safely with no retry (1.518136ms)
✔ P5 refusal refuses safely with no retry (1.062337ms)
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.122725ms)
ℹ tests 32
ℹ suites 0
ℹ pass 32
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1490.423611
@@ -0,0 +1,99 @@
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (60.34137ms)
✖ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (43.55479ms)
✖ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (42.788302ms)
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (43.315969ms)
✖ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (40.209703ms)
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (38.596309ms)
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (45.908134ms)
✖ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (16.729146ms)
✔ P5 bad envelope refuses safely with no retry (3.674119ms)
✔ P5 over count refuses safely with no retry (1.818219ms)
✔ P5 missing key refuses safely with no retry (1.550156ms)
✔ P5 bad counts refuses safely with no retry (2.537033ms)
✔ P5 redirect refuses safely with no retry (1.858685ms)
✔ P5 refusal refuses safely with no retry (1.153412ms)
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.135306ms)
ℹ tests 15
ℹ suites 0
ℹ pass 11
ℹ fail 4
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 487.776777
✖ failing tests:
test at packages/bus/tests/proxy-usage.test.mjs:36:1
✖ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (43.55479ms)
TypeError: Cannot read properties of undefined (reading 'keyId')
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/proxy-usage.test.mjs:38:87)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
test at packages/bus/tests/proxy-usage.test.mjs:47:1
✖ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (42.788302ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ undefined
- {
- action: 'proxy.usage.reconcile',
- code: 'proxy-usage-unknown-key',
- keyId: 'f76403e5ce2e'
- }
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/proxy-usage.test.mjs:49:9)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: undefined,
expected: { action: 'proxy.usage.reconcile', keyId: 'f76403e5ce2e', code: 'proxy-usage-unknown-key' },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/bus/tests/proxy-usage.test.mjs:58:1
✖ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (40.209703ms)
AssertionError [ERR_ASSERTION]: Missing expected exception.
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/proxy-usage.test.mjs:63:9)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: undefined,
expected: /append-only/,
operator: 'throws',
diff: 'simple'
}
test at packages/model-proxy/tests/usage-client.test.mjs:21:1
✖ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (16.729146ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
[
{
+ accountId: 'made-up-upstream-canary',
- accountId: '51dfa8a6722b',
cacheRead: 4,
cacheWrite: 3,
failed: true,
input: 7,
keyId: 'd1e3e19ac482',
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/model-proxy/tests/usage-client.test.mjs:24:10)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: [ { keyId: 'd1e3e19ac482', accountId: 'made-up-upstream-canary', managed: true, failed: true, statusCode: 503, input: 7, output: 2, cacheWrite: 3, cacheRead: 4 } ],
expected: [ { keyId: 'd1e3e19ac482', accountId: '51dfa8a6722b', managed: true, failed: true, statusCode: 503, input: 7, output: 2, cacheWrite: 3, cacheRead: 4 } ],
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,23 @@
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (63.115978ms)
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (53.184947ms)
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (43.353706ms)
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (42.937785ms)
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (48.231864ms)
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (42.352423ms)
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (43.470712ms)
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (15.069336ms)
✔ P5 bad envelope refuses safely with no retry (2.896886ms)
✔ P5 over count refuses safely with no retry (1.591065ms)
✔ P5 missing key refuses safely with no retry (1.351768ms)
✔ P5 bad counts refuses safely with no retry (2.127704ms)
✔ P5 redirect refuses safely with no retry (1.349646ms)
✔ P5 refusal refuses safely with no retry (1.162024ms)
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.135262ms)
ℹ tests 15
ℹ suites 0
ℹ pass 15
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 508.770711
@@ -0,0 +1,243 @@
serial nice19; private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG; unchanged whole-file budgets
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":0}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"bc8872d6-c10d-4cbc-963c-dd87cf9163e5","source":"@none","code":"baseline-unknown"}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max","run":"run1"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":1}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"3e17a52f-1444-4d91-a204-87e39766f9c6","source":"@none","code":"baseline-unknown"}
✔ REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it (170.726529ms)
✔ REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota (145.594621ms)
✔ REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it (126.673361ms)
✔ REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none (67.580463ms)
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.298781ms)
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.222463ms)
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (47.459097ms)
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (46.035967ms)
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (45.718506ms)
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (57.755296ms)
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (45.052811ms)
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (51.313528ms)
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (46.094531ms)
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (48.189649ms)
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (44.413841ms)
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (46.465199ms)
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.636118ms)
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (87.250164ms)
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (52.454059ms)
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (2.054757ms)
✔ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (42.170203ms)
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (41.545306ms)
✔ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.418717ms)
✖ REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check (106.432474ms)
✔ REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit (170.782587ms)
✔ REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code (437.666292ms)
✔ REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit (120.745836ms)
✔ REQ-LIMIT-4 a broker with no limit checks configured never stops a run (80.230732ms)
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mayLaunch","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":0}
organization: {"event":"reload-needs-restart","business":"demo"}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"3646df55-73df-46ac-a828-41d4c0adef5c","source":"@none","code":"baseline-unknown"}
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mustStop","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null,"run":"run1"},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":1}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"ae4d4f3a-9306-4a9d-88c5-234c2f2bfcaf","source":"@none","code":"baseline-unknown"}
✔ REQ-LIMIT-3 REQ-LIMIT-4 runtime: limits carries the token count, mayLaunch refuses at the limit, a reset moves since (243.095091ms)
organization: {"event":"reload-needs-restart","business":"demo"}
✔ REQ-LIMIT-3 runtime: with no limit check switched on, the limit shows not enforced and every launch is allowed (90.928952ms)
✔ REQ-LIMIT-4 runtime: the broker asks the shipped token-limit after a turn, and the run at its limit stops on its next receive (143.039435ms)
✔ REQ-LIMIT-4 runtime: with no usage source a turn is unknown, counts zero and stops nothing under a limit of 1 (136.591564ms)
✔ REQ-LIMIT-3 runtime: switching a limit check on with plugins.set loads it without a launch or a turn (171.913947ms)
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["ddaa88bc74e9"]}
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["ddaa88bc74e9"]}
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["ddaa88bc74e9","fd2b06e41cec"]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["ddaa88bc74e9","fd2b06e41cec"]}
model-proxy: {"action":"proxy.key.issued","keyIds":["fd2b06e41cec"],"instance":"demo/coder"}
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["fd2b06e41cec"]}
organization: {"event":"reload-needs-restart","business":"demo"}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":null,"model":null,"account":null,"run":"p5-run","modelKeyId":"fd2b06e41cec"},"path":["tokens","keys","fd2b06e41cec"],"limit":2,"count":2,"unknownTurns":0}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"fixture","model":"fake","account":null,"modelKeyId":"fd2b06e41cec"},"path":["tokens","keys","fd2b06e41cec"],"limit":2,"count":2,"unknownTurns":0}
organization: {"event":"reload-needs-restart","business":"demo"}
✔ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (313.95876ms)
organization: {"event":"reload-needs-restart","business":"demo"}
organization: {"event":"reload-needs-restart","business":"demo"}
organization: {"event":"reload-needs-restart","business":"demo"}
organization: {"event":"reload-needs-restart","business":"demo"}
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (100.42834ms)
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (261.328835ms)
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (199.005826ms)
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (59.508865ms)
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (54.132395ms)
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (42.918239ms)
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (47.414676ms)
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (49.580277ms)
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (42.767702ms)
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (44.597112ms)
✔ REQ-LIMIT-4 usage protocol binds run identity, requires a delivered turn and isolates businesses (115.479121ms)
✔ REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket (137.456433ms)
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (52.575663ms)
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (47.838399ms)
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (46.771667ms)
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (40.568247ms)
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (45.022848ms)
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (44.520995ms)
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (38.477112ms)
✔ usage records are append-only (38.207707ms)
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (49.361853ms)
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (59.674051ms)
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (52.284427ms)
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (54.284346ms)
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (54.236183ms)
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (50.417947ms)
✔ row 65 a run bound without a transcript directory records no-transcript (49.190606ms)
✔ P5 immutable stack key attribution survives rotation and restart without key values (45.910581ms)
✔ P5 malformed key metadata is dropped rather than stored or exposed as a key value (45.051417ms)
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (9.756957ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (139.461766ms)
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (198.116707ms)
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.940571ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (23.77339ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.651382ms)
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (56.64271ms)
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (100.452598ms)
✔ P5 only human can enable/disable telemetry or change polling, including direct organization writes (148.009247ms)
✔ REQ-LIMIT-3 schema: each subject kind, limit 0 and no ceiling are accepted; bad limits, times, keys and undeclared instances refuse (12.986058ms)
✔ REQ-LIMIT-3 the writer stamps since: a new limit gets now, a changed one keeps its time, a different time is refused (248.032277ms)
✔ REQ-LIMIT-3 only tokens.* at schema depth holds token limits: agent limits named `limit` save as sent, and a token limit named `limit` is stamped and reset (276.275719ms)
✔ REQ-LIMIT-3 a reset moves since to now, is logged with its actor, and refuses a path that is not a limit (149.313217ms)
✔ REQ-LIMIT-2 schema: launch.account names a credential set; a daily quota needs a reset and an IANA zone and names the account (22.104886ms)
✔ REQ-LIMIT-2 the writer stamps a daily quota's since, keeps its reset and zone, and a reset moves since (155.859496ms)
✔ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (232.766603ms)
✔ probeKey observes 200 with one agent-authenticated GET /v1/models (13.606016ms)
✔ probeKey observes 401 with one agent-authenticated GET /v1/models (2.349516ms)
✔ probeKey observes 503 with one agent-authenticated GET /v1/models (1.394451ms)
✔ proxy-down: agent-key probe connection failure is sanitized (1.448631ms)
✔ proxy-down: silent listener cannot extend probe request deadline (50.92774ms)
✔ agent-key probe returns redirect status without following Location or exposing key (2.519341ms)
✔ proxy-client-invalid: https://127.0.0.1:18318 (0.954469ms)
✔ proxy-client-invalid: http://example.com:18318 (0.688091ms)
✔ proxy-client-invalid: http://localhost:18318 (0.089486ms)
✔ proxy-client-invalid: http://127.0.0.1:8317 (0.072442ms)
✔ proxy-client-invalid: http://user:[email protected]:18318 (0.075664ms)
✔ proxy-client-invalid: http://127.0.0.1:18318/path (0.064187ms)
✔ client GET/PUT v8 only, Authorization header, receipt IDs without values or bodies (15.756687ms)
✔ proxy-client-refused (3.167201ms)
✔ proxy-client-response (1.333201ms)
✔ proxy-client-redirect (1.083098ms)
✔ proxy-client-down: transport errors redact details (0.993207ms)
✔ proxy-client-invalid: PUT rejects object key records and empty strings locally (0.155978ms)
✔ proxy-management-key-invalid: missing, symlink and public key file refuse without values (1.086163ms)
✔ bus management-key loader supplies a private fixture key without exposing it on the client (0.529214ms)
✔ proxy-client-response: truncated response remains a redacted named refusal (12.081487ms)
✔ management client ignores ambient fetch dispatchers (1.152012ms)
✔ proxy-key-invalid: Latin-1 leaves complete config/data inventories unchanged (3.391538ms)
✔ proxy-key-invalid: leading space leaves complete config/data inventories unchanged (1.062708ms)
✔ proxy-key-invalid: trailing space leaves complete config/data inventories unchanged (1.046332ms)
✔ proxy-key-invalid: internal space leaves complete config/data inventories unchanged (1.087954ms)
✔ printable non-space ASCII control initializes and authenticates with unchanged existing files (16.664061ms)
✔ OAuth management calls keep URL and state out of receipts (16.723462ms)
✔ upstream key goes only in request body and upstream refusal body is discarded (3.387523ms)
✔ redirected management calls are not followed or retried (1.835042ms)
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (14.543908ms)
✔ P5 bad envelope refuses safely with no retry (2.805976ms)
✔ P5 over count refuses safely with no retry (1.641432ms)
✔ P5 missing key refuses safely with no retry (1.977544ms)
✔ P5 bad counts refuses safely with no retry (1.458ms)
✔ P5 redirect refuses safely with no retry (1.387336ms)
✔ P5 refusal refuses safely with no retry (1.028864ms)
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.11627ms)
✔ REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report (1.248222ms)
✔ REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since (11.695173ms)
✔ REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota (0.286778ms)
✔ REQ-LIMIT-4 an unknown turn adds nothing and is counted apart (0.491571ms)
✔ REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's (0.574704ms)
✔ REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long (0.368738ms)
✔ REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long (0.297179ms)
✔ REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap (0.789063ms)
✔ REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one (0.436754ms)
✔ REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again (1.07467ms)
✔ REQ-LIMIT-2 counts past the safe integer range come back as digit strings (0.372713ms)
✔ REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments (2.387209ms)
✔ REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty (0.190068ms)
✔ P5 daily quota for a model key ID matches stack key records and resets the next day (0.797912ms)
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list (1.067108ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.242701ms)
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (0.499586ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.148124ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.132027ms)
✔ P5 usage telemetry is optional, single module, separate from enforcing sources (0.141236ms)
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (9.357471ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.869634ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.937122ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.673271ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.374164ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (27.658454ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.627026ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.181959ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.491019ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.663113ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.78261ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.634605ms)
✔ REQ-PLUG-1 REQ-LIMIT-3 a version 1 limit check refuses after the bump to 2, and the old setting stays (2.598243ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.844243ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.647337ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.801872ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.263318ms)
✔ REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report (1.188308ms)
✔ REQ-LIMIT-3 each subject kind refuses at its limit and allows under it (1.33092ms)
✔ REQ-LIMIT-3 a limit covers only its own subject's records and launches (0.355614ms)
✔ REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart (0.231653ms)
✔ REQ-LIMIT-3 a reset moves since: records before it no longer count (0.148217ms)
✔ REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named (0.136573ms)
✔ REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) (0.176874ms)
✔ REQ-LIMIT-3 counts past the safe integer range come back as digit strings (0.124961ms)
✔ REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments (0.607578ms)
✔ REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty (0.23856ms)
✔ REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) (0.114066ms)
✔ P5 a model key ID limit counts stack records by key ID without an account (0.118256ms)
✔ P5 Console displays stack count per safe key separately from optional proxy account numbers (0.841797ms)
✔ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (0.176474ms)
✔ REQ-WEB-1 usage read keeps unknown counts and each token kind; no query or write is accepted (25.573147ms)
✔ REQ-WEB-1 malformed usage is refused instead of shown as zero (4.896859ms)
ℹ tests 170
ℹ suites 0
ℹ pass 169
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 9018.08934
✖ failing tests:
test at packages/bus/tests/limit-stop.test.mjs:51:1
✖ REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check (106.432474ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
... Skipped lines
[
{
business: 'demo',
subject: {
account: null,
...
provider: 'anthropic',
+ run: 'run1'
}
},
{
business: 'demo',
subject: {
...
provider: 'anthropic',
+ run: 'run1'
}
}
]
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/limit-stop.test.mjs:61:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: [ { business: 'demo', subject: [Object] }, { business: 'demo', subject: [Object] } ],
expected: [ { business: 'demo', subject: [Object] }, { business: 'demo', subject: [Object] } ],
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,204 @@
serial nice19; private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG; unchanged whole-file budgets
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":0}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"5bb2f720-5e85-4a68-a925-a3353c40a2f8","source":"@none","code":"baseline-unknown"}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":1}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"705b4abe-0076-4b91-a1cc-5086242adeed","source":"@none","code":"baseline-unknown"}
✔ REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it (161.759642ms)
✔ REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota (143.832834ms)
✔ REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it (121.34683ms)
✔ REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none (69.700044ms)
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.251176ms)
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.204566ms)
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (51.271224ms)
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (52.372536ms)
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (45.813258ms)
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (54.966516ms)
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (45.689186ms)
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (47.849713ms)
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (48.476916ms)
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (50.630185ms)
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (43.636714ms)
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (43.52912ms)
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.50935ms)
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (85.225278ms)
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (51.638301ms)
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.900971ms)
✔ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (52.673427ms)
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (41.052561ms)
✔ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.486898ms)
✔ REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check (142.265785ms)
✔ REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit (186.467373ms)
✔ REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code (423.452103ms)
✔ REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit (110.322117ms)
✔ REQ-LIMIT-4 a broker with no limit checks configured never stops a run (77.036392ms)
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mayLaunch","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":0}
organization: {"event":"reload-needs-restart","business":"demo"}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"071301b4-8009-4918-9b07-39907d1d5082","source":"@none","code":"baseline-unknown"}
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mustStop","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":1}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"231aab8c-068f-4e5a-81e9-19b1cf7d34cc","source":"@none","code":"baseline-unknown"}
✔ REQ-LIMIT-3 REQ-LIMIT-4 runtime: limits carries the token count, mayLaunch refuses at the limit, a reset moves since (248.63219ms)
organization: {"event":"reload-needs-restart","business":"demo"}
✔ REQ-LIMIT-3 runtime: with no limit check switched on, the limit shows not enforced and every launch is allowed (87.393715ms)
✔ REQ-LIMIT-4 runtime: the broker asks the shipped token-limit after a turn, and the run at its limit stops on its next receive (140.096907ms)
✔ REQ-LIMIT-4 runtime: with no usage source a turn is unknown, counts zero and stops nothing under a limit of 1 (122.214342ms)
✔ REQ-LIMIT-3 runtime: switching a limit check on with plugins.set loads it without a launch or a turn (161.718448ms)
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["2817f62132a8"]}
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["2817f62132a8"]}
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["2817f62132a8","e87aa1b93018"]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["2817f62132a8","e87aa1b93018"]}
model-proxy: {"action":"proxy.key.issued","keyIds":["e87aa1b93018"],"instance":"demo/coder"}
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["e87aa1b93018"]}
organization: {"event":"reload-needs-restart","business":"demo"}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":null,"model":null,"account":null,"modelKeyId":"e87aa1b93018"},"path":["tokens","keys","e87aa1b93018"],"limit":2,"count":2,"unknownTurns":0}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"fixture","model":"fake","account":null,"modelKeyId":"e87aa1b93018"},"path":["tokens","keys","e87aa1b93018"],"limit":2,"count":2,"unknownTurns":0}
organization: {"event":"reload-needs-restart","business":"demo"}
✔ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (311.047592ms)
organization: {"event":"reload-needs-restart","business":"demo"}
organization: {"event":"reload-needs-restart","business":"demo"}
organization: {"event":"reload-needs-restart","business":"demo"}
organization: {"event":"reload-needs-restart","business":"demo"}
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (99.333676ms)
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (257.002212ms)
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (196.173099ms)
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (58.628561ms)
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (52.79243ms)
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (42.569864ms)
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (41.831504ms)
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (47.808191ms)
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (43.023649ms)
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (42.774113ms)
✔ REQ-LIMIT-4 usage protocol binds run identity, requires a delivered turn and isolates businesses (111.658595ms)
✔ REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket (136.372459ms)
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (52.523881ms)
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (60.980995ms)
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (47.608728ms)
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (40.927657ms)
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (55.771008ms)
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (57.407378ms)
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (42.03284ms)
✔ usage records are append-only (41.064096ms)
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (46.863323ms)
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (51.492502ms)
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (40.548781ms)
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (41.97363ms)
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (50.186944ms)
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (44.545546ms)
✔ row 65 a run bound without a transcript directory records no-transcript (44.101897ms)
✔ P5 immutable stack key attribution survives rotation and restart without key values (44.09141ms)
✔ P5 malformed key metadata is dropped rather than stored or exposed as a key value (44.151576ms)
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (9.654239ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (136.405265ms)
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (164.709168ms)
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.961195ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (20.250129ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.590323ms)
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (50.378509ms)
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (93.589584ms)
✔ P5 only human can enable/disable telemetry or change polling, including direct organization writes (146.907219ms)
✔ REQ-LIMIT-3 schema: each subject kind, limit 0 and no ceiling are accepted; bad limits, times, keys and undeclared instances refuse (14.755461ms)
✔ REQ-LIMIT-3 the writer stamps since: a new limit gets now, a changed one keeps its time, a different time is refused (223.35974ms)
✔ REQ-LIMIT-3 only tokens.* at schema depth holds token limits: agent limits named `limit` save as sent, and a token limit named `limit` is stamped and reset (262.018477ms)
✔ REQ-LIMIT-3 a reset moves since to now, is logged with its actor, and refuses a path that is not a limit (136.45906ms)
✔ REQ-LIMIT-2 schema: launch.account names a credential set; a daily quota needs a reset and an IANA zone and names the account (22.468222ms)
✔ REQ-LIMIT-2 the writer stamps a daily quota's since, keeps its reset and zone, and a reset moves since (146.912888ms)
✔ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (199.214764ms)
✔ probeKey observes 200 with one agent-authenticated GET /v1/models (13.500079ms)
✔ probeKey observes 401 with one agent-authenticated GET /v1/models (2.29275ms)
✔ probeKey observes 503 with one agent-authenticated GET /v1/models (1.453939ms)
✔ proxy-down: agent-key probe connection failure is sanitized (1.448596ms)
✔ proxy-down: silent listener cannot extend probe request deadline (51.226767ms)
✔ agent-key probe returns redirect status without following Location or exposing key (2.599627ms)
✔ proxy-client-invalid: https://127.0.0.1:18318 (0.940367ms)
✔ proxy-client-invalid: http://example.com:18318 (0.110721ms)
✔ proxy-client-invalid: http://localhost:18318 (0.551474ms)
✔ proxy-client-invalid: http://127.0.0.1:8317 (0.085358ms)
✔ proxy-client-invalid: http://user:[email protected]:18318 (0.082245ms)
✔ proxy-client-invalid: http://127.0.0.1:18318/path (0.071237ms)
✔ client GET/PUT v8 only, Authorization header, receipt IDs without values or bodies (16.679264ms)
✔ proxy-client-refused (2.60845ms)
✔ proxy-client-response (1.279043ms)
✔ proxy-client-redirect (1.146966ms)
✔ proxy-client-down: transport errors redact details (0.949938ms)
✔ proxy-client-invalid: PUT rejects object key records and empty strings locally (0.180359ms)
✔ proxy-management-key-invalid: missing, symlink and public key file refuse without values (0.938153ms)
✔ bus management-key loader supplies a private fixture key without exposing it on the client (0.489424ms)
✔ proxy-client-response: truncated response remains a redacted named refusal (12.060482ms)
✔ management client ignores ambient fetch dispatchers (1.377676ms)
✔ proxy-key-invalid: Latin-1 leaves complete config/data inventories unchanged (3.526441ms)
✔ proxy-key-invalid: leading space leaves complete config/data inventories unchanged (1.110569ms)
✔ proxy-key-invalid: trailing space leaves complete config/data inventories unchanged (1.01067ms)
✔ proxy-key-invalid: internal space leaves complete config/data inventories unchanged (1.13613ms)
✔ printable non-space ASCII control initializes and authenticates with unchanged existing files (17.073708ms)
✔ OAuth management calls keep URL and state out of receipts (16.393438ms)
✔ upstream key goes only in request body and upstream refusal body is discarded (3.072175ms)
✔ redirected management calls are not followed or retried (1.57426ms)
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (15.82294ms)
✔ P5 bad envelope refuses safely with no retry (2.96929ms)
✔ P5 over count refuses safely with no retry (1.741334ms)
✔ P5 missing key refuses safely with no retry (1.466913ms)
✔ P5 bad counts refuses safely with no retry (2.929775ms)
✔ P5 redirect refuses safely with no retry (1.463954ms)
✔ P5 refusal refuses safely with no retry (1.03957ms)
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.194237ms)
✔ REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report (1.253421ms)
✔ REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since (12.848519ms)
✔ REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota (0.34571ms)
✔ REQ-LIMIT-4 an unknown turn adds nothing and is counted apart (0.530747ms)
✔ REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's (0.735447ms)
✔ REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long (0.388703ms)
✔ REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long (0.354873ms)
✔ REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap (0.967098ms)
✔ REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one (0.478992ms)
✔ REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again (1.167482ms)
✔ REQ-LIMIT-2 counts past the safe integer range come back as digit strings (0.375179ms)
✔ REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments (2.739059ms)
✔ REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty (0.22961ms)
✔ P5 daily quota for a model key ID matches stack key records and resets the next day (0.935079ms)
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list (1.194208ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.254856ms)
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (1.125412ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.161968ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.141125ms)
✔ P5 usage telemetry is optional, single module, separate from enforcing sources (0.146226ms)
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (9.365221ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (4.138219ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.181488ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (3.076206ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.618445ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (30.33829ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.849943ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.25734ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.597703ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.743636ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.876351ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.717178ms)
✔ REQ-PLUG-1 REQ-LIMIT-3 a version 1 limit check refuses after the bump to 2, and the old setting stays (2.639476ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.884786ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.078835ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.865433ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.252523ms)
✔ REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report (1.15958ms)
✔ REQ-LIMIT-3 each subject kind refuses at its limit and allows under it (1.269598ms)
✔ REQ-LIMIT-3 a limit covers only its own subject's records and launches (0.319894ms)
✔ REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart (0.245595ms)
✔ REQ-LIMIT-3 a reset moves since: records before it no longer count (0.147653ms)
✔ REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named (0.136545ms)
✔ REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) (0.161235ms)
✔ REQ-LIMIT-3 counts past the safe integer range come back as digit strings (0.131986ms)
✔ REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments (0.612439ms)
✔ REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty (0.225872ms)
✔ REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) (0.115054ms)
✔ P5 a model key ID limit counts stack records by key ID without an account (0.118321ms)
✔ P5 Console displays stack count per safe key separately from optional proxy account numbers (0.840194ms)
✔ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (0.169412ms)
✔ REQ-WEB-1 usage read keeps unknown counts and each token kind; no query or write is accepted (25.71419ms)
✔ REQ-WEB-1 malformed usage is refused instead of shown as zero (4.903993ms)
ℹ tests 170
ℹ suites 0
ℹ pass 170
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 8854.156666
@@ -0,0 +1,36 @@
✔ P5 broker preserves original plugin subject and derives internal run context from authenticated native caller (99.462478ms)
✖ P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing (43.555167ms)
✔ P5 internal context resolves exactly current or retained generation; wrong business, instance, run and owner refuse (0.357162ms)
ℹ tests 3
ℹ suites 0
ℹ pass 2
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 237.626033
✖ failing tests:
test at packages/bus/tests/p5-key-context.test.mjs:23:1
✖ P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing (43.555167ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
{
+ stop: false
- check: null,
- code: 'proxy-key-refused',
- stop: true
}
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/p5-key-context.test.mjs:27:9)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: { stop: false },
expected: { stop: true, check: null, code: 'proxy-key-refused' },
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,23 @@
✔ REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check (135.950817ms)
✔ REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit (183.02595ms)
✔ REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code (446.621104ms)
✔ REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit (114.707723ms)
✔ REQ-LIMIT-4 a broker with no limit checks configured never stops a run (71.318028ms)
✔ P5 broker preserves original plugin subject and derives internal run context from authenticated native caller (89.174131ms)
✔ P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing (41.80406ms)
✔ P5 internal context resolves exactly current or retained generation; wrong business, instance, run and owner refuse (0.436962ms)
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (57.810472ms)
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (54.180897ms)
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (41.762914ms)
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (43.65014ms)
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (50.005361ms)
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (42.308399ms)
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (46.350571ms)
ℹ tests 15
ℹ suites 0
ℹ pass 15
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1674.306377
@@ -0,0 +1,207 @@
serial nice19; private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG; unchanged whole-file budgets
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":0}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"4fe53301-641b-494d-a461-847c03170e3f","source":"@none","code":"baseline-unknown"}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":1}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"797da8e3-f04c-4e40-b8e1-bfb60b07c554","source":"@none","code":"baseline-unknown"}
✔ REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it (158.160821ms)
✔ REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota (143.809206ms)
✔ REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it (121.006833ms)
✔ REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none (64.961645ms)
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.220027ms)
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.214936ms)
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (44.021673ms)
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (43.052934ms)
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (40.139268ms)
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (52.680831ms)
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (47.313105ms)
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (46.754294ms)
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (42.493056ms)
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (41.402846ms)
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (41.969573ms)
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (41.694193ms)
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.52246ms)
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (83.096899ms)
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (50.535823ms)
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.710249ms)
✔ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (41.544044ms)
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (39.590387ms)
✔ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.460753ms)
✔ REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check (132.493862ms)
✔ REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit (177.559162ms)
✔ REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code (440.047034ms)
✔ REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit (109.873105ms)
✔ REQ-LIMIT-4 a broker with no limit checks configured never stops a run (77.150566ms)
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mayLaunch","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":0}
organization: {"event":"reload-needs-restart","business":"demo"}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"b338e07c-04c8-4942-902f-484f07e73153","source":"@none","code":"baseline-unknown"}
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mustStop","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":1}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"fd7f45ea-e03c-49dd-a53c-e385fdd5acbf","source":"@none","code":"baseline-unknown"}
✔ REQ-LIMIT-3 REQ-LIMIT-4 runtime: limits carries the token count, mayLaunch refuses at the limit, a reset moves since (245.80231ms)
organization: {"event":"reload-needs-restart","business":"demo"}
✔ REQ-LIMIT-3 runtime: with no limit check switched on, the limit shows not enforced and every launch is allowed (84.052026ms)
✔ REQ-LIMIT-4 runtime: the broker asks the shipped token-limit after a turn, and the run at its limit stops on its next receive (136.937413ms)
✔ REQ-LIMIT-4 runtime: with no usage source a turn is unknown, counts zero and stops nothing under a limit of 1 (118.705264ms)
✔ REQ-LIMIT-3 runtime: switching a limit check on with plugins.set loads it without a launch or a turn (165.970294ms)
✔ P5 broker preserves original plugin subject and derives internal run context from authenticated native caller (90.023506ms)
✔ P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing (42.127316ms)
✔ P5 internal context resolves exactly current or retained generation; wrong business, instance, run and owner refuse (0.383979ms)
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["59bfaebcb056"]}
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["59bfaebcb056"]}
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["59bfaebcb056","fa6669b39602"]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["59bfaebcb056","fa6669b39602"]}
model-proxy: {"action":"proxy.key.issued","keyIds":["fa6669b39602"],"instance":"demo/coder"}
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["fa6669b39602"]}
organization: {"event":"reload-needs-restart","business":"demo"}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":null,"model":null,"account":null,"modelKeyId":"fa6669b39602"},"path":["tokens","keys","fa6669b39602"],"limit":2,"count":2,"unknownTurns":0}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"fixture","model":"fake","account":null,"modelKeyId":"fa6669b39602"},"path":["tokens","keys","fa6669b39602"],"limit":2,"count":2,"unknownTurns":0}
organization: {"event":"reload-needs-restart","business":"demo"}
✔ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (325.548897ms)
organization: {"event":"reload-needs-restart","business":"demo"}
organization: {"event":"reload-needs-restart","business":"demo"}
organization: {"event":"reload-needs-restart","business":"demo"}
organization: {"event":"reload-needs-restart","business":"demo"}
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (104.870501ms)
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (268.507544ms)
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (215.488037ms)
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (60.18695ms)
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (56.879533ms)
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (46.789381ms)
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (43.152978ms)
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (49.497425ms)
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (46.179514ms)
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (46.481349ms)
✔ REQ-LIMIT-4 usage protocol binds run identity, requires a delivered turn and isolates businesses (113.617169ms)
✔ REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket (154.197141ms)
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (55.1487ms)
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (48.001192ms)
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (52.699151ms)
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (43.859028ms)
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (49.684957ms)
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (48.842941ms)
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (46.725304ms)
✔ usage records are append-only (43.666526ms)
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (50.791657ms)
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (67.235771ms)
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (50.444244ms)
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (48.518074ms)
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (52.596237ms)
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (48.989984ms)
✔ row 65 a run bound without a transcript directory records no-transcript (47.601985ms)
✔ P5 immutable stack key attribution survives rotation and restart without key values (58.908338ms)
✔ P5 malformed key metadata is dropped rather than stored or exposed as a key value (48.622269ms)
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (11.123203ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (144.541984ms)
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (186.444017ms)
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (2.070716ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (24.002633ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.819444ms)
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (53.502998ms)
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (102.914554ms)
✔ P5 only human can enable/disable telemetry or change polling, including direct organization writes (153.795381ms)
✔ REQ-LIMIT-3 schema: each subject kind, limit 0 and no ceiling are accepted; bad limits, times, keys and undeclared instances refuse (12.633498ms)
✔ REQ-LIMIT-3 the writer stamps since: a new limit gets now, a changed one keeps its time, a different time is refused (250.719331ms)
✔ REQ-LIMIT-3 only tokens.* at schema depth holds token limits: agent limits named `limit` save as sent, and a token limit named `limit` is stamped and reset (279.391871ms)
✔ REQ-LIMIT-3 a reset moves since to now, is logged with its actor, and refuses a path that is not a limit (143.161688ms)
✔ REQ-LIMIT-2 schema: launch.account names a credential set; a daily quota needs a reset and an IANA zone and names the account (22.600091ms)
✔ REQ-LIMIT-2 the writer stamps a daily quota's since, keeps its reset and zone, and a reset moves since (147.449414ms)
✔ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (211.379051ms)
✔ probeKey observes 200 with one agent-authenticated GET /v1/models (13.650453ms)
✔ probeKey observes 401 with one agent-authenticated GET /v1/models (2.452411ms)
✔ probeKey observes 503 with one agent-authenticated GET /v1/models (1.454096ms)
✔ proxy-down: agent-key probe connection failure is sanitized (1.507584ms)
✔ proxy-down: silent listener cannot extend probe request deadline (51.18593ms)
✔ agent-key probe returns redirect status without following Location or exposing key (2.629896ms)
✔ proxy-client-invalid: https://127.0.0.1:18318 (0.940604ms)
✔ proxy-client-invalid: http://example.com:18318 (0.620294ms)
✔ proxy-client-invalid: http://localhost:18318 (0.082993ms)
✔ proxy-client-invalid: http://127.0.0.1:8317 (0.075406ms)
✔ proxy-client-invalid: http://user:[email protected]:18318 (0.082019ms)
✔ proxy-client-invalid: http://127.0.0.1:18318/path (0.077949ms)
✔ client GET/PUT v8 only, Authorization header, receipt IDs without values or bodies (16.759591ms)
✔ proxy-client-refused (2.644555ms)
✔ proxy-client-response (1.257544ms)
✔ proxy-client-redirect (1.116738ms)
✔ proxy-client-down: transport errors redact details (0.932782ms)
✔ proxy-client-invalid: PUT rejects object key records and empty strings locally (0.174045ms)
✔ proxy-management-key-invalid: missing, symlink and public key file refuse without values (0.93563ms)
✔ bus management-key loader supplies a private fixture key without exposing it on the client (0.481342ms)
✔ proxy-client-response: truncated response remains a redacted named refusal (11.038179ms)
✔ management client ignores ambient fetch dispatchers (1.371561ms)
✔ proxy-key-invalid: Latin-1 leaves complete config/data inventories unchanged (3.426795ms)
✔ proxy-key-invalid: leading space leaves complete config/data inventories unchanged (1.114261ms)
✔ proxy-key-invalid: trailing space leaves complete config/data inventories unchanged (1.011023ms)
✔ proxy-key-invalid: internal space leaves complete config/data inventories unchanged (1.128478ms)
✔ printable non-space ASCII control initializes and authenticates with unchanged existing files (16.93766ms)
✔ OAuth management calls keep URL and state out of receipts (16.303618ms)
✔ upstream key goes only in request body and upstream refusal body is discarded (3.098596ms)
✔ redirected management calls are not followed or retried (1.618972ms)
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (14.682335ms)
✔ P5 bad envelope refuses safely with no retry (2.770996ms)
✔ P5 over count refuses safely with no retry (1.619582ms)
✔ P5 missing key refuses safely with no retry (2.024573ms)
✔ P5 bad counts refuses safely with no retry (1.40751ms)
✔ P5 redirect refuses safely with no retry (1.380605ms)
✔ P5 refusal refuses safely with no retry (0.992984ms)
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.079984ms)
✔ REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report (1.195525ms)
✔ REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since (12.385039ms)
✔ REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota (0.294446ms)
✔ REQ-LIMIT-4 an unknown turn adds nothing and is counted apart (0.448244ms)
✔ REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's (0.585636ms)
✔ REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long (0.344176ms)
✔ REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long (0.309404ms)
✔ REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap (0.823288ms)
✔ REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one (0.462864ms)
✔ REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again (1.053193ms)
✔ REQ-LIMIT-2 counts past the safe integer range come back as digit strings (0.384911ms)
✔ REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments (2.335648ms)
✔ REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty (0.194429ms)
✔ P5 daily quota for a model key ID matches stack key records and resets the next day (0.764141ms)
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list (1.078533ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.243968ms)
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (0.928754ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.133743ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.128969ms)
✔ P5 usage telemetry is optional, single module, separate from enforcing sources (0.180465ms)
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (9.158842ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (4.034236ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.123767ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.857748ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.422702ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (27.290401ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.752498ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.289418ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.561921ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.761977ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.894842ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.759495ms)
✔ REQ-PLUG-1 REQ-LIMIT-3 a version 1 limit check refuses after the bump to 2, and the old setting stays (2.719036ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (2.205867ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.120271ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (103.864421ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.369307ms)
✔ REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report (1.204087ms)
✔ REQ-LIMIT-3 each subject kind refuses at its limit and allows under it (1.293377ms)
✔ REQ-LIMIT-3 a limit covers only its own subject's records and launches (0.332255ms)
✔ REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart (0.241481ms)
✔ REQ-LIMIT-3 a reset moves since: records before it no longer count (0.148082ms)
✔ REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named (0.130431ms)
✔ REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) (0.168183ms)
✔ REQ-LIMIT-3 counts past the safe integer range come back as digit strings (0.134841ms)
✔ REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments (0.611062ms)
✔ REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty (0.218561ms)
✔ REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) (0.116475ms)
✔ P5 a model key ID limit counts stack records by key ID without an account (0.113961ms)
✔ P5 Console displays stack count per safe key separately from optional proxy account numbers (0.908576ms)
✔ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (0.662967ms)
✔ REQ-WEB-1 usage read keeps unknown counts and each token kind; no query or write is accepted (26.726073ms)
✔ REQ-WEB-1 malformed usage is refused instead of shown as zero (5.304556ms)
ℹ tests 173
ℹ suites 0
ℹ pass 173
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 9284.877315
@@ -0,0 +1,37 @@
✔ P5 broker preserves original plugin subject and derives internal run context from authenticated native caller (100.714572ms)
✔ P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing (42.059265ms)
✔ P5 internal context resolves exactly current or retained generation; wrong business, instance, run and owner refuse (0.383747ms)
✖ P5 model-key mustStop without native run context fails closed even when the current key resolves (42.738629ms)
ℹ tests 4
ℹ suites 0
ℹ pass 3
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 276.940054
✖ failing tests:
test at packages/bus/tests/p5-key-context.test.mjs:39:1
✖ P5 model-key mustStop without native run context fails closed even when the current key resolves (42.738629ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
{
+ stop: false
- check: null,
- code: 'proxy-key-refused',
- stop: true
}
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/t3-79263d4f/packages/bus/tests/p5-key-context.test.mjs:43:9)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: { stop: false },
expected: { stop: true, check: null, code: 'proxy-key-refused' },
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,208 @@
serial nice19; private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG; unchanged whole-file budgets
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":0}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"713a4859-153d-4efb-9e60-6abbd4549b0e","source":"@none","code":"baseline-unknown"}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":"anthropic","model":"opus","account":"jason-max"},"path":["tokens","daily","jason-max"],"limit":0,"count":0,"unknownTurns":1}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"6615caa1-e75d-463c-b6b8-789d6dc77e40","source":"@none","code":"baseline-unknown"}
✔ REQ-LIMIT-2 runtime: limits counts the daily quota, and mayLaunch refuses only the account at it (160.549327ms)
✔ REQ-LIMIT-4 runtime: a run bound with the account writes it on its usage records and stops at the quota (143.628999ms)
✔ REQ-LIMIT-4 runtime: a run bound without an account records null and the daily quota never stops it (123.342684ms)
✔ REQ-LIMIT-4 bindLaunch keeps the account off session.launched, refuses one that is not an identifier, and takes null as none (67.349794ms)
✔ REQ-LIMIT-3 limitLeaves finds every limit object and skips the agent numbers (1.271433ms)
✔ REQ-LIMIT-3 limitLeaves takes token limits at schema depth only, whatever their names (0.194636ms)
✔ REQ-LIMIT-3 with no check switched on a launch is allowed, a turn never stops, and every limit is not enforced (45.635942ms)
✔ REQ-LIMIT-3 a fixture check that refuses refuses the launch and stops the turn, logged with the limit and the count (46.176242ms)
✔ REQ-LIMIT-3 a report that omits a limit shows it not enforced; a counted entry and a reason come through (44.938267ms)
✔ REQ-LIMIT-4 each check gets the business, a copy of the limits, the subject, the records and the time (54.558566ms)
✔ REQ-LIMIT-4 fail closed: a throw refuses, stops and fails the report, naming the check and the code (46.342833ms)
✔ REQ-LIMIT-4 fail closed: a malformed answer, a promise, a rejected promise, a non-boolean or a bad hit is malformed-answer (47.766687ms)
✔ REQ-LIMIT-4 fail closed: a check switched on but not loaded refuses, stops and fails every limit as not-loaded (43.59231ms)
✔ REQ-LIMIT-4 state(), never-loaded case: before any load the report shows not enforced, or not-loaded for a switched-on check (48.104463ms)
✔ REQ-LIMIT-4 state(), first-load-refused case: a check refused on its first load is not-loaded in mayLaunch, mustStop and report (42.805959ms)
✔ REQ-LIMIT-4 fail closed: an unreadable organization file refuses and stops with check null; the report throws (43.597155ms)
✔ REQ-LIMIT-4 fail closed: unreadable records refuse and stop with check null and fail the report (0.492317ms)
✔ REQ-LIMIT-3 the shipped token-limit, through the real loader, counts known records only since the limit was set (91.037972ms)
✔ REQ-LIMIT-3 a token limit for a provider named limit is counted and refuses, beside an agent limit of the same name (50.368678ms)
✔ REQ-LIMIT-3 core reaches limit checks only through the plug-in loader (1.715607ms)
✔ P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error (40.810413ms)
✔ P5 trusted lookup uses the retiring run key rather than the agent current key (35.820247ms)
✔ P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run (0.45891ms)
✔ REQ-LIMIT-4 a role run at its limit stops at the end of its turn: RESULT and read land first, the claim is revoked by limit-check (121.318326ms)
✔ REQ-LIMIT-4 the stop also lands on state; a run with no stop ends without a limit (168.385765ms)
✔ REQ-LIMIT-4 fail closed: a mustStop throw or a malformed answer stops the run, naming the bus and the code (417.685568ms)
✔ REQ-LIMIT-4 a thread run at its limit is released with the reason, and its end record names the limit (114.909337ms)
✔ REQ-LIMIT-4 a broker with no limit checks configured never stops a run (77.129589ms)
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mayLaunch","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":0}
organization: {"event":"reload-needs-restart","business":"demo"}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"5c3d20b7-bbe0-44e1-876f-393c04bf33e3","source":"@none","code":"baseline-unknown"}
limits: {"event":"limit-reached","business":"demo","check":"token-limit","export":"mustStop","subject":{"instance":"coder","provider":"zai","model":"glm-5.3-flash","account":null},"path":["tokens","instances","coder"],"limit":0,"count":0,"unknownTurns":1}
usage: {"event":"usage-unknown","business":"demo","run":"run1","instance":"coder","turn":"1ed92631-bf69-4279-8f2e-da5c8c2d9061","source":"@none","code":"baseline-unknown"}
✔ REQ-LIMIT-3 REQ-LIMIT-4 runtime: limits carries the token count, mayLaunch refuses at the limit, a reset moves since (242.78734ms)
organization: {"event":"reload-needs-restart","business":"demo"}
✔ REQ-LIMIT-3 runtime: with no limit check switched on, the limit shows not enforced and every launch is allowed (83.772136ms)
✔ REQ-LIMIT-4 runtime: the broker asks the shipped token-limit after a turn, and the run at its limit stops on its next receive (135.822066ms)
✔ REQ-LIMIT-4 runtime: with no usage source a turn is unknown, counts zero and stops nothing under a limit of 1 (121.123659ms)
✔ REQ-LIMIT-3 runtime: switching a limit check on with plugins.set loads it without a launch or a turn (159.884938ms)
✔ P5 broker preserves original plugin subject and derives internal run context from authenticated native caller (89.685601ms)
✔ P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing (41.975207ms)
✔ P5 internal context resolves exactly current or retained generation; wrong business, instance, run and owner refuse (0.374876ms)
✔ P5 model-key mustStop without native run context fails closed even when the current key resolves (39.706143ms)
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["2ab905e62cf4"]}
model-proxy: {"action":"proxy.reconcile","addedKeyIds":[],"removedKeyIds":[]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["2ab905e62cf4"]}
model-proxy: {"call":"PUT /v8/management/config/access/api-keys","status":200,"keyIds":["2ab905e62cf4","f81b23885f0a"]}
model-proxy: {"call":"GET /v8/management/config/access/api-keys","status":200,"keyIds":["2ab905e62cf4","f81b23885f0a"]}
model-proxy: {"action":"proxy.key.issued","keyIds":["f81b23885f0a"],"instance":"demo/coder"}
model-proxy: {"call":"GET /v1/models","status":200,"keyIds":["f81b23885f0a"]}
organization: {"event":"reload-needs-restart","business":"demo"}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mustStop","subject":{"instance":"coder","provider":null,"model":null,"account":null,"modelKeyId":"f81b23885f0a"},"path":["tokens","keys","f81b23885f0a"],"limit":2,"count":2,"unknownTurns":0}
limits: {"event":"limit-reached","business":"demo","check":"daily-quota","export":"mayLaunch","subject":{"instance":"coder","provider":"fixture","model":"fake","account":null,"modelKeyId":"f81b23885f0a"},"path":["tokens","keys","f81b23885f0a"],"limit":2,"count":2,"unknownTurns":0}
organization: {"event":"reload-needs-restart","business":"demo"}
✔ P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract (319.346483ms)
organization: {"event":"reload-needs-restart","business":"demo"}
organization: {"event":"reload-needs-restart","business":"demo"}
organization: {"event":"reload-needs-restart","business":"demo"}
organization: {"event":"reload-needs-restart","business":"demo"}
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (102.705755ms)
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (258.622237ms)
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (194.943673ms)
✔ P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks (58.879723ms)
✔ P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records (51.610465ms)
✔ P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated (41.842706ms)
✔ P5 queue failure is safe, does not enforce and does not retry before poll deadline (43.265972ms)
✔ P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart (45.846149ms)
✔ P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view (42.767318ms)
✔ P5 concurrent ticks issue one bounded queue read and a closed collector never polls again (42.425739ms)
✔ REQ-LIMIT-4 usage protocol binds run identity, requires a delivered turn and isolates businesses (107.035274ms)
✔ REQ-PLUG-1 runtime reaches transcript only through loader, over the real bus socket (138.029928ms)
✔ REQ-LIMIT-4 loader source records new turn kinds, excludes history and retries exactly once (102.708913ms)
✔ REQ-LIMIT-4 cut: unknown is durable and logged next to every total (51.29996ms)
✔ REQ-LIMIT-4 disabled: unknown is durable and logged next to every total (44.547138ms)
✔ REQ-LIMIT-4 missing-begin: unknown is durable and logged next to every total (40.305662ms)
✔ REQ-LIMIT-4 no-new-usage: unknown is durable and logged next to every total (46.243747ms)
✔ REQ-LIMIT-4 rewrite: unknown is durable and logged next to every total (49.699154ms)
✔ REQ-LIMIT-4 unfinished turn remains visibly unknown after accounting restarts (41.750326ms)
✔ usage records are append-only (44.741061ms)
✔ REQ-LIMIT-4 parse failure logs its safe code, never transcript content (46.066508ms)
✔ REQ-LIMIT-4 resumed run baselines history and exact totals do not overflow (58.388899ms)
✔ REQ-PLUG-1 core has no transcript import and disabled sources do not read any transcript (45.643672ms)
✔ REQ-LIMIT-4 a resumed thread bills only new assistant messages to its next run (46.749719ms)
✔ REQ-LIMIT-4 every enabled source is called; failure is unknown and a partial total stays labelled (51.822533ms)
✔ REQ-LIMIT-4 a turn whose reported sum exceeds safe precision is unknown, not rounded (53.80965ms)
✔ row 65 a run bound without a transcript directory records no-transcript (57.433717ms)
✔ P5 immutable stack key attribution survives rotation and restart without key values (47.921754ms)
✔ P5 malformed key metadata is dropped rather than stored or exposed as a key value (48.881094ms)
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (9.919614ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (141.282316ms)
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (199.085632ms)
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (5.994558ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (29.095644ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (2.986444ms)
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (64.912764ms)
✔ P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict (124.041908ms)
✔ P5 only human can enable/disable telemetry or change polling, including direct organization writes (163.47796ms)
✔ REQ-LIMIT-3 schema: each subject kind, limit 0 and no ceiling are accepted; bad limits, times, keys and undeclared instances refuse (25.815386ms)
✔ REQ-LIMIT-3 the writer stamps since: a new limit gets now, a changed one keeps its time, a different time is refused (253.253525ms)
✔ REQ-LIMIT-3 only tokens.* at schema depth holds token limits: agent limits named `limit` save as sent, and a token limit named `limit` is stamped and reset (294.58611ms)
✔ REQ-LIMIT-3 a reset moves since to now, is logged with its actor, and refuses a path that is not a limit (144.894737ms)
✔ REQ-LIMIT-2 schema: launch.account names a credential set; a daily quota needs a reset and an IANA zone and names the account (26.673634ms)
✔ REQ-LIMIT-2 the writer stamps a daily quota's since, keeps its reset and zone, and a reset moves since (173.373389ms)
✔ P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them (221.557913ms)
✔ probeKey observes 200 with one agent-authenticated GET /v1/models (13.906006ms)
✔ probeKey observes 401 with one agent-authenticated GET /v1/models (2.654873ms)
✔ probeKey observes 503 with one agent-authenticated GET /v1/models (1.465852ms)
✔ proxy-down: agent-key probe connection failure is sanitized (1.484469ms)
✔ proxy-down: silent listener cannot extend probe request deadline (52.146773ms)
✔ agent-key probe returns redirect status without following Location or exposing key (2.580254ms)
✔ proxy-client-invalid: https://127.0.0.1:18318 (0.937801ms)
✔ proxy-client-invalid: http://example.com:18318 (0.535029ms)
✔ proxy-client-invalid: http://localhost:18318 (0.087694ms)
✔ proxy-client-invalid: http://127.0.0.1:8317 (0.069318ms)
✔ proxy-client-invalid: http://user:[email protected]:18318 (0.073249ms)
✔ proxy-client-invalid: http://127.0.0.1:18318/path (0.061539ms)
✔ client GET/PUT v8 only, Authorization header, receipt IDs without values or bodies (16.662783ms)
✔ proxy-client-refused (2.363491ms)
✔ proxy-client-response (1.26715ms)
✔ proxy-client-redirect (1.119781ms)
✔ proxy-client-down: transport errors redact details (0.943923ms)
✔ proxy-client-invalid: PUT rejects object key records and empty strings locally (0.172918ms)
✔ proxy-management-key-invalid: missing, symlink and public key file refuse without values (0.890633ms)
✔ bus management-key loader supplies a private fixture key without exposing it on the client (0.473687ms)
✔ proxy-client-response: truncated response remains a redacted named refusal (10.816438ms)
✔ management client ignores ambient fetch dispatchers (1.14023ms)
✔ proxy-key-invalid: Latin-1 leaves complete config/data inventories unchanged (3.507611ms)
✔ proxy-key-invalid: leading space leaves complete config/data inventories unchanged (1.092119ms)
✔ proxy-key-invalid: trailing space leaves complete config/data inventories unchanged (1.004054ms)
✔ proxy-key-invalid: internal space leaves complete config/data inventories unchanged (1.102862ms)
✔ printable non-space ASCII control initializes and authenticates with unchanged existing files (16.268442ms)
✔ OAuth management calls keep URL and state out of receipts (16.20323ms)
✔ upstream key goes only in request body and upstream refusal body is discarded (3.013252ms)
✔ redirected management calls are not followed or retried (1.543184ms)
✔ P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values (14.200284ms)
✔ P5 bad envelope refuses safely with no retry (2.700404ms)
✔ P5 over count refuses safely with no retry (1.604716ms)
✔ P5 missing key refuses safely with no retry (1.370666ms)
✔ P5 bad counts refuses safely with no retry (2.020663ms)
✔ P5 redirect refuses safely with no retry (1.338733ms)
✔ P5 refusal refuses safely with no retry (0.975888ms)
✔ P5 malformed event after a valid event rejects the entire queue before any credential can escape (1.062269ms)
✔ REQ-LIMIT-2 daily-quota exports interface version 2 with mayLaunch, mustStop and report (1.111774ms)
✔ REQ-LIMIT-2 the count sums every kind of the account's known records since the later of the day start and since (11.668338ms)
✔ REQ-LIMIT-2 a launch with no account (pi) is covered by no daily quota (0.297908ms)
✔ REQ-LIMIT-4 an unknown turn adds nothing and is counted apart (0.432147ms)
✔ REQ-LIMIT-2 the day turns at the reset in its zone, not in UTC, and before it the day is yesterday's (0.598992ms)
✔ REQ-LIMIT-2 the spring DST change makes the day after a 00:00 reset 23 hours long (0.356206ms)
✔ REQ-LIMIT-2 the fall DST change makes the day after a 00:00 reset 25 hours long (0.313154ms)
✔ REQ-LIMIT-2 a reset the clocks skip starts the day at the first instant after the gap (0.81377ms)
✔ REQ-LIMIT-2 a reset the clocks repeat starts one day, at the first one (0.455025ms)
✔ REQ-LIMIT-2 a launch is refused at the quota, a turn that reaches it stops, and the next day allows again (1.086843ms)
✔ REQ-LIMIT-2 counts past the safe integer range come back as digit strings (0.349512ms)
✔ REQ-LIMIT-4 bad leaves, records or times throw a code, and the check reads nothing but its arguments (2.388492ms)
✔ REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is empty (0.195575ms)
✔ P5 daily quota for a model key ID matches stack key records and resets the next day (0.769635ms)
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list (1.012155ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.250245ms)
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (0.922679ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.147977ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.122575ms)
✔ P5 usage telemetry is optional, single module, separate from enforcing sources (0.132403ms)
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (9.032509ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.876412ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.975479ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.818854ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.461598ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (30.463335ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.687366ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.214904ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.519903ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.657821ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.655045ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.640761ms)
✔ REQ-PLUG-1 REQ-LIMIT-3 a version 1 limit check refuses after the bump to 2, and the old setting stays (2.650255ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (2.148582ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.724542ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (103.671706ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.199165ms)
✔ REQ-LIMIT-3 token-limit exports interface version 2 with mayLaunch, mustStop and report (0.667098ms)
✔ REQ-LIMIT-3 each subject kind refuses at its limit and allows under it (1.777171ms)
✔ REQ-LIMIT-3 a limit covers only its own subject's records and launches (0.345096ms)
✔ REQ-LIMIT-4 only known records count; an unknown turn adds nothing and is counted apart (0.242181ms)
✔ REQ-LIMIT-3 a reset moves since: records before it no longer count (0.147915ms)
✔ REQ-LIMIT-3 limit 0 refuses with no records; the first limit hit in file order is named (0.129665ms)
✔ REQ-LIMIT-3 a key limit is not enforced while every record's account is null (decision 150 Q1) (0.156705ms)
✔ REQ-LIMIT-3 counts past the safe integer range come back as digit strings (0.145396ms)
✔ REQ-LIMIT-4 bad records or times throw a code, and the check reads nothing but its arguments (0.617108ms)
✔ REQ-LIMIT-3 no token limits: every launch is allowed and the report is empty (0.218957ms)
✔ REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check enforces (row 126) (0.119273ms)
✔ P5 a model key ID limit counts stack records by key ID without an account (0.120965ms)
✔ P5 Console displays stack count per safe key separately from optional proxy account numbers (0.925558ms)
✔ P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero (0.191209ms)
✔ REQ-WEB-1 usage read keeps unknown counts and each token kind; no query or write is accepted (27.325912ms)
✔ REQ-WEB-1 malformed usage is refused instead of shown as zero (5.087908ms)
ℹ tests 174
ℹ suites 0
ℹ pass 174
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 9323.231998
@@ -0,0 +1,944 @@
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/bus/tests/daily-quota-runtime.test.mjs","sha256":"dbbfa80b4082fd44e2f08539b5455653fac062321b8f2106f638e2d8161fa3eb"}
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
{"path":"packages/bus/src/runtime.mjs","sha256":"969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6"}
{"path":"packages/project/src/index.mjs","sha256":"3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899"}
{"path":"packages/project/src/paths.mjs","sha256":"bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9"}
{"path":"packages/project/src/git.mjs","sha256":"af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e"}
{"path":"packages/seat/src/checkout.mjs","sha256":"5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d"}
{"path":"packages/processing-control/src/effects.mjs","sha256":"3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17"}
{"path":"packages/processing-control/src/runtimes.mjs","sha256":"7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea"}
{"path":"packages/project/src/validate.mjs","sha256":"e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5"}
{"path":"packages/project/src/read.mjs","sha256":"42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c"}
{"path":"packages/library/src/index.mjs","sha256":"98c2c2877549c3e2c5963ec4e49d99ab3b6d6ad54fb3bfae86cf98542207157e"}
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
{"path":"packages/library/src/scope.mjs","sha256":"97e12255f52ad638eeacd152eb26822f9a2aa72cd30e2fed1193f51cd6e56192"}
{"path":"packages/library/src/supporting.mjs","sha256":"6a3b4de2070e62b1cca1c0ab20f2883d3153fc61608d1bf7670cecea08765b4c"}
{"path":"packages/library/src/links.mjs","sha256":"def32a176cb70c86248e45908edde22f9c4c5f88575a4af0a396a05f617358bc"}
{"path":"packages/library/src/reader.mjs","sha256":"ea126533afb7e74b71419eb943febb6b242eb96fc6917d9df1019db3e7e6ce8d"}
{"path":"packages/library/src/render.mjs","sha256":"bfc3de029d3c8f0dcc96c90fde30d6da58bbb5b72d8f13e3f536c0d735c73ca5"}
{"path":"packages/library/src/survey.mjs","sha256":"016bfa5c80572c0baf90ced39cb3d3ec66d395f0be15c2727b9552a9dd849093"}
{"path":"packages/library/src/mirror.mjs","sha256":"26b824d6885e5c6d1b8bd71e754a9fa333c26307693f7e6a0c6a8e6300ecb4ae"}
{"path":"packages/library/src/sync.mjs","sha256":"a58f3aec5ed9b3530b363e2fdbd38bc9ded7635d261ab2fca3cb31c45dcd3dfa"}
{"path":"packages/library/src/index-build.mjs","sha256":"70c1fe75cb2149c9a074d55a6301d5b66157c2dc2e777b92bac338cce09d89c7"}
{"path":"packages/library/src/query.mjs","sha256":"bafe113bee70f17bd249876d6bdd1c08fa051223c2111955e5d5f275bd76bba0"}
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
{"path":"packages/library/src/guard.mjs","sha256":"f710d9600a17f6e2989a289cfe84e58f161d86c7306605946ce05fa71b364eb2"}
{"path":"packages/library/src/reply-protocol.mjs","sha256":"7b46f47b5e9d6b554b5d39bce2cd95c4610f5f35b8ab8fdc5a2864b3214be809"}
{"path":"packages/library/src/write.mjs","sha256":"a301b7c7e3f42f66cb69d88991220f4e236f25a6e5951c61e79ec4ef2b714198"}
{"path":"packages/bus/src/credentials.mjs","sha256":"10485afcf94c29ac9f3d5ba30b12248a2379efd69185ff9fb90e9fed25fe0678"}
{"path":"packages/bus/src/server.mjs","sha256":"8318bed9168ac3f58c09de40a139b68aacefd684e6c117406e181e2ca5ab4ec7"}
{"path":"packages/bus/src/interpreter.mjs","sha256":"56bfc8dcba476886d7de61a1e798aae8e3041c2434c62d44fc40a168d22bb3bd"}
{"path":"packages/bus/src/peercred.mjs","sha256":"29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7"}
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
{"path":"packages/seat/src/session.mjs","sha256":"c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41"}
{"path":"packages/seat/src/proc.mjs","sha256":"382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198"}
{"path":"packages/seat/src/sandbox.mjs","sha256":"0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf"}
{"path":"packages/seat/src/seat.mjs","sha256":"eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15"}
{"path":"packages/seat/src/compactions.mjs","sha256":"c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774"}
{"path":"packages/seat/src/working.mjs","sha256":"621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3"}
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
{"path":"packages/business/src/plugin-settings.mjs","sha256":"9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50"}
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
{"path":"packages/bus/src/proxy-page.mjs","sha256":"af36aae674f46a4e5eacfe176fde8b58cd0b171a6d70e07ee6d479e0f558cce7"}
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
{"path":"packages/bus/src/model-keys.mjs","sha256":"b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550"}
{"path":"packages/business/src/instance-settings.mjs","sha256":"09f2bde85a6d7a8f0b1d1c60ac589b845b0c95e991b2f807758878416b13c6bd"}
{"path":"packages/bus/src/credential-verbs.mjs","sha256":"86b4321dd436b97e389101873197dbab95b3d2202e5ef7da712c4978f4f9159f"}
{"path":"packages/bus/src/business.mjs","sha256":"ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996"}
{"path":"packages/bus/src/web.mjs","sha256":"68efa3c9d0a72095f503208ed5c2e660ef9bca68d3ea15f0fc2f1826a68e09cc"}
{"path":"packages/discord/src/web.mjs","sha256":"e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7"}
{"path":"packages/bus/src/host-run.mjs","sha256":"324c05b16253e0fcfc1a0299d1d8ab45850ea723fad1f67bcc07fc031f50d593"}
{"path":"packages/bus/src/host-grant.mjs","sha256":"48337cdbc41d503f17962d3e3ad014183b1286165f97da6fd88b4faa50be3949"}
{"path":"packages/business/src/hosts.mjs","sha256":"e08b11b70b54f13e3b18996dd903f841e04fd6c64791e96063df8b164c663882"}
{"path":"packages/bus/src/gitea-grant.mjs","sha256":"27d7d5322c2f12641e350867d3ac6f838b33832951e69f057e3a7a28b8ac4d5b"}
{"path":"packages/bus/src/principal.mjs","sha256":"2b1e18be825e8264b16506d6294863acbba812956cfdf8e056f21faaa94f7137"}
{"path":"packages/bus/src/human.mjs","sha256":"bb13c146717cdc46d75d157177e400edac4d3e10f14fe511027a25fd44cec885"}
{"path":"packages/bus/src/tester.mjs","sha256":"5e9e08ca8069e1de35232f26d48a77792388128dda659893909f2d34b5af2346"}
{"path":"packages/business/src/access.mjs","sha256":"af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f"}
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
{"path":"packages/bus/src/proxy-usage.mjs","sha256":"5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59"}
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
{"path":"packages/processing-control/src/coordinator.mjs","sha256":"ddc7318297abc4ec4dd03d425820b7323db609e554cfc5341cfdfa6934271e73"}
{"path":"packages/discord/src/processing.mjs","sha256":"8fa9968862dff77fa6d8be5210c22d13712fd622a8cbc722d167be5be80d0783"}
{"path":"packages/discord/src/binding.mjs","sha256":"5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec"}
{"path":"packages/discord/src/setspark.mjs","sha256":"ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387"}
{"path":"packages/discord/src/errors.mjs","sha256":"917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed"}
{"path":"packages/discord/src/tools.mjs","sha256":"975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f"}
{"path":"packages/discord/src/git.mjs","sha256":"c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7"}
{"path":"packages/discord/src/journal.mjs","sha256":"12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5"}
{"path":"packages/processing-control/src/containers.mjs","sha256":"781973277c09133de15fc39be35b372a79066479097d46923c8ab7782f011dcd"}
{"path":"packages/project/schemas/project.schema.json","sha256":"f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de"}
{"path":"packages/project/schemas/requirement.schema.json","sha256":"79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3"}
{"path":"packages/project/schemas/decision.schema.json","sha256":"925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b"}
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
{"path":"packages/plugins/harness/claude-code/index.mjs","sha256":"a317ac544359d321bb91b67cd87fc6ef431b72df9ac9f7f2a9ff291ed1a9109a"}
{"path":"packages/harness/src/gate.mjs","sha256":"a74ef2db4093c0c797ba9e7e28e4e4df0ceac9040385f00e60a273f39af9610b"}
{"path":"packages/plugins/harness/pi/index.mjs","sha256":"39c225f157b8f66b416625bda689153505743ffcfdc32964bb1f3d2c6fcb73af"}
{"path":"packages/plugins/harness/pi/compactions.mjs","sha256":"aabaf5c4602e28f025c18b2e2ddd6fa0d1648870101a5de0c4424d97b24472dd"}
{"path":"packages/plugins/limit-check/daily-quota/index.mjs","sha256":"3749b9f6dd681ef424ee7d7e4d80ccee87b3655df8cd8fe9ccd0d505dcaaee9b"}
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/bus/tests/limit-checks.test.mjs","sha256":"45870a4903d1996915c0086a6beb4d0a4c75b38386b7c5e6d98b5bc811c3b541"}
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
{"path":"packages/plugins/tests/helpers.mjs","sha256":"5d5e5dccdae3f94b8540d187a8899ec36f9c9933cae3933249c2d8c400c75aa2"}
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
{"path":"packages/plugins/limit-check/token-limit/index.mjs","sha256":"4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524"}
{"path":"packages/bus/src/runtime.mjs","sha256":"969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6"}
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
{"path":"packages/bus/src/process.mjs","sha256":"ed13afdce6359df31d35a79496ebb4afdefef82030a8326a76b2a25b37e98d9d"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/bus/tests/limit-stop.test.mjs","sha256":"561d0950b788d08ad9a79ccd6572ad6976ba4b2e2b1c79d1e4d06827a84c131b"}
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
{"path":"roles/assistant.json","sha256":"5f63ff52aaccf06a0f2415ffdd9d1903c202679cf953bef5266a6841b5e39ab7"}
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/bus/tests/limits-runtime.test.mjs","sha256":"a2e553025edbe6e930c9d03b48289c53b51b153ac9ae49bb21bf721b725f1913"}
{"path":"packages/bus/src/runtime.mjs","sha256":"969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6"}
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
{"path":"packages/project/src/index.mjs","sha256":"3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899"}
{"path":"packages/project/src/paths.mjs","sha256":"bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9"}
{"path":"packages/project/src/git.mjs","sha256":"af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e"}
{"path":"packages/seat/src/checkout.mjs","sha256":"5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d"}
{"path":"packages/processing-control/src/effects.mjs","sha256":"3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17"}
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
{"path":"packages/processing-control/src/runtimes.mjs","sha256":"7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea"}
{"path":"packages/project/src/validate.mjs","sha256":"e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5"}
{"path":"packages/project/src/read.mjs","sha256":"42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c"}
{"path":"packages/library/src/index.mjs","sha256":"98c2c2877549c3e2c5963ec4e49d99ab3b6d6ad54fb3bfae86cf98542207157e"}
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
{"path":"packages/library/src/scope.mjs","sha256":"97e12255f52ad638eeacd152eb26822f9a2aa72cd30e2fed1193f51cd6e56192"}
{"path":"packages/library/src/supporting.mjs","sha256":"6a3b4de2070e62b1cca1c0ab20f2883d3153fc61608d1bf7670cecea08765b4c"}
{"path":"packages/library/src/links.mjs","sha256":"def32a176cb70c86248e45908edde22f9c4c5f88575a4af0a396a05f617358bc"}
{"path":"packages/library/src/reader.mjs","sha256":"ea126533afb7e74b71419eb943febb6b242eb96fc6917d9df1019db3e7e6ce8d"}
{"path":"packages/library/src/render.mjs","sha256":"bfc3de029d3c8f0dcc96c90fde30d6da58bbb5b72d8f13e3f536c0d735c73ca5"}
{"path":"packages/library/src/survey.mjs","sha256":"016bfa5c80572c0baf90ced39cb3d3ec66d395f0be15c2727b9552a9dd849093"}
{"path":"packages/library/src/mirror.mjs","sha256":"26b824d6885e5c6d1b8bd71e754a9fa333c26307693f7e6a0c6a8e6300ecb4ae"}
{"path":"packages/library/src/sync.mjs","sha256":"a58f3aec5ed9b3530b363e2fdbd38bc9ded7635d261ab2fca3cb31c45dcd3dfa"}
{"path":"packages/library/src/index-build.mjs","sha256":"70c1fe75cb2149c9a074d55a6301d5b66157c2dc2e777b92bac338cce09d89c7"}
{"path":"packages/library/src/query.mjs","sha256":"bafe113bee70f17bd249876d6bdd1c08fa051223c2111955e5d5f275bd76bba0"}
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
{"path":"packages/library/src/guard.mjs","sha256":"f710d9600a17f6e2989a289cfe84e58f161d86c7306605946ce05fa71b364eb2"}
{"path":"packages/library/src/reply-protocol.mjs","sha256":"7b46f47b5e9d6b554b5d39bce2cd95c4610f5f35b8ab8fdc5a2864b3214be809"}
{"path":"packages/library/src/write.mjs","sha256":"a301b7c7e3f42f66cb69d88991220f4e236f25a6e5951c61e79ec4ef2b714198"}
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
{"path":"packages/bus/src/credentials.mjs","sha256":"10485afcf94c29ac9f3d5ba30b12248a2379efd69185ff9fb90e9fed25fe0678"}
{"path":"packages/bus/src/server.mjs","sha256":"8318bed9168ac3f58c09de40a139b68aacefd684e6c117406e181e2ca5ab4ec7"}
{"path":"packages/bus/src/interpreter.mjs","sha256":"56bfc8dcba476886d7de61a1e798aae8e3041c2434c62d44fc40a168d22bb3bd"}
{"path":"packages/bus/src/peercred.mjs","sha256":"29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7"}
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
{"path":"packages/seat/src/session.mjs","sha256":"c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41"}
{"path":"packages/seat/src/proc.mjs","sha256":"382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198"}
{"path":"packages/seat/src/sandbox.mjs","sha256":"0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf"}
{"path":"packages/seat/src/seat.mjs","sha256":"eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15"}
{"path":"packages/seat/src/compactions.mjs","sha256":"c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774"}
{"path":"packages/seat/src/working.mjs","sha256":"621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3"}
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
{"path":"packages/business/src/plugin-settings.mjs","sha256":"9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50"}
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
{"path":"packages/bus/src/proxy-page.mjs","sha256":"af36aae674f46a4e5eacfe176fde8b58cd0b171a6d70e07ee6d479e0f558cce7"}
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
{"path":"packages/bus/src/model-keys.mjs","sha256":"b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550"}
{"path":"packages/business/src/instance-settings.mjs","sha256":"09f2bde85a6d7a8f0b1d1c60ac589b845b0c95e991b2f807758878416b13c6bd"}
{"path":"packages/bus/src/credential-verbs.mjs","sha256":"86b4321dd436b97e389101873197dbab95b3d2202e5ef7da712c4978f4f9159f"}
{"path":"packages/bus/src/business.mjs","sha256":"ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996"}
{"path":"packages/bus/src/web.mjs","sha256":"68efa3c9d0a72095f503208ed5c2e660ef9bca68d3ea15f0fc2f1826a68e09cc"}
{"path":"packages/discord/src/web.mjs","sha256":"e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7"}
{"path":"packages/bus/src/host-run.mjs","sha256":"324c05b16253e0fcfc1a0299d1d8ab45850ea723fad1f67bcc07fc031f50d593"}
{"path":"packages/bus/src/host-grant.mjs","sha256":"48337cdbc41d503f17962d3e3ad014183b1286165f97da6fd88b4faa50be3949"}
{"path":"packages/business/src/hosts.mjs","sha256":"e08b11b70b54f13e3b18996dd903f841e04fd6c64791e96063df8b164c663882"}
{"path":"packages/bus/src/gitea-grant.mjs","sha256":"27d7d5322c2f12641e350867d3ac6f838b33832951e69f057e3a7a28b8ac4d5b"}
{"path":"packages/bus/src/principal.mjs","sha256":"2b1e18be825e8264b16506d6294863acbba812956cfdf8e056f21faaa94f7137"}
{"path":"packages/bus/src/human.mjs","sha256":"bb13c146717cdc46d75d157177e400edac4d3e10f14fe511027a25fd44cec885"}
{"path":"packages/bus/src/tester.mjs","sha256":"5e9e08ca8069e1de35232f26d48a77792388128dda659893909f2d34b5af2346"}
{"path":"packages/business/src/access.mjs","sha256":"af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f"}
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
{"path":"packages/bus/src/proxy-usage.mjs","sha256":"5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59"}
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
{"path":"packages/processing-control/src/coordinator.mjs","sha256":"ddc7318297abc4ec4dd03d425820b7323db609e554cfc5341cfdfa6934271e73"}
{"path":"packages/discord/src/processing.mjs","sha256":"8fa9968862dff77fa6d8be5210c22d13712fd622a8cbc722d167be5be80d0783"}
{"path":"packages/discord/src/binding.mjs","sha256":"5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec"}
{"path":"packages/discord/src/setspark.mjs","sha256":"ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387"}
{"path":"packages/discord/src/errors.mjs","sha256":"917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed"}
{"path":"packages/discord/src/tools.mjs","sha256":"975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f"}
{"path":"packages/discord/src/git.mjs","sha256":"c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7"}
{"path":"packages/discord/src/journal.mjs","sha256":"12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5"}
{"path":"packages/processing-control/src/containers.mjs","sha256":"781973277c09133de15fc39be35b372a79066479097d46923c8ab7782f011dcd"}
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
{"path":"packages/project/schemas/project.schema.json","sha256":"f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de"}
{"path":"packages/project/schemas/requirement.schema.json","sha256":"79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3"}
{"path":"packages/project/schemas/decision.schema.json","sha256":"925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b"}
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
{"path":"packages/plugins/harness/claude-code/index.mjs","sha256":"a317ac544359d321bb91b67cd87fc6ef431b72df9ac9f7f2a9ff291ed1a9109a"}
{"path":"packages/harness/src/gate.mjs","sha256":"a74ef2db4093c0c797ba9e7e28e4e4df0ceac9040385f00e60a273f39af9610b"}
{"path":"packages/plugins/harness/pi/index.mjs","sha256":"39c225f157b8f66b416625bda689153505743ffcfdc32964bb1f3d2c6fcb73af"}
{"path":"packages/plugins/harness/pi/compactions.mjs","sha256":"aabaf5c4602e28f025c18b2e2ddd6fa0d1648870101a5de0c4424d97b24472dd"}
{"path":"packages/plugins/limit-check/token-limit/index.mjs","sha256":"4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524"}
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/bus/tests/p5-key-context.test.mjs","sha256":"e37114eab9c5f21015ea8e429f0574d3ea34b06263f1e42b83b31b8d2df222a7"}
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
{"path":"packages/plugins/limit-check/token-limit/index.mjs","sha256":"4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/bus/tests/p5-runtime.test.mjs","sha256":"241e779016ffd0b54c5646cb4fac7e21ea1167e77afbd652ff4e01f8d238f99c"}
{"path":"packages/bus/src/runtime.mjs","sha256":"969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6"}
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
{"path":"packages/project/src/index.mjs","sha256":"3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899"}
{"path":"packages/project/src/paths.mjs","sha256":"bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9"}
{"path":"packages/project/src/git.mjs","sha256":"af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e"}
{"path":"packages/seat/src/checkout.mjs","sha256":"5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d"}
{"path":"packages/processing-control/src/effects.mjs","sha256":"3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17"}
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
{"path":"packages/processing-control/src/runtimes.mjs","sha256":"7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea"}
{"path":"packages/project/src/validate.mjs","sha256":"e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5"}
{"path":"packages/project/src/read.mjs","sha256":"42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c"}
{"path":"packages/library/src/index.mjs","sha256":"98c2c2877549c3e2c5963ec4e49d99ab3b6d6ad54fb3bfae86cf98542207157e"}
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
{"path":"packages/library/src/scope.mjs","sha256":"97e12255f52ad638eeacd152eb26822f9a2aa72cd30e2fed1193f51cd6e56192"}
{"path":"packages/library/src/supporting.mjs","sha256":"6a3b4de2070e62b1cca1c0ab20f2883d3153fc61608d1bf7670cecea08765b4c"}
{"path":"packages/library/src/links.mjs","sha256":"def32a176cb70c86248e45908edde22f9c4c5f88575a4af0a396a05f617358bc"}
{"path":"packages/library/src/reader.mjs","sha256":"ea126533afb7e74b71419eb943febb6b242eb96fc6917d9df1019db3e7e6ce8d"}
{"path":"packages/library/src/render.mjs","sha256":"bfc3de029d3c8f0dcc96c90fde30d6da58bbb5b72d8f13e3f536c0d735c73ca5"}
{"path":"packages/library/src/survey.mjs","sha256":"016bfa5c80572c0baf90ced39cb3d3ec66d395f0be15c2727b9552a9dd849093"}
{"path":"packages/library/src/mirror.mjs","sha256":"26b824d6885e5c6d1b8bd71e754a9fa333c26307693f7e6a0c6a8e6300ecb4ae"}
{"path":"packages/library/src/sync.mjs","sha256":"a58f3aec5ed9b3530b363e2fdbd38bc9ded7635d261ab2fca3cb31c45dcd3dfa"}
{"path":"packages/library/src/index-build.mjs","sha256":"70c1fe75cb2149c9a074d55a6301d5b66157c2dc2e777b92bac338cce09d89c7"}
{"path":"packages/library/src/query.mjs","sha256":"bafe113bee70f17bd249876d6bdd1c08fa051223c2111955e5d5f275bd76bba0"}
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
{"path":"packages/library/src/guard.mjs","sha256":"f710d9600a17f6e2989a289cfe84e58f161d86c7306605946ce05fa71b364eb2"}
{"path":"packages/library/src/reply-protocol.mjs","sha256":"7b46f47b5e9d6b554b5d39bce2cd95c4610f5f35b8ab8fdc5a2864b3214be809"}
{"path":"packages/library/src/write.mjs","sha256":"a301b7c7e3f42f66cb69d88991220f4e236f25a6e5951c61e79ec4ef2b714198"}
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
{"path":"packages/bus/src/credentials.mjs","sha256":"10485afcf94c29ac9f3d5ba30b12248a2379efd69185ff9fb90e9fed25fe0678"}
{"path":"packages/bus/src/server.mjs","sha256":"8318bed9168ac3f58c09de40a139b68aacefd684e6c117406e181e2ca5ab4ec7"}
{"path":"packages/bus/src/interpreter.mjs","sha256":"56bfc8dcba476886d7de61a1e798aae8e3041c2434c62d44fc40a168d22bb3bd"}
{"path":"packages/bus/src/peercred.mjs","sha256":"29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7"}
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
{"path":"packages/seat/src/session.mjs","sha256":"c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41"}
{"path":"packages/seat/src/proc.mjs","sha256":"382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198"}
{"path":"packages/seat/src/sandbox.mjs","sha256":"0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf"}
{"path":"packages/seat/src/seat.mjs","sha256":"eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15"}
{"path":"packages/seat/src/compactions.mjs","sha256":"c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774"}
{"path":"packages/seat/src/working.mjs","sha256":"621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3"}
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
{"path":"packages/business/src/plugin-settings.mjs","sha256":"9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50"}
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
{"path":"packages/bus/src/proxy-page.mjs","sha256":"af36aae674f46a4e5eacfe176fde8b58cd0b171a6d70e07ee6d479e0f558cce7"}
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
{"path":"packages/bus/src/model-keys.mjs","sha256":"b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550"}
{"path":"packages/business/src/instance-settings.mjs","sha256":"09f2bde85a6d7a8f0b1d1c60ac589b845b0c95e991b2f807758878416b13c6bd"}
{"path":"packages/bus/src/credential-verbs.mjs","sha256":"86b4321dd436b97e389101873197dbab95b3d2202e5ef7da712c4978f4f9159f"}
{"path":"packages/bus/src/business.mjs","sha256":"ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996"}
{"path":"packages/bus/src/web.mjs","sha256":"68efa3c9d0a72095f503208ed5c2e660ef9bca68d3ea15f0fc2f1826a68e09cc"}
{"path":"packages/discord/src/web.mjs","sha256":"e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7"}
{"path":"packages/bus/src/host-run.mjs","sha256":"324c05b16253e0fcfc1a0299d1d8ab45850ea723fad1f67bcc07fc031f50d593"}
{"path":"packages/bus/src/host-grant.mjs","sha256":"48337cdbc41d503f17962d3e3ad014183b1286165f97da6fd88b4faa50be3949"}
{"path":"packages/business/src/hosts.mjs","sha256":"e08b11b70b54f13e3b18996dd903f841e04fd6c64791e96063df8b164c663882"}
{"path":"packages/bus/src/gitea-grant.mjs","sha256":"27d7d5322c2f12641e350867d3ac6f838b33832951e69f057e3a7a28b8ac4d5b"}
{"path":"packages/bus/src/principal.mjs","sha256":"2b1e18be825e8264b16506d6294863acbba812956cfdf8e056f21faaa94f7137"}
{"path":"packages/bus/src/human.mjs","sha256":"bb13c146717cdc46d75d157177e400edac4d3e10f14fe511027a25fd44cec885"}
{"path":"packages/bus/src/tester.mjs","sha256":"5e9e08ca8069e1de35232f26d48a77792388128dda659893909f2d34b5af2346"}
{"path":"packages/business/src/access.mjs","sha256":"af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f"}
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
{"path":"packages/bus/src/proxy-usage.mjs","sha256":"5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59"}
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
{"path":"packages/processing-control/src/coordinator.mjs","sha256":"ddc7318297abc4ec4dd03d425820b7323db609e554cfc5341cfdfa6934271e73"}
{"path":"packages/discord/src/processing.mjs","sha256":"8fa9968862dff77fa6d8be5210c22d13712fd622a8cbc722d167be5be80d0783"}
{"path":"packages/discord/src/binding.mjs","sha256":"5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec"}
{"path":"packages/discord/src/setspark.mjs","sha256":"ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387"}
{"path":"packages/discord/src/errors.mjs","sha256":"917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed"}
{"path":"packages/discord/src/tools.mjs","sha256":"975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f"}
{"path":"packages/discord/src/git.mjs","sha256":"c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7"}
{"path":"packages/discord/src/journal.mjs","sha256":"12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5"}
{"path":"packages/processing-control/src/containers.mjs","sha256":"781973277c09133de15fc39be35b372a79066479097d46923c8ab7782f011dcd"}
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
{"path":"packages/project/schemas/project.schema.json","sha256":"f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de"}
{"path":"packages/project/schemas/requirement.schema.json","sha256":"79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3"}
{"path":"packages/project/schemas/decision.schema.json","sha256":"925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b"}
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
{"path":"packages/plugins/harness/claude-code/index.mjs","sha256":"a317ac544359d321bb91b67cd87fc6ef431b72df9ac9f7f2a9ff291ed1a9109a"}
{"path":"packages/harness/src/gate.mjs","sha256":"a74ef2db4093c0c797ba9e7e28e4e4df0ceac9040385f00e60a273f39af9610b"}
{"path":"packages/plugins/harness/pi/index.mjs","sha256":"39c225f157b8f66b416625bda689153505743ffcfdc32964bb1f3d2c6fcb73af"}
{"path":"packages/plugins/harness/pi/compactions.mjs","sha256":"aabaf5c4602e28f025c18b2e2ddd6fa0d1648870101a5de0c4424d97b24472dd"}
{"path":"packages/plugins/usage-source/transcript/index.mjs","sha256":"d09ae19db3eb69477783163559bd6a8e5b59a6f5af0eafd62d0e2e3bd325065e"}
{"path":"packages/plugins/limit-check/daily-quota/index.mjs","sha256":"3749b9f6dd681ef424ee7d7e4d80ccee87b3655df8cd8fe9ccd0d505dcaaee9b"}
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/bus/tests/plugins-verb.test.mjs","sha256":"895ffddbcca1b38fdaa17eefdeca9092a9b9a934d3a54a3bf7857f42fe99fba7"}
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
{"path":"packages/bus/src/runtime.mjs","sha256":"969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6"}
{"path":"packages/project/src/index.mjs","sha256":"3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899"}
{"path":"packages/project/src/paths.mjs","sha256":"bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9"}
{"path":"packages/project/src/git.mjs","sha256":"af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e"}
{"path":"packages/seat/src/checkout.mjs","sha256":"5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d"}
{"path":"packages/processing-control/src/effects.mjs","sha256":"3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17"}
{"path":"packages/processing-control/src/runtimes.mjs","sha256":"7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea"}
{"path":"packages/project/src/validate.mjs","sha256":"e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5"}
{"path":"packages/project/src/read.mjs","sha256":"42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c"}
{"path":"packages/library/src/index.mjs","sha256":"98c2c2877549c3e2c5963ec4e49d99ab3b6d6ad54fb3bfae86cf98542207157e"}
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
{"path":"packages/library/src/scope.mjs","sha256":"97e12255f52ad638eeacd152eb26822f9a2aa72cd30e2fed1193f51cd6e56192"}
{"path":"packages/library/src/supporting.mjs","sha256":"6a3b4de2070e62b1cca1c0ab20f2883d3153fc61608d1bf7670cecea08765b4c"}
{"path":"packages/library/src/links.mjs","sha256":"def32a176cb70c86248e45908edde22f9c4c5f88575a4af0a396a05f617358bc"}
{"path":"packages/library/src/reader.mjs","sha256":"ea126533afb7e74b71419eb943febb6b242eb96fc6917d9df1019db3e7e6ce8d"}
{"path":"packages/library/src/render.mjs","sha256":"bfc3de029d3c8f0dcc96c90fde30d6da58bbb5b72d8f13e3f536c0d735c73ca5"}
{"path":"packages/library/src/survey.mjs","sha256":"016bfa5c80572c0baf90ced39cb3d3ec66d395f0be15c2727b9552a9dd849093"}
{"path":"packages/library/src/mirror.mjs","sha256":"26b824d6885e5c6d1b8bd71e754a9fa333c26307693f7e6a0c6a8e6300ecb4ae"}
{"path":"packages/library/src/sync.mjs","sha256":"a58f3aec5ed9b3530b363e2fdbd38bc9ded7635d261ab2fca3cb31c45dcd3dfa"}
{"path":"packages/library/src/index-build.mjs","sha256":"70c1fe75cb2149c9a074d55a6301d5b66157c2dc2e777b92bac338cce09d89c7"}
{"path":"packages/library/src/query.mjs","sha256":"bafe113bee70f17bd249876d6bdd1c08fa051223c2111955e5d5f275bd76bba0"}
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
{"path":"packages/library/src/guard.mjs","sha256":"f710d9600a17f6e2989a289cfe84e58f161d86c7306605946ce05fa71b364eb2"}
{"path":"packages/library/src/reply-protocol.mjs","sha256":"7b46f47b5e9d6b554b5d39bce2cd95c4610f5f35b8ab8fdc5a2864b3214be809"}
{"path":"packages/library/src/write.mjs","sha256":"a301b7c7e3f42f66cb69d88991220f4e236f25a6e5951c61e79ec4ef2b714198"}
{"path":"packages/bus/src/credentials.mjs","sha256":"10485afcf94c29ac9f3d5ba30b12248a2379efd69185ff9fb90e9fed25fe0678"}
{"path":"packages/bus/src/server.mjs","sha256":"8318bed9168ac3f58c09de40a139b68aacefd684e6c117406e181e2ca5ab4ec7"}
{"path":"packages/bus/src/interpreter.mjs","sha256":"56bfc8dcba476886d7de61a1e798aae8e3041c2434c62d44fc40a168d22bb3bd"}
{"path":"packages/bus/src/peercred.mjs","sha256":"29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7"}
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
{"path":"packages/seat/src/session.mjs","sha256":"c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41"}
{"path":"packages/seat/src/proc.mjs","sha256":"382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198"}
{"path":"packages/seat/src/sandbox.mjs","sha256":"0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf"}
{"path":"packages/seat/src/seat.mjs","sha256":"eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15"}
{"path":"packages/seat/src/compactions.mjs","sha256":"c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774"}
{"path":"packages/seat/src/working.mjs","sha256":"621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3"}
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
{"path":"packages/business/src/plugin-settings.mjs","sha256":"9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50"}
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
{"path":"packages/bus/src/proxy-page.mjs","sha256":"af36aae674f46a4e5eacfe176fde8b58cd0b171a6d70e07ee6d479e0f558cce7"}
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
{"path":"packages/bus/src/model-keys.mjs","sha256":"b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550"}
{"path":"packages/business/src/instance-settings.mjs","sha256":"09f2bde85a6d7a8f0b1d1c60ac589b845b0c95e991b2f807758878416b13c6bd"}
{"path":"packages/bus/src/credential-verbs.mjs","sha256":"86b4321dd436b97e389101873197dbab95b3d2202e5ef7da712c4978f4f9159f"}
{"path":"packages/bus/src/business.mjs","sha256":"ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996"}
{"path":"packages/bus/src/web.mjs","sha256":"68efa3c9d0a72095f503208ed5c2e660ef9bca68d3ea15f0fc2f1826a68e09cc"}
{"path":"packages/discord/src/web.mjs","sha256":"e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7"}
{"path":"packages/bus/src/host-run.mjs","sha256":"324c05b16253e0fcfc1a0299d1d8ab45850ea723fad1f67bcc07fc031f50d593"}
{"path":"packages/bus/src/host-grant.mjs","sha256":"48337cdbc41d503f17962d3e3ad014183b1286165f97da6fd88b4faa50be3949"}
{"path":"packages/business/src/hosts.mjs","sha256":"e08b11b70b54f13e3b18996dd903f841e04fd6c64791e96063df8b164c663882"}
{"path":"packages/bus/src/gitea-grant.mjs","sha256":"27d7d5322c2f12641e350867d3ac6f838b33832951e69f057e3a7a28b8ac4d5b"}
{"path":"packages/bus/src/principal.mjs","sha256":"2b1e18be825e8264b16506d6294863acbba812956cfdf8e056f21faaa94f7137"}
{"path":"packages/bus/src/human.mjs","sha256":"bb13c146717cdc46d75d157177e400edac4d3e10f14fe511027a25fd44cec885"}
{"path":"packages/bus/src/tester.mjs","sha256":"5e9e08ca8069e1de35232f26d48a77792388128dda659893909f2d34b5af2346"}
{"path":"packages/business/src/access.mjs","sha256":"af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f"}
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
{"path":"packages/bus/src/proxy-usage.mjs","sha256":"5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59"}
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
{"path":"packages/processing-control/src/coordinator.mjs","sha256":"ddc7318297abc4ec4dd03d425820b7323db609e554cfc5341cfdfa6934271e73"}
{"path":"packages/discord/src/processing.mjs","sha256":"8fa9968862dff77fa6d8be5210c22d13712fd622a8cbc722d167be5be80d0783"}
{"path":"packages/discord/src/binding.mjs","sha256":"5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec"}
{"path":"packages/discord/src/setspark.mjs","sha256":"ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387"}
{"path":"packages/discord/src/errors.mjs","sha256":"917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed"}
{"path":"packages/discord/src/tools.mjs","sha256":"975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f"}
{"path":"packages/discord/src/git.mjs","sha256":"c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7"}
{"path":"packages/discord/src/journal.mjs","sha256":"12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5"}
{"path":"packages/processing-control/src/containers.mjs","sha256":"781973277c09133de15fc39be35b372a79066479097d46923c8ab7782f011dcd"}
{"path":"packages/project/schemas/project.schema.json","sha256":"f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de"}
{"path":"packages/project/schemas/requirement.schema.json","sha256":"79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3"}
{"path":"packages/project/schemas/decision.schema.json","sha256":"925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b"}
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
{"path":"packages/plugins/harness/claude-code/index.mjs","sha256":"a317ac544359d321bb91b67cd87fc6ef431b72df9ac9f7f2a9ff291ed1a9109a"}
{"path":"packages/harness/src/gate.mjs","sha256":"a74ef2db4093c0c797ba9e7e28e4e4df0ceac9040385f00e60a273f39af9610b"}
{"path":"packages/plugins/harness/pi/index.mjs","sha256":"39c225f157b8f66b416625bda689153505743ffcfdc32964bb1f3d2c6fcb73af"}
{"path":"packages/plugins/harness/pi/compactions.mjs","sha256":"aabaf5c4602e28f025c18b2e2ddd6fa0d1648870101a5de0c4424d97b24472dd"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/bus/tests/proxy-usage.test.mjs","sha256":"84c8351029272b6ee05e7fd81b4cc4453553ceeb7a5127a1333dae63d1336ad5"}
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
{"path":"packages/bus/src/proxy-usage.mjs","sha256":"5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59"}
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
{"path":"packages/plugins/usage/cliproxy-queue/index.mjs","sha256":"6096a577cd5d7e8bf84fd6b98ab284e2f47d5facebd027548e07e6aeec442f96"}
{"path":"packages/plugins/limit-check/token-limit/index.mjs","sha256":"4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/bus/tests/usage-broker.test.mjs","sha256":"4b2149ea4219f49db19669ada9f88931f7691cdd73dd27dceec6e8fe1f76dd0c"}
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/bus/tests/usage-runtime.test.mjs","sha256":"5abe93fca8442f06ff68760623e91262d863e1191fa35a3d0c87d7b0e6c0a4c6"}
{"path":"packages/bus/src/runtime.mjs","sha256":"969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6"}
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
{"path":"packages/project/src/index.mjs","sha256":"3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899"}
{"path":"packages/project/src/paths.mjs","sha256":"bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9"}
{"path":"packages/project/src/git.mjs","sha256":"af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e"}
{"path":"packages/seat/src/checkout.mjs","sha256":"5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d"}
{"path":"packages/processing-control/src/effects.mjs","sha256":"3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17"}
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
{"path":"packages/processing-control/src/runtimes.mjs","sha256":"7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea"}
{"path":"packages/project/src/validate.mjs","sha256":"e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5"}
{"path":"packages/project/src/read.mjs","sha256":"42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c"}
{"path":"packages/library/src/index.mjs","sha256":"98c2c2877549c3e2c5963ec4e49d99ab3b6d6ad54fb3bfae86cf98542207157e"}
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
{"path":"packages/library/src/scope.mjs","sha256":"97e12255f52ad638eeacd152eb26822f9a2aa72cd30e2fed1193f51cd6e56192"}
{"path":"packages/library/src/supporting.mjs","sha256":"6a3b4de2070e62b1cca1c0ab20f2883d3153fc61608d1bf7670cecea08765b4c"}
{"path":"packages/library/src/links.mjs","sha256":"def32a176cb70c86248e45908edde22f9c4c5f88575a4af0a396a05f617358bc"}
{"path":"packages/library/src/reader.mjs","sha256":"ea126533afb7e74b71419eb943febb6b242eb96fc6917d9df1019db3e7e6ce8d"}
{"path":"packages/library/src/render.mjs","sha256":"bfc3de029d3c8f0dcc96c90fde30d6da58bbb5b72d8f13e3f536c0d735c73ca5"}
{"path":"packages/library/src/survey.mjs","sha256":"016bfa5c80572c0baf90ced39cb3d3ec66d395f0be15c2727b9552a9dd849093"}
{"path":"packages/library/src/mirror.mjs","sha256":"26b824d6885e5c6d1b8bd71e754a9fa333c26307693f7e6a0c6a8e6300ecb4ae"}
{"path":"packages/library/src/sync.mjs","sha256":"a58f3aec5ed9b3530b363e2fdbd38bc9ded7635d261ab2fca3cb31c45dcd3dfa"}
{"path":"packages/library/src/index-build.mjs","sha256":"70c1fe75cb2149c9a074d55a6301d5b66157c2dc2e777b92bac338cce09d89c7"}
{"path":"packages/library/src/query.mjs","sha256":"bafe113bee70f17bd249876d6bdd1c08fa051223c2111955e5d5f275bd76bba0"}
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
{"path":"packages/library/src/guard.mjs","sha256":"f710d9600a17f6e2989a289cfe84e58f161d86c7306605946ce05fa71b364eb2"}
{"path":"packages/library/src/reply-protocol.mjs","sha256":"7b46f47b5e9d6b554b5d39bce2cd95c4610f5f35b8ab8fdc5a2864b3214be809"}
{"path":"packages/library/src/write.mjs","sha256":"a301b7c7e3f42f66cb69d88991220f4e236f25a6e5951c61e79ec4ef2b714198"}
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
{"path":"packages/bus/src/credentials.mjs","sha256":"10485afcf94c29ac9f3d5ba30b12248a2379efd69185ff9fb90e9fed25fe0678"}
{"path":"packages/bus/src/server.mjs","sha256":"8318bed9168ac3f58c09de40a139b68aacefd684e6c117406e181e2ca5ab4ec7"}
{"path":"packages/bus/src/interpreter.mjs","sha256":"56bfc8dcba476886d7de61a1e798aae8e3041c2434c62d44fc40a168d22bb3bd"}
{"path":"packages/bus/src/peercred.mjs","sha256":"29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7"}
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
{"path":"packages/seat/src/session.mjs","sha256":"c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41"}
{"path":"packages/seat/src/proc.mjs","sha256":"382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198"}
{"path":"packages/seat/src/sandbox.mjs","sha256":"0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf"}
{"path":"packages/seat/src/seat.mjs","sha256":"eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15"}
{"path":"packages/seat/src/compactions.mjs","sha256":"c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774"}
{"path":"packages/seat/src/working.mjs","sha256":"621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3"}
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
{"path":"packages/business/src/plugin-settings.mjs","sha256":"9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50"}
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
{"path":"packages/bus/src/proxy-page.mjs","sha256":"af36aae674f46a4e5eacfe176fde8b58cd0b171a6d70e07ee6d479e0f558cce7"}
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
{"path":"packages/bus/src/model-keys.mjs","sha256":"b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550"}
{"path":"packages/business/src/instance-settings.mjs","sha256":"09f2bde85a6d7a8f0b1d1c60ac589b845b0c95e991b2f807758878416b13c6bd"}
{"path":"packages/bus/src/credential-verbs.mjs","sha256":"86b4321dd436b97e389101873197dbab95b3d2202e5ef7da712c4978f4f9159f"}
{"path":"packages/bus/src/business.mjs","sha256":"ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996"}
{"path":"packages/bus/src/web.mjs","sha256":"68efa3c9d0a72095f503208ed5c2e660ef9bca68d3ea15f0fc2f1826a68e09cc"}
{"path":"packages/discord/src/web.mjs","sha256":"e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7"}
{"path":"packages/bus/src/host-run.mjs","sha256":"324c05b16253e0fcfc1a0299d1d8ab45850ea723fad1f67bcc07fc031f50d593"}
{"path":"packages/bus/src/host-grant.mjs","sha256":"48337cdbc41d503f17962d3e3ad014183b1286165f97da6fd88b4faa50be3949"}
{"path":"packages/business/src/hosts.mjs","sha256":"e08b11b70b54f13e3b18996dd903f841e04fd6c64791e96063df8b164c663882"}
{"path":"packages/bus/src/gitea-grant.mjs","sha256":"27d7d5322c2f12641e350867d3ac6f838b33832951e69f057e3a7a28b8ac4d5b"}
{"path":"packages/bus/src/principal.mjs","sha256":"2b1e18be825e8264b16506d6294863acbba812956cfdf8e056f21faaa94f7137"}
{"path":"packages/bus/src/human.mjs","sha256":"bb13c146717cdc46d75d157177e400edac4d3e10f14fe511027a25fd44cec885"}
{"path":"packages/bus/src/tester.mjs","sha256":"5e9e08ca8069e1de35232f26d48a77792388128dda659893909f2d34b5af2346"}
{"path":"packages/business/src/access.mjs","sha256":"af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f"}
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
{"path":"packages/bus/src/proxy-usage.mjs","sha256":"5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59"}
{"path":"packages/bus/src/limits.mjs","sha256":"18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3"}
{"path":"packages/processing-control/src/coordinator.mjs","sha256":"ddc7318297abc4ec4dd03d425820b7323db609e554cfc5341cfdfa6934271e73"}
{"path":"packages/discord/src/processing.mjs","sha256":"8fa9968862dff77fa6d8be5210c22d13712fd622a8cbc722d167be5be80d0783"}
{"path":"packages/discord/src/binding.mjs","sha256":"5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec"}
{"path":"packages/discord/src/setspark.mjs","sha256":"ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387"}
{"path":"packages/discord/src/errors.mjs","sha256":"917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed"}
{"path":"packages/discord/src/tools.mjs","sha256":"975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f"}
{"path":"packages/discord/src/git.mjs","sha256":"c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7"}
{"path":"packages/discord/src/journal.mjs","sha256":"12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5"}
{"path":"packages/processing-control/src/containers.mjs","sha256":"781973277c09133de15fc39be35b372a79066479097d46923c8ab7782f011dcd"}
{"path":"packages/bus/src/client.mjs","sha256":"f3d483f61a24cbc9cce235e1e92889f09b8cecf513fcaf90c741f316f62262e2"}
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
{"path":"packages/project/schemas/project.schema.json","sha256":"f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de"}
{"path":"packages/project/schemas/requirement.schema.json","sha256":"79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3"}
{"path":"packages/project/schemas/decision.schema.json","sha256":"925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b"}
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
{"path":"packages/plugins/usage-source/transcript/index.mjs","sha256":"d09ae19db3eb69477783163559bd6a8e5b59a6f5af0eafd62d0e2e3bd325065e"}
{"path":"packages/plugins/harness/pi/index.mjs","sha256":"39c225f157b8f66b416625bda689153505743ffcfdc32964bb1f3d2c6fcb73af"}
{"path":"packages/plugins/harness/pi/compactions.mjs","sha256":"aabaf5c4602e28f025c18b2e2ddd6fa0d1648870101a5de0c4424d97b24472dd"}
{"path":"packages/tasks/requirements.json","sha256":"80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/bus/tests/usage.test.mjs","sha256":"2613ba0561572a7d4f753066922fddc90cca812cb0ce2b3e0a9a4d249a15e340"}
{"path":"packages/bus/src/store.mjs","sha256":"dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84"}
{"path":"packages/bus/src/usage.mjs","sha256":"4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29"}
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/bus/schema.sql","sha256":"a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7"}
{"path":"packages/bus/src/migrations/3b.sql","sha256":"179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65"}
{"path":"packages/bus/src/migrations/3b-3c.sql","sha256":"b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07"}
{"path":"packages/bus/src/migrations/3c-3d.sql","sha256":"0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56"}
{"path":"packages/bus/src/migrations/3d-3e.sql","sha256":"d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077"}
{"path":"packages/bus/src/migrations/3e-3f.sql","sha256":"bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3"}
{"path":"packages/bus/src/migrations/3f-3g.sql","sha256":"82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05"}
{"path":"packages/bus/src/migrations/3g-3h.sql","sha256":"76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0"}
{"path":"packages/bus/src/migrations/3h-3i.sql","sha256":"e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035"}
{"path":"packages/bus/src/migrations/3i-3j.sql","sha256":"5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031"}
{"path":"packages/bus/src/migrations/3j-3k.sql","sha256":"2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4"}
{"path":"packages/bus/src/migrations/3k-3l.sql","sha256":"eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58"}
{"path":"packages/bus/src/migrations/3l-3m.sql","sha256":"791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156"}
{"path":"packages/bus/src/migrations/3m-3n.sql","sha256":"b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a"}
{"path":"packages/plugins/usage-source/transcript/index.mjs","sha256":"d09ae19db3eb69477783163559bd6a8e5b59a6f5af0eafd62d0e2e3bd325065e"}
{"path":"packages/plugins/tests/helpers.mjs","sha256":"5d5e5dccdae3f94b8540d187a8899ec36f9c9933cae3933249c2d8c400c75aa2"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/business/tests/plugin-settings.test.mjs","sha256":"f0dfe004905dce31317d85d89a05802db878c3472e765e85dc9f1e04166e1df6"}
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
{"path":"packages/business/src/plugin-settings.mjs","sha256":"9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50"}
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/business/tests/token-limit-settings.test.mjs","sha256":"bc6b3a31e8918d70aced7151b91ac4b39afec4081054024b162acb0e8f8fae07"}
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/model-proxy/tests/client-probe.test.mjs","sha256":"77327681d6eb51f25d7aeffcc532b7e8269c1dc59139cb03adb4a3a1409f63e9"}
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/model-proxy/tests/client.test.mjs","sha256":"790c6a50ec030a8b27a28fac7fd129bd9eabe79774adf11d6620c00df9b6ae86"}
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/model-proxy/tests/management-key-encoding.test.mjs","sha256":"95e39a519f7ac8b9592876e6157191169f9b14d002163867a6ff6ab808e42c14"}
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/model-proxy/tests/page-client.test.mjs","sha256":"f24e1d121a340cbcaa3f6cd6390eeb7d4b05f778dd498d76ba099cba5a719dea"}
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/model-proxy/tests/usage-client.test.mjs","sha256":"1ad66d56800a31cfbd387939e640653bc72150f4e73822d9e3c777b3bffbf1e1"}
{"path":"packages/model-proxy/src/client.mjs","sha256":"f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441"}
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/plugins/tests/daily-quota.test.mjs","sha256":"3d4fab56fea4c45c6a317ef41121aa5b6da0502a6ef614b7931f91cafdfc1f71"}
{"path":"packages/plugins/limit-check/daily-quota/index.mjs","sha256":"3749b9f6dd681ef424ee7d7e4d80ccee87b3655df8cd8fe9ccd0d505dcaaee9b"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/plugins/tests/kinds.test.mjs","sha256":"f3081e1dbdac20ade2246c743bcbb3934be686f79f378af21c365cd1451893ba"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/plugins/tests/loader.test.mjs","sha256":"8588ad7eee0c9ce5de3b53e3b88562812a155a3d791a2bd3413bb1754655d78b"}
{"path":"packages/plugins/tests/helpers.mjs","sha256":"5d5e5dccdae3f94b8540d187a8899ec36f9c9933cae3933249c2d8c400c75aa2"}
{"path":"packages/business/tests/helpers.mjs","sha256":"a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1"}
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/plugins/tests/token-limit.test.mjs","sha256":"6e96bb96278ec754ca1816a24f49ef677771615ab5cf186ae41969fc2f93d8cc"}
{"path":"packages/plugins/limit-check/token-limit/index.mjs","sha256":"4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/webui/tests/usage-render.test.mjs","sha256":"39f50991578b98594183390a00efbca84fda90ef61617eea4215e2c75f90b82c"}
{"path":"packages/webui/src/public/bus.js","sha256":"3c7a35e25b4c1cfda19ac9466d4b2fbc86c880761a1d04ad3ece8bc485f60f93"}
{"path":"agents/codex/work/queue-333/trace-inputs.mjs","sha256":"06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1"}
{"path":"packages/webui/tests/usage.test.mjs","sha256":"f96d06974bc83051c0d5c9000e38161ea0cc231997410bcc6c42ed7f55718dfd"}
{"path":"packages/webui/src/serve.mjs","sha256":"7b7bee91604b7bd973027b177de83205db9aed366e694072fc6343b46465b5ba"}
{"path":"packages/webui/src/proxy-http.mjs","sha256":"a09028cd5ca57367f597d0681e84926ca871fd4626769e9947927d949c2b6ab7"}
{"path":"packages/webui/src/tester-socket.mjs","sha256":"1c1fe0c795adac97f28502564a75f26d5666d9be5ae51169f7dd5bb7741fad16"}
{"path":"packages/webui/src/bus.mjs","sha256":"4ebf6c2b5d71c23d85cbde83f69aa671058dc2195c9ae4bdda624f6940729d1b"}
{"path":"packages/cli/src/transport.mjs","sha256":"662642a8ce739fcb6c188ad07125a94e008c8a305eced127c8041d472c56e55b"}
{"path":"packages/cli/src/errors.mjs","sha256":"c7bdd98a3ddeeb9bc4415d907b92555d723c566eba314075d91486da9b5e85dc"}
{"path":"packages/cli/src/host.mjs","sha256":"a0936aee783ff47dd58fc907fefd86f63e571809a3ce5b0d6d931f71e756b15e"}
{"path":"packages/seat/src/proc.mjs","sha256":"382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198"}
{"path":"packages/bus/src/views.mjs","sha256":"1f31aefa71984fba90c5390df5cc595d929681965f57485ad4972143d5c4b15f"}
{"path":"packages/bus/src/broker.mjs","sha256":"c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5"}
{"path":"packages/bus/src/proxy-page-vocabulary.mjs","sha256":"cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9"}
{"path":"packages/model-proxy/src/validation.mjs","sha256":"e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1"}
{"path":"packages/bus/src/address.mjs","sha256":"232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23"}
{"path":"packages/processing-control/src/state.mjs","sha256":"ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed"}
{"path":"packages/plugins/src/kinds.mjs","sha256":"eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78"}
{"path":"packages/tasks/src/requirements.mjs","sha256":"38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d"}
{"path":"packages/bus/src/landing.mjs","sha256":"9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b"}
{"path":"packages/business/src/vocabulary.mjs","sha256":"de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb"}
{"path":"packages/webui/src/reads.mjs","sha256":"46defeb3b4be0e1a22e4b89445872ad6b15cdee182076e9e6222219ae29997f4"}
{"path":"packages/business/src/index.mjs","sha256":"a386ce5bd1d41d86f7b90641a423a2b651b491c8989d5085412c7d202ac1cb30"}
{"path":"packages/business/src/errors.mjs","sha256":"cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a"}
{"path":"packages/business/src/role.mjs","sha256":"b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9"}
{"path":"packages/business/src/util.mjs","sha256":"e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c"}
{"path":"packages/business/src/vars.mjs","sha256":"f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421"}
{"path":"packages/business/src/credentials.mjs","sha256":"c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73"}
{"path":"packages/business/src/business.mjs","sha256":"aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9"}
{"path":"packages/business/src/launch.mjs","sha256":"0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c"}
{"path":"packages/library/src/mapping.mjs","sha256":"c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802"}
{"path":"packages/library/src/problems.mjs","sha256":"0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31"}
{"path":"packages/business/src/access.mjs","sha256":"af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f"}
{"path":"packages/business/src/project.mjs","sha256":"9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff"}
{"path":"packages/business/src/resolve.mjs","sha256":"712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109"}
{"path":"packages/business/src/library-seats.mjs","sha256":"93a7fddac9a08b5f740a0a277b29b8a3459e6f5a4fd33a37212437cb456b9b62"}
{"path":"packages/business/src/launch-settings.mjs","sha256":"e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96"}
{"path":"packages/business/src/organization.mjs","sha256":"fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7"}
{"path":"packages/library/src/limits.mjs","sha256":"98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530"}
{"path":"packages/seat/src/session.mjs","sha256":"c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41"}
{"path":"packages/seat/src/sandbox.mjs","sha256":"0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf"}
{"path":"packages/seat/src/seat.mjs","sha256":"eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15"}
{"path":"packages/cli/src/boot-status.mjs","sha256":"147a17bbdcbc34efe20a88a4cabe796c101cb63dce621d28103f4de29def4cc2"}
{"path":"packages/cli/src/cli.mjs","sha256":"1e663b175e18e39ff68c9ac3a65ff71fc777a6c37ebca035fce6a2783d0aaac3"}
{"path":"packages/discord/src/binding.mjs","sha256":"5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec"}
{"path":"packages/discord/src/web.mjs","sha256":"e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7"}
{"path":"packages/discord/src/setspark.mjs","sha256":"ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387"}
{"path":"packages/discord/src/errors.mjs","sha256":"917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed"}
{"path":"packages/discord/src/tools.mjs","sha256":"975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f"}
{"path":"packages/discord/src/git.mjs","sha256":"c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7"}
{"path":"packages/cli/src/project.mjs","sha256":"6cfe7fd5086ddb59c5666060c6f8044c2852e0f3d5755b1fa206f7521173f300"}
{"path":"packages/project/src/index.mjs","sha256":"3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899"}
{"path":"packages/project/src/paths.mjs","sha256":"bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9"}
{"path":"packages/project/src/git.mjs","sha256":"af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e"}
{"path":"packages/seat/src/checkout.mjs","sha256":"5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d"}
{"path":"packages/processing-control/src/effects.mjs","sha256":"3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17"}
{"path":"packages/processing-control/src/runtimes.mjs","sha256":"7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea"}
{"path":"packages/project/src/validate.mjs","sha256":"e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5"}
{"path":"packages/project/src/read.mjs","sha256":"42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c"}
{"path":"packages/cli/src/config.mjs","sha256":"d960c2a9df3f7c84deff22dad1f0ab120f95ee365984e390de98eba7292b65a1"}
{"path":"packages/bus/src/business.mjs","sha256":"ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996"}
{"path":"packages/cli/src/access.mjs","sha256":"c4949a16173d11f9d32d10d3ddd58a181631848b259bef1998820a78f5694808"}
{"path":"packages/cli/src/format.mjs","sha256":"481d9956698df7765ca8556d57164fb78f131708a09900d5a55b9048b5638f5f"}
{"path":"packages/cli/src/thread.mjs","sha256":"58888b7731f8009d4c3f8be2caf4445f13dd8f534e1633f6e2720b259fcc3f92"}
{"path":"packages/cli/src/session.mjs","sha256":"1a30048032f5bb64419ae9716a1692978bc1a137220a094d1900298aca6ba1d7"}
{"path":"packages/cli/src/limits.mjs","sha256":"2f291a71f490f2741edada7a3e3788500f8976a08eb8ab1411f6c5982f778260"}
{"path":"packages/business/src/migrate-launch.mjs","sha256":"44fa089c9024934a2f9fb5ef99552eb18d616842210cbc0fc860ea32ce0b1524"}
{"path":"packages/cli/src/plugins.mjs","sha256":"f8d9fc24ccd71494fb2914914949cb08948ae93fb3180b9531eb807c921a6f53"}
{"path":"packages/cli/src/model-proxy.mjs","sha256":"9a043f122e1d49103bab64716d0eb80cfc09da3c91f7e2eb014b0d8ff0b02f3d"}
{"path":"packages/model-proxy/src/fetch.mjs","sha256":"00378d2ea95ac4945899696462f8ff4c70dc020cc58d93663d731d2f2f333783"}
{"path":"packages/model-proxy/src/common.mjs","sha256":"a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23"}
{"path":"packages/model-proxy/src/settings.mjs","sha256":"1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb"}
{"path":"packages/cli/src/credentials.mjs","sha256":"19755f7bb002d8455990c5dc7c458e64aeb95252ec7231a2ed2fd9c638fcb511"}
{"path":"packages/cli/src/hosts.mjs","sha256":"60419503898f5e7f3046df5e749098728fbdfea76eb5c53b5dc9b909329abe2e"}
{"path":"packages/cli/src/grants.mjs","sha256":"b586907ca8f351f60dc19ec2683df75d2d70ddb12955d09fb14560c9d3bed3dc"}
{"path":"packages/cli/src/instances.mjs","sha256":"8d6dab8da62b4458477572ca1956adad57bc0b0d308df6eae57477175c345d7a"}
{"path":"packages/plugins/src/channel.mjs","sha256":"5fcecf8336ee247e8ac2f626b21e4c79b1edc49082eadfd536cd23016c6bb756"}
{"path":"packages/plugins/src/loader.mjs","sha256":"2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f"}
{"path":"packages/cli/src/launcher.mjs","sha256":"373d4c028dfa6d85c748d56f56359789fe2b81987f522ac23747fd37bb5478ed"}
{"path":"packages/cli/src/model-stall.mjs","sha256":"0bdc91dcaa096bd3dc9d08a1dea59893a21f6505c843e698ad9c8daa4b74364b"}
{"path":"packages/harness/src/bundle.mjs","sha256":"e944a4c7a26d1fe55e13ac1eca31dd86c302dc7c868224b8b000b27255976153"}
{"path":"packages/harness/src/tools.mjs","sha256":"38fe84040a78c3f8a8dcde4339d88db3b5df9ef669d605ad1d92ff3e8b646b40"}
{"path":"packages/seat/src/compactions.mjs","sha256":"c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774"}
{"path":"packages/cli/src/git-socket.mjs","sha256":"3076a53b9891d4d0e084306567b88ded12c4de53a943c029646a424bf59d8e49"}
{"path":"packages/seat/src/landing.mjs","sha256":"6f7c938a32b349ee49ce95b89ad499e599f6016e5e9d7efd79a9ea4177b4d175"}
{"path":"packages/seat/src/working.mjs","sha256":"621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3"}
{"path":"packages/cli/src/app.mjs","sha256":"15a8ee212fc37cea28e389f60ddb8916f9e1509cdcfb2e522acfe548702a16dc"}
{"path":"packages/cli/src/screens.mjs","sha256":"9d03335628ae62e85c5fbc08c2e739ed0bd43b10d486faf397129a56a1b343e0"}
{"path":"packages/conversation/src/terminal.mjs","sha256":"c24d28a073659640b8b027eb12ad150ba895c3001091b892ecef2ec1da40d5cd"}
{"path":"packages/conversation/src/client.mjs","sha256":"a45beb82438bb42d97d1e322010e175e785767664e548b90c4125e98b7660003"}
{"path":"packages/conversation/src/framing.mjs","sha256":"eaf0772b60bb17fbf9548267c9cfeb0104f92f5cbafdfcb60c1633883eec6432"}
{"path":"packages/conversation/src/records.mjs","sha256":"96f7b64c2e2c3493e270224542818fd14f042e3cf0ac14788b3f881010bc25b1"}
{"path":"packages/conversation/src/parts.mjs","sha256":"da336ed2a2a149ff56ac12af2440a8353d4573c33e9069381be60f1a0ca70151"}
{"path":"packages/conversation/src/transcript.mjs","sha256":"f834ee740e7149e7d2ed976112d0719ce0660270e3b61cf93e1774d112c992a2"}
{"path":"packages/cli/src/usage.mjs","sha256":"f9e0c69849633ae36a7a6aa22729a690dc40292178ac3db43accbb131fd7b4ca"}
{"path":"packages/tasks/src/fields.mjs","sha256":"c9a883e9a1649277edce97adca40bca2874df7b5312c70e4ac6f6d4a1c860841"}
{"path":"packages/webui/src/chat-http.mjs","sha256":"3a5321a5f492a98d342e4ddcc1e9da3522cfff89a4f9bc3f51d2ab1426d3de1b"}
{"path":"packages/webui/src/processing-http.mjs","sha256":"c3825a02c3b4f4e5537db4a945439d707e177e74c3e8b1fc2cb777515e610b64"}
{"path":"packages/webui/src/decision-http.mjs","sha256":"93d4d0c36d0b74eaace24bce4c3e7179b7418377eb4df6d0f6a9ca89d5eb8e39"}
{"path":"packages/webui/tests/fixture.mjs","sha256":"b35d3f3471d6d83ef2d19d6102eaecce2ddec9330f337d7194f1d7be03cbd216"}
{"path":"packages/control-board/src/serve.mjs","sha256":"2eb25c46e85ddadd3bdbdbe605db54a6e09845155384a209622554d78307e583"}
{"path":"packages/control-board/src/scan.mjs","sha256":"6d74b131af360268be748a1f8f7f2b3f5a9180365e7279426640883fc295a676"}
{"path":"packages/control-board/src/discord.mjs","sha256":"8966f1f98ea81b4525345fc4889db5e0e5263ca41b5132ac8dd9bd99a2c88522"}
{"path":"packages/discord/src/journal.mjs","sha256":"12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5"}
{"path":"packages/conversation/src/reader.mjs","sha256":"75d0cc982c36b0a81ff23f0da9da1b56906c496250a043f91d3a3b18ffa8e51b"}
{"path":"packages/conversation/src/safe-fs.mjs","sha256":"62b0f7e9f798f584fcc0e4ead0522e44fd113bd0803f2bad92ffa480cadb7527"}
{"path":"packages/conversation/src/pi.mjs","sha256":"20e781240846298fa65f9a8226b5e1ee1e81338b81229334666d845c17c99ac1"}
{"path":"packages/project/schemas/project.schema.json","sha256":"f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de"}
{"path":"packages/project/schemas/requirement.schema.json","sha256":"79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3"}
{"path":"packages/project/schemas/decision.schema.json","sha256":"925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b"}
{"path":"packages/model-proxy/PIN","sha256":"889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b"}
@@ -0,0 +1,202 @@
06794536ac746e9cf02ca698838cd5355987b29fd6a18a8fb3b51464c41f10c1 agents/codex/work/queue-333/trace-inputs.mjs
a2ba3a46f12e56139ecae9e55227d00847842aedec50c1d92aaae28844ca48e7 packages/bus/schema.sql
232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23 packages/bus/src/address.mjs
c0144adade79c2cfc6b8247721393f0250b1d64f6c6c04d85738cb80939c42e5 packages/bus/src/broker.mjs
ff927da3cf22fbacc9ace77b2e8b803bffc2953fb58cf7ab4e5f6f6493732996 packages/bus/src/business.mjs
f3d483f61a24cbc9cce235e1e92889f09b8cecf513fcaf90c741f316f62262e2 packages/bus/src/client.mjs
86b4321dd436b97e389101873197dbab95b3d2202e5ef7da712c4978f4f9159f packages/bus/src/credential-verbs.mjs
10485afcf94c29ac9f3d5ba30b12248a2379efd69185ff9fb90e9fed25fe0678 packages/bus/src/credentials.mjs
27d7d5322c2f12641e350867d3ac6f838b33832951e69f057e3a7a28b8ac4d5b packages/bus/src/gitea-grant.mjs
48337cdbc41d503f17962d3e3ad014183b1286165f97da6fd88b4faa50be3949 packages/bus/src/host-grant.mjs
324c05b16253e0fcfc1a0299d1d8ab45850ea723fad1f67bcc07fc031f50d593 packages/bus/src/host-run.mjs
bb13c146717cdc46d75d157177e400edac4d3e10f14fe511027a25fd44cec885 packages/bus/src/human.mjs
56bfc8dcba476886d7de61a1e798aae8e3041c2434c62d44fc40a168d22bb3bd packages/bus/src/interpreter.mjs
9919febc7679168e0a72c0ef51983120283e595fea290a5e8e948409bf5c911b packages/bus/src/landing.mjs
18c1aacd280ebf0f200d5e6fc1dd1a7e098a3046c1cb8427140bb2198ac81cd3 packages/bus/src/limits.mjs
b753f630301bf125e9e286b4156d0736930dd8fb9cd8eb2ebf316688f9191a07 packages/bus/src/migrations/3b-3c.sql
179ffe356d4ff19a49b5ebad39b6c6bfd7771deb8e1b7c55b5e746f039d69e65 packages/bus/src/migrations/3b.sql
0423832d05aa68f9191d7362827bd19310001165b895fb2de40b962fe68f9d56 packages/bus/src/migrations/3c-3d.sql
d9aacc974d5047790e65c30a90068259bb9396dc92d4904eae3b9c5dbbb2f077 packages/bus/src/migrations/3d-3e.sql
bf0b72c606b1a56a1610f09619b0c1118f1f300c636824ea13fd51a4ca6ac4b3 packages/bus/src/migrations/3e-3f.sql
82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05 packages/bus/src/migrations/3f-3g.sql
76168e4f9f6b427286ddb8402fd833acadb01d6325a85f60e9ccf8d42fe2d1d0 packages/bus/src/migrations/3g-3h.sql
e058e6cea8da7b6e649f3e03f2b81dc5444ee940a64274d0e367124c93545035 packages/bus/src/migrations/3h-3i.sql
5ad122ca950e43e066f3d9ed215e73353e6b26de6687b961a8818d69c9465031 packages/bus/src/migrations/3i-3j.sql
2e2bb1fe70076f5e24406a18a923b9e55c4192178a0a704a1b9716032676f9d4 packages/bus/src/migrations/3j-3k.sql
eb2822c73e527697399691ae520092277ddbd4d2a9a42a0731b3c81cc3569e58 packages/bus/src/migrations/3k-3l.sql
791879f06a3e97d3cfbe6112e2fb6502457af30b3e0198e3da1192038906d156 packages/bus/src/migrations/3l-3m.sql
b40bc6a7bedc459d6827cbf0414619e48fc5dce2febdeff70a647345f2281c3a packages/bus/src/migrations/3m-3n.sql
b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550 packages/bus/src/model-keys.mjs
29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7 packages/bus/src/peercred.mjs
2b1e18be825e8264b16506d6294863acbba812956cfdf8e056f21faaa94f7137 packages/bus/src/principal.mjs
ed13afdce6359df31d35a79496ebb4afdefef82030a8326a76b2a25b37e98d9d packages/bus/src/process.mjs
cec059ea4bef5ef62f6181123bfe64bca21d8985d5357471da8c0a3199a877f9 packages/bus/src/proxy-page-vocabulary.mjs
af36aae674f46a4e5eacfe176fde8b58cd0b171a6d70e07ee6d479e0f558cce7 packages/bus/src/proxy-page.mjs
5a6c3707e6a64304cfd37f1875eb378c6eb58bf438cc40365fe913eaec7cee59 packages/bus/src/proxy-usage.mjs
969d04eb06b97093c7f9f0dfa6b51084c781e967e2668814083bbba84a2af7b6 packages/bus/src/runtime.mjs
8318bed9168ac3f58c09de40a139b68aacefd684e6c117406e181e2ca5ab4ec7 packages/bus/src/server.mjs
dd7fce9706402efd1c5a5b81f7d0fa3793de203e7a6aef4e118e934aebdc7c84 packages/bus/src/store.mjs
5e9e08ca8069e1de35232f26d48a77792388128dda659893909f2d34b5af2346 packages/bus/src/tester.mjs
4ae57d053c4b217e1c1a22ada3ed1c5d4a3f0e61b8d2798e9db37997cd071a29 packages/bus/src/usage.mjs
1f31aefa71984fba90c5390df5cc595d929681965f57485ad4972143d5c4b15f packages/bus/src/views.mjs
68efa3c9d0a72095f503208ed5c2e660ef9bca68d3ea15f0fc2f1826a68e09cc packages/bus/src/web.mjs
dbbfa80b4082fd44e2f08539b5455653fac062321b8f2106f638e2d8161fa3eb packages/bus/tests/daily-quota-runtime.test.mjs
45870a4903d1996915c0086a6beb4d0a4c75b38386b7c5e6d98b5bc811c3b541 packages/bus/tests/limit-checks.test.mjs
561d0950b788d08ad9a79ccd6572ad6976ba4b2e2b1c79d1e4d06827a84c131b packages/bus/tests/limit-stop.test.mjs
a2e553025edbe6e930c9d03b48289c53b51b153ac9ae49bb21bf721b725f1913 packages/bus/tests/limits-runtime.test.mjs
e37114eab9c5f21015ea8e429f0574d3ea34b06263f1e42b83b31b8d2df222a7 packages/bus/tests/p5-key-context.test.mjs
241e779016ffd0b54c5646cb4fac7e21ea1167e77afbd652ff4e01f8d238f99c packages/bus/tests/p5-runtime.test.mjs
895ffddbcca1b38fdaa17eefdeca9092a9b9a934d3a54a3bf7857f42fe99fba7 packages/bus/tests/plugins-verb.test.mjs
84c8351029272b6ee05e7fd81b4cc4453553ceeb7a5127a1333dae63d1336ad5 packages/bus/tests/proxy-usage.test.mjs
4b2149ea4219f49db19669ada9f88931f7691cdd73dd27dceec6e8fe1f76dd0c packages/bus/tests/usage-broker.test.mjs
5abe93fca8442f06ff68760623e91262d863e1191fa35a3d0c87d7b0e6c0a4c6 packages/bus/tests/usage-runtime.test.mjs
2613ba0561572a7d4f753066922fddc90cca812cb0ce2b3e0a9a4d249a15e340 packages/bus/tests/usage.test.mjs
af028c999a6ab4d42b321c3f047e683b226c7ad232a2ae9cfc623b7dd5a4dd5f packages/business/src/access.mjs
aaa4578fd4133f64119de6c8786a14759240a8910677529fdeae57173058b7d9 packages/business/src/business.mjs
c3422b1e144177f9dd3015ac036ee1d2cde02bd2b3be406364f3b3f45d8c9b73 packages/business/src/credentials.mjs
cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a packages/business/src/errors.mjs
e08b11b70b54f13e3b18996dd903f841e04fd6c64791e96063df8b164c663882 packages/business/src/hosts.mjs
a386ce5bd1d41d86f7b90641a423a2b651b491c8989d5085412c7d202ac1cb30 packages/business/src/index.mjs
09f2bde85a6d7a8f0b1d1c60ac589b845b0c95e991b2f807758878416b13c6bd packages/business/src/instance-settings.mjs
e14d73f719664499d809909962a6ecc16d4ffb9d824fcdee699e0778809d9e96 packages/business/src/launch-settings.mjs
0aa94dbd14acd379a4837cc3e70b9618b3fa797d74124314e7245a8a3070e98c packages/business/src/launch.mjs
93a7fddac9a08b5f740a0a277b29b8a3459e6f5a4fd33a37212437cb456b9b62 packages/business/src/library-seats.mjs
44fa089c9024934a2f9fb5ef99552eb18d616842210cbc0fc860ea32ce0b1524 packages/business/src/migrate-launch.mjs
fa4ba1ae878cd27287865fa12115f8a6c1175a2dfd1011d5f8aca11e46e669c7 packages/business/src/organization.mjs
9d2c68dd21c6c9553af75f4b137c4f169e95761f32528767e0518d0313311f50 packages/business/src/plugin-settings.mjs
9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff packages/business/src/project.mjs
712183465fee099606223d84423afc54e3386a0c8e468c68d5ac39c1e676d109 packages/business/src/resolve.mjs
b10af84d7422da4d0e8c0a4fea1064eebbc2fac6a838a1b3939b554e22dedfc9 packages/business/src/role.mjs
e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c packages/business/src/util.mjs
f6b15ee8dad2d985c0ae66b1f106ca46cb56ec86ac8cd5dec8a05c887596a421 packages/business/src/vars.mjs
de1f04628e400084a46e77fd7e03c7a039f0f80c9e07bb486c9c012f187aa3eb packages/business/src/vocabulary.mjs
a6a9971b42ddf176d9415caee3efc2eb16791dead5f0f0557d28449a550aefa1 packages/business/tests/helpers.mjs
f0dfe004905dce31317d85d89a05802db878c3472e765e85dc9f1e04166e1df6 packages/business/tests/plugin-settings.test.mjs
bc6b3a31e8918d70aced7151b91ac4b39afec4081054024b162acb0e8f8fae07 packages/business/tests/token-limit-settings.test.mjs
c4949a16173d11f9d32d10d3ddd58a181631848b259bef1998820a78f5694808 packages/cli/src/access.mjs
15a8ee212fc37cea28e389f60ddb8916f9e1509cdcfb2e522acfe548702a16dc packages/cli/src/app.mjs
147a17bbdcbc34efe20a88a4cabe796c101cb63dce621d28103f4de29def4cc2 packages/cli/src/boot-status.mjs
1e663b175e18e39ff68c9ac3a65ff71fc777a6c37ebca035fce6a2783d0aaac3 packages/cli/src/cli.mjs
d960c2a9df3f7c84deff22dad1f0ab120f95ee365984e390de98eba7292b65a1 packages/cli/src/config.mjs
19755f7bb002d8455990c5dc7c458e64aeb95252ec7231a2ed2fd9c638fcb511 packages/cli/src/credentials.mjs
c7bdd98a3ddeeb9bc4415d907b92555d723c566eba314075d91486da9b5e85dc packages/cli/src/errors.mjs
481d9956698df7765ca8556d57164fb78f131708a09900d5a55b9048b5638f5f packages/cli/src/format.mjs
3076a53b9891d4d0e084306567b88ded12c4de53a943c029646a424bf59d8e49 packages/cli/src/git-socket.mjs
b586907ca8f351f60dc19ec2683df75d2d70ddb12955d09fb14560c9d3bed3dc packages/cli/src/grants.mjs
a0936aee783ff47dd58fc907fefd86f63e571809a3ce5b0d6d931f71e756b15e packages/cli/src/host.mjs
60419503898f5e7f3046df5e749098728fbdfea76eb5c53b5dc9b909329abe2e packages/cli/src/hosts.mjs
8d6dab8da62b4458477572ca1956adad57bc0b0d308df6eae57477175c345d7a packages/cli/src/instances.mjs
373d4c028dfa6d85c748d56f56359789fe2b81987f522ac23747fd37bb5478ed packages/cli/src/launcher.mjs
2f291a71f490f2741edada7a3e3788500f8976a08eb8ab1411f6c5982f778260 packages/cli/src/limits.mjs
9a043f122e1d49103bab64716d0eb80cfc09da3c91f7e2eb014b0d8ff0b02f3d packages/cli/src/model-proxy.mjs
0bdc91dcaa096bd3dc9d08a1dea59893a21f6505c843e698ad9c8daa4b74364b packages/cli/src/model-stall.mjs
f8d9fc24ccd71494fb2914914949cb08948ae93fb3180b9531eb807c921a6f53 packages/cli/src/plugins.mjs
6cfe7fd5086ddb59c5666060c6f8044c2852e0f3d5755b1fa206f7521173f300 packages/cli/src/project.mjs
9d03335628ae62e85c5fbc08c2e739ed0bd43b10d486faf397129a56a1b343e0 packages/cli/src/screens.mjs
1a30048032f5bb64419ae9716a1692978bc1a137220a094d1900298aca6ba1d7 packages/cli/src/session.mjs
58888b7731f8009d4c3f8be2caf4445f13dd8f534e1633f6e2720b259fcc3f92 packages/cli/src/thread.mjs
662642a8ce739fcb6c188ad07125a94e008c8a305eced127c8041d472c56e55b packages/cli/src/transport.mjs
f9e0c69849633ae36a7a6aa22729a690dc40292178ac3db43accbb131fd7b4ca packages/cli/src/usage.mjs
8966f1f98ea81b4525345fc4889db5e0e5263ca41b5132ac8dd9bd99a2c88522 packages/control-board/src/discord.mjs
6d74b131af360268be748a1f8f7f2b3f5a9180365e7279426640883fc295a676 packages/control-board/src/scan.mjs
2eb25c46e85ddadd3bdbdbe605db54a6e09845155384a209622554d78307e583 packages/control-board/src/serve.mjs
a45beb82438bb42d97d1e322010e175e785767664e548b90c4125e98b7660003 packages/conversation/src/client.mjs
eaf0772b60bb17fbf9548267c9cfeb0104f92f5cbafdfcb60c1633883eec6432 packages/conversation/src/framing.mjs
da336ed2a2a149ff56ac12af2440a8353d4573c33e9069381be60f1a0ca70151 packages/conversation/src/parts.mjs
20e781240846298fa65f9a8226b5e1ee1e81338b81229334666d845c17c99ac1 packages/conversation/src/pi.mjs
75d0cc982c36b0a81ff23f0da9da1b56906c496250a043f91d3a3b18ffa8e51b packages/conversation/src/reader.mjs
96f7b64c2e2c3493e270224542818fd14f042e3cf0ac14788b3f881010bc25b1 packages/conversation/src/records.mjs
62b0f7e9f798f584fcc0e4ead0522e44fd113bd0803f2bad92ffa480cadb7527 packages/conversation/src/safe-fs.mjs
c24d28a073659640b8b027eb12ad150ba895c3001091b892ecef2ec1da40d5cd packages/conversation/src/terminal.mjs
f834ee740e7149e7d2ed976112d0719ce0660270e3b61cf93e1774d112c992a2 packages/conversation/src/transcript.mjs
5ab69c4111dd9589a197172ffe6968bf414f41c552b7910e5478a27c446cfaec packages/discord/src/binding.mjs
917b0e6c4f100e93f056b925e38d97eacdd8b2596e39fbd3f88c0b62b973d8ed packages/discord/src/errors.mjs
c28e04a0055997ea0b34bea1ad2912adb248d5fd43713df1e6f5a661d87949b7 packages/discord/src/git.mjs
12684e926574c3fe7f693a03b60d1393df483f5feb4b47c9dd7c5a7ac050aec5 packages/discord/src/journal.mjs
8fa9968862dff77fa6d8be5210c22d13712fd622a8cbc722d167be5be80d0783 packages/discord/src/processing.mjs
ba09d286e707860afa53300f8802ac8e6193ab2d2e7abe9d2b07cbdef3822387 packages/discord/src/setspark.mjs
975503616245bb6051f06ecbf47436ce7d030f21af23042df7f3341062df967f packages/discord/src/tools.mjs
e5a7b64720872b12b34223549537ace05ebf0ca8a29b2f844d2b7c5cc9ea41f7 packages/discord/src/web.mjs
e944a4c7a26d1fe55e13ac1eca31dd86c302dc7c868224b8b000b27255976153 packages/harness/src/bundle.mjs
a74ef2db4093c0c797ba9e7e28e4e4df0ceac9040385f00e60a273f39af9610b packages/harness/src/gate.mjs
38fe84040a78c3f8a8dcde4339d88db3b5df9ef669d605ad1d92ff3e8b646b40 packages/harness/src/tools.mjs
f710d9600a17f6e2989a289cfe84e58f161d86c7306605946ce05fa71b364eb2 packages/library/src/guard.mjs
70c1fe75cb2149c9a074d55a6301d5b66157c2dc2e777b92bac338cce09d89c7 packages/library/src/index-build.mjs
98c2c2877549c3e2c5963ec4e49d99ab3b6d6ad54fb3bfae86cf98542207157e packages/library/src/index.mjs
98ef45ed61144aaea44d8aea1ac43082b6d340297e46846d01772da38728e530 packages/library/src/limits.mjs
def32a176cb70c86248e45908edde22f9c4c5f88575a4af0a396a05f617358bc packages/library/src/links.mjs
c83c626c7cdc2a00ba4217c34b889ca0517cd2022d1f8fc9e7d3a14a0293a802 packages/library/src/mapping.mjs
26b824d6885e5c6d1b8bd71e754a9fa333c26307693f7e6a0c6a8e6300ecb4ae packages/library/src/mirror.mjs
0c8764b03dae0150c56af74bcb113cf583dcbe1fa0c6f7386ef2d48d59a6bd31 packages/library/src/problems.mjs
bafe113bee70f17bd249876d6bdd1c08fa051223c2111955e5d5f275bd76bba0 packages/library/src/query.mjs
ea126533afb7e74b71419eb943febb6b242eb96fc6917d9df1019db3e7e6ce8d packages/library/src/reader.mjs
bfc3de029d3c8f0dcc96c90fde30d6da58bbb5b72d8f13e3f536c0d735c73ca5 packages/library/src/render.mjs
7b46f47b5e9d6b554b5d39bce2cd95c4610f5f35b8ab8fdc5a2864b3214be809 packages/library/src/reply-protocol.mjs
97e12255f52ad638eeacd152eb26822f9a2aa72cd30e2fed1193f51cd6e56192 packages/library/src/scope.mjs
6a3b4de2070e62b1cca1c0ab20f2883d3153fc61608d1bf7670cecea08765b4c packages/library/src/supporting.mjs
016bfa5c80572c0baf90ced39cb3d3ec66d395f0be15c2727b9552a9dd849093 packages/library/src/survey.mjs
a58f3aec5ed9b3530b363e2fdbd38bc9ded7635d261ab2fca3cb31c45dcd3dfa packages/library/src/sync.mjs
a301b7c7e3f42f66cb69d88991220f4e236f25a6e5951c61e79ec4ef2b714198 packages/library/src/write.mjs
889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b packages/model-proxy/PIN
f5f86cad661034f223a76352d877fa8d7883bfa921a7a01282347a9a03272441 packages/model-proxy/src/client.mjs
a6fb88352018b8f21593a0bb9311f87162c80d8b1e05e62b4d43b1e69af21b23 packages/model-proxy/src/common.mjs
00378d2ea95ac4945899696462f8ff4c70dc020cc58d93663d731d2f2f333783 packages/model-proxy/src/fetch.mjs
1eac4b5741b360a077bb1c871c008b64f7c7119afc64be4d6e4a0dcdb3a313bb packages/model-proxy/src/settings.mjs
e66453cf6662677cf28cbad1ae8f7509917d333e5b80404ab02c53f5cf75e9e1 packages/model-proxy/src/validation.mjs
77327681d6eb51f25d7aeffcc532b7e8269c1dc59139cb03adb4a3a1409f63e9 packages/model-proxy/tests/client-probe.test.mjs
790c6a50ec030a8b27a28fac7fd129bd9eabe79774adf11d6620c00df9b6ae86 packages/model-proxy/tests/client.test.mjs
95e39a519f7ac8b9592876e6157191169f9b14d002163867a6ff6ab808e42c14 packages/model-proxy/tests/management-key-encoding.test.mjs
f24e1d121a340cbcaa3f6cd6390eeb7d4b05f778dd498d76ba099cba5a719dea packages/model-proxy/tests/page-client.test.mjs
1ad66d56800a31cfbd387939e640653bc72150f4e73822d9e3c777b3bffbf1e1 packages/model-proxy/tests/usage-client.test.mjs
a317ac544359d321bb91b67cd87fc6ef431b72df9ac9f7f2a9ff291ed1a9109a packages/plugins/harness/claude-code/index.mjs
aabaf5c4602e28f025c18b2e2ddd6fa0d1648870101a5de0c4424d97b24472dd packages/plugins/harness/pi/compactions.mjs
39c225f157b8f66b416625bda689153505743ffcfdc32964bb1f3d2c6fcb73af packages/plugins/harness/pi/index.mjs
3749b9f6dd681ef424ee7d7e4d80ccee87b3655df8cd8fe9ccd0d505dcaaee9b packages/plugins/limit-check/daily-quota/index.mjs
4d0c6f5f87101f94608c02001a49d62cef113da48c539b2d2488dfbed1a4c524 packages/plugins/limit-check/token-limit/index.mjs
5fcecf8336ee247e8ac2f626b21e4c79b1edc49082eadfd536cd23016c6bb756 packages/plugins/src/channel.mjs
eaa258a1aadadb5a75450fa73fdbcea0b53636adb50ed9a508193d29d564ca78 packages/plugins/src/kinds.mjs
2e99f9222424cf9503253701568f0bb5ef579a22930f9f224e5b63ad6b4f745f packages/plugins/src/loader.mjs
3d4fab56fea4c45c6a317ef41121aa5b6da0502a6ef614b7931f91cafdfc1f71 packages/plugins/tests/daily-quota.test.mjs
5d5e5dccdae3f94b8540d187a8899ec36f9c9933cae3933249c2d8c400c75aa2 packages/plugins/tests/helpers.mjs
f3081e1dbdac20ade2246c743bcbb3934be686f79f378af21c365cd1451893ba packages/plugins/tests/kinds.test.mjs
8588ad7eee0c9ce5de3b53e3b88562812a155a3d791a2bd3413bb1754655d78b packages/plugins/tests/loader.test.mjs
6e96bb96278ec754ca1816a24f49ef677771615ab5cf186ae41969fc2f93d8cc packages/plugins/tests/token-limit.test.mjs
d09ae19db3eb69477783163559bd6a8e5b59a6f5af0eafd62d0e2e3bd325065e packages/plugins/usage-source/transcript/index.mjs
6096a577cd5d7e8bf84fd6b98ab284e2f47d5facebd027548e07e6aeec442f96 packages/plugins/usage/cliproxy-queue/index.mjs
781973277c09133de15fc39be35b372a79066479097d46923c8ab7782f011dcd packages/processing-control/src/containers.mjs
ddc7318297abc4ec4dd03d425820b7323db609e554cfc5341cfdfa6934271e73 packages/processing-control/src/coordinator.mjs
3bc600649267f011e21ed8266fb16927b0ad3a0e2c49e4b54062d34c544d0c17 packages/processing-control/src/effects.mjs
7145420aa354180689a5c84423928fc60c8123476dcfed3364c9cf4542f8c7ea packages/processing-control/src/runtimes.mjs
ed834770fed863cb0c15b75062de1fd63dea940f3b42020b769a7e62b319c8ed packages/processing-control/src/state.mjs
925bb03ac99e5845e4bfa20b4561a331f034f88e187db82213df6602a7ceee4b packages/project/schemas/decision.schema.json
f069c012e9660d5d0491a21f98e936b725f6818e1c3136dfec61b3c800bd58de packages/project/schemas/project.schema.json
79a1e7b567af7162bb88ca69861075fc579a858e8aec4e49824ccdc370b690c3 packages/project/schemas/requirement.schema.json
af6865a4cace92ef27910098507ffedfc8dfe768cea088b1fee21d0876cc556e packages/project/src/git.mjs
3ab38cc40ce9ed1a714a59a1f2c336c3792a59431a6a9cc655ba6a2f47513899 packages/project/src/index.mjs
bd9debcf3f9bb92560e74f220a0b108dfe24154bc6d1fb03c5ec414356d451f9 packages/project/src/paths.mjs
42113cd20eb8f04dd252f9963a6f1a84806af9cae7beb6808c4d584a2548220c packages/project/src/read.mjs
e49ab5e825f0706da2f3c8dfcf33c1331a38d77ca2d35b03359ee68ea74652c5 packages/project/src/validate.mjs
5aca02491fe8df51487968ce62c776d493d0fe693cc41478b84bef7b49c8948d packages/seat/src/checkout.mjs
c5de99284b8fa61763b8dd30a58809bbc086529eeb10587586d52b0df2754774 packages/seat/src/compactions.mjs
6f7c938a32b349ee49ce95b89ad499e599f6016e5e9d7efd79a9ea4177b4d175 packages/seat/src/landing.mjs
382cbf7e0ff336911e288ce858bdbfbec693bc2b69879720d1f0b4c7d8455198 packages/seat/src/proc.mjs
0868f393f6fb117d430428ec390e435359737eae0792b4a4d1f54797c7a6c1bf packages/seat/src/sandbox.mjs
eec970961a667c9e614d1474d33c31a019b2cf1b0bf931a51458d874bca13a15 packages/seat/src/seat.mjs
c37a6ef6f6d2b4e61443e77d800656bf31e38913bf7dbdc4ca955f4a83b13a41 packages/seat/src/session.mjs
621f5c223811444336f0f5d6ad10bc7afce075491653c0527d6c26ca568b79c3 packages/seat/src/working.mjs
80b58323994d70e8bb496d81225aeb3d2cdfda464654b68b3b082e9af1fac5c1 packages/tasks/requirements.json
c9a883e9a1649277edce97adca40bca2874df7b5312c70e4ac6f6d4a1c860841 packages/tasks/src/fields.mjs
38e7b85650247759f06c09fce205b2970b8368bc81491f51dc6b3c90ba2a846d packages/tasks/src/requirements.mjs
4ebf6c2b5d71c23d85cbde83f69aa671058dc2195c9ae4bdda624f6940729d1b packages/webui/src/bus.mjs
3a5321a5f492a98d342e4ddcc1e9da3522cfff89a4f9bc3f51d2ab1426d3de1b packages/webui/src/chat-http.mjs
93d4d0c36d0b74eaace24bce4c3e7179b7418377eb4df6d0f6a9ca89d5eb8e39 packages/webui/src/decision-http.mjs
c3825a02c3b4f4e5537db4a945439d707e177e74c3e8b1fc2cb777515e610b64 packages/webui/src/processing-http.mjs
a09028cd5ca57367f597d0681e84926ca871fd4626769e9947927d949c2b6ab7 packages/webui/src/proxy-http.mjs
3c7a35e25b4c1cfda19ac9466d4b2fbc86c880761a1d04ad3ece8bc485f60f93 packages/webui/src/public/bus.js
46defeb3b4be0e1a22e4b89445872ad6b15cdee182076e9e6222219ae29997f4 packages/webui/src/reads.mjs
7b7bee91604b7bd973027b177de83205db9aed366e694072fc6343b46465b5ba packages/webui/src/serve.mjs
1c1fe0c795adac97f28502564a75f26d5666d9be5ae51169f7dd5bb7741fad16 packages/webui/src/tester-socket.mjs
b35d3f3471d6d83ef2d19d6102eaecce2ddec9330f337d7194f1d7be03cbd216 packages/webui/tests/fixture.mjs
39f50991578b98594183390a00efbca84fda90ef61617eea4215e2c75f90b82c packages/webui/tests/usage-render.test.mjs
f96d06974bc83051c0d5c9000e38161ea0cc231997410bcc6c42ed7f55718dfd packages/webui/tests/usage.test.mjs
5f63ff52aaccf06a0f2415ffdd9d1903c202679cf953bef5266a6841b5e39ab7 roles/assistant.json
@@ -0,0 +1,202 @@
agents/codex/work/queue-333/trace-inputs.mjs: OK
packages/bus/schema.sql: OK
packages/bus/src/address.mjs: OK
packages/bus/src/broker.mjs: OK
packages/bus/src/business.mjs: OK
packages/bus/src/client.mjs: OK
packages/bus/src/credential-verbs.mjs: OK
packages/bus/src/credentials.mjs: OK
packages/bus/src/gitea-grant.mjs: OK
packages/bus/src/host-grant.mjs: OK
packages/bus/src/host-run.mjs: OK
packages/bus/src/human.mjs: OK
packages/bus/src/interpreter.mjs: OK
packages/bus/src/landing.mjs: OK
packages/bus/src/limits.mjs: OK
packages/bus/src/migrations/3b-3c.sql: OK
packages/bus/src/migrations/3b.sql: OK
packages/bus/src/migrations/3c-3d.sql: OK
packages/bus/src/migrations/3d-3e.sql: OK
packages/bus/src/migrations/3e-3f.sql: OK
packages/bus/src/migrations/3f-3g.sql: OK
packages/bus/src/migrations/3g-3h.sql: OK
packages/bus/src/migrations/3h-3i.sql: OK
packages/bus/src/migrations/3i-3j.sql: OK
packages/bus/src/migrations/3j-3k.sql: OK
packages/bus/src/migrations/3k-3l.sql: OK
packages/bus/src/migrations/3l-3m.sql: OK
packages/bus/src/migrations/3m-3n.sql: OK
packages/bus/src/model-keys.mjs: OK
packages/bus/src/peercred.mjs: OK
packages/bus/src/principal.mjs: OK
packages/bus/src/process.mjs: OK
packages/bus/src/proxy-page-vocabulary.mjs: OK
packages/bus/src/proxy-page.mjs: OK
packages/bus/src/proxy-usage.mjs: OK
packages/bus/src/runtime.mjs: OK
packages/bus/src/server.mjs: OK
packages/bus/src/store.mjs: OK
packages/bus/src/tester.mjs: OK
packages/bus/src/usage.mjs: OK
packages/bus/src/views.mjs: OK
packages/bus/src/web.mjs: OK
packages/bus/tests/daily-quota-runtime.test.mjs: OK
packages/bus/tests/limit-checks.test.mjs: OK
packages/bus/tests/limit-stop.test.mjs: OK
packages/bus/tests/limits-runtime.test.mjs: OK
packages/bus/tests/p5-key-context.test.mjs: OK
packages/bus/tests/p5-runtime.test.mjs: OK
packages/bus/tests/plugins-verb.test.mjs: OK
packages/bus/tests/proxy-usage.test.mjs: OK
packages/bus/tests/usage-broker.test.mjs: OK
packages/bus/tests/usage-runtime.test.mjs: OK
packages/bus/tests/usage.test.mjs: OK
packages/business/src/access.mjs: OK
packages/business/src/business.mjs: OK
packages/business/src/credentials.mjs: OK
packages/business/src/errors.mjs: OK
packages/business/src/hosts.mjs: OK
packages/business/src/index.mjs: OK
packages/business/src/instance-settings.mjs: OK
packages/business/src/launch-settings.mjs: OK
packages/business/src/launch.mjs: OK
packages/business/src/library-seats.mjs: OK
packages/business/src/migrate-launch.mjs: OK
packages/business/src/organization.mjs: OK
packages/business/src/plugin-settings.mjs: OK
packages/business/src/project.mjs: OK
packages/business/src/resolve.mjs: OK
packages/business/src/role.mjs: OK
packages/business/src/util.mjs: OK
packages/business/src/vars.mjs: OK
packages/business/src/vocabulary.mjs: OK
packages/business/tests/helpers.mjs: OK
packages/business/tests/plugin-settings.test.mjs: OK
packages/business/tests/token-limit-settings.test.mjs: OK
packages/cli/src/access.mjs: OK
packages/cli/src/app.mjs: OK
packages/cli/src/boot-status.mjs: OK
packages/cli/src/cli.mjs: OK
packages/cli/src/config.mjs: OK
packages/cli/src/credentials.mjs: OK
packages/cli/src/errors.mjs: OK
packages/cli/src/format.mjs: OK
packages/cli/src/git-socket.mjs: OK
packages/cli/src/grants.mjs: OK
packages/cli/src/host.mjs: OK
packages/cli/src/hosts.mjs: OK
packages/cli/src/instances.mjs: OK
packages/cli/src/launcher.mjs: OK
packages/cli/src/limits.mjs: OK
packages/cli/src/model-proxy.mjs: OK
packages/cli/src/model-stall.mjs: OK
packages/cli/src/plugins.mjs: OK
packages/cli/src/project.mjs: OK
packages/cli/src/screens.mjs: OK
packages/cli/src/session.mjs: OK
packages/cli/src/thread.mjs: OK
packages/cli/src/transport.mjs: OK
packages/cli/src/usage.mjs: OK
packages/control-board/src/discord.mjs: OK
packages/control-board/src/scan.mjs: OK
packages/control-board/src/serve.mjs: OK
packages/conversation/src/client.mjs: OK
packages/conversation/src/framing.mjs: OK
packages/conversation/src/parts.mjs: OK
packages/conversation/src/pi.mjs: OK
packages/conversation/src/reader.mjs: OK
packages/conversation/src/records.mjs: OK
packages/conversation/src/safe-fs.mjs: OK
packages/conversation/src/terminal.mjs: OK
packages/conversation/src/transcript.mjs: OK
packages/discord/src/binding.mjs: OK
packages/discord/src/errors.mjs: OK
packages/discord/src/git.mjs: OK
packages/discord/src/journal.mjs: OK
packages/discord/src/processing.mjs: OK
packages/discord/src/setspark.mjs: OK
packages/discord/src/tools.mjs: OK
packages/discord/src/web.mjs: OK
packages/harness/src/bundle.mjs: OK
packages/harness/src/gate.mjs: OK
packages/harness/src/tools.mjs: OK
packages/library/src/guard.mjs: OK
packages/library/src/index-build.mjs: OK
packages/library/src/index.mjs: OK
packages/library/src/limits.mjs: OK
packages/library/src/links.mjs: OK
packages/library/src/mapping.mjs: OK
packages/library/src/mirror.mjs: OK
packages/library/src/problems.mjs: OK
packages/library/src/query.mjs: OK
packages/library/src/reader.mjs: OK
packages/library/src/render.mjs: OK
packages/library/src/reply-protocol.mjs: OK
packages/library/src/scope.mjs: OK
packages/library/src/supporting.mjs: OK
packages/library/src/survey.mjs: OK
packages/library/src/sync.mjs: OK
packages/library/src/write.mjs: OK
packages/model-proxy/PIN: OK
packages/model-proxy/src/client.mjs: OK
packages/model-proxy/src/common.mjs: OK
packages/model-proxy/src/fetch.mjs: OK
packages/model-proxy/src/settings.mjs: OK
packages/model-proxy/src/validation.mjs: OK
packages/model-proxy/tests/client-probe.test.mjs: OK
packages/model-proxy/tests/client.test.mjs: OK
packages/model-proxy/tests/management-key-encoding.test.mjs: OK
packages/model-proxy/tests/page-client.test.mjs: OK
packages/model-proxy/tests/usage-client.test.mjs: OK
packages/plugins/harness/claude-code/index.mjs: OK
packages/plugins/harness/pi/compactions.mjs: OK
packages/plugins/harness/pi/index.mjs: OK
packages/plugins/limit-check/daily-quota/index.mjs: OK
packages/plugins/limit-check/token-limit/index.mjs: OK
packages/plugins/src/channel.mjs: OK
packages/plugins/src/kinds.mjs: OK
packages/plugins/src/loader.mjs: OK
packages/plugins/tests/daily-quota.test.mjs: OK
packages/plugins/tests/helpers.mjs: OK
packages/plugins/tests/kinds.test.mjs: OK
packages/plugins/tests/loader.test.mjs: OK
packages/plugins/tests/token-limit.test.mjs: OK
packages/plugins/usage-source/transcript/index.mjs: OK
packages/plugins/usage/cliproxy-queue/index.mjs: OK
packages/processing-control/src/containers.mjs: OK
packages/processing-control/src/coordinator.mjs: OK
packages/processing-control/src/effects.mjs: OK
packages/processing-control/src/runtimes.mjs: OK
packages/processing-control/src/state.mjs: OK
packages/project/schemas/decision.schema.json: OK
packages/project/schemas/project.schema.json: OK
packages/project/schemas/requirement.schema.json: OK
packages/project/src/git.mjs: OK
packages/project/src/index.mjs: OK
packages/project/src/paths.mjs: OK
packages/project/src/read.mjs: OK
packages/project/src/validate.mjs: OK
packages/seat/src/checkout.mjs: OK
packages/seat/src/compactions.mjs: OK
packages/seat/src/landing.mjs: OK
packages/seat/src/proc.mjs: OK
packages/seat/src/sandbox.mjs: OK
packages/seat/src/seat.mjs: OK
packages/seat/src/session.mjs: OK
packages/seat/src/working.mjs: OK
packages/tasks/requirements.json: OK
packages/tasks/src/fields.mjs: OK
packages/tasks/src/requirements.mjs: OK
packages/webui/src/bus.mjs: OK
packages/webui/src/chat-http.mjs: OK
packages/webui/src/decision-http.mjs: OK
packages/webui/src/processing-http.mjs: OK
packages/webui/src/proxy-http.mjs: OK
packages/webui/src/public/bus.js: OK
packages/webui/src/reads.mjs: OK
packages/webui/src/serve.mjs: OK
packages/webui/src/tester-socket.mjs: OK
packages/webui/tests/fixture.mjs: OK
packages/webui/tests/usage-render.test.mjs: OK
packages/webui/tests/usage.test.mjs: OK
roles/assistant.json: OK
@@ -0,0 +1,26 @@
// Final scoped verification only: records paths/hashes, never file contents.
import fs from 'node:fs';
import { createHash } from 'node:crypto';
import { fileURLToPath } from 'node:url';
import { resolve, relative, isAbsolute } from 'node:path';
import { registerHooks, syncBuiltinESMExports } from 'node:module';
const root = process.env.P5_SOURCE_ROOT;
const target = process.env.P5_INPUT_TRACE;
const read = fs.readFileSync.bind(fs), append = fs.appendFileSync.bind(fs);
const seen = new Set();
function record(path) {
try {
if (path instanceof URL) path = fileURLToPath(path);
if (typeof path !== 'string') return;
path = resolve(path);
const rel = relative(root, path);
if (rel.startsWith('..') || isAbsolute(rel) || rel.startsWith('agents/codex/work/queue-333/receipts/') || rel === relative(root,target)) return;
const sha256 = createHash('sha256').update(read(path)).digest('hex');
const key = rel + ':' + sha256;
if (!seen.has(key)) { seen.add(key); append(target,JSON.stringify({path:rel,sha256})+'\n'); }
} catch {}
}
fs.readFileSync = function(path,...args) { const answer=read(path,...args);record(path);return answer; };
syncBuiltinESMExports();
registerHooks({ load(url,context,next) { const answer=next(url,context);if(url.startsWith('file:'))record(fileURLToPath(url));return answer; } });
record(fileURLToPath(import.meta.url));
@@ -0,0 +1,35 @@
#!/usr/bin/env bash
set -euo pipefail
# Run from the repository root. Explicit current whole files; no package/full gate.
p5root=$(mktemp -d /tmp/p5-scoped-XXXXXX)
trap 'rm -rf "$p5root"' EXIT
mkdir "$p5root/home" "$p5root/config" "$p5root/tmp"
export HOME="$p5root/home" XDG_CONFIG_HOME="$p5root/config" TMPDIR="$p5root/tmp" MOSAIC_CONFIG="$p5root/config/absent.json"
export P5_SOURCE_ROOT="$PWD" P5_INPUT_TRACE="$PWD/agents/codex/work/queue-333/receipts/source-inputs.raw.jsonl"
: > "$P5_INPUT_TRACE"
printf '%s\n' 'serial nice19; private HOME/XDG_CONFIG_HOME/TMPDIR/MOSAIC_CONFIG; unchanged whole-file budgets'
nice -n 19 node --import ./agents/codex/work/queue-333/trace-inputs.mjs --test --test-concurrency=1 \
packages/model-proxy/tests/usage-client.test.mjs \
packages/model-proxy/tests/client.test.mjs \
packages/model-proxy/tests/client-probe.test.mjs \
packages/model-proxy/tests/page-client.test.mjs \
packages/model-proxy/tests/management-key-encoding.test.mjs \
packages/plugins/tests/kinds.test.mjs \
packages/plugins/tests/loader.test.mjs \
packages/plugins/tests/token-limit.test.mjs \
packages/plugins/tests/daily-quota.test.mjs \
packages/business/tests/plugin-settings.test.mjs \
packages/business/tests/token-limit-settings.test.mjs \
packages/bus/tests/usage.test.mjs \
packages/bus/tests/proxy-usage.test.mjs \
packages/bus/tests/p5-runtime.test.mjs \
packages/bus/tests/p5-key-context.test.mjs \
packages/bus/tests/limit-checks.test.mjs \
packages/bus/tests/usage-runtime.test.mjs \
packages/bus/tests/usage-broker.test.mjs \
packages/bus/tests/daily-quota-runtime.test.mjs \
packages/bus/tests/limits-runtime.test.mjs \
packages/bus/tests/limit-stop.test.mjs \
packages/bus/tests/plugins-verb.test.mjs \
packages/webui/tests/usage.test.mjs \
packages/webui/tests/usage-render.test.mjs
+4
View File
@@ -1879,3 +1879,7 @@ are never rewritten or removed; corrections are new entries.
2026-10-26 | Sage | mos1884/#662 scope after330/331landing | ReadQ222/Q261/Q263 and659/660/662; posted bounded human-only factory settings/triage/defaulttwo-roundmandate/trackedno-exemptionflake scope with10acceptance criteria, task662comment1338 exactwholebody/author13GETverified. No implementation/review/gate launched.660c1335notready(review/merge, noVM); gatefacts1329/1334 retained; target integration/fullrunner confirmation follows readiness, no localfallback. Landedproduct/evidence unchanged;657/658backlog. 2026-10-26 | Sage | mos1884/#662 scope after330/331landing | ReadQ222/Q261/Q263 and659/660/662; posted bounded human-only factory settings/triage/defaulttwo-roundmandate/trackedno-exemptionflake scope with10acceptance criteria, task662comment1338 exactwholebody/author13GETverified. No implementation/review/gate launched.660c1335notready(review/merge, noVM); gatefacts1329/1334 retained; target integration/fullrunner confirmation follows readiness, no localfallback. Landedproduct/evidence unchanged;657/658backlog.
2026-10-26 | Sage | Mos1909/1915/1917 real postlanding reviews | Boyd/Dewey/Filbert/Gladstone real authored candidate52ba verdictfiles independently byte/hash-verified, allAPPROVE scoped; Dewey656broaderPARTIAL retained. Formal330R1/331R4 requests failedpre-send/no comments or approvals; no borrowed/copied/mintedkeys. LegacyhelperGETname jason.woltje is NOT ownJarvis, ownslotabsent; rows tracking-open/#436, files cited via normalqueue. NewFilbertNEW-330-01 filedtask665 exactreadback, notlandingreopen/gate. Repair646-648/652-656 remainOPEN untilactualcomments;1917 conditionalbacklog routing retained. #662scope1338posted;660PR405REVISE/notready. Product1968inputs unchanged; no source/helper/test/gate edits/runs; peerjournal prefixes preserved. 2026-10-26 | Sage | Mos1909/1915/1917 real postlanding reviews | Boyd/Dewey/Filbert/Gladstone real authored candidate52ba verdictfiles independently byte/hash-verified, allAPPROVE scoped; Dewey656broaderPARTIAL retained. Formal330R1/331R4 requests failedpre-send/no comments or approvals; no borrowed/copied/mintedkeys. LegacyhelperGETname jason.woltje is NOT ownJarvis, ownslotabsent; rows tracking-open/#436, files cited via normalqueue. NewFilbertNEW-330-01 filedtask665 exactreadback, notlandingreopen/gate. Repair646-648/652-656 remainOPEN untilactualcomments;1917 conditionalbacklog routing retained. #662scope1338posted;660PR405REVISE/notready. Product1968inputs unchanged; no source/helper/test/gate edits/runs; peerjournal prefixes preserved.
2026-10-26 | Codex P5 builder | row333/Mos1961 isolated t3/model-proxy-p5-quota-usage at 09a847eda; clean base verified, queue next refused linked worktree (no canonical mutation) | implementation started; local fake-only serial nice19 verification; parent owns review/full gates/landing.
2026-10-26 | Codex P5 builder | row333/Mos1961 implementation candidate on isolated base09a847eda | 174/174 scoped whole-file GREEN; upstream-value mutant killed/restored+positive; native current/retiring key ownership fail-closed and telemetry isolated; 202 consumed inputs frozen in agents/codex/work/queue-333; own scratch cleaned; parent fresh review/full/browser gate pending1014.Q264; no queue/remote/push/landing.
+2 -2
View File
@@ -4930,7 +4930,7 @@ export class Broker {
if (!role && !s.human && !s.tester) fail("human-required"); if (!role && !s.human && !s.tester) fail("human-required");
if (!this.#organization) fail("not-configured"); if (!this.#organization) fail("not-configured");
if (["limits", "plugins", "instances", "routes", "organization.revision"].includes(request.verb)) keys(args, []); if (["limits", "plugins", "instances", "routes", "organization.revision"].includes(request.verb)) keys(args, []);
else if (request.verb === "plugins.set") keys(args, ["revision", "plugins"], ["revision", "plugins"]); else if (request.verb === "plugins.set") keys(args, ["revision", "plugins", "usage"], ["revision", "plugins"]);
// Row 165 (#1662): instances.set is human-only and outside ORGANIZATION_KEYS, so // Row 165 (#1662): instances.set is human-only and outside ORGANIZATION_KEYS, so
// organization.set and the chief of staff's tool never reach it (sage-0918). // organization.set and the chief of staff's tool never reach it (sage-0918).
else if (request.verb === "instances.set") { else if (request.verb === "instances.set") {
@@ -5303,7 +5303,7 @@ export class Broker {
if (!this.#limits) return; if (!this.#limits) return;
let answer; let answer;
try { try {
answer = await this.#limits.mustStop(s.business, { instance: s.role, provider: s.provider ?? null, model: s.model ?? null, account: s.account ?? null }); answer = await this.#limits.mustStop(s.business, { instance: s.role, provider: s.provider ?? null, model: s.model ?? null, account: s.account ?? null }, { run: s.run });
} catch { } catch {
answer = { stop: true, check: null, code: 'check-threw' }; answer = { stop: true, check: null, code: 'check-threw' };
} }
+35 -5
View File
@@ -51,7 +51,7 @@ class Failure extends Error {
} }
// makeLoader is the plug-in loader's factory; tests pass a scratch tree's copy to load fixture checks. // makeLoader is the plug-in loader's factory; tests pass a scratch tree's copy to load fixture checks.
export function createLimits({ store, read, log, makeLoader = createLoader }) { export function createLimits({ store, read, log, makeLoader = createLoader, keyForSubject = () => null }) {
if (typeof read !== 'function' || typeof log !== 'function') throw new TypeError('createLimits needs read and log'); if (typeof read !== 'function' || typeof log !== 'function') throw new TypeError('createLimits needs read and log');
const loaders = new Map(); const loaders = new Map();
const loaderFor = business => { const loaderFor = business => {
@@ -111,7 +111,7 @@ export function createLimits({ store, read, log, makeLoader = createLoader }) {
// mayLaunch and mustStop: every switched-on check is asked in order; the first refusal or // mayLaunch and mustStop: every switched-on check is asked in order; the first refusal or
// stop wins. key is the answer's boolean (allow, stop) and go its value when nothing is hit. // stop wins. key is the answer's boolean (allow, stop) and go its value when nothing is hit.
async function decide(business, subject, name, key, go, halt) { async function decide(business, subject, name, key, go, halt, context = {}) {
await refresh(business); await refresh(business);
let st; let st;
try { st = state(business); } catch (e) { try { st = state(business); } catch (e) {
@@ -123,6 +123,18 @@ export function createLimits({ store, read, log, makeLoader = createLoader }) {
return halt({ check: st.missing, code: 'not-loaded' }); return halt({ check: st.missing, code: 'not-loaded' });
} }
const leaves = limitLeaves(st.limits); const leaves = limitLeaves(st.limits);
if (Object.keys(st.limits?.tokens?.keys ?? {}).some(k => /^[a-f0-9]{12}$/.test(k))) {
let modelKeyId;
try {
if (name === 'mustStop' && (typeof context?.run !== 'string' || !context.run)) throw new Failure('proxy-key-refused');
modelKeyId = keyForSubject(business, { ...subject, ...context });
} catch {}
if (typeof modelKeyId !== 'string' || !/^[a-f0-9]{12}$/.test(modelKeyId)) {
log({ event: 'limit-check-failed', business, check: null, export: name, code: 'proxy-key-refused' });
return halt({ check: null, code: 'proxy-key-refused' });
}
subject = { ...subject, modelKeyId };
}
const args = { business, limits: st.limits, subject, records: st.records, now: new Date().toISOString() }; const args = { business, limits: st.limits, subject, records: st.records, now: new Date().toISOString() };
for (const check of st.checks) { for (const check of st.checks) {
const { answer, code } = ask(business, check, name, args, a => const { answer, code } = ask(business, check, name, args, a =>
@@ -136,14 +148,15 @@ export function createLimits({ store, read, log, makeLoader = createLoader }) {
return { [key]: go }; return { [key]: go };
} }
const subjectOf = ({ instance, provider = null, model = null, account = null }) => ({ instance, provider, model, account }); const subjectOf = ({ instance, provider = null, model = null, account = null }) =>
({ instance, provider, model, account });
// { allow: true } | { allow: false, check, hit } | { allow: false, check, code } // { allow: true } | { allow: false, check, hit } | { allow: false, check, code }
const mayLaunch = (business, subject) => const mayLaunch = (business, subject) =>
decide(business, subjectOf(subject), 'mayLaunch', 'allow', true, why => ({ allow: false, ...why })); decide(business, subjectOf(subject), 'mayLaunch', 'allow', true, why => ({ allow: false, ...why }));
// { stop: false } | { stop: true, check, hit } | { stop: true, check, code } // { stop: false } | { stop: true, check, hit } | { stop: true, check, code }
const mustStop = (business, subject) => const mustStop = (business, subject, context = {}) =>
decide(business, subjectOf(subject), 'mustStop', 'stop', false, why => ({ stop: true, ...why })); decide(business, subjectOf(subject), 'mustStop', 'stop', false, why => ({ stop: true, ...why }), context);
const validEntry = (e, leaves) => { const validEntry = (e, leaves) => {
const leaf = plainObject(e) && Array.isArray(e.path) && leaves.find(l => same(l.path, e.path)); const leaf = plainObject(e) && Array.isArray(e.path) && leaves.find(l => same(l.path, e.path));
@@ -187,3 +200,20 @@ export function createLimits({ store, read, log, makeLoader = createLoader }) {
return { refresh, mayLaunch, mustStop, report }; return { refresh, mayLaunch, mustStop, report };
} }
// Host metadata adapter, extracted from runtime so ownership cases are testable.
export function modelUsageKey(records, runs, business, subject) {
const fail = () => { throw new Failure('proxy-key-refused'); };
const instance = business + '/' + subject.instance;
const owners = records.filter(r => r.service === 'model' && r.instance === instance);
if (owners.length !== 1 || !/^[a-f0-9]{12}$/.test(owners[0].keyId ?? '')) fail();
const record = owners[0], ids = [record.keyId, ...(record.retiring ?? []).map(r => r.keyId)];
if (ids.some(id => !/^[a-f0-9]{12}$/.test(id ?? '')) || new Set(ids).size !== ids.length) fail();
// A key ID must identify exactly this owner, including retained generations.
for (const other of records.filter(r => r.service === 'model' && r !== record))
if ([other.keyId, ...(other.retiring ?? []).map(r => r.keyId)].some(id => ids.includes(id))) fail();
if (!subject.run) return record.keyId;
const run = runs.get(business + ':' + subject.run);
if (!run || run.instance !== instance || !ids.includes(run.keyId)) fail();
return run.keyId;
}
+95
View File
@@ -0,0 +1,95 @@
// P5: one reader per broker/data root drains the instance queue once, then routes
// safe IDs to the owning business. It never supplies records to limit checks.
import { randomUUID } from 'node:crypto';
import { createLoader } from '../../plugins/src/loader.mjs';
import { checkUsageSettings } from '../../plugins/src/kinds.mjs';
const SOURCE = '@proxy/cliproxy-queue';
const KINDS = ['input', 'output', 'cacheWrite', 'cacheRead'];
const ID = /^[a-f0-9]{12}$/;
const plain = n => n <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(n) : String(n);
export function createProxyUsage({ store, read, client, records, log, now = Date.now }) {
const loader = createLoader({ log });
let due = 0, previous = '', pending = null, closed = false;
const states = new Map();
function configured() {
return Object.entries(read()).filter(([, b]) => b.plugins?.usage === 'cliproxy-queue').map(([business, b]) => {
checkUsageSettings(b.usage ?? {});
return { business, pollSeconds: b.usage?.cliproxyQueue?.pollSeconds ?? 15 };
});
}
async function poll() {
let enabled;
try { enabled = configured(); }
catch { log({ action: 'proxy.usage', code: 'invalid-usage-settings' }); return; }
if (!enabled.length) { previous = ''; return; }
const signature = JSON.stringify(enabled);
if (signature !== previous) { previous = signature; due = 0; }
if (now() < due) return;
due = now() + Math.min(...enabled.map(b => b.pollSeconds)) * 1000;
try {
await loader.load({ usage: 'cliproxy-queue' });
const module = loader.modules('usage')[0], management = client();
if (!module || !management) throw Error('unavailable');
const events = await module.read({ client: management });
const owners = new Map();
for (const record of records()) {
if (record.service !== 'model') continue;
const split = record.instance.indexOf('/'), business = record.instance.slice(0, split), instance = record.instance.slice(split + 1);
if (split < 1) continue;
for (const keyId of [record.keyId, ...(record.retiring ?? []).map(r => r.keyId)]) {
if (!ID.test(keyId ?? '')) continue;
if (owners.has(keyId)) throw Error('ambiguous');
owners.set(keyId, { business, instance });
}
}
// Validate all plug-in answers before writing any row or log field.
if (!Array.isArray(events) || events.length > 100 || events.some(e => !e || !ID.test(e.keyId ?? '') || !ID.test(e.accountId ?? '')
|| typeof e.managed !== 'boolean' || typeof e.failed !== 'boolean'
|| (e.statusCode !== null && (!Number.isSafeInteger(e.statusCode) || e.statusCode < 0 || e.statusCode > 599))
|| KINDS.some(k => !Number.isSafeInteger(e[k]) || e[k] < 0))) throw Error('invalid');
const unknown = [];
store.transaction(() => {
for (const e of events) {
const owner = owners.get(e.keyId);
if (!owner) { if (e.managed) unknown.push(e.keyId); continue; }
if (!enabled.some(b => b.business === owner.business)) continue;
// Whitelist fields; never persist raw plug-in results. Cursor holds only
// metadata, and turnRecords excludes SOURCE before every quota decision.
store.run(`INSERT INTO usage_records(at,business,run,instance,account,turn,source,phase,status,code,cursor,input,output,cache_write,cache_read)
VALUES (?,?,?,?,?,?,?,'end','known',?,?,?,?,?,?)`, new Date(now()).toISOString(), owner.business, '@proxy', owner.instance,
e.accountId, randomUUID(), SOURCE, e.failed ? 'proxy-upstream-failed' : null,
JSON.stringify({ modelKeyId: e.keyId, failed: e.failed, statusCode: e.statusCode }), e.input, e.output, e.cacheWrite, e.cacheRead);
}
});
for (const keyId of unknown) log({ action: 'proxy.usage.reconcile', keyId, code: 'proxy-usage-unknown-key' });
for (const { business } of enabled) states.set(business, 'available');
} catch {
for (const { business } of enabled) states.set(business, 'unavailable');
log({ action: 'proxy.usage', code: 'proxy-usage-read-failed' });
}
}
function tick() {
if (closed) return Promise.resolve();
if (pending) return pending;
pending = poll().finally(() => { pending = null; });
return pending;
}
function view(business) {
try { if (!configured().some(b => b.business === business)) return null; } catch { return null; }
const byKey = new Map(), byAccount = new Map();
for (const r of store.all('SELECT * FROM usage_records WHERE business=? AND source=? ORDER BY seq', business, SOURCE)) {
const meta = JSON.parse(r.cursor);
for (const [map, identity] of [[byKey, { keyId: meta.modelKeyId }], [byAccount, { accountId: r.account }]]) {
const id = Object.values(identity)[0];
if (!map.has(id)) map.set(id, { ...identity, input: 0n, output: 0n, cacheWrite: 0n, cacheRead: 0n, requests: 0, failures: 0, statuses: {} });
const entry = map.get(id);
for (const [key, column] of [['input','input'],['output','output'],['cacheWrite','cache_write'],['cacheRead','cache_read']]) entry[key] += BigInt(r[column]);
entry.requests++; if (meta.failed) entry.failures++;
if (meta.failed && meta.statusCode !== null) entry.statuses[meta.statusCode] = (entry.statuses[meta.statusCode] ?? 0) + 1;
}
}
const finish = map => [...map.values()].map(e => ({ ...e, ...Object.fromEntries(KINDS.map(k => [k, plain(e[k])])) }));
return { source: 'proxy', state: states.get(business) ?? 'unread', byKey: finish(byKey), byAccount: finish(byAccount) };
}
return { tick, view, async close() { closed = true; await pending; } };
}
+21 -5
View File
@@ -35,7 +35,8 @@ import { loadAccess } from '../../business/src/access.mjs';
import { inspectInterpreter, recordInterpreterStart } from './interpreter.mjs'; import { inspectInterpreter, recordInterpreterStart } from './interpreter.mjs';
import { createPeerReader } from './peercred.mjs'; import { createPeerReader } from './peercred.mjs';
import { createUsage } from './usage.mjs'; import { createUsage } from './usage.mjs';
import { createLimits } from './limits.mjs'; import { createProxyUsage } from './proxy-usage.mjs';
import { createLimits, modelUsageKey } from './limits.mjs';
import { createProcessing } from '../../processing-control/src/coordinator.mjs'; import { createProcessing } from '../../processing-control/src/coordinator.mjs';
import { discordProcessingHooks } from '../../discord/src/processing.mjs'; import { discordProcessingHooks } from '../../discord/src/processing.mjs';
import { createContainerStopper } from '../../processing-control/src/containers.mjs'; import { createContainerStopper } from '../../processing-control/src/containers.mjs';
@@ -265,7 +266,7 @@ export async function startBroker({
|| (Object.hasOwn(librarySync, 'intervalMs') && !(Number.isSafeInteger(librarySync.intervalMs) && librarySync.intervalMs > 0)) || (Object.hasOwn(librarySync, 'intervalMs') && !(Number.isSafeInteger(librarySync.intervalMs) && librarySync.intervalMs > 0))
|| (Object.hasOwn(librarySync, 'configDir') && typeof librarySync.configDir !== 'string'))) || (Object.hasOwn(librarySync, 'configDir') && typeof librarySync.configDir !== 'string')))
throw new BusError('invalid-host-request'); throw new BusError('invalid-host-request');
let modelProxyClient = null, proxyPage = null; let modelProxyClient = null, proxyPage = null, proxyUsage = null, usageTimer = null;
let modelKeys = null, modelTimer = null, modelSweep = null; let modelKeys = null, modelTimer = null, modelSweep = null;
const modelRuns = new Map(); const modelRuns = new Map();
let store, credentials, server, adapter, processing, syncTimer = null, syncPass = null, accessTimer = null; let store, credentials, server, adapter, processing, syncTimer = null, syncPass = null, accessTimer = null;
@@ -379,12 +380,18 @@ export async function startBroker({
const proxyOrganization = modelKeys ? modelOrganization({ modelKeys, writer: organizationWriter({ dir: organization.dir, rolesDir: organization.rolesDir }) }) : null; const proxyOrganization = modelKeys ? modelOrganization({ modelKeys, writer: organizationWriter({ dir: organization.dir, rolesDir: organization.rolesDir }) }) : null;
const instances=organization?instanceSettings({dir:organization.dir,rolesDir:organization.rolesDir,system:organization.system,levels,revoke, const instances=organization?instanceSettings({dir:organization.dir,rolesDir:organization.rolesDir,system:organization.system,levels,revoke,
...(proxyOrganization ? { writer: proxyOrganization.writer, revoke: proxyOrganization.revoke(revoke) } : {})}):null; ...(proxyOrganization ? { writer: proxyOrganization.writer, revoke: proxyOrganization.revoke(revoke) } : {})}):null;
const usage = await createUsage({ store, dataRoot, businesses, const usageLog = entry => process.stderr.write(`usage: ${JSON.stringify(entry)}\n`);
log: entry => process.stderr.write(`usage: ${JSON.stringify(entry)}\n`) }); const keyForRun = (business, run) => modelRuns.get(business + ':' + run)?.keyId ?? null;
const usage = await createUsage({ store, dataRoot, businesses, log: usageLog, keyForRun,
proxyView: business => proxyUsage?.view(business) ?? null });
proxyUsage = createProxyUsage({ store, log: usageLog, client: () => modelProxyClient,
records: () => credentials.status(),
read: () => Object.fromEntries(Object.keys(businesses).map(id => [id, settings ? settings.current(id) : businesses[id]])) });
// Row 125 (#1619, REQ-LIMIT-3, REQ-LIMIT-4): the limit checks read the organization file at // Row 125 (#1619, REQ-LIMIT-3, REQ-LIMIT-4): the limit checks read the organization file at
// each ask, so a limit, a reset or a switched-on check takes effect without a restart. // each ask, so a limit, a reset or a switched-on check takes effect without a restart.
const limitLog = entry => process.stderr.write(`limits: ${JSON.stringify(entry)}\n`); const limitLog = entry => process.stderr.write(`limits: ${JSON.stringify(entry)}\n`);
const limits = createLimits({ store, read: id => settings ? settings.current(id) : businesses[id], log: limitLog }); const limits = createLimits({ store, read: id => settings ? settings.current(id) : businesses[id], log: limitLog,
keyForSubject: (business, subject) => modelUsageKey(credentials.status(), modelRuns, business, subject) });
for (const id of Object.keys(businesses)) await limits.refresh(id); for (const id of Object.keys(businesses)) await limits.refresh(id);
const withTokens = (id, result) => ({ ...result, tokens: limits.report(id) }); const withTokens = (id, result) => ({ ...result, tokens: limits.report(id) });
// Row 210 (#1707, design D7 step 6) and row 234 (#1740, r6 E2): the run dir and the host enrollment half. // Row 210 (#1707, design D7 step 6) and row 234 (#1740, r6 E2): the run dir and the host enrollment half.
@@ -853,6 +860,11 @@ export async function startBroker({
}, 1000); }, 1000);
modelTimer.unref(); modelTimer.unref();
} }
// One bounded queue read at a time. The service applies the configured
// 1..59 second poll deadline; this tick only checks whether a read is due.
usageTimer = setInterval(() => { proxyUsage.tick().catch(() => usageLog({ action: 'proxy.usage', code: 'proxy-usage-read-failed' })); }, 1000);
usageTimer.unref();
await proxyUsage.tick();
return { return {
broker, broker,
credentials, credentials,
@@ -916,6 +928,8 @@ export async function startBroker({
launches: bound, launches: bound,
readers: readCaps, readers: readCaps,
async close() { async close() {
clearInterval(usageTimer);
await proxyUsage.close();
clearInterval(modelTimer); clearInterval(modelTimer);
await modelSweep; await modelSweep;
clearInterval(accessTimer); clearInterval(accessTimer);
@@ -928,6 +942,8 @@ export async function startBroker({
}, },
}; };
} catch (e) { } catch (e) {
clearInterval(usageTimer);
await proxyUsage?.close();
clearInterval(modelTimer); clearInterval(modelTimer);
clearInterval(accessTimer); clearInterval(accessTimer);
await server?.close(); await server?.close();
+11 -5
View File
@@ -38,6 +38,7 @@ function delta(before, after) {
export function turnRecords(store, business) { export function turnRecords(store, business) {
const turns = new Map(); const turns = new Map();
for (const row of store.all(`SELECT * FROM usage_records WHERE business=? ORDER BY seq`, business)) { for (const row of store.all(`SELECT * FROM usage_records WHERE business=? ORDER BY seq`, business)) {
if (row.source === '@proxy/cliproxy-queue') continue; // telemetry never drives quotas
const key = JSON.stringify([row.run, row.turn, row.source]); const key = JSON.stringify([row.run, row.turn, row.source]);
if (row.phase === 'end' || !turns.has(key)) turns.set(key, row); if (row.phase === 'end' || !turns.has(key)) turns.set(key, row);
} }
@@ -45,13 +46,14 @@ export function turnRecords(store, business) {
const known = row.phase === 'end' && row.status === 'known'; const known = row.phase === 'end' && row.status === 'known';
return { return {
at: row.at, run: row.run, turn: row.turn, source: row.source, instance: row.instance, at: row.at, run: row.run, turn: row.turn, source: row.source, instance: row.instance,
modelKeyId: row.cursor ? JSON.parse(row.cursor).modelKeyId ?? null : null,
provider: row.provider, model: row.model, account: row.account, status: known ? 'known' : 'unknown', provider: row.provider, model: row.model, account: row.account, status: known ? 'known' : 'unknown',
input: known ? row.input : null, output: known ? row.output : null, input: known ? row.input : null, output: known ? row.output : null,
cacheWrite: known ? row.cache_write : null, cacheRead: known ? row.cache_read : null, cacheWrite: known ? row.cache_write : null, cacheRead: known ? row.cache_read : null,
}; };
}); });
} }
export async function createUsage({ store, businesses, log }) { export async function createUsage({ store, businesses, log, keyForRun = () => null, proxyView = () => null }) {
const loaders = new Map(); const loaders = new Map();
for (const [id, b] of Object.entries(businesses)) { for (const [id, b] of Object.entries(businesses)) {
const loader = createLoader({ log }); const loader = createLoader({ log });
@@ -70,6 +72,9 @@ export async function createUsage({ store, businesses, log }) {
const sources = modules.length ? modules.map((module, i) => ({ module, name: names[i] })) : [{ name: '@none' }]; const sources = modules.length ? modules.map((module, i) => ({ module, name: names[i] })) : [{ name: '@none' }];
// Preserve a failed/disabled baseline even if configuration changes between calls/restarts. // Preserve a failed/disabled baseline even if configuration changes between calls/restarts.
for (const base of bases) if (!sources.some(s => s.name === base.source)) sources.push({ name: base.source }); for (const base of bases) if (!sources.some(s => s.name === base.source)) sources.push({ name: base.source });
const captured = bases.find(row => row.cursor && JSON.parse(row.cursor).modelKeyId)?.cursor;
const candidate = captured ? JSON.parse(captured).modelKeyId : keyForRun(business, run);
const modelKeyId = typeof candidate === 'string' && /^[a-f0-9]{12}$/.test(candidate) ? candidate : null;
const rows = []; const rows = [];
// Row 65 (#1558): where the run's harness keeps its session files is the module's transcript(), // Row 65 (#1558): where the run's harness keeps its session files is the module's transcript(),
// which the launcher binds into the run record. A run bound without one has no reading. // which the launcher binds into the run record. A run bound without one has no reading.
@@ -92,7 +97,7 @@ export async function createUsage({ store, businesses, log }) {
store.run(`INSERT INTO usage_records(at,business,run,instance,provider,model,account,turn,source,phase,status,code,cursor,input,output,cache_write,cache_read) store.run(`INSERT INTO usage_records(at,business,run,instance,provider,model,account,turn,source,phase,status,code,cursor,input,output,cache_write,cache_read)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, new Date().toISOString(), business, run, instance, VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, new Date().toISOString(), business, run, instance,
provider, model, account, turn, name, phase, result.status, result.code ?? null, provider, model, account, turn, name, phase, result.status, result.code ?? null,
phase === 'begin' ? JSON.stringify(result) : null, phase === 'begin' ? JSON.stringify({ ...result, ...(modelKeyId ? { modelKeyId } : {}) }) : modelKeyId ? JSON.stringify({ modelKeyId }) : null,
known ? counts.input : null, known ? counts.output : null, known ? counts.cacheWrite : null, known ? counts.cacheRead : null); known ? counts.input : null, known ? counts.output : null, known ? counts.cacheWrite : null, known ? counts.cacheRead : null);
} }
}); });
@@ -109,7 +114,7 @@ export async function createUsage({ store, businesses, log }) {
return op.finally(() => { if (pending.get(key) === tail) pending.delete(key); }); return op.finally(() => { if (pending.get(key) === tail) pending.delete(key); });
} }
function view(business) { function view(business) {
const groups = { byRun: new Map(), byInstance: new Map(), byProvider: new Map(), byModel: new Map(), byAccount: new Map() }; const groups = { byRun: new Map(), byInstance: new Map(), byProvider: new Map(), byModel: new Map(), byAccount: new Map(), byKey: new Map() };
const total = { ...zero(), unknown: new Set() }; const total = { ...zero(), unknown: new Set() };
const add = (target, row) => { const add = (target, row) => {
if (row.status !== 'known') target.unknown.add(row.run + ':' + row.turn); if (row.status !== 'known') target.unknown.add(row.run + ':' + row.turn);
@@ -118,7 +123,7 @@ export async function createUsage({ store, businesses, log }) {
for (const row of turnRecords(store, business)) { for (const row of turnRecords(store, business)) {
add(total, row); add(total, row);
for (const [name, identity] of Object.entries({ byRun: { run: row.run }, byInstance: { instance: row.instance }, for (const [name, identity] of Object.entries({ byRun: { run: row.run }, byInstance: { instance: row.instance },
byProvider: { provider: row.provider }, byModel: { provider: row.provider, model: row.model }, byAccount: { account: row.account } })) { byKey: { modelKeyId: row.modelKeyId }, byProvider: { provider: row.provider }, byModel: { provider: row.provider, model: row.model }, byAccount: { account: row.account } })) {
const key = JSON.stringify(identity); const key = JSON.stringify(identity);
if (!groups[name].has(key)) groups[name].set(key, { ...identity, ...zero(), unknown: new Set() }); if (!groups[name].has(key)) groups[name].set(key, { ...identity, ...zero(), unknown: new Set() });
add(groups[name].get(key), row); add(groups[name].get(key), row);
@@ -129,7 +134,8 @@ export async function createUsage({ store, businesses, log }) {
for (const kind of KINDS) rest[kind] = BigInt(rest[kind]) <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(rest[kind]) : String(rest[kind]); for (const kind of KINDS) rest[kind] = BigInt(rest[kind]) <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(rest[kind]) : String(rest[kind]);
return { ...rest, unknownTurns: unknown.size }; return { ...rest, unknownTurns: unknown.size };
}; };
return { total: finish(total), ...Object.fromEntries(Object.entries(groups).map(([key, map]) => [key, [...map.values()].map(finish)])) }; const proxy = proxyView(business);
return { ...(proxy ? { proxy } : {}), total: finish(total), ...Object.fromEntries(Object.entries(groups).map(([key, map]) => [key, [...map.values()].map(finish)])) };
} }
return { collect, view }; return { collect, view };
} }
+30
View File
@@ -324,3 +324,33 @@ test('REQ-LIMIT-3 core reaches limit checks only through the plug-in loader', ()
assert.doesNotMatch(readFileSync(new URL(file, import.meta.url), 'utf8'), /limit-check\/|token-limit/, file); assert.doesNotMatch(readFileSync(new URL(file, import.meta.url), 'utf8'), /limit-check\/|token-limit/, file);
} }
}); });
test('P5 missing, ambiguous or invalid model key lookup fails closed without leaking a lookup error', async t => {
const root=mkdtempSync(join(tmpdir(),'p5-limit-')),store=new Store(root),log=[];t.after(()=>{store.close();rmSync(root,{recursive:true,force:true});});
const key='012345abcdef',doc={plugins:{'limit-check':['token-limit']},launch:{limits:{tokens:{keys:{[key]:{limit:5,since:SINCE}}}}}};
for(const lookup of [()=>null,()=>['012345abcdef','abcdef012345'],()=> 'msk-private-lookup',()=>{throw Error('PRIVATE-LOOKUP-CANARY');}]) {
const l=createLimits({store,read:()=>doc,log:e=>log.push(e),keyForSubject:lookup});
assert.deepEqual(await l.mayLaunch('demo',SUBJECT),{allow:false,check:null,code:'proxy-key-refused'});
assert.deepEqual(await l.mustStop('demo',SUBJECT,{run:'old-run'}),{stop:true,check:null,code:'proxy-key-refused'});
}
assert.equal(JSON.stringify(log).includes('PRIVATE-LOOKUP-CANARY'),false);assert.equal(JSON.stringify(log).includes('msk-private-lookup'),false);
});
test('P5 trusted lookup uses the retiring run key rather than the agent current key',async t=>{
const root=mkdtempSync(join(tmpdir(),'p5-old-key-')),store=new Store(root);t.after(()=>{store.close();rmSync(root,{recursive:true,force:true});});
const old='012345abcdef',current='abcdef012345',doc={plugins:{'limit-check':['token-limit']},launch:{limits:{tokens:{keys:{[old]:{limit:0,since:SINCE}}}}}};
const l=createLimits({store,read:()=>doc,log:()=>{},keyForSubject:(_,s)=>s.run==='old-run'?old:current});
assert.equal((await l.mayLaunch('demo',SUBJECT)).allow,true);
assert.equal((await l.mustStop('demo',SUBJECT,{run:'old-run'})).stop,true);
});
test('P5 actual model metadata lookup rejects missing/ambiguous owners and never cross-attributes a retiring run',async()=>{
const { modelUsageKey }=await import('../src/limits.mjs');
const old='012345abcdef',current='abcdef012345';
const rows=[{service:'model',instance:'demo/coder',keyId:current,retiring:[{keyId:old}]},{service:'model',instance:'other/coder',keyId:'123456abcdef',retiring:[]}];
const runs=new Map([['demo:old-run',{instance:'demo/coder',keyId:old}],['demo:foreign-run',{instance:'other/coder',keyId:'123456abcdef'}]]);
assert.equal(modelUsageKey(rows,runs,'demo',{instance:'coder'}),current);
assert.equal(modelUsageKey(rows,runs,'demo',{instance:'coder',run:'old-run'}),old);
for(const [rs,s] of [[rows,{instance:'coder',run:'absent'}],[rows,{instance:'coder',run:'foreign-run'}],[[...rows,{...rows[0]}],{instance:'coder'}],[[{...rows[0],retiring:[]}],{instance:'coder',run:'old-run'}]]) {
assert.throws(()=>modelUsageKey(rs,runs,'demo',s),{code:'proxy-key-refused'});
}
});
@@ -0,0 +1,44 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import { mkdtempSync, rmSync } from 'node:fs';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
import { Store } from '../src/store.mjs';
import { Broker } from '../src/broker.mjs';
import { createLimits, modelUsageKey } from '../src/limits.mjs';
const key='012345abcdef';
test('P5 broker preserves original plugin subject and derives internal run context from authenticated native caller',async t=>{
const root=mkdtempSync(join(tmpdir(),'p5-context-')),store=new Store(root),asked=[];t.after(()=>{store.close();rmSync(root,{recursive:true,force:true});});
const b=new Broker({store,businesses:{demo:{id:'demo',human:'jason',arbiters:{technical:'coder',delivery:'coder'},roles:{coder:{authority:{withinRole:[],crossRole:[]}}}}},
limits:{mustStop:async(...args)=>{asked.push(args);return {stop:false};}},usage:{collect:async()=>({recorded:true}),view:()=>({})}});
const human=b.bindHuman({business:'demo',human:'jason',via:'cli',outsideAgent:true});
const cap=b.bindLaunch({business:'demo',role:'coder',run:'native-run',harness:'pi',provider:'fixture',model:'fake'});b.request(cap,{verb:'role.claim'});
const {id}=b.request(human,{verb:'message.send',args:{to:'coder',body:'work'}});b.request(cap,{verb:'message.receive'});
await b.request(cap,{verb:'usage.begin',args:{turn:id}});
await assert.rejects(b.request(cap,{verb:'usage.end',args:{turn:id,run:'forged-run'}}),{code:'invalid-request'});
assert.equal(asked.length,0);
await b.request(cap,{verb:'usage.end',args:{turn:id}});
assert.deepEqual(asked,[['demo',{instance:'coder',provider:'fixture',model:'fake',account:null},{run:'native-run'}]]);
});
test('P5 configured key quotas never use a supplied safe-looking ID when trusted metadata lookup is missing',async t=>{
const root=mkdtempSync(join(tmpdir(),'p5-no-bypass-')),store=new Store(root);t.after(()=>{store.close();rmSync(root,{recursive:true,force:true});});
const doc={plugins:{'limit-check':['token-limit']},launch:{limits:{tokens:{keys:{[key]:{limit:10,since:'2026-01-01T00:00:00.000Z'}}}}}};
const limits=createLimits({store,read:()=>doc,log:()=>{},keyForSubject:()=>null});
assert.deepEqual(await limits.mustStop('demo',{instance:'coder',modelKeyId:key},{run:'forged-run'}),{stop:true,check:null,code:'proxy-key-refused'});
});
test('P5 internal context resolves exactly current or retained generation; wrong business, instance, run and owner refuse',()=>{
const newer='abcdef012345',rows=[{instance:'demo/coder',service:'model',keyId:newer,retiring:[{keyId:key}]}];
const runs=new Map([['demo:old',{instance:'demo/coder',keyId:key}],['demo:new',{instance:'demo/coder',keyId:newer}],['other:wrong',{instance:'demo/coder',keyId:key}]]);
assert.equal(modelUsageKey(rows,runs,'demo',{instance:'coder'}),newer);
assert.equal(modelUsageKey(rows,runs,'demo',{instance:'coder',run:'old'}),key);
assert.equal(modelUsageKey(rows,runs,'demo',{instance:'coder',run:'new'}),newer);
for(const [business,subject] of [['other',{instance:'coder',run:'wrong'}],['demo',{instance:'other',run:'old'}],['demo',{instance:'coder',run:'wrong'}]])
assert.throws(()=>modelUsageKey(rows,runs,business,subject),{code:'proxy-key-refused'});
});
test('P5 model-key mustStop without native run context fails closed even when the current key resolves',async t=>{
const root=mkdtempSync(join(tmpdir(),'p5-missing-context-')),store=new Store(root);t.after(()=>{store.close();rmSync(root,{recursive:true,force:true});});
const doc={plugins:{'limit-check':['token-limit']},launch:{limits:{tokens:{keys:{[key]:{limit:10,since:'2026-01-01T00:00:00.000Z'}}}}}};
const limits=createLimits({store,read:()=>doc,log:()=>{},keyForSubject:()=>key});
assert.deepEqual(await limits.mustStop('demo',{instance:'coder'}),{stop:true,check:null,code:'proxy-key-refused'});
});
+57
View File
@@ -0,0 +1,57 @@
// P5 end-to-end within one process: only fresh fake config, credentials and loopback HTTP.
import test from 'node:test';
import assert from 'node:assert/strict';
import http from 'node:http';
import { createHash, randomBytes } from 'node:crypto';
import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, rmSync } from 'node:fs';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
import { startBroker } from '../src/runtime.mjs';
import { Registry } from '../../seat/src/session.mjs';
import { startTimeOf } from '../../seat/src/proc.mjs';
import { businessDoc, rolesCopy, systemFor, writeJson } from '../../business/tests/helpers.mjs';
const hash=s=>createHash('sha256').update(s).digest('hex').slice(0,12);
test('P5 real runtime binds stack usage to issued key, daily stops at stack count and human-only telemetry settings pass broker contract',async t=>{
const root=mkdtempSync(join(tmpdir(),'p5-runtime-')),config=join(root,'config'),data=join(root,'data');
mkdirSync(config,{mode:0o700});mkdirSync(data,{mode:0o700});const rolesDir=rolesCopy(config),doc=businessDoc(config,'demo');
doc.plugins={'usage-source':['transcript'],'limit-check':['daily-quota'],harness:['pi']};
writeJson(join(config,'businesses/demo.json'),doc);mkdirSync(join(config,'secrets'),{recursive:true,mode:0o700});
writeFileSync(join(config,'secrets/proxy-management.key'),'p5-fake-management',{mode:0o600});
new Registry(data);
let keys=[`msk-${hash(config)}-sentinel-${randomBytes(32).toString('base64url')}`],queue=[],calls=[];
const server=http.createServer(async(req,res)=>{
calls.push(req.url);
if(req.url==='/v8/management/config/access/api-keys') {
if(req.method==='PUT'){let b='';for await(const c of req)b+=c;keys=JSON.parse(b);res.end('{"status":"ok"}');}
else res.end(JSON.stringify(keys));return;
}
if(req.url==='/v8/management/observability/usage/queue?count=100'){res.end(JSON.stringify(queue));queue=[];return;}
res.writeHead(keys.includes(req.headers.authorization?.slice(7))?200:401);res.end('{}');
});
await new Promise(r=>server.listen(0,'127.0.0.1',r));let bus;
t.after(async()=>{await bus?.close();await new Promise(r=>server.close(r));rmSync(root,{recursive:true,force:true});});
bus=await startBroker({dataRoot:data,businesses:{demo:{id:'demo',human:'jason',plugins:doc.plugins,arbiters:{technical:'coder',delivery:'coder'},roles:{coder:{definition:'coder',authority:{withinRole:[],crossRole:[]}}}}},
organization:{dir:config,rolesDir,system:systemFor(config)},proxy:{port:server.address().port,binary:'/fixture-unused'}});
assert.equal(calls.some(p=>p.includes('usage/queue')),false);
const model=await bus.modelPreflight({business:'demo',role:'coder'}),keyId=hash(model.key);
const human=bus.broker.bindHuman({business:'demo',human:'jason',via:'cli',outsideAgent:true});
let limits=bus.broker.request(human,{verb:'limits'});
bus.broker.request(human,{verb:'limits.set',args:{revision:limits.revision,limits:{tokens:{keys:{[keyId]:{limit:2,reset:'00:00',timeZone:'UTC'}}}}}});
assert.equal((await bus.mayLaunch({business:'demo',instance:'coder',provider:'fixture',model:'fake'})).allow,true);
const dir=join(root,'transcript');mkdirSync(dir);
const {cap}=bus.bindLaunch({business:'demo',role:'coder',run:'p5-run',harness:'pi',modelKeyId:keyId,transcript:dir,pid:process.pid,startTime:startTimeOf(process.pid)});
bus.broker.request(cap,{verb:'role.claim'});
const {id}=bus.broker.request(human,{verb:'message.send',args:{to:'coder',body:'fake work'}});
bus.broker.request(cap,{verb:'message.receive'});
await bus.broker.request(cap,{verb:'usage.begin',args:{turn:id}});
writeFileSync(join(dir,'s.jsonl'),JSON.stringify({type:'message',id:'fake',message:{role:'assistant',usage:{input:2,output:0,cacheWrite:0,cacheRead:0}}})+'\n');
await bus.broker.request(cap,{verb:'usage.end',args:{turn:id}});
const view=bus.broker.request(human,{verb:'usage'});assert.equal(view.byKey[0].modelKeyId,keyId);assert.equal(view.byKey[0].input,2);
assert.equal((await bus.mayLaunch({business:'demo',instance:'coder',provider:'fixture',model:'fake'})).allow,false);
assert.throws(()=>bus.broker.request(cap,{verb:'message.receive'}),{code:'not-holder'});
let plugins=bus.broker.request(human,{verb:'plugins'});
plugins=bus.broker.request(human,{verb:'plugins.set',args:{revision:plugins.revision,plugins:{usage:'cliproxy-queue'},usage:{cliproxyQueue:{pollSeconds:7}}}});
assert.equal(plugins.plugins.usage,'cliproxy-queue');assert.equal(plugins.usage.cliproxyQueue.pollSeconds,7);
const history=readFileSync(join(config,'businesses/.history/demo/changes.jsonl'),'utf8');
for(const value of [model.key,'p5-fake-management'])assert.equal(JSON.stringify([view,history]).includes(value),false);
});
+74
View File
@@ -0,0 +1,74 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import http from 'node:http';
import { mkdtempSync, rmSync } from 'node:fs';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
import { createHash } from 'node:crypto';
import { Store } from '../src/store.mjs';
import { createUsage, turnRecords } from '../src/usage.mjs';
import { createLimits } from '../src/limits.mjs';
import { createProxyUsage } from '../src/proxy-usage.mjs';
import { ManagementClient } from '../../model-proxy/src/client.mjs';
const id = s => createHash('sha256').update(s).digest('hex').slice(0,12);
const key='msk-fake-client-value',source='fake-upstream-value',keyId=id(key);
async function fixture(t) {
const root=mkdtempSync(join(tmpdir(),'proxy-usage-')),store=new Store(root),logs=[],calls=[];
let events=[],now=0,fail=false;
const server=http.createServer((req,res)=>{calls.push(req.url);res.writeHead(fail?500:200);res.end(JSON.stringify(events));events=[];});
await new Promise(r=>server.listen(0,'127.0.0.1',r));
const client=new ManagementClient({baseUrl:`http://127.0.0.1:${server.address().port}`,key:'fake-management',receipt:e=>logs.push(e)});
let doc={plugins:{},launch:{limits:{tokens:{keys:{[keyId]:{limit:1,since:'2026-01-01T00:00:00.000Z'}}}}}};
const reader=createProxyUsage({store,read:()=>({demo:doc}),client:()=>client,records:()=>[{instance:'demo/coder',service:'model',keyId,retiring:[]}],log:e=>logs.push(e),now:()=>now});
t.after(async()=>{await reader.close();await new Promise(r=>server.close(r));store.close();rmSync(root,{recursive:true,force:true});});
const event=(over={})=>({api_key:key,source,failed:true,fail:{status_code:503,body:source},tokens:{input_tokens:9,output_tokens:2},...over});
return {store,logs,calls,reader,event,setEvents:v=>{events=v;},clock:v=>{now=v;},enable:(pollSeconds)=>{doc={...doc,plugins:{usage:'cliproxy-queue','limit-check':['token-limit']},...(pollSeconds===undefined?{}:{usage:{cliproxyQueue:{pollSeconds}}})};},doc:()=>doc,fail:()=>{fail=true;}};
}
test('P5 usage plugin off by default, default poll is 15 seconds and configured polls skip early ticks',async t=>{
const f=await fixture(t);await f.reader.tick();assert.equal(f.calls.length,0);assert.equal(f.reader.view('demo'),null);
f.enable();await f.reader.tick();assert.equal(f.calls.length,1);
f.clock(14999);await f.reader.tick();assert.equal(f.calls.length,1);
f.clock(15000);await f.reader.tick();assert.equal(f.calls.length,2);
f.enable(7);f.clock(16000);await f.reader.tick();assert.equal(f.calls.length,3);
f.clock(22999);await f.reader.tick();assert.equal(f.calls.length,3);
f.clock(23000);await f.reader.tick();assert.equal(f.calls.length,4);
});
test('P5 safe telemetry stores failures per key and proxy-labelled accounts; no client/upstream value enters store/log/view or quota records',async t=>{
const f=await fixture(t);f.enable();f.setEvents([f.event()]);await f.reader.tick();
const v=f.reader.view('demo');assert.equal(v.source,'proxy');assert.equal(v.byKey[0].keyId,keyId);assert.equal(v.byKey[0].failures,1);assert.deepEqual(v.byKey[0].statuses,{'503':1});
assert.equal(v.byAccount[0].accountId,id(source));assert.equal(v.byAccount[0].input,9);
const usage=await createUsage({store:f.store,businesses:{demo:f.doc()},log:()=>{},proxyView:b=>f.reader.view(b)});
assert.equal(usage.view('demo').proxy.source,'proxy');assert.equal(usage.view('demo').total.input,0);
assert.deepEqual(turnRecords(f.store,'demo'),[]);
const limits=createLimits({store:f.store,read:()=>f.doc(),log:()=>{},keyForSubject:()=>keyId});
assert.equal((await limits.mayLaunch('demo',{instance:'coder',modelKeyId:keyId})).allow,true);
for(const value of [key,source,'fake-management']) assert.equal(JSON.stringify([f.store.all('SELECT * FROM usage_records'),f.logs,usage.view('demo')]).includes(value),false);
});
test('P5 unknown msk key goes only to value-free reconcile log and other businesses stay isolated',async t=>{
const f=await fixture(t);f.enable();f.setEvents([f.event({api_key:'msk-unknown-canary'}),f.event({api_key:'external-canary'})]);await f.reader.tick();
assert.deepEqual(f.logs.find(e=>e.action==='proxy.usage.reconcile'),{action:'proxy.usage.reconcile',keyId:id('msk-unknown-canary'),code:'proxy-usage-unknown-key'});
assert.equal(f.reader.view('demo').byKey.length,0);assert.equal(f.reader.view('other'),null);
assert.equal(JSON.stringify(f.logs).includes('msk-unknown-canary'),false);
assert.equal(f.store.all('SELECT * FROM usage_records').length,0);
});
test('P5 queue failure is safe, does not enforce and does not retry before poll deadline',async t=>{
const f=await fixture(t);f.enable();f.fail();await f.reader.tick();await f.reader.tick();
assert.equal(f.calls.length,1);assert.equal(f.logs.at(-1).code,'proxy-usage-read-failed');assert.equal(f.reader.view('demo').state,'unavailable');
});
test('P5 retiring key keeps attribution and telemetry rows remain append-only across reader restart',async t=>{
const f=await fixture(t);f.enable();f.setEvents([f.event()]);await f.reader.tick();
const before=f.reader.view('demo');await f.reader.close();
const again=createProxyUsage({store:f.store,read:()=>({demo:f.doc()}),client:()=>null,records:()=>[],log:()=>{}});
assert.deepEqual(again.view('demo').byKey,before.byKey);await again.close();
assert.throws(()=>f.store.run('DELETE FROM usage_records'),/append-only/);
});
test('P5 malformed queue batch is atomic: no valid prefix, body or credential can reach store/log/view',async t=>{
const f=await fixture(t);f.enable();f.setEvents([f.event(),f.event({source:'malformed-upstream-canary',tokens:{input_tokens:-1}})]);await f.reader.tick();
assert.equal(f.store.all('SELECT * FROM usage_records').length,0);
for(const secret of [key,source,'malformed-upstream-canary'])assert.equal(JSON.stringify([f.logs,f.reader.view('demo')]).includes(secret),false);
});
test('P5 concurrent ticks issue one bounded queue read and a closed collector never polls again',async t=>{
const f=await fixture(t);f.enable();await Promise.all([f.reader.tick(),f.reader.tick(),f.reader.tick()]);assert.equal(f.calls.length,1);
await f.reader.close();f.clock(90000);await f.reader.tick();assert.equal(f.calls.length,1);
});
+18
View File
@@ -153,3 +153,21 @@ test('row 65 a run bound without a transcript directory records no-transcript',
assert.equal(f.usage.view('demo').total.unknownTurns, 1); assert.equal(f.usage.view('demo').total.unknownTurns, 1);
assert.ok(transcript); assert.ok(transcript);
}); });
test('P5 immutable stack key attribution survives rotation and restart without key values', async t => {
const f=await fixture(t),keyId='012345abcdef';let current=keyId;
const usage=await createUsage({store:f.store,businesses:{demo:{plugins:{'usage-source':['transcript']}}},log:()=>{},keyForRun:()=>current});
f.save([]);await usage.collect(f.session,'begin','key-turn');current='abcdef012345';
f.save([f.put('new')]);await usage.collect(f.session,'end','key-turn');
assert.equal(usage.view('demo').byKey[0].modelKeyId,keyId);
assert.equal(usage.view('demo').byKey[0].input,2);
const again=await createUsage({store:f.store,businesses:{demo:{plugins:{}}},log:()=>{}});
assert.equal(again.view('demo').byKey[0].modelKeyId,keyId);
});
test('P5 malformed key metadata is dropped rather than stored or exposed as a key value',async t=>{
const f=await fixture(t);
const usage=await createUsage({store:f.store,businesses:{demo:{plugins:{}}},log:e=>f.logs.push(e),keyForRun:()=> 'msk-fake-invalid-metadata-canary'});
await usage.collect(f.session,'begin','invalid-key');await usage.collect(f.session,'end','invalid-key');
assert.equal(JSON.stringify([f.store.all('SELECT * FROM usage_records'),f.logs,usage.view('demo')]).includes('msk-fake-invalid-metadata-canary'),false);
});
+4 -3
View File
@@ -10,7 +10,7 @@ import { checkVars } from "./vars.mjs";
import { parseCredentialRef } from "./credentials.mjs"; import { parseCredentialRef } from "./credentials.mjs";
import { loadRole } from "./role.mjs"; import { loadRole } from "./role.mjs";
import { END_PROTECTED } from "./vocabulary.mjs"; import { END_PROTECTED } from "./vocabulary.mjs";
import { checkPlugins } from "../../plugins/src/kinds.mjs"; import { checkPlugins, checkUsageSettings } from "../../plugins/src/kinds.mjs";
import { checkMapping } from "../../library/src/mapping.mjs"; import { checkMapping } from "../../library/src/mapping.mjs";
import { forkProblem, giteaName, parseGiteaUrl, HOST_SERVICE, CREATIVE_DEFINITIONS } from "./vocabulary.mjs"; import { forkProblem, giteaName, parseGiteaUrl, HOST_SERVICE, CREATIVE_DEFINITIONS } from "./vocabulary.mjs";
import { import {
@@ -21,7 +21,7 @@ const BOT_NAME = /^bot-[a-z0-9][a-z0-9._-]{0,60}$/;
// How long a thread's session stays up with no turn before the launcher stops // How long a thread's session stays up with no turn before the launcher stops
// it, when launch.threadIdleSeconds is absent (REQ-THREAD-2, row 121). // it, when launch.threadIdleSeconds is absent (REQ-THREAD-2, row 121).
export const THREAD_IDLE_SECONDS = 900; export const THREAD_IDLE_SECONDS = 900;
const TOP_KEYS = ["businessVersion", "id", "human", "arbiters", "projects", "vars", "tracker", "roles", "launch", "plugins", "hosts", "retired", "replyLimits"]; const TOP_KEYS = ["businessVersion", "id", "human", "arbiters", "projects", "vars", "tracker", "roles", "launch", "plugins", "hosts", "retired", "replyLimits", "usage"];
// The config directory: next to the system config, $MOSAIC_CONFIG or // The config directory: next to the system config, $MOSAIC_CONFIG or
// ~/.config/mosaic-dev/config.json, the same rule mosaic-config.mjs uses. // ~/.config/mosaic-dev/config.json, the same rule mosaic-config.mjs uses.
@@ -312,11 +312,12 @@ export function validateBusinessDocument(document, file, { rolesDir }) {
// here; whether each module loads is the loader's check, at load time. // here; whether each module loads is the loader's check, at load time.
const plugins = document.plugins === undefined ? {} const plugins = document.plugins === undefined ? {}
: structuredClone(checkPlugins(document.plugins, `${file} plugins`, { fail: (_code, message) => refuse(message) })); : structuredClone(checkPlugins(document.plugins, `${file} plugins`, { fail: (_code, message) => refuse(message) }));
const usage = document.usage === undefined ? undefined : checkUsageSettings(document.usage);
const retired = document.retired === undefined ? undefined : checkRetired(document.retired, roles, file); const retired = document.retired === undefined ? undefined : checkRetired(document.retired, roles, file);
return deepFreeze({ return deepFreeze({
businessVersion: 1, id: document.id, file, human, arbiters, projects, vars, tracker, roles, launch, plugins, definitions, businessVersion: 1, id: document.id, file, human, arbiters, projects, vars, tracker, roles, launch, plugins, definitions,
...(retired ? { retired } : {}), ...(retired ? { retired } : {}), ...(usage === undefined ? {} : { usage }),
}); });
} }
+6 -2
View File
@@ -67,8 +67,12 @@ export function checkTokenLimits(value, where = "launch.limits.tokens") {
if (Object.hasOwn(value, "models")) { if (Object.hasOwn(value, "models")) {
out.models = tokenMap(value.models, `${where}.models`, name, (models, at) => tokenMap(models, at, name, tokenLimit)); out.models = tokenMap(value.models, `${where}.models`, name, (models, at) => tokenMap(models, at, name, tokenLimit));
} }
// A key is a name until row 126 names the accounts. // P5: model key IDs are 12 hex characters (including digit-leading IDs).
if (Object.hasOwn(value, "keys")) out.keys = tokenMap(value.keys, `${where}.keys`, requireId, tokenLimit); // A model key may use the daily quota shape; existing account limits retain theirs.
if (Object.hasOwn(value, "keys")) out.keys = tokenMap(value.keys, `${where}.keys`,
(key, at) => /^[a-f0-9]{12}$/.test(key) ? key : requireId(key, at),
(entry, at) => Object.hasOwn(entry ?? {}, "reset") && /^[a-f0-9]{12}$/.test(at.split('.').at(-1))
? dailyQuota(entry, at) : tokenLimit(entry, at));
// One quota per account; the business read checks each key names launch.account. // One quota per account; the business read checks each key names launch.account.
if (Object.hasOwn(value, "daily")) out.daily = tokenMap(value.daily, `${where}.daily`, requireId, dailyQuota); if (Object.hasOwn(value, "daily")) out.daily = tokenMap(value.daily, `${where}.daily`, requireId, dailyQuota);
return out; return out;
+24
View File
@@ -81,6 +81,26 @@ function changes(old, next, path = "") {
}]; }];
} }
// P5/Q222: every writer protects per-model-key quotas, including removal/reset.
function modelQuotaFence(old, document, actor) {
const keys = doc => Object.fromEntries(Object.entries(doc?.launch?.limits?.tokens?.keys ?? {})
.filter(([key]) => /^[a-f0-9]{12}$/.test(key)));
if (canonicalJson(keys(old)) === canonicalJson(keys(document))) return;
const agents = Object.entries(old.roles ?? {}).flatMap(([instance, entry]) => [instance, `${entry?.definition}.${instance}`]);
if (actor === old.human && actor !== "tester" && !agents.includes(actor)) return;
fail("organization-model-quota-human-only");
}
// P5: the optional queue reader and polling setting are human changes even on
// the tester organization path. This guards every writer, not only the UI verb.
function usageFence(old, document, actor) {
const setting = doc => ({ plugin: doc?.plugins?.usage ?? null, usage: doc?.usage ?? null });
if (canonicalJson(setting(old)) === canonicalJson(setting(document))) return;
const agents = Object.entries(old.roles ?? {}).flatMap(([instance, entry]) => [instance, `${entry?.definition}.${instance}`]);
if (actor === old.human && actor !== "tester" && !agents.includes(actor)) return;
fail("organization-usage-human-only");
}
// C2-06 M11: replyLimits is the human's alone. Any setter that changes it refuses unless the actor is // C2-06 M11: replyLimits is the human's alone. Any setter that changes it refuses unless the actor is
// the business's human as the file stood before the write, and no agent or the tester under that // the business's human as the file stood before the write, and no agent or the tester under that
// name. Compared as M9 compares projects, on the document and again on what lands on disk. // name. Compared as M9 compares projects, on the document and again on what lands on disk.
@@ -240,6 +260,8 @@ export function organizationWriter({ dir, rolesDir, barrier = () => {} }) {
if (canonicalJson(document?.projects) !== canonicalJson(old.projects)) if (canonicalJson(document?.projects) !== canonicalJson(old.projects))
fail('organization-projects-protected'); fail('organization-projects-protected');
replyLimitsFence(old, document, actor); replyLimitsFence(old, document, actor);
modelQuotaFence(old, document, actor);
usageFence(old, document, actor);
validateBusinessDocument(document, file, { rolesDir }); validateBusinessDocument(document, file, { rolesDir });
const bytes = JSON.stringify(document, null, 2) + "\n"; const bytes = JSON.stringify(document, null, 2) + "\n";
// Check and log exactly what lands on disk, for every setter: a value JSON // Check and log exactly what lands on disk, for every setter: a value JSON
@@ -248,6 +270,8 @@ export function organizationWriter({ dir, rolesDir, barrier = () => {} }) {
if (canonicalJson(written.projects) !== canonicalJson(old.projects)) if (canonicalJson(written.projects) !== canonicalJson(old.projects))
fail('organization-projects-protected'); fail('organization-projects-protected');
replyLimitsFence(old, written, actor); replyLimitsFence(old, written, actor);
modelQuotaFence(old, written, actor);
usageFence(old, written, actor);
validateBusinessDocument(written, file, { rolesDir }); validateBusinessDocument(written, file, { rolesDir });
if (beforeWrite) { if (beforeWrite) {
beforeWrite(); beforeWrite();
+8 -3
View File
@@ -5,7 +5,7 @@
// like a limit change. A write is a patch per kind (see set()): kinds it doesn't name are kept. A refused write throws a code and logs nothing. // like a limit change. A write is a patch per kind (see set()): kinds it doesn't name are kept. A refused write throws a code and logs nothing.
import { organizationWriter, OrganizationError } from "./organization.mjs"; import { organizationWriter, OrganizationError } from "./organization.mjs";
import { isPlainObject } from "./util.mjs"; import { isPlainObject } from "./util.mjs";
import { KINDS, PluginError, checkPlugins } from "../../plugins/src/kinds.mjs"; import { KINDS, PluginError, checkPlugins, checkUsageSettings } from "../../plugins/src/kinds.mjs";
// `exists(kind, name)`, when given, refuses a name no module answers to (the host passes the // `exists(kind, name)`, when given, refuses a name no module answers to (the host passes the
// loader's hasModule). Without it the setter checks only the shape, as before. // loader's hasModule). Without it the setter checks only the shape, as before.
@@ -14,11 +14,12 @@ export function pluginSettings({ dir, rolesDir, exists = null }) {
function read(id) { function read(id) {
const { document, revision } = writer.read(id); const { document, revision } = writer.read(id);
return { business: id, revision, plugins: structuredClone(document.plugins ?? {}) }; return { business: id, revision, plugins: structuredClone(document.plugins ?? {}),
...(document.usage === undefined ? {} : { usage: structuredClone(document.usage) }) };
} }
function set(id, args, actor) { function set(id, args, actor) {
if (!isPlainObject(args) || Object.keys(args).some(key => key !== "revision" && key !== "plugins")) { if (!isPlainObject(args) || Object.keys(args).some(key => key !== "revision" && key !== "plugins" && key !== "usage")) {
throw new OrganizationError("invalid-request"); throw new OrganizationError("invalid-request");
} }
if (typeof args.revision !== "string" || !/^[a-f0-9]{64}$/.test(args.revision)) { if (typeof args.revision !== "string" || !/^[a-f0-9]{64}$/.test(args.revision)) {
@@ -55,6 +56,10 @@ export function pluginSettings({ dir, rolesDir, exists = null }) {
} }
} }
const next = structuredClone(writer.read(id).document); const next = structuredClone(writer.read(id).document);
if (Object.hasOwn(args, "usage")) {
if (args.usage === null) delete next.usage;
else next.usage = checkUsageSettings(args.usage);
}
next.plugins = { ...structuredClone(next.plugins ?? {}), ...structuredClone(sets) }; next.plugins = { ...structuredClone(next.plugins ?? {}), ...structuredClone(sets) };
for (const kind of removals) delete next.plugins[kind]; for (const kind of removals) delete next.plugins[kind];
const receipt = writer.write(id, next, { revision: args.revision, actor }); const receipt = writer.write(id, next, { revision: args.revision, actor });
@@ -144,3 +144,26 @@ test("vikunja:19/305 with an exists check, the setter refuses a module no tree f
assert.equal(events(f).length, before); assert.equal(events(f).length, before);
assert.deepEqual(settings.set("acme", { revision: view.revision, plugins: { "usage-source": ["meter"] } }, "jason").plugins, { "usage-source": ["meter"] }); assert.deepEqual(settings.set("acme", { revision: view.revision, plugins: { "usage-source": ["meter"] } }, "jason").plugins, { "usage-source": ["meter"] });
}); });
test('P5 optional usage kind and pollSeconds configure through plugins.set; default stays absent and retention bound is strict', () => {
const f=fixture();let v=f.settings.read('acme');assert.equal(v.plugins.usage,undefined);assert.equal(v.usage,undefined);
v=f.settings.set('acme',{revision:v.revision,plugins:{usage:'cliproxy-queue'},usage:{cliproxyQueue:{pollSeconds:7}}},'jason');
assert.equal(v.plugins.usage,'cliproxy-queue');assert.equal(v.usage.cliproxyQueue.pollSeconds,7);
for(const pollSeconds of [0,60,61,-1,1.5,'15',null]) {
const before=readFileSync(f.file,'utf8');
assert.throws(()=>f.settings.set('acme',{revision:v.revision,plugins:{usage:'cliproxy-queue'},usage:{cliproxyQueue:{pollSeconds}}},'jason'));
assert.equal(readFileSync(f.file,'utf8'),before);
}
v=f.settings.set('acme',{revision:v.revision,plugins:{usage:null},usage:null},'jason');
assert.equal(v.plugins.usage,undefined);assert.equal(v.usage,undefined);
});
test('P5 only human can enable/disable telemetry or change polling, including direct organization writes', () => {
const f=fixture();let v=f.settings.read('acme');const patch={plugins:{usage:'cliproxy-queue'},usage:{cliproxyQueue:{pollSeconds:15}}};
for(const actor of ['tester','chief','coder']) assert.throws(()=>f.settings.set('acme',{revision:v.revision,...patch},actor),{code:'organization-usage-human-only'});
v=f.settings.set('acme',{revision:v.revision,...patch},'jason');
for(const actor of ['tester','chief','coder']) {
assert.throws(()=>f.settings.set('acme',{revision:v.revision,plugins:{usage:null}},actor),{code:'organization-usage-human-only'});
assert.throws(()=>f.settings.set('acme',{revision:v.revision,plugins:{usage:'cliproxy-queue'},usage:{cliproxyQueue:{pollSeconds:1}}},actor),{code:'organization-usage-human-only'});
}
});
@@ -150,3 +150,21 @@ test('REQ-LIMIT-2 the writer stamps a daily quota\'s since, keeps its reset and
// The account itself stays a hand edit: the file's account is untouched by the writes. // The account itself stays a hand edit: the file's account is untouched by the writes.
assert.deepEqual(JSON.parse(readFileSync(f.file,'utf8')).launch.account,ACCOUNT); assert.deepEqual(JSON.parse(readFileSync(f.file,'utf8')).launch.account,ACCOUNT);
}); });
test('P5 per-model-key quotas are unset by default, accept digit-leading IDs and only the human changes or resets them', () => {
const f=fixture(),key='012345abcdef'; let view=f.settings.read('acme');
assert.equal(view.limits.tokens,undefined);
const limits={tokens:{keys:{[key]:{limit:20,reset:'05:00',timeZone:'America/Chicago'}}}};
view=f.settings.set('acme',{revision:view.revision,limits},'jason');
assert.deepEqual(stored(f).keys[key],{...limits.tokens.keys[key],since:T0});
const bytes=readFileSync(f.file,'utf8');f.tick(T1);
for(const actor of ['chief','tester','coder']) {
assert.throws(()=>f.settings.set('acme',{revision:view.revision,limits:{tokens:{keys:{}}}},actor),{code:'organization-model-quota-human-only'});
assert.throws(()=>f.settings.set('acme',{revision:view.revision,reset:[['tokens','keys',key]]},actor),{code:'organization-model-quota-human-only'});
}
assert.equal(readFileSync(f.file,'utf8'),bytes);
f.tick(T1);view=f.settings.set('acme',{revision:view.revision,reset:[['tokens','keys',key]]},'jason');
assert.equal(stored(f).keys[key].since,T1);
view=f.settings.set('acme',{revision:view.revision,limits:{}},'jason');
assert.equal(view.limits.tokens,undefined);
});
+7
View File
@@ -95,3 +95,10 @@ a failed connection refuses `proxy-down`. No stdout by the configured deadline
requests a bounded stop and records `proxy-stall` with key IDs. The runner writes requests a bounded stop and records `proxy-stall` with key IDs. The runner writes
only a fixed token to `<run>/proxy-first-output`, never stdout contents. A stop only a fixed token to `<run>/proxy-first-output`, never stdout contents. A stop
failure records/refuses `proxy-stop-failed` and retains the key. failure records/refuses `proxy-stop-failed` and retains the key.
P5 adds the bus-only `readUsageQueue()` management operation. Its fixed
`GET /v8/management/observability/usage/queue?count=100` retains the client's
existing response-size/deadline/loopback controls. It validates the entire array
(maximum 100 events), hashes client `api_key` and upstream `source` to 12 hex IDs
at the read boundary, and returns only safe IDs, counts and failure metadata.
Bodies, credential values and upstream error messages never enter receipts.
+18
View File
@@ -76,6 +76,24 @@ export class ManagementClient {
} }
finally { this.#receipt({ call: `${method} ${endpoint.split('?')[0]}`, status, keyIds: [] }); } finally { this.#receipt({ call: `${method} ${endpoint.split('?')[0]}`, status, keyIds: [] }); }
} }
// The queue drains at most 100 events. Credential-bearing strings exist only
// inside this bounded read, never in a plug-in result, receipt, store or view.
async readUsageQueue() {
const events = await this.#page('GET', '/v8/management/observability/usage/queue?count=100');
if (!Array.isArray(events) || events.length > 100) refuse('proxy-client-response');
const string = v => typeof v === 'string' && v.length > 0 && v.length <= 4096 && !/[\r\n\x00]/.test(v);
const amount = v => v === undefined ? 0 : Number.isSafeInteger(v) && v >= 0 ? v : refuse('proxy-client-response');
return events.map(event => {
if (!event || !string(event.api_key) || !string(event.source) || typeof event.failed !== 'boolean'
|| !event.tokens || typeof event.tokens !== 'object' || Array.isArray(event.tokens)) refuse('proxy-client-response');
const statusCode = event.fail?.status_code ?? null;
if (statusCode !== null && (!Number.isSafeInteger(statusCode) || statusCode < 0 || statusCode > 599)) refuse('proxy-client-response');
return { keyId: sha256(event.api_key).slice(0, 12), accountId: sha256(event.source).slice(0, 12),
managed: event.api_key.startsWith('msk-'), failed: event.failed, statusCode,
input: amount(event.tokens.input_tokens), output: amount(event.tokens.output_tokens),
cacheWrite: amount(event.tokens.cache_creation_tokens), cacheRead: amount(event.tokens.cache_read_tokens) };
});
}
getCredentials() { return this.#page('GET', '/v8/management/credentials'); } getCredentials() { return this.#page('GET', '/v8/management/credentials'); }
getUpstreamGroups() { return this.#page('GET', '/v8/management/config/api-keys/claude'); } getUpstreamGroups() { return this.#page('GET', '/v8/management/config/api-keys/claude'); }
putUpstreamGroups(groups) { putUpstreamGroups(groups) {
@@ -0,0 +1,50 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import http from 'node:http';
import { createHash } from 'node:crypto';
import { ManagementClient } from '../src/client.mjs';
const id = s => createHash('sha256').update(s).digest('hex').slice(0, 12);
const raw = { api_key: 'msk-made-up-client-canary', source: 'made-up-upstream-canary', failed: true,
fail: { status_code: 503, body: 'private-body' }, tokens: { input_tokens: 7, output_tokens: 2, cache_creation_tokens: 3, cache_read_tokens: 4 },
user_agent: 'private-agent', request_id: 'private-request' };
async function fixture(t, reply = () => [raw]) {
const calls = [], receipts = [];
const server = http.createServer((req, res) => {
calls.push([req.method, req.url, req.headers.authorization]);
const answer = reply(); res.writeHead(answer.status ?? 200, answer.headers ?? {});
res.end(JSON.stringify(answer.body ?? answer));
});
await new Promise(r => server.listen(0, '127.0.0.1', r));
t.after(() => new Promise(r => server.close(r)));
return { calls, receipts, client: new ManagementClient({ baseUrl: `http://127.0.0.1:${server.address().port}`, key: 'fake-management', receipt: e => receipts.push(e) }) };
}
test('P5 queue read uses actual bounded fixed management GET and immediately drops client and upstream values', async t => {
const f = await fixture(t);
const events = await f.client.readUsageQueue();
assert.deepEqual(events, [{ keyId: id(raw.api_key), accountId: id(raw.source), managed: true, failed: true, statusCode: 503,
input: 7, output: 2, cacheWrite: 3, cacheRead: 4 }]);
assert.deepEqual(f.calls, [['GET', '/v8/management/observability/usage/queue?count=100', 'Bearer fake-management']]);
assert.deepEqual(f.receipts, [{ call: 'GET /v8/management/observability/usage/queue', status: 200, keyIds: [] }]);
for (const secret of [raw.api_key, raw.source, 'private-body', 'private-agent', 'private-request', 'fake-management'])
assert.equal(JSON.stringify([events, f.receipts]).includes(secret), false);
});
for (const [name, reply, code] of [
['bad envelope', () => ({ events: [raw] }), 'proxy-client-response'],
['over count', () => Array(101).fill(raw), 'proxy-client-response'],
['missing key', () => [{ ...raw, api_key: null }], 'proxy-client-response'],
['bad counts', () => [{ ...raw, tokens: { input_tokens: -1 } }], 'proxy-client-response'],
['redirect', () => ({ status: 302, headers: { location: 'http://127.0.0.1:8317/' }, body: raw }), 'proxy-client-redirect'],
['refusal', () => ({ status: 401, body: raw }), 'proxy-client-refused'],
]) test(`P5 ${name} refuses safely with no retry`, async t => {
const f = await fixture(t, reply);
await assert.rejects(f.client.readUsageQueue(), e => e.code === code && !e.message.includes(raw.source));
assert.equal(f.calls.length, 1);
assert.equal(JSON.stringify(f.receipts).includes(raw.api_key), false);
assert.equal(JSON.stringify(f.receipts).includes(raw.source), false);
});
test('P5 malformed event after a valid event rejects the entire queue before any credential can escape',async t=>{
const f=await fixture(t,()=>[raw,{...raw,source:'another-upstream-canary',tokens:{input_tokens:'bad-count'}}]);
await assert.rejects(f.client.readUsageQueue(),{code:'proxy-client-response'});
for(const secret of [raw.api_key,raw.source,'another-upstream-canary'])assert.equal(JSON.stringify(f.receipts).includes(secret),false);
});
+9
View File
@@ -327,3 +327,12 @@ organization file or unavailable bus.
For the re-pin introducing this kind, Jason enables both channels through For the re-pin introducing this kind, Jason enables both channels through
plugins.set immediately after activate in Mos's window, then smokes CLI thread plugins.set immediately after activate in Mos's window, then smokes CLI thread
listing and Console chat. No development seat performs that live step. listing and Console chat. No development seat performs that live step.
## Proxy usage telemetry (row333 / P5)
The optional `usage` kind is interface 1, a single module with `read({client})`.
`cliproxy-queue` is off by default and enabled through human `plugins.set`.
It supplies proxy-labelled per-account numbers alongside the native per-key
counts; it has no quota authority. See
[the module contract](usage/cliproxy-queue/README.md) for poll settings, ID mapping,
record separation, bounded reads and per-key quota settings.
@@ -62,10 +62,13 @@ function windowStart(entry, now) {
function leaves(limits) { function leaves(limits) {
const daily = limits?.tokens?.daily ?? {}; const daily = limits?.tokens?.daily ?? {};
return Object.entries(daily).map(([account, entry]) => { const entries = [...Object.entries(daily).map(([account, entry]) => ({ path: ['tokens', 'daily', account], entry, match: x => x.account === account })),
...Object.entries(limits?.tokens?.keys ?? {}).filter(([key, entry]) => /^[a-f0-9]{12}$/.test(key) && Object.hasOwn(entry, 'reset'))
.map(([key, entry]) => ({ path: ['tokens', 'keys', key], entry, match: x => x.modelKeyId === key }))];
return entries.map(({ path, entry, match }) => {
if (!Number.isSafeInteger(entry?.limit) || entry.limit < 0 || typeof entry.reset !== 'string' || !RESET.test(entry.reset) || if (!Number.isSafeInteger(entry?.limit) || entry.limit < 0 || typeof entry.reset !== 'string' || !RESET.test(entry.reset) ||
typeof entry.timeZone !== 'string') refuse('bad-leaf'); typeof entry.timeZone !== 'string') refuse('bad-leaf');
return { path: ['tokens', 'daily', account], entry, account }; return { path, entry, match };
}); });
} }
@@ -74,7 +77,7 @@ function tally(leaf, records, now) {
const kinds = Object.fromEntries(KINDS.map(k => [k, 0n])); const kinds = Object.fromEntries(KINDS.map(k => [k, 0n]));
const unknown = new Set(); const unknown = new Set();
for (const r of records) { for (const r of records) {
if (r.account !== leaf.account || time(r.at) < from) continue; if (!leaf.match(r) || time(r.at) < from) continue;
if (r.status === 'known') for (const k of KINDS) kinds[k] += amount(r[k]); if (r.status === 'known') for (const k of KINDS) kinds[k] += amount(r[k]);
else unknown.add(JSON.stringify([r.run, r.turn])); else unknown.add(JSON.stringify([r.run, r.turn]));
} }
@@ -86,7 +89,7 @@ function hitFor({ limits, subject, records, now }) {
if (!Array.isArray(records)) refuse('bad-records'); if (!Array.isArray(records)) refuse('bad-records');
const at = time(now); const at = time(now);
for (const leaf of leaves(limits)) { for (const leaf of leaves(limits)) {
if (subject?.account !== leaf.account) continue; if (!leaf.match(subject ?? {})) continue;
const { count, unknownTurns } = tally(leaf, records, at); const { count, unknownTurns } = tally(leaf, records, at);
if (count >= BigInt(leaf.entry.limit)) return { path: leaf.path, limit: leaf.entry.limit, count: plain(count), unknownTurns }; if (count >= BigInt(leaf.entry.limit)) return { path: leaf.path, limit: leaf.entry.limit, count: plain(count), unknownTurns };
} }
@@ -31,7 +31,8 @@ function leaves(limits) {
// A key is the record's account. Accounts are null until row 126 names them, // A key is the record's account. Accounts are null until row 126 names them,
// so a key limit matches nothing until then. // so a key limit matches nothing until then.
for (const [k, entry] of Object.entries(tokens.keys ?? {})) for (const [k, entry] of Object.entries(tokens.keys ?? {}))
out.push({ path: ['tokens', 'keys', k], entry, match: x => x.account === k, key: true }); if (!Object.hasOwn(entry, 'reset')) out.push({ path: ['tokens', 'keys', k], entry,
match: x => /^[a-f0-9]{12}$/.test(k) ? x.modelKeyId === k : x.account === k, key: true });
return out; return out;
} }
@@ -72,7 +73,7 @@ export function mustStop(args) {
// while no record names an account (lead decision 150, Q1). // while no record names an account (lead decision 150, Q1).
export function report({ limits, records }) { export function report({ limits, records }) {
if (!Array.isArray(records)) refuse('bad-records'); if (!Array.isArray(records)) refuse('bad-records');
const named = records.some(r => r.account !== null && r.account !== undefined); const named = records.some(r => r.account != null || r.modelKeyId != null);
return leaves(limits).map(leaf => { return leaves(limits).map(leaf => {
const { path, entry: { limit, since } } = leaf; const { path, entry: { limit, since } } = leaf;
if (leaf.key && !named) return { path, limit, since, notEnforced: 'no records name a key' }; if (leaf.key && !named) return { path, limit, since, notEnforced: 'no records name a key' };
+16
View File
@@ -4,6 +4,19 @@
// switches on one module or a list. Adding a kind, or changing one, is a // switches on one module or a list. Adding a kind, or changing one, is a
// core change: a reviewed edit to this file. // core change: a reviewed edit to this file.
// Optional proxy telemetry is separate from session usage-source and limit-check.
export function checkUsageSettings(value) {
const object = v => v !== null && typeof v === "object" && !Array.isArray(v);
const bad = () => { throw new PluginError("invalid-usage-settings", "usage.cliproxyQueue.pollSeconds must be a whole number from 1 through 59"); };
if (!object(value) || Object.keys(value).some(k => k !== "cliproxyQueue")) bad();
if (Object.hasOwn(value, "cliproxyQueue")) {
const queue = value.cliproxyQueue;
if (!object(queue) || Object.keys(queue).some(k => k !== "pollSeconds")) bad();
if (Object.hasOwn(queue, "pollSeconds") && (!Number.isSafeInteger(queue.pollSeconds) || queue.pollSeconds < 1 || queue.pollSeconds >= 60)) bad();
}
return structuredClone(value);
}
export const NAME = /^[a-z][a-z0-9-]*$/; export const NAME = /^[a-z][a-z0-9-]*$/;
export const KINDS = Object.freeze({ export const KINDS = Object.freeze({
@@ -56,6 +69,9 @@ export const KINDS = Object.freeze({
exports: Object.freeze(["adapter", "levels", "preflight", "version", "countsAccount", "mounts", "builtinWeb", "builtins", exports: Object.freeze(["adapter", "levels", "preflight", "version", "countsAccount", "mounts", "builtinWeb", "builtins",
"typedName", "reliesOn", "gateTimeout", "bundle", "env", "turnEnd", "transcript", "compactions"]), "typedName", "reliesOn", "gateTimeout", "bundle", "env", "turnEnd", "transcript", "compactions"]),
}), }),
usage: Object.freeze({
kind: "usage", interfaceVersion: 1, exports: Object.freeze(["read"]), switch: "one",
}),
}); });
export class PluginError extends Error { export class PluginError extends Error {
@@ -169,3 +169,17 @@ test("REQ-LIMIT-2 no daily quotas: every launch is allowed and the report is emp
assert.deepEqual(check.report(a), []); assert.deepEqual(check.report(a), []);
} }
}); });
test('P5 daily quota for a model key ID matches stack key records and resets the next day', () => {
const keyId = '012345abcdef';
const a = { business: 'demo', now: NOW, limits: { tokens: { keys: { [keyId]: quota({ limit: 100 }) } } },
subject: { instance: 'coder', modelKeyId: keyId, account: null },
records: [known('2026-10-18T11:00:00.000Z', { modelKeyId: keyId, account: null })] };
assert.equal(check.mayLaunch(a).allow, false);
assert.equal(check.mustStop(a).stop, true);
assert.equal(check.report(a)[0].count, 100);
assert.deepEqual(check.report(a)[0].path, ['tokens', 'keys', keyId]);
assert.equal(check.mayLaunch({ ...a, now: '2026-10-19T11:00:00.000Z' }).allow, true);
assert.equal(check.mayLaunch({ ...a, subject: { modelKeyId: 'abcdef012345' } }).allow, true);
assert.equal(check.mayLaunch({ ...a, limits: {} }).allow, true);
});
+10 -1
View File
@@ -6,7 +6,7 @@ import { KINDS, NAME, PluginError, checkPlugins } from "../src/kinds.mjs";
const code = expected => e => e instanceof PluginError && e.code === expected; const code = expected => e => e instanceof PluginError && e.code === expected;
test("REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list", () => { test("REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source at interface version 1, limit-check at 2 (row 125), each a list", () => {
assert.deepEqual(Object.keys(KINDS), ["usage-source", "limit-check", "search-source", "channel", "harness"]); assert.deepEqual(Object.keys(KINDS), ["usage-source", "limit-check", "search-source", "channel", "harness", "usage"]);
assert.deepEqual({ ...KINDS["usage-source"], exports: [...KINDS["usage-source"].exports] }, assert.deepEqual({ ...KINDS["usage-source"], exports: [...KINDS["usage-source"].exports] },
{ kind: "usage-source", interfaceVersion: 1, exports: ["readTurn"], switch: "list" }); { kind: "usage-source", interfaceVersion: 1, exports: ["readTurn"], switch: "list" });
assert.deepEqual({ ...KINDS["limit-check"], exports: [...KINDS["limit-check"].exports] }, assert.deepEqual({ ...KINDS["limit-check"], exports: [...KINDS["limit-check"].exports] },
@@ -54,3 +54,12 @@ test("REQ-PLUG-1 checkPlugins reports through the caller's fail callback", () =>
assert.throws(() => checkPlugins({ "made-up": [] }, "x plugins", { fail }), /x plugins names unknown kind/); assert.throws(() => checkPlugins({ "made-up": [] }, "x plugins", { fail }), /x plugins names unknown kind/);
assert.deepEqual(seen, ["unknown-kind"]); assert.deepEqual(seen, ["unknown-kind"]);
}); });
test("P5 usage telemetry is optional, single module, separate from enforcing sources", () => {
assert.deepEqual({ ...KINDS.usage, exports: [...KINDS.usage.exports] },
{ kind: "usage", interfaceVersion: 1, exports: ["read"], switch: "one" });
assert.deepEqual(checkPlugins({}, "plugins"), {});
assert.deepEqual(checkPlugins({ usage: "cliproxy-queue" }, "plugins"), { usage: "cliproxy-queue" });
assert.throws(() => checkPlugins({ usage: ["cliproxy-queue"] }, "plugins"), code("bad-setting"));
});
+5 -5
View File
@@ -12,7 +12,7 @@ import { validateBusinessDocument } from "../../business/src/business.mjs";
const GOOD = { "usage-source": ["meter"], "limit-check": ["cap"] }; const GOOD = { "usage-source": ["meter"], "limit-check": ["cap"] };
// What loaded() reports for GOOD: search-source is a kind too, switched off here. // What loaded() reports for GOOD: search-source is a kind too, switched off here.
const GOOD_LOADED = { ...GOOD, "search-source": [], channel: [], harness: [] }; const GOOD_LOADED = { ...GOOD, "search-source": [], channel: [], harness: [], usage: [] };
// A tree with one good module of each kind, already loaded. // A tree with one good module of each kind, already loaded.
async function loadedTree(t, options) { async function loadedTree(t, options) {
@@ -56,7 +56,7 @@ test("REQ-PLUG-1 fixture modules of each kind switch on from a test organization
const loader = await s.loader(); const loader = await s.loader();
const result = await loader.load(business.plugins); const result = await loader.load(business.plugins);
assert.deepEqual(result.refused, []); assert.deepEqual(result.refused, []);
assert.deepEqual(result.loaded, { ...doc.plugins, "search-source": [], channel: [], harness: [] }); assert.deepEqual(result.loaded, { ...doc.plugins, "search-source": [], channel: [], harness: [], usage: [] });
assert.equal(loader.modules("usage-source")[0].readTurn(), "fixture-usage"); assert.equal(loader.modules("usage-source")[0].readTurn(), "fixture-usage");
assert.equal(loader.modules("limit-check")[0].mayLaunch(), "fixture-limit"); assert.equal(loader.modules("limit-check")[0].mayLaunch(), "fixture-limit");
assert.equal(loader.modules("limit-check")[0].mustStop(), false); assert.equal(loader.modules("limit-check")[0].mustStop(), false);
@@ -170,7 +170,7 @@ test("REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses a
assert.match(result.refused[0].message, /packages\/plugins can't be read \(EACCES\)/); assert.match(result.refused[0].message, /packages\/plugins can't be read \(EACCES\)/);
assert.deepEqual(result.refused[0].kept, ["meter"]); assert.deepEqual(result.refused[0].kept, ["meter"]);
assert.deepEqual(s.loader.logged.slice(before), result.refused); assert.deepEqual(s.loader.logged.slice(before), result.refused);
assert.deepEqual(s.loader.loaded(), { "usage-source": ["meter"], "limit-check": [], "search-source": [], channel: [], harness: [] }); assert.deepEqual(s.loader.loaded(), { "usage-source": ["meter"], "limit-check": [], "search-source": [], channel: [], harness: [], usage: [] });
} finally { } finally {
if (lock) chmodSync(lock, 0o755); if (lock) chmodSync(lock, 0o755);
} }
@@ -232,7 +232,7 @@ test("REQ-PLUG-1 a kind refused on its first load has nothing switched on, and t
const loader = await s.loader(); const loader = await s.loader();
// meter loads, absent refuses: the whole kind stays off, not half on. // meter loads, absent refuses: the whole kind stays off, not half on.
const result = await loader.load({ "usage-source": ["meter", "absent"], "limit-check": ["cap"] }); const result = await loader.load({ "usage-source": ["meter", "absent"], "limit-check": ["cap"] });
assert.deepEqual(result.loaded, { "usage-source": [], "limit-check": ["cap"], "search-source": [], channel: [], harness: [] }); assert.deepEqual(result.loaded, { "usage-source": [], "limit-check": ["cap"], "search-source": [], channel: [], harness: [], usage: [] });
assert.deepEqual(loader.loaded(), result.loaded); assert.deepEqual(loader.loaded(), result.loaded);
assert.deepEqual(loader.modules("usage-source"), []); assert.deepEqual(loader.modules("usage-source"), []);
assert.equal(loader.logged.length, 1); assert.equal(loader.logged.length, 1);
@@ -260,7 +260,7 @@ test("REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole se
await refusesKeepingOld(s, ["meter", "meter"], "bad-setting", "meter", /twice/); await refusesKeepingOld(s, ["meter", "meter"], "bad-setting", "meter", /twice/);
// An absent key switches the kind off. // An absent key switches the kind off.
result = await s.loader.load({ "limit-check": ["cap"] }); result = await s.loader.load({ "limit-check": ["cap"] });
assert.deepEqual(result.loaded, { "usage-source": [], "limit-check": ["cap"], "search-source": [], channel: [], harness: [] }); assert.deepEqual(result.loaded, { "usage-source": [], "limit-check": ["cap"], "search-source": [], channel: [], harness: [], usage: [] });
}); });
test("REQ-PLUG-1 loads run one at a time, so the last requested setting wins", async t => { test("REQ-PLUG-1 loads run one at a time, so the last requested setting wins", async t => {
@@ -149,3 +149,12 @@ test("REQ-LIMIT-3 token-limit ignores tokens.daily, which the daily-quota check
assert.deepEqual(check.mustStop(a), { stop: false }); assert.deepEqual(check.mustStop(a), { stop: false });
assert.deepEqual(check.report(a), []); assert.deepEqual(check.report(a), []);
}); });
test('P5 a model key ID limit counts stack records by key ID without an account', () => {
const keyId = '012345abcdef';
const args = { business: 'demo', limits: { tokens: { keys: { [keyId]: { limit: 5, since: '2026-10-18T00:00:00.000Z' } } } },
subject: { instance: 'coder', modelKeyId: keyId, account: null }, records: [{ at: '2026-10-18T01:00:00.000Z',
run: 'run', turn: 'turn', modelKeyId: keyId, account: null, status: 'known', input: 5, output: 0, cacheWrite: 0, cacheRead: 0 }] };
assert.equal(check.mayLaunch(args).allow, false);
assert.equal(check.report(args)[0].count, 5);
});
@@ -0,0 +1,43 @@
# Optional CLIProxyAPI queue telemetry (P5)
Enable through the human `plugins.set` transport with `plugins.usage` set to
`"cliproxy-queue"`. Omission is off. The same patch may set
`usage.cliproxyQueue.pollSeconds` (integer 1 through 59, default 15); `usage: null`
removes this setting. Both switches and polling changes are human-only, including
on the tester path. The existing instance configuration and proxy key paths do
not change.
Interface 1 exports `read({client})`. The bus supplies its management client;
the module never reads credentials, configuration paths or the environment.
The client performs exactly one bounded GET of
`/v8/management/observability/usage/queue?count=100` per poll. Existing fixed
loopback, timeout, response byte cap and no-redirect/no-retry controls apply.
The proxy's array response is validated completely and mapped immediately:
`api_key` and `source` become their first 12 hexadecimal SHA-256 characters.
Only whitelisted token counts, a failure flag/status, and IDs leave the client.
No request IDs, failure bodies, client values or upstream values are retained.
Malformed batches fail atomically and yield a fixed, value-free failure code.
One bus/store writer owns the reader for its instance. It serializes polls,
drains the shared queue once, and assigns IDs to current and retiring model-key
metadata owners. Unknown `msk-` IDs go to the reconcile receipt. Foreign keys
without that prefix are ignored. Disabled businesses receive no telemetry.
Telemetry uses the existing append-only usage table with source
`@proxy/cliproxy-queue`, separate from native session source records. `turnRecords`
excludes it before every limit check and native usage total. Proxy totals may be
incomplete (60-second upstream retention and a 100-event drain); the Console
labels them proxy-reported and reports the reader's availability. They never
independently enforce quotas.
Native transcript counts carry the immutable run's safe `modelKeyId` in the
usage cursor, preserved at turn begin and end. The Console exposes `byKey`.
A business can set a daily per-key quota at
`launch.limits.tokens.keys.<12-hex-key-id>` with `{limit, since, reset, timeZone}`;
the human writer stamps `since`. Enable `limit-check: ["daily-quota"]` to apply
that quota. Cumulative model-key limits retain `{limit,since}` and use
`token-limit`. Omitting a limit means no quota. Existing named account keys and
`tokens.daily.<account>` retain their existing behavior. Model-key limits and
resets are human-only through every organization writer. Missing, ambiguous or
foreign run-key metadata fails closed with `proxy-key-refused`; a retiring run
counts against its own retained key, never the agent's newer key.
@@ -0,0 +1,4 @@
// P5: telemetry only. The bus's management client sanitizes at the HTTP boundary.
// No credential value or limit-check authority crosses this interface.
export const interfaceVersion = 1;
export function read({ client }) { return client.readUsageQueue(); }
+4 -3
View File
@@ -751,13 +751,14 @@
if (!value?.total) return '<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Usage unavailable. No count was read.</p></section>'; if (!value?.total) return '<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Usage unavailable. No count was read.</p></section>';
const columns = row => ['input', 'output', 'cacheWrite', 'cacheRead', 'unknownTurns'].map(key => `<td>${txt(row[key])}</td>`).join(''); const columns = row => ['input', 'output', 'cacheWrite', 'cacheRead', 'unknownTurns'].map(key => `<td>${txt(row[key])}</td>`).join('');
const rows = [`<tr><th scope="row">Total</th>${columns(value.total)}</tr>`]; const rows = [`<tr><th scope="row">Total</th>${columns(value.total)}</tr>`];
for (const [group, label] of [['byRun', 'Run'], ['byInstance', 'Instance'], ['byModel', 'Model'], ['byProvider', 'Provider'], ['byAccount', 'Account']]) { for (const [group, label] of [['byRun', 'Run'], ['byInstance', 'Instance'], ['byModel', 'Model'], ['byProvider', 'Provider'], ['byAccount', 'Account'], ['byKey', 'Key']]) {
for (const row of value[group] || []) { for (const row of value[group] || []) {
const name = ['run', 'instance', 'provider', 'model', 'account'].filter(key => key in row).map(key => row[key] ?? 'unassigned').join(' / '); const name = ['run', 'instance', 'provider', 'model', 'account', 'modelKeyId'].filter(key => key in row).map(key => row[key] ?? 'unassigned').join(' / ');
rows.push(`<tr><th scope="row">${label}: ${txt(name)}</th>${columns(row)}</tr>`); rows.push(`<tr><th scope="row">${label}: ${txt(name)}</th>${columns(row)}</tr>`);
} }
} }
return `<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Best reading of session-editable transcripts, not proof. Unknown turns may have used more tokens. Account is unassigned until account tracking is configured.</p><div class="table-wrap"><table id="token-usage-table"><thead><tr><th scope="col">Subject</th><th scope="col">Input</th><th scope="col">Output</th><th scope="col">Cache write</th><th scope="col">Cache read</th><th scope="col">Unknown turns</th></tr></thead><tbody>${rows.join('')}</tbody></table></div></section>`; const proxy = value.proxy ? `<section aria-label="Proxy-reported usage"><h3>Proxy-reported usage</h3><p>Optional proxy telemetry never enforces a quota. Status: ${txt(value.proxy.state)}. These counts cover drained events and may be incomplete.</p><div class="table-wrap"><table><thead><tr><th>Proxy account ID</th><th>Input</th><th>Output</th><th>Cache write</th><th>Cache read</th><th>Requests</th><th>Failures</th></tr></thead><tbody>${(value.proxy.byAccount || []).map(row => `<tr><th scope="row">${txt(row.accountId)}</th>${['input','output','cacheWrite','cacheRead','requests','failures'].map(k => `<td>${txt(row[k])}</td>`).join('')}</tr>`).join('')}</tbody></table></div></section>` : '';
return `<section class="panel" aria-labelledby="token-usage-title"><h2 id="token-usage-title">Token usage</h2><p>Best reading of session-editable transcripts, not proof. Unknown turns may have used more tokens. Account is unassigned until account tracking is configured.</p><div class="table-wrap"><table id="token-usage-table"><thead><tr><th scope="col">Subject</th><th scope="col">Input</th><th scope="col">Output</th><th scope="col">Cache write</th><th scope="col">Cache read</th><th scope="col">Unknown turns</th></tr></thead><tbody>${rows.join('')}</tbody></table></div>${proxy}</section>`;
} }
// Row 155 (#1649, Q169): each assistant instance's settings, its seat name and a stop. A save // Row 155 (#1649, Q169): each assistant instance's settings, its seat name and a stop. A save
// sends only the fields that changed, with the read's revision. Drafts survive polling and // sends only the fields that changed, with the read's revision. Drafts survive polling and
@@ -0,0 +1,20 @@
// Local renderer contract: no browser, real accounts, provider or auth material.
import test from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import { runInNewContext } from 'node:vm';
const source=readFileSync(new URL('../src/public/bus.js',import.meta.url),'utf8');
const start=source.indexOf(' function tokenUsage(value) {'),end=source.indexOf('\n // Row 155',start);
const render=runInNewContext(`const txt=v=>String(v??'').replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));${source.slice(start,end)};tokenUsage`);
const counts={input:2,output:3,cacheWrite:4,cacheRead:5,unknownTurns:0};
test('P5 Console displays stack count per safe key separately from optional proxy account numbers',()=>{
const native={total:counts,byKey:[{modelKeyId:'012345abcdef',...counts}]};
const off=render(native);assert.match(off,/Key: 012345abcdef/);assert.doesNotMatch(off,/Proxy-reported/);
const on=render({...native,proxy:{source:'proxy',state:'available',byAccount:[{accountId:'abcdef012345',input:99,output:7,cacheWrite:0,cacheRead:0,requests:2,failures:1}]}});
assert.match(on,/Proxy-reported/);assert.match(on,/abcdef012345/);assert.match(on,/telemetry.*quota/i);assert.match(on,/>99</);
assert.match(on,/Key: 012345abcdef/);assert.doesNotMatch(on,/msk-|upstream-canary/);
});
test('P5 Console escapes hostile labels and labels unavailable telemetry without presenting a fresh zero',()=>{
const page=render({total:counts,byKey:[{modelKeyId:'<img src=x>',...counts}],proxy:{source:'proxy',state:'unavailable',byAccount:[]}});
assert.doesNotMatch(page,/<img/);assert.match(page,/unavailable/);
});