diff --git a/BUILD-LOG.md b/BUILD-LOG.md index 37d2e4fa4..5cfaf3b1d 100644 --- a/BUILD-LOG.md +++ b/BUILD-LOG.md @@ -5963,3 +5963,5 @@ Owner directed static-only fallback after actual nativepriority drift: no new pr 2026-11-03T01:27:26Z | Claude Opus 5.5 implementation sub-agent (lead T3 c5c1e8ba) | row 333 (#1831) R4 since carry fix on t3/row333-r4-fix, product commit f65faf9df on fe3ef5128, BUILD.md R4 section a13050012 | Ruling 1: the bus runtime passes launchSettings a key lineage lookup read from its own credential records (ids only); a new daily key quota takes the earliest stored since among the old document's daily key quotas in its key's lineage, now only when there is none, so a quota moved from a rotated or re-issued key keeps its count; a reset still sets now, a caller since still refuses, a quota removed and added back later is new, and a failed or malformed lookup refuses proxy-key-refused. Ruling 2: every limits refresh updates the remembered orphan set, empty when no daily key quota is left, so remove then re-add logs again; in memory only, a restart observes afresh. Ruling 3: the poll barrier's last yield is on the captured real setImmediate inside the deadline. Ruling 4: BUILD.md records the 64-id bound as a limit and corrects R3 departure 4 (a late queued event loses telemetry attribution to the reconcile log; not a quota bypass). Runs: bus 1397/1397, plugins 132/132, business 295/295, webui 499/499 (run 1 498/499 with editor-browser.test.mjs:93 timed out under load, the file 16/16 alone, then 499/499 twice), cli stack-release 225/225, stack-release-external 25/25, stack-upgrade 25/25, launch-limit-checks 5/5, harness tools 23/23; no skips, the model-final-completion flake did not appear; mutants M1 to M4, M4b and M5 each killed. Not run: 19 cli files that import bus runtime.mjs without pinning it. No migration, push, queue or PR action. 2026-11-03T02:52:45Z | Claude Opus 5.5 implementation sub-agent (lead T3 c5c1e8ba) | Vikunja #774 F1 and F4 for row 332 (model proxy P3, 5df0e9d6f) on t3/proxy-launch-774, product commit 85ecdfbde on 1ff45c4ad | F1: with system.proxy set the first launcher check no longer returns before the account, sandbox, capacity and limit checks. It skips only the harness preflight and the session proxy key match, which need the key P2 admits in startLocked; it runs harness-off (already first on the tip), the account declaration with credential proxy only, sandboxProblem, limitHit, mayLaunch and admission, so a launch that can never start refuses before authorizeLaunch, the workspace and checkouts, and modelPreflight. Added beyond the reviewer's list: the account-is-credential match against host credential env values and the admission generation re-check, both key-independent. The first proxy pass refuses only when the primary and the fallback model both refuse, with the primary's reason, and lets mayLaunch key-quota-no-model-key (row 333) through so P2 can issue the first key. The final check is unchanged, still before newRun and spawn; modelPreflight did not move. F4: rename path. The option is testProxy and createLauncher throws test-proxy-refused when it comes with system.proxy, because launch-account.test.mjs is a second caller (three row 332 R2 tests). Tests: proxy-launch-order.test.mjs 6 (capacity-full, limit-reached, sandbox-unavailable, upstream account credential, final-check key match, daily key quota with no key yet) and the launcher.test.mjs F4 throw test; on 1ff45c4ad five order tests fail, the key-match test passes by design and the F4 test fails on a business-file error. Runs: cli run 1 1112/1114 with 1 fail and 1 skip (case2-unit row253 C4 member query read outer-timeout for inner-timeout under host load; the file alone 83/83), cli run 2 1113/1114 with 1 skip (FED R7); bus 1397/1397, the model-final-completion flake did not appear; launch-limit-checks 5/5 (it reads launcher.mjs). Mutants M1 (early return before limitHit), M2 (no sandbox check in the first proxy pass) and M3 (no testProxy throw) each killed. No push, queue, Vikunja, Gitea or PR action. + +2026-11-03T03:41:28Z | Claude Opus 5.5 implementation sub-agent (lead T3 c5c1e8ba) | Vikunja #774 R2 for row 332 (GPT review P2 on round 1) on t3/proxy-launch-774-r2-fix, product commit b8f01a189 on a605e44d1 | Correction to the round 1 entry: its first proxy check refused only when the primary and the fallback both refused, so a healthy primary at capacity zero passed it and was refused only after modelPreflight. Both checks now pick the route through one helper, pickRoute in check(): the primary when its harness preflight passes, else the fallback through its own preflight. The first check calls it with a stand-in session proxy (PENDING_ADMISSION_KEY "pending-admission", a fixed non-secret marker, on the configured proxy port) that reaches only the preflights, then gates the picked route only, gate() still given null; no union and no retry. The final check calls it with proxyFor; its body is the round 1 code moved into the helper (proxyFor renamed proxyOf, two spaces less indent). Nothing reads the first check's route: startLocked takes model and account from the final check. Fixture options extra, real and hostEnv load the real claude-code harness with a pi fallback. Tests: 7 new in proxy-launch-order.test.mjs (healthy primary at capacity zero, fallback launch, failed primary at capacity zero, fallback at capacity zero, both preflights fail, no fallback, stand-in key absent from the launch log, bus events, session.json and the data root); on a605e44d1 the four refusal tests fail on modelPreflight 1 !== 0 and the three live tests pass. Runs: cli 1120/1121 with 1 skip (FED R7), 768 s; bus 1397/1397, 52 s; launch-limit-checks 5/5; neither known flake appeared. Mutants M4 (fall back on any primary gate refusal, test 1), M5 (first check never falls back, tests 2, 3, 4a, 4b, 6), M6 (no predicted preflight, tests 3, 4a, 4b, 5), the reviewer's unconditional throw at the helper's fallback decision (tests 2, 3, 4a, 4b, 6) and M7 (stand-in key written to the launch log, test 6) each killed. No push, queue, Vikunja, Gitea or PR action. diff --git a/docs/SESSIONS.md b/docs/SESSIONS.md index 2bd1fc207..61c8043ec 100644 --- a/docs/SESSIONS.md +++ b/docs/SESSIONS.md @@ -1972,3 +1972,4 @@ are never rewritten or removed; corrections are new entries. 2026-11-03 | Claude (sub-agent of Mosaic Stack lead c5c1e8ba) | row333 R3 rotation fix (#1831) | 3692fca52 on t3/row333-r3-fix (base b37cc5087): key quota follows the agent's key lineage across rotation and re-issue, orphaned leaves listed and logged, key-quota-no-model-key, usage module gets readUsageQueue only, fixture deadlines; bus 1393, plugins 132, business 293, webui 499, cli stack-release 225, stack-release-external 25, stack-upgrade 25, launch-limit-checks 5, no skips; 5 mutants killed; no push, queue or PR action. 2026-11-03 | Claude (sub-agent of Mosaic Stack lead c5c1e8ba) | row 333 R4 since carry fix (#1831) | f65faf9df on t3/row333-r4-fix (on R3 tip fe3ef5128): a moved key quota keeps its count through the bus's lineage lookup, orphan set updated on every refresh, real-timer barrier yield, BUILD.md R4 section a13050012; bus 1397, plugins 132, business 295, webui 499, cli stack-release 225, stack-release-external 25, stack-upgrade 25, launch-limit-checks 5, harness tools 23, no skips; 6 mutants killed; no push, queue or PR action. 2026-11-03 | Claude (sub-agent of Mosaic Stack lead c5c1e8ba) | Vikunja #774 F1/F4 for row 332 | 85ecdfbde on t3/proxy-launch-774 (base 1ff45c4ad): proxy first check runs every key-independent refusal before authorizeLaunch, checkouts and modelPreflight; testProxy test option refused with system.proxy; 7 new tests; cli 1113 + 1 skip, bus 1397, launch-limit-checks 5; mutants M1-M3 killed +2026-11-03 | Claude (sub-agent of Mosaic Stack lead c5c1e8ba) | Vikunja #774 R2 for row 332 | b8f01a189 on t3/proxy-launch-774-r2-fix (base a605e44d1): one pickRoute helper picks the route in both checks; the first check predicts it on a stand-in key and gates only that route; 7 new tests; cli 1120 + 1 skip, bus 1397, launch-limit-checks 5; mutants M4-M7 and the reviewer's throw killed; no push, queue or PR action