Compare commits
16
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
141627154e | ||
|
|
7e37ae3f7e | ||
|
|
be9fea1357 | ||
|
|
7687259265 | ||
|
|
7bff065d91 | ||
|
|
522ebf63fa | ||
|
|
c824049c0a | ||
|
|
31641c3c6f | ||
|
|
0fa356d0c6 | ||
|
|
c91bd3787b | ||
|
|
2492be8399 | ||
|
|
ee1f926ceb | ||
|
|
fbdd8c164c | ||
|
|
51c14e2e2c | ||
|
|
70f7be7f3f | ||
|
|
c155f52230 |
No files matched your search
@@ -5816,3 +5816,82 @@ 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 | 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-26T22:26:40.409240+00:00 — Sage: Mos1960 MVP deadline path
|
||||
|
||||
Before: #662 approved at72f77815, landing held436/660. New priority: #415/#416 Case1 .53 / Case2 .54 by10-27T23:59Z; verify rows332/333/334, install pins, row209 A–D and human entries. Readonly source/task/owner evidence; no deployment, reboot, secrets or gate run authorized by this status investigation. Report exact checked state and unverified boundaries within30min.
|
||||
|
||||
|
||||
### 2026-10-26T22:47:46.874946+00:00 — Sage: Mos1960 accepted, Mos1961 execution started
|
||||
|
||||
Report ebb24c79/14926B delivered22:35Z and accepted1961. Execution branch sage/mvp-1027-execution-1961 starts09a847ed,662stays72f77815. Fethry332join, Rockerduck334GREEN/review, isolatedCodex333builder, Steelbeak227 and Darkwingproxyacceptance active.334current+Git14evidencepins independentlychecked,81/81+28/28 and namedmutants+restore2/2, no sourceedit/rerunbySage. Requiredfullgate isdedicated1014underQ263/Q264/1962/1963, notadmitted; builderscontinue targetedchecks. Darkwingidentifiednativeprebootmanaged-probeboundary; first11checksGREENbuthealthyproxyacceptanceNOTclaimed. No hostdeploy/reboot/sourcepush/landing/borrowedsecret.
|
||||
|
||||
2026-10-25 — Rockerduck row334 (#1832), before: Case 2 renders bus/Console only. Plan: reuse P1 proxy template/runner under --proxy, enforce three-unit re-install checks and proxy→bus→Console starts, cover refusals and both named mutants. Tests held for Sage CLEAR; design in agents/rockerduck/work/queue-334/BUILD.md.
|
||||
|
||||
2026-10-25 — Rockerduck row334 (#1832), RED evidence: whole case2-unit.test.mjs against baseline has 48 pass/33 expected new fail; whole case2-install.test.mjs has 27 pass/1 expected new fail. All 74 older tests pass. Implementations restored. Sage sage-4390 authorizes seat-branch candidate commit/push before GREEN; GREEN/mutants held until separate CLEAR after row331. Per-failure evidence: agents/rockerduck/work/queue-334/red-results.txt.
|
||||
|
||||
2026-10-26 — Rockerduck row334 Mos1961: integrated old candidate onto 09a847eda using documented rebase after diagnosing merge queue-guard refusal; old RED preserved. Whole case2-unit 81/81 and case2-install 28/28 pass; named After and direct-ExecStart mutants killed, restored tests 2/2 pass; all nice19, private temp roots, zero skips. No source edits after integration beyond temporary restored mutants, no push/live action. Source c4bba5d2a; evidence agents/rockerduck/work/queue-334/BUILD.md. Full landing gate belongs to Sage; live behavior UNVERIFIED.
|
||||
|
||||
|
||||
### 2026-10-26T23:01:43.829916+00:00 — Sage: local334 integration, P5 scoped candidate and selected probe
|
||||
|
||||
ActualBoyd FIRST APPROVE8474d717/7330B and Webby boundary APPROVE28c9ecf2/10043B verified for4c49919e9. Exactsource integratedlocally70f7be7f3+51c14e2e2; packages/scriptsdiffemptyagainstreviewedcandidate; appendjournalsbothretained. RawREDtrailingwhitespace preserved; sourcecheckclean. NOTlanded/no fullgate.
|
||||
|
||||
P5actual503b91e56137482abef475bc3b1b72a64b0a329c: parentindependentlyverified202current+committedinputhashes/31changedpackagepaths/finalraw3358af06; builder174/174scope24wholefiles, namedupstreamvaluemutant+restore separate. FreshCodexreviewR1 requestedMos1966, notselfapproval. Canonical333startrefused331donepredicate; buildauthorized1961continueswithoutqueuestatebypass.
|
||||
|
||||
P3launcherRED35file34/1 exactadapter127 nowcaptured /usr/bin/claude wrapper missing/opt targetinsidebwrap. ExistingdeclaredMOSAIC_CLAUDE_BIN sameELFprerequisitefix authorized, originalassertions/deadlinesretained; wholepositivepending. Mos1966 selectsDarkwing63cb9caf/5624B humanacceptance.authorize/fixedprobe/case1-probe-v1 withoriginalmarker+input<=2000/no malformedusage+180/200/210+ownedcleanup. CodebuildingCodex; newauth/schema getsfreshreview. Dedicated1014guest/profile/admissionnotready; nofallback, nohostaction/landing/installSHA. #662stays72f77815.
|
||||
|
||||
## 2026-10-24 — row332 P3 proxy harness configuration: investigation/test placement
|
||||
|
||||
Fethry at c8a9bcf94, per Sage sage-4292 and mos-1616 pi-route amendment. Before: every managed session receives instance-wide provider credentials; harnesses have no transient per-session proxy context; pi preflight checks only its binary. Intended after: proxy-mode isolation, Claude proxy env, pi private run-local route config using environment references only, credential preflight, and business proxy account settings. Design/test plan: agents/fethry/work/queue-332/BUILD.md. Initial tests placed before production changes. No tests run: Sage CLEAR is required and has not arrived. No success/acceptance claim, live change, or dependency landing. Existing proxy issue number requested from Sage; not yet received.
|
||||
|
||||
## 2026-10-24 — row332 crash stop, documentation-only checkpoint
|
||||
|
||||
Fethry stopped under Mos mos-1630/Jason's T3 crash instruction. No production implementation, tests, probes, mutants or acceptance runs occurred; Sage CLEAR never arrived. Explicit route metadata per sage-4293 is recorded in agents/fethry/work/queue-332/BUILD.md; full state and resumption boundaries are in HANDOFF.md there. Safe crash checkpoint commits documentation/historical plain-text import manifest only; four unrun tests and the import-audit script remain uncommitted. No long jobs restarted, protected branch changes, merges, live changes or further thread messages.
|
||||
|
||||
2026-10-24 — Fethry row332 P3 UNRUN implementation checkpoint: optional proxy route per sage-4325 (default Anthropic), transient preflight/bundle/spawn context and serialization split, pi private model file/provider credential requirement. Existing initial RED evidence precedes source changes; only specifically authorized old fixtures updated. GPT wire API value PENDING until separate offline CLEAR/evidence; P2 seam remains injected context, no real proxy/auth access. Not GREEN, not accepted or landed. Details agents/fethry/work/queue-332/BUILD.md.
|
||||
|
||||
2026-10-24 — Fethry row332 P3 checkpoint ef0939e35: required explicit route restored per sage-4293/4328; openai-responses chosen by Sage sage-4331 as reasoning-based tie-break, not evidence-decided (both offline shapes passed). Rehashed pinned8.0.42 single active-tool isolated GLM turn confirms thinking/tool_stream survive to stand-in;bundle7/7,proxy-harness5/5,no skips. Real Codex auth proof remains row209 phaseA step7. P2 landing/rebase,mutants,reviews and full gate still pending; no landing claim. Plain evidence/limitations in agents/fethry/work/queue-332/BUILD.md.
|
||||
|
||||
2026-10-26 — Fethry Mos1961 P3/P2 actual join on09a847ed: metadata-first/one actual modelPreflight key through harness,private spawn,binding and stall;explicit provider-identity mapping preserves existing zai/anthropic;proxy strict route. TDD new RED→GREEN plus117/117 targeted wholefile checks,zero skips;original653/655 bodies/assertions/deadlines and runtime/process/modelkeys unchanged. Preserved nonproxy fixture-key RED and exact127 /usr wrapper→unmounted /opt ELF failure;minimal approved fake-key prerequisite/proper executable pin,focused andwholefile recheck. No P5 overlap,#662,fullgate,push or live-provider claim. Full evidence agents/fethry/work/queue-332/join1961/.
|
||||
|
||||
2026-10-26T23:10:42.967773+00:00 — Sage corrective journal integration: P3 carry ee1f926ce accidentally committed unresolved journal markers after an append-only resolver failed and the shell continued staging. Removed only marker lines; restored exact prior parent journal prefixes and appended every incoming Fethry block byte-for-byte instead of inserting historical entries. No history rewrite or product change; source trees unchanged. Corrected before any candidate freeze/full gate. P5 independent R1 CHANGES preserved and sent for actual RED-first fixes; no approval or landing claimed.
|
||||
|
||||
2026-10-26 — Fethry row332 named mutants3/3 killed on unchanged d6dc04e84 source: OAuth-only env leak1/1RED→restored2/0;literal models-file key5/2RED→restored7/0;serialized session key1/6RED→restored actual-context7/0. Exact anchors/all6 source SHA restoration,private/nice19/originalbound receipts andcleanup0. HeavyM3 after227SLOTBACK only;directSLOTBACK toSteelbeak+Sage afterward. Receipts-only localcommit,no push. Fresh review/fullgate/live acceptance still pending;not fullacceptance.
|
||||
|
||||
2026-10-26T23:22:27.937549+00:00 — Sage Mos1961/1971 checkpoint: P3 actual independent Codex source/evidence APPROVE6b68b30e; named Gladstone FIRST separately requested, no queue approval inferred. All9 committed mutant logs independently matched counts/SHA/Git and exact restored source; copied receipt-only evidence, no product edit/rerun. P5 actual R1 CHANGES7c95672a has foreign-drain, legacy12hex-account and startup-blocking findings; builder repairs/source controls active, native19->16 STOP78 means repair runtime acceptance UNVERIFIED. Row227 first credential-format RED and corrected native-priority STOP143 both beforeS1a; fake values corrected16..23 separate-hunk review required; zero acceptance steps claimed. Mos1971 config evidence matches workstation ananicy, no daemon eventlog, no scheduler change/retry. Both targeted validations/fullgate require admitted1014; Ops reports quiet gateRED io+etcd, no runner start/admission. Source-only successor gate-summary fixtures drafted separately, UNRUN/uncommitted, historical counters/receipts untouched. Case1 probe builds under1966 on actual P3+334 base. No push, landing, frozen install SHA, host window or liveprovider claim.
|
||||
|
||||
2026-10-26T23:24:27.986219+00:00 — Sage P3 historical priority qualification after Mos1971: independently inspected11 final whole-file logs+9 mutant/control logs; 12 of20 explicitly record priority corrections from16/10 backto19. Actual117-pass assertions/mutant errors/source restoration remain real, but these are behavior receipts and NOT uninterrupted strict19 acceptance. No historical raw file/reviewer verdict rewritten, no local rerun/correctionloop or scheduler mutation. Mos/Fethry/Gladstone notified. Required final priority-compliant controls await admitted1014; source approval alone cannot land.
|
||||
|
||||
2026-10-26T23:37:13.207082+00:00 — Sage P5 R2 source-only APPROVE3ed00e2a: fresh reviewer verified exact503+UNCOMMITTED overlayINDEX3eb9b8d1, all3 R1 source corrections and original assertion preservation. Parent independentlycheckedINDEX16artifacts/312staticinputSHAbytes/Gitblob; runtime28wholefiles/baselineRED/fixedGREEN remain pending admitted1014. No new product commit/application, no drifted run relabelled. Gate-summary successor R1 CHANGESb5004515 retained; three lexical falseGREEN gaps verified, refusal groups added before source corrections, exact R1 snapshots preserved. Revised38tests plus separate9historical+3R1baselineRED expectations UNOBSERVED; fresh R2 source review running on6d5dd8f4 manifest, no host test/parser execution. P3/P5 overlap has two explicit unapplied source/document resolution proposals; actual product unchanged.
|
||||
|
||||
2026-10-26T23:43:17.900414+00:00 — Sage MVP source assembly BEFORE runner validation: copied exact P5 R2-approved503+repair overlay into38parent package paths UNCOMMITTED;25tracked+13new, no source/tests run or product commit. Only two actual P3 overlaps: business launch retainsBusinessError plus P5 pure quota classifier; README retainsbothsections. Exact before/after/source/review pins in p5-applied-source-overlay.json. Independently preserved INDEX16artifacts and rootR1response/control/gate docs for transfer; their hashes unchanged. Actual Gladstone namedFIRST APPROVE987be31f sourcefile copied including append-only priority qualification; no lawfulpostedcomment invented. Counter R2 CHANGES0621a215 left no-gapbailout; source/test correction and TAP14 escape-parity authorfinding fixed in draft, originalR1/R2bytes preserved; freshR3 examines66df2068 manifest, all runtimeforecast39tests stillUNOBSERVED. No code staged/committed, no host action/fullgate/landing/installSHA.
|
||||
|
||||
2026-10-26T23:53:39.857914+00:00 — Sage Mos1981 boundary: actualRockerduck0013 source audit proves current interactiveprobePID cannotbeinstalledunitMainPID and external200/210 wrapsreadernotproducer. Saved4289B relay5c86b46e; Mos1981 selectsONLYsourceproposal, noimplementation. Darkwing authorsactualexisting-human-transport/same-unithost/privateproducer/supervisor delta; RockerduckdifferentCodexseat independentreview whenfileexists. Allhuman/run/copy/MainPID/oneuse/180/usage/PM/no-auto-probe/no-host-stop/current-schema guardsfixed; defaultunitPM/alreadychiefremainsrefused. Parentverified6532693bpatch/all34currentpins; freshprobeimplementationR1 source review runs separately, notlaunchready. Fresh227sourceR1 includesexplicitfixture-onlyhunk/nativeSTOP limitations. CounterR3CHANGESc6427703 foundSkipped/TODOsuffix; draftsource/testfixed, UNREVIEWED andUNEXECUTED, goeswithfinalintegratedindependentreviewratherthanstandalonecounterloop. No host/Node/parser/test/gate run, sourcepush, productcommit, installSHA or inventedapproval.
|
||||
|
||||
2026-10-27T00:01:25.007444+00:00 — Sage fresh source reviews retained:227R1 CHANGES30bc5f1f, probeR1 CHANGES3a8dceb0. 227 independentminimalhunk review confirms onlyfakevalues/leakliterals and all17names/assertions/deadlines; actualold14/13/14/new19/18/19, notourprevious13/12/13->18/17/18 shorthand. Bounds16..23 satisfied; correction is metadata, rawpins preserved. GateNode-exemption/ownedidentity/capture/pins vetoes and joinedP3own-pi-key fixture needsourcefixes; Steelbeak worksstaticonly. ProbeendLaunch-null mustnotbeconfirmedcleanup/PMproof, finalreloadmustretainauthorizedfixedselection, L2mutantmaskingmustbeclassified/corrected; Darkwing original1966sourcefixes queuedAFTERstable1981proposal, no1981codegranted. Allruntimegates remainUNVERIFIED/admitted1014pending; no local retry/schedulerchange/codecommit/landing/falseapproval.
|
||||
|
||||
2026-10-27T00:13:58.605083+00:00 — Sage227R2 source handoff: packetbf1e6ed6/currentmapbc76838e independently verified23packetfiles+9actualsource/toolfiles+287staticinputhashes. Fresh independentCodexR2 task sage-row227-independent-source-review-r2-mos1971-20261027 briefedfulloriginalcontract/R1/response and realnative release/ownership/sandbox/fakeprovider fixes. AllsourceUNCOMMITTED/UNPARSED/UNTESTED; no actual strict19/nativebefore-effect/17steps/cleanup outcome inferred. No localexecution, productcommit or targetadmission. Mos1981 sourceproposal remains Darkwing-owned and awaits actualdifferent-seat review before report/code ruling.
|
||||
|
||||
2026-10-27T00:22:50.315643+00:00 — Sage227R2 CHANGES3e919b63 retained. Source inspection confirms actualnative-role attribution missing, runtimepublication canraceancestry snapshot, dynamicrunner dependencies omittedfrompins, finalization canthrowbeforefailure/raw/cleanupreceipt anddeleteunresolvedevidence. Originalfixturelength/fakeownZAI fixes addressedatsource, all17assertions retained. Steelbeak receivesfullreport andboundedF1-F4source/control correction mandate, no new public/product authority, no local runtime/parser/probe/retry orcodecommit. Alloldpacket/rawpins preserved; no acceptance/newGREEN inferred.
|
||||
|
||||
2026-10-27T00:49:45.450511+00:00 — Sage Mos1986 source checkpoint: original1966 probe actual independent R2 APPROVE35a41462 closes all3 R1 source findings, runtime and same-unit integration still UNVERIFIED. Same-unit R1 proposal18e6ec68/25542 and actual Rockerduck CHANGES773ae7c3/12742 preserved; Mos1986 ONE revision delivered to Darkwing run15 with exact F1 delivery/F2 minimum P2 inner-await/F3 IPC corrections. No R1 handoff code selected. Different Codex R2 PASS within1981 bounds conditionally authorizes implementation; extra public delta returns before code. Case1 misses10-27;16–28 engineering-hour estimate excludes admission/gates/window. P5 named Boyd FIRST source-only APPROVE3f256e89 preserved; all38 parent uncommitted P5 source paths independently still match applied map, no productcommit. Row227 R3 packet5a28156c/all27 artifacts+13currentfiles checked; fresh independent R3 task runs on exact source/controls with prior CHANGES preserved. No local Node/parser/test/process/proxy/priority run, target admission, push, landing or installSHA.
|
||||
|
||||
2026-10-27T00:57:00.832582+00:00 — Sage row227 actual fresh R3 CHANGES eadec81a/23936B independently read and four findings source-confirmed: known wrapper exit reclassified unknown, own dependency trees excluded, shell removes unresolved scratch before controller retention, raw FIFO read can block before bounded finalization. Central prior native-role/startup-race predicates addressed at source only; no behavior acceptance. Steelbeak receives exact bounded tooling fixes and source-control requirements; all17 assertions/deadlines and prior raw/pins remain. No local execution, expanded product authority, productcommit, target admission or landing.
|
||||
|
||||
2026-10-27T01:08:05.469158+00:00 — Sage row227 R4 superseding source/control packet4eb60915 verified all28 packet artifacts+13 currentfiles; exactfive-filedelta read against four R3 findings. Fresh independent Codex R4 task sage-row227-independent-source-review-r4-mos1971-20261027 receives full original mandate/all3 prior CHANGES/replies and actual lifecycle/retention/input bounds. No author approval, runtime result or combined freeze inferred; standalone assertions/deadlines/product authority unchanged by claimed correction, actual independent disposition pending. All38 parentP5 source paths remain mapped uncommitted; no local code/parser/test/process/FSfault/priority execution, sourcecommit, push or landing.
|
||||
|
||||
2026-10-27T01:14:44.960322+00:00 — Sage row227 fresh R4 source-only APPROVE6667baaa/22665B independently read/hash-verified; allfour R3 findings addressed without assertion/deadline/product-authority expansion. Exact13 reviewed new source/tool paths copied into parent UNCOMMITTED, no conflicts with existing P3/P5; preserved R4 packet28artefacts, appliedhash/mode map row227-applied-source-overlay.json. P5 all38 applied rows remain exact; combined51 uncommitted source/toolpaths not tested, committed or joined-approved. Actual native controls, complete input/dependency/profile freeze, Dewey whole17 run and applicable full gate require admitted1014. AllpriorCHANGES/RED/STOP remain history. No local code/parser/test/process/FSfault/priority run, target admission, push/landing/installSHA.
|
||||
|
||||
2026-10-27T01:36:02.749707+00:00 — Sage Mos1995 recovery: no Codex config/secret edit or probe by Sage. Durable row227 R4 approval/join and runner-preparation phase inventory survived provider failure:19 whole packages+13 whole scripts,487 physical entryfiles, not actual consumedfreeze or admission. Checked actual latest runs for Darkwing/Steelbeak/Rockerduck/Fethry/P5builder: all completed, zero failed turns found, zero resends. Recovered Darkwing completedrun15 actual R2proposal2150aa36/47379B after its directsendHTTP400; copied unchanged, sent ONE authorized independentRockerduckR2 review with full1981/1986 bounds/F1-F3/priorCHANGES and explicit public-surface classification. No R1/R2 handoff implementation selected yet. Mos1995 runner1014 stopped/DHCPreservation review/freshGREEN wait recorded, no assumed SSHendpoint. All51 reviewed source/tooloverlaypaths remain exact/uncommitted, no runtime/test/parser/host action or codecommit.
|
||||
|
||||
2026-10-27T01:46:25.777993+00:00 — Sage Mos2002: actual Rockerduck R2 CHANGES4e395456/16781B copied/read/hashverified; publicFD0/rootCase1probe+PM/rootPythonwitness/socketcontinuation boundary and missing remainingbudget rootpublisher wait returned in7e3ba970/3079B. Mos2002 SELECTS exactfourcaller/root deltas for ONE R3DESIGN ONLY, explicit roothelper200/210 nativecontainment/UNKNOWN required; automaticPASS-toimplementationclause removed. Delivered Darkwingrun16, no code or automaticR4; either actualfreshCodexR3verdict returnsMos before implementation decision. Independent P5/22751sourcepaths unchanged/uncommitted. Guest-local fullgate source-preparation Codex task started in own driver-draft namespace, no local tests/parsers/childexecution; cannot admit itself/guesstarget or edit products. Ops66001:37 receipt phaseinventorymatched, VMstopped/reservationreview/noSSHtrust/runtime/native/LAB admission stillpending. No codecommit/target/fullgate/landing/installSHA.
|
||||
|
||||
2026-10-27T01:57:41.542679+00:00 — Sage Q272/Mos2004 Case1 priority: existing isolatedworktree switched to sage/case1-minimum-q272 atbe9fea135; no anotherworktree/defaultinstall. Before source separation, all51 own P5/227rows matched, saved deterministic1044480B tar528aba974429f8f8c5e7beff2dd3083938c575b396665dbb4474f7add8ab4e46 and independentlyreadback all51members. Restoredexact38 ownP5paths tocommittedHEAD andremovedonly6 copiedunlanded227productscripts;7privategatehelpersremainuntracked forsourceprep. Packages/scripts nowexactHEAD, no lostexternalbuilderwork/canonicalrootdirty/indexchange. No tests orproductcommit. CurrentCase1freeze excludesP5/227 perQ272; sourceR3DESIGN remainsfirst, wallclockP5-after planrequested withactualownerestimates/unknownadmission/humanwindow, no greenpathinvented.
|
||||
|
||||
2026-10-27T03:26:49.573684+00:00 — Sage Q272/Mos2021-2029: actual same-unit R3 CHANGES e3975550 accepted; PrivateTmp witness namespace boundary returned e7c9ac51, ONE R4 /run shared-receipt DESIGN authorized. Mos2027 pre-grants only actual independent R4 PASS-selected implementation, not before PASS;03:15 checkpoint missed. GapA packet originalfa141169 preserved whole in history-mos2021, Mos2024 addendum parks unselected broker comment proposal and removes T3posting/fivegrants from slice; actual managed ownGitea remoteeffect remains. Q228 scope-close/executor source already present, no per-grant-only gap inferred. Jason cards committed ONLY requested brain file locally45a5a896 then965e5093, no Sagepush; rotation2027-01-25, IPorigin held2029, humanOS/USC/SSO details NOTREADY, proxyinit now explicit human step. Parallel source-only Codex SSO/bootstrap/driver lanes active, no overlapping productedits. Ops trusted.55SSH is access-only, not admission; runtime/native19/helper/LAB still open. Existing packages/scripts remain exactHEAD, P5/227 saved, no tests/parser/host/process/FSfault/proxy execution, newproductcommit, fullgate/landing/installSHA.
|
||||
|
||||
2026-10-27T03:48:02.124992+00:00 — Sage Mos2027/2031-2034: actual stable R4d56f11e4/78516B +LANES1dad0710/15495 +manifest325b06b8/8078 independently byte/hash copied; ONE actual RockerduckR4 reviewrun13 requested, no PASS/implementation yet. Lane plan76d1aa8f attributes actual owner17h/20h and9h/10h serial tails,20h case misses03agentready even lower2hgate atT04; reportedAT RISK, no gates cut. Separate SSO packet4117292f21pins verified; independentR1CHANGES564d3f50 maskedI3control, correction-onlyfollowup active. Bootstrap clean second-start trace accepted;2034 selects humanConsole beforeP2completion with actual private modelPreflight asfirstP2proof, no newstatus/lifecyclecode, allPMoff/onspawnpaths require review. Cards onlybrain e7cf3fb7 local/no Sagepush, originheld, explicit P2UNOBSERVED baseline and humanrestartwait. No product/source/test/parser/host/FSfault/priority/runtime/proxy execution, new nativeGREEN, admission, landing/installSHA.
|
||||
|
||||
2026-10-27T04:11:50.906883+00:00 — Sage ACTUAL R4 PASS accb0b2f at03:50:45Z activatedMos2027. R1joinstart03:51:38; exactrepaired26972d10 appliedcleanly, all34currentbytes/hash/size matchreviewedR1map; UNCOMMITTED/UNTESTED. CoreDarkwingstarted03:53 inownscratch; separateRoot/P2/unitcontrolCodexbuilders startedwithdisjointdraftownership, native/current-sourceindependentreviewrequired.2039 selects firstfresh EXISTING--no-launch, exactA/Bargvswitchatoneplannedrestartbeforebaseline, nonfreshpathunchanged; CorefixesnewRun-beforepreflight. SSOR2CHANGESfe2464cd loggerinteraction preserved, narrowR3controlfix52cee18e underfreshreview. CardsONLYbrainab4dd1de local/noSagepush: selectedhostname/port80sourcecontract, daycards1/3/4prepared, exactsudo/privateTTYroute verifiedbyOpsHELPONLY04:04. RunnerstillUNADMITTED/stopped, no productcommit/test/parser/host/proxy/FSfault/priority/fullgate/landing/installSHA.
|
||||
@@ -0,0 +1,367 @@
|
||||
# Row 332 — P3 harness config from the model proxy
|
||||
|
||||
## Assignment and boundaries
|
||||
|
||||
2026-10-24: Fethry, thread 65673bd9-3bfa-412b-85d5-9b364187d8b6, branch fethry/row332, baseline c8a9bcf94. Sage assignment sage-4292; accepted brief plus full pi-routes amendment c8a9bcf94 (mos-1616). Gladstone first review, Dewey landing review; landing waits for P1/329 and P2/331, rebase on both and Sage's gate. No tests before Sage's CLEAR. No live proxy, host credential directories, real proxy data, management key, cutover, policy edits, or Codex harness changes.
|
||||
|
||||
Queue next in canonical checkout returned `nothing` during assignment. Starting row with op fethry-332-start met Sage's queue update lock; retry through the queue only. Root npm ci --ignore-scripts --no-audit --no-fund completed in this worktree (128 packages); no canonical node_modules use.
|
||||
|
||||
## Design note (line numbers at c8a9bcf94)
|
||||
|
||||
- packages/seat/src/session.mjs:242-247 defines ENV_ALLOW; keep it unchanged. sessionEnv:256-262 gains optional proxy context and drops CLAUDE_CODE_OAUTH_TOKEN, every passed ANTHROPIC_* variable, OPENAI_API_KEY, OPENROUTER_API_KEY and ZAI_API_KEY before adding harness env. Non-proxy results retain current behavior exactly.
|
||||
- packages/plugins/harness/claude-code/index.mjs:56-67 preflight accepts the session proxy credential; env:119-126 sets ANTHROPIC_BASE_URL and ANTHROPIC_AUTH_TOKEN from that context.
|
||||
- packages/plugins/harness/pi/index.mjs:33-36 preflight requires its own provider credential or proxy key, never a Claude OAuth token. env:63-70 sets only the session's proxy key as ANTHROPIC_API_KEY and selects the generated provider. Fresh run-local home/.pi/agent/models.json is private (0600; parent directories 0700). Every apiKey is the literal reference $ANTHROPIC_API_KEY; recursively forbid values beginning with !. Nothing stores the key in models.json or a manifest.
|
||||
- packages/harness/src/bundle.mjs:313 buildBundle accepts transient proxy context; :379 harness.env call needs it plus run location and launch.models. Context must never be added to session metadata, source digests, or manifest. The run-local file regenerates on each launch.
|
||||
- packages/cli/src/launcher.mjs:391,400 preflight, :412 account checks, :529 bundle creation and :592 child env must agree on the same session credential. Coordinate its acquisition with P2; build/test now against the specified { baseUrl, key } stand-in, not a management client or a key-store implementation.
|
||||
|
||||
Exact business setting keys remain launch.models.<selection>.provider, launch.models.<selection>.model, launch.account.name and launch.account.credential (launch.mjs:12-24,81-89). Provider already accepts proxy. Proposed account credential sentinel is the literal proxy (add alongside existing uppercase environment-set syntax), with launch.account.name a human-readable id such as proxy. No new fields. Existing provider anthropic selects the Anthropic route, zai selects GLM, and proxy selects the stack-owned GPT route; send this interpretation to Sage before implementation because the brief doesn't specify route encoding for provider proxy.
|
||||
|
||||
## Build-time API choice and pinned binary
|
||||
|
||||
P1's committed magica/row329 has CLIProxyAPI 8.0.42 in packages/model-proxy/PIN. Use that commit's fetchPinned({dataRoot:<fresh temporary root>}) implementation, copied from Git objects to this seat's temp tooling directory with its relative dependencies and PIN, until P1 lands. Never inspect another seat's worktree/scratch. It fetches only pinned GitHub release assets and checks archive, executable and panel hashes. No production instance config is needed and nothing under a real dataRoot/proxy is read.
|
||||
|
||||
After CLEAR, try actual pinned pi requests with both openai-responses and openai-completions through that binary under unshare -rn, against stand-in upstreams with made-up credentials under 24 characters. Record version, API path, safe request fields, response status and turn result. Choose one shape once from those results and hard-code it; no runtime fallback. Real Codex OAuth cannot be simulated as a real authenticated turn: first real Codex turn remains row209 phase A step7. Distinguish the offline compatibility evidence from that deferred real-auth proof.
|
||||
|
||||
The separate offline GLM acceptance script (outside scripts/test-*.sh) uses pinned pi and proxy, checks the upstream sees the model id from /v1/models, and records whether thinkingFormat/zaiToolStream-derived fields survive translation. All configs/auth placeholders belong to its fresh temp root.
|
||||
|
||||
## Implementation and test sequence
|
||||
|
||||
1. Add tests first for env isolation, Claude proxy env and preflight, pi credential refusal and each generated route/file invariant, and business account acceptance. Do not run until CLEAR; first new-test red is reported afterward, old-test red or second red is reported before changing anything.
|
||||
2. Implement harness/bundle/env handling against P2's transient interface. Add launcher boundary integration once its exact P2 acquisition seam is agreed. Keep secrets out of session.json and bundle manifests.
|
||||
3. With CLEAR, run the offline API-shape probe and GLM turn, then whole touched test files. Before each whole-file run report the list derived by parsing imports and traversing local dependencies; include harness plug-in dynamic loading explicitly. packages/cli/tests/case1-accept.test.mjs remains excluded without Mos approval.
|
||||
4. Kill named mutants; restore production source and verify. Record exact output and nice. Use a fresh shell mktemp -d /mnt/storage/scratch/tmp/XXXXXX TMPDIR for each run, absolute nice 19, and timeout -k 10 for each scripts/test-*.sh. No hidden skips; Sage owns the package/script landing gate.
|
||||
5. After dependency landings, rebase, complete review and gate stages, update queue only through its CLI, and append session/build receipts. Push only fethry/* when ready for authorized review; no force-push or attribution trailers.
|
||||
|
||||
Planned tests:
|
||||
- Each forbidden environment variable is absent in proxy mode; all existing allowed env is identical without a proxy; two launches receive distinct own keys and no other agent's key.
|
||||
- Claude env has exactly the supplied proxy base URL/auth token; proxy credential satisfies preflight without host upstream credentials.
|
||||
- pi refuses no-session-credential for no key or Claude OAuth alone, accepts an own provider key and a proxy key.
|
||||
- models.json covers Anthropic anthropic-messages at root URL, GLM openai-completions at /v1, and a stack-owned GPT provider at /v1 with the chosen API; routes use configured model ids.
|
||||
- Every apiKey is $ANTHROPIC_API_KEY; no key value occurs in file; recursively no value starts with !; mode 0600 and private parents; next launch uses changed port/models/key reference with no stale content.
|
||||
- Business accepts provider proxy and account credential proxy while preserving existing valid and invalid account behavior.
|
||||
- Launcher/bundle integration keeps context transient and passes only the launch's own key.
|
||||
- Every new refusal code gets a separate test.
|
||||
- Offline GLM pinned-pi turn and z.ai compat observation; both GPT API-shape requests recorded with limitations.
|
||||
|
||||
Named gate mutants:
|
||||
1. Proxy mode still passes CLAUDE_CODE_OAUTH_TOKEN (original brief).
|
||||
2. models.json receives the key value instead of $ANTHROPIC_API_KEY (amendment).
|
||||
|
||||
No tests have run. API-shape choice is pending evidence, not claimed.
|
||||
|
||||
## Progress 22:27Z
|
||||
|
||||
Placed initial RED tests (not executed): packages/seat/tests/proxy-session-env.test.mjs and packages/plugins/tests/proxy-harness.test.mjs. These exercise real sessionEnv and loader-loaded harness exports. Production source remains untouched pending the first authorized RED run. Removed no assertions and ran no tests. Correct baseline bundle harness.env line is 376 (not 379 in the initial design note).
|
||||
|
||||
Sage reporting attempts fethry-0001 (including same-key retry) and fethry-0002 all returned `T3 GET /api/orchestration/threads/<sage> timed out after 30s`. Delivery is unconfirmed. Queue move retry also met a Sage queue update lock (sage-333-reviewers-1024a); no bypass.
|
||||
|
||||
Additional test-first placement: packages/business/tests/proxy-launch.test.mjs covers existing proxy model acceptance, proposed proxy account credential literal, preserved environment account forms, and rejection of mixed/literal credential strings. Pending Sage's route/account interpretation and CLEAR; no production edits or tests run.
|
||||
|
||||
## Import audit and queue status
|
||||
|
||||
The non-evaluating import audit uses Node vm.SourceTextModule.dependencySpecifiers, not a text-path grep, plus explicit computed-import edges from the plug-in loader to both harness modules. Source: import-run-list.mjs; output: IMPORT-RUN-LIST.txt (211 entries, including the explicitly EXCLUDED case1-accept file). This is a candidate impact list for the planned source changes, not an executed test list. Before a whole-file run, report the actual authorized subset to Sage. Parsing executes no repository modules and runs no tests. The first audit invocation had a path-depth setup error (ENOENT); corrected the audit's own repository root and regenerated successfully.
|
||||
|
||||
At 22:28:19Z the canonical start operation returned `queue: only the owner (sage) may start row 332`. Per assignment, wait at least two minutes before repeating this same op. No queue state was edited manually.
|
||||
|
||||
## Design correction after D9 re-read
|
||||
|
||||
The initial route-encoding proposal (provider proxy for GPT only) is not sufficient: design D9 explicitly defines provider proxy as any model through the instance proxy. Do not implement the earlier proposal. Two viable encodings need resolving before route-dependent tests/production: exact model-id lookup in pinned pi's provider catalogs (no new business fields, but refuses proxy-only aliases/unknown models), or explicit route metadata in launch.models (additive schema, needs Sage to confirm it is within the approved brief). Recommend exact catalog membership if all intended configured model ids are in pinned pi; otherwise ask Sage to define/approve an explicit route field. Never guess by model prefix or silently choose a wire API. Independent env/preflight tests already placed remain valid.
|
||||
|
||||
Reporting recovered: fethry-0004 was accepted by t3_send_message at approximately 22:29:51Z. It delivered the D9 route correction, route-encoding/P2-seam question, import-manifest location and no-tests status to Sage. Earlier failed-message deliveries remain unconfirmed.
|
||||
|
||||
22:32:18Z: The start retry issued at 22:30:40Z (over two minutes after first owner refusal) also exited 2: `queue: only the owner (sage) may start row 332`. This is an ownership boundary; row was not started and no code/test execution proceeds through it. Sage's assignment must take effect before the same op can succeed. The full design report fethry-0005 again timed out; fethry-0004 is the confirmed delivered report. git diff --check passed; no test, probe, commit or push has run.
|
||||
|
||||
## Route ruling accepted — sage-4293, 22:37Z
|
||||
|
||||
Sage settled explicit metadata, superseding both initial encoding proposals and the catalog proposal. Exact new setting: launch.models.<selection>.route; permitted values anthropic, glm, codex, required only when provider is proxy. Nonproxy entries still allow provider/model only. Missing route refuses proxy-route-missing; present unknown/nonstring route refuses proxy-route-unknown. Both get independent code assertions; each valid value gets a test using a proxy-only model id absent from any catalog. The GPT route's generated pi provider will be mosaic-proxy-codex, never openai-codex. Its wire API remains a build-time choice after the pinned-binary probe. P2 passes only {baseUrl,key}; no route belongs to that seam.
|
||||
|
||||
A key persistence hazard found during source inspection: launcher.mjs:571 writes bundle.env as session.harnessEnv. Adding the key to harness.env must not retain this behavior for credentials. P3 will keep generated key env transient for spawnSession and omit those credential values from serialized harnessEnv. runner.mjs:390 already inherits the spawn environment before applying nonsecret harnessEnv. Test the on-disk session/bundle boundary, not only models.json.
|
||||
|
||||
The old launch-settings.test.mjs already uses provider proxy fixtures without route. Update those fixtures to explicit anthropic routes before any full-file run; preserve their existing authorization assertions. This is the new approved validation shape, not permission to loosen tests. No tests have run and no production edits exist.
|
||||
|
||||
Additional test-first placement after route ruling: packages/harness/tests/proxy-bundle.test.mjs exercises real buildBundle with explicit provider proxy entries and proxy-only model ids, three generated providers, run-local file mode, environment references, recursive no-! values, no key in bundle files/manifest, fresh model/port/key on next launch. The exact GPT API assertion must be added from the authorized pinned-binary probe before this test file's first run; it deliberately makes no unverified wire-shape claim now. No skip is introduced.
|
||||
|
||||
Canonical queue show returned owner sage and after=331 at 22:40Z; it also warned `view unknown` for the rendered table. No repair or queue bypass attempted; wait for Sage's announced batch. Queue metadata identifies shared proxy Gitea issue #1830.
|
||||
|
||||
## STOPPED — mos-1630, 2026-10-24T22:48Z
|
||||
|
||||
Jason's relayed crash instruction supersedes active work: no long-job restart, commit/push safe documentation only, handoff in this worktree, no other thread messages, then stop. See HANDOFF.md for complete state, next steps, uncommitted tests/audit script, and reruns needed. No tests or probes ever ran; no production implementation exists. Latest design is explicit launch.models route metadata per sage-4293; earlier catalog/GPT-only proposals are superseded. The original 211-entry import manifest predates the fourth new test file and is historical, not run authorization. Full inline resends still hit T3 timeouts. Crash commit will exclude every unrun test and the audit script.
|
||||
|
||||
## Resumed — sage-4298, 2026-10-24T23:12Z
|
||||
|
||||
Resume authorized; crash-stop state above is historical. Sage accepts route spellings, refusal codes, mosaic-proxy-codex and launch.account.credential=proxy. Added third named mutant: **proxy key serialized into session.json**. Added an unrun real-launcher integration test in packages/cli/tests/launcher.test.mjs: a stand-in `{baseUrl,key}` enters via proposed createLauncher proxy option; real harness generation, session writer and runner must pass the key transiently while disk session/bundle files omit it. Adapter alone is fake. This catches restoring harnessEnv:bundle.env without credential separation. Existing test assertions are unchanged.
|
||||
|
||||
Regenerated IMPORT-RUN-LIST.txt with the non-evaluating import audit (static module dependencies plus explicit computed harness-loader edges). It now includes proxy-bundle.test.mjs; case1-accept remains explicitly EXCLUDED (mos-1612). Full manifest, touched tests and all three named mutants delivered inline to Sage using t3_code t3_thread_send, clientRequestId fethry-row332-resume-report-001, delivery steered. No unresolved route question remains. GPT API selection awaits CLEAR and pinned-binary evidence. Production implementation remains held for required first RED; tests/probes/fetches remain held for CLEAR. git diff --check clean.
|
||||
|
||||
Canonical queue next fethry started without timeout; no start retry until Sage confirms after-none write. Initial local-worktree queue invocation refused because queue requires canonical checkout; rerouted to canonical as required, no state bypass.
|
||||
|
||||
## Queue start retry — sage-4301, 2026-10-24T23:15Z
|
||||
|
||||
Sage reports after=none at rev4057. Retried canonical `scripts/mosaic queue move 332 in-progress --op fethry-332-start --by fethry` without a timeout. Awaiting its result; no duplicate command or manual queue edit. Lane B remains held and all tests/probes/fetches remain forbidden until CLEAR. Static review of test fixtures confirms launcher test uses the existing real-harness fake-adapter setup; initial RED remains unrun.
|
||||
|
||||
Start result: `ok fethry-332-start rev 4059 row 332 briefed→in-progress` (exit0). No tests/probes/fetches run.
|
||||
|
||||
## P1 rebase and pre-run reader stop — sage-4312/4313
|
||||
|
||||
Rebased onto 9e2689dff; current documentation checkpoint efe3e4697. Saved/restored all uncommitted notes/tests with named stash (retained for recovery). BUILD-LOG.md and SESSIONS.md append conflicts preserve both upstream and row332 entries. No production edits or force-push. git diff --check clean.
|
||||
|
||||
CLEAR received in sage-4313, conditional on pre-step reader check. STOP condition found before any test/probe/fetch: packages/cli/tests/launcher.test.mjs imports ./helpers.mjs, whose line10 imports BusError/Broker from ../../bus/src/broker.mjs (P1-changed path). The P3 test also starts the real broker through startHost. Report delivered to Sage as fethry-resume-0003, clientRequestId fethry-row332-p1-reader-stop. Await specific reader-chain authorization. No runs, counts or mutant outcomes exist. Mutant execution requires implementation reaching GREEN first; baseline RED will not be claimed as mutant evidence.
|
||||
|
||||
## First execution — sage-4316/4319, lane B, 2026-10-24
|
||||
|
||||
Reader chain authorized by sage-4316. Every run below used fresh shell `mktemp -d /mnt/storage/scratch/tmp/gXXX`, absolute nice19 (recorded), timeout -k10 (180s new files/300s whole launcher). No probes/fetches/mutants or case1-accept run. Logs are plain text in red/ beside this note.
|
||||
|
||||
| File | UTC start/end | pass/fail/skip | Classification |
|
||||
| --- | --- | --- | --- |
|
||||
| business proxy-launch | 23:41:37/23:41:37 | 2/4/0 | Expected missing route validation/account support |
|
||||
| harness proxy-bundle | 23:41:42/23:41:42 | 0/5/0 | Fixture ERROR: assignment to frozen resolved.vars, not feature RED |
|
||||
| plugins proxy-harness | 23:41:44/23:41:44 | 0/5/0 | Fixture ERROR: missing createLoader options, not feature RED |
|
||||
| seat proxy-session-env | 23:41:50/23:41:50 | 1/1/0 | Expected instance OAuth leak |
|
||||
| cli launcher (whole) | 23:41:55/23:42:25 | 34/1/0 | New P3 route rejected; all34 old tests pass |
|
||||
|
||||
Per sage-4319, fixed only the two new-file fixtures and committed b285e581e `fixture fix, untested` before rerunning. resolvedFor uses its mutation callback; createLoader receives {log(){}}. Existing launcher assertions were not changed.
|
||||
|
||||
| Corrected file | UTC start/end | pass/fail/skip | Classification |
|
||||
| --- | --- | --- | --- |
|
||||
| harness proxy-bundle | 23:42:41/23:42:41 | 0/5/0 | Another fixture ERROR: pm selects a/z/g absent from fixture launch.models; not valid feature RED |
|
||||
| plugins proxy-harness | 23:42:41/23:42:41 | 1/4/0 | Valid feature REDs: missing Claude proxy URL/key and preflight; pi missing-credential refusals absent. Acceptance test already passes because existing pi preflight only checks binary; not proof of proxy credential behavior |
|
||||
|
||||
Stopped after exactly one authorized corrected run each. No edits/reruns after second harness fixture error; report to Sage before changes. Proposed follow-up: preserve valid fixture business routing, then overlay a test-local resolved vars object for buildBundle, or supply a coherent model table in callback. GPT API assertion still awaits authorized evidence and must precede a GREEN claim.
|
||||
|
||||
Stash created before rebase: 69ad35ec79805a0303ede4454f8d6815ddfa7bb3. Shared refs/stash must not be used again; entry remains untouched for Sage to clear. Future checkpoints use branch WIP commits.
|
||||
|
||||
Own-worktree node/chromium process sweep at23:42:57Z found only six tool-service processes predating tests (started23:12:08–23:12:10Z), no test node/chromium leftovers. Preserved tool services. No process killed. Lane B returned; mutants deferred until RED→fix→GREEN and later CLEAR with tip.
|
||||
|
||||
## Corrected bundle first valid RED — sage-4320
|
||||
|
||||
Only proxy-bundle.test.mjs edited: resolve a valid existing fixture business first, then copy resolved and vars locally, overlay harness/model, and assert selection exists in the supplied declared models table. Frozen original is untouched. Commit56701f715 `fixture fix, untested`, directly atop b285e581e, before execution.
|
||||
|
||||
Exactly one whole proxy-bundle run at23:44:40Z (start/end), fresh gXXX TMPDIR, nice19, timeout-k10/180s: 5tests,0pass,5fail,0skip,exit1. All five now reach real buildBundle and fail ENOENT on the required run/home/.pi/agent/models.json: missing production generation, valid feature RED rather than fixture errors. Earlier frozen-vars and unknown-model errors remain separately recorded. Log red/harness-corrected-2.txt. No production edits, further runs, mutants, probes or fetches. Lane B free.
|
||||
|
||||
Rebase made original origin/fethry/row332 diverge from local; publish current history on fethry/row332-p1 without force, preserving original remote checkpoint. Shared stash69ad35ec79805a0303ede4454f8d6815ddfa7bb3 remains untouched. Remaining uncommitted business/seat tests, launcher addition and audit source are not included in this two-fixture checkpoint.
|
||||
|
||||
## P3 implementation checkpoint — sage-4323/4325, UNRUN
|
||||
|
||||
Scope correction: sage-4322's P1 meant P3; no P1 code changed. Source edits authorized by sage-4323; all runs remain held. This is an implementation checkpoint, not GREEN or acceptance. Executing the established plan inline; user lane restrictions supersede skill test-run/commit defaults for this checkpoint.
|
||||
|
||||
Latest route ruling sage-4325 supersedes sage-4293/4298 and all earlier route-required notes: omitted proxy route means Anthropic and preserves the stored provider/model shape. Explicit anthropic/glm/codex routes remain accepted; unknown/present-invalid route refuses proxy-route-unknown. proxy-route-missing is withdrawn, not implemented. Other providers keep provider/model-only schema. Own business test updated for default; new bundle test exercises default generation without changing existing explicit-route assertions. launch-settings.test.mjs remains byte-unchanged.
|
||||
|
||||
Implementation in six production files:
|
||||
- business launch validates optional proxy route, preserves omission, accepts account credential literal proxy.
|
||||
- seat sessionEnv leaves ENV_ALLOW unchanged and filters provider variables only with proxy context.
|
||||
- Claude accepts proxy credential preflight and returns proxy base/auth env; pi requires own provider key or proxy key, never Claude OAuth.
|
||||
- bundle carries transient proxy/models to harness calls and propagates proxyRoute separately from primary/fallback route; no context in manifest.
|
||||
- pi groups declared routes into run-local private models.json, references only $ANTHROPIC_API_KEY, refuses executable-looking model ids/key collisions, exclusive create and0700 parents/0600 file. No host auth reads. Generated file digest included in bundle manifest. Models use pi's documented default sizes/costs and reasoning support, with explicit z.ai compat for GLM; no catalog membership inference.
|
||||
- launcher accepts the specified context stand-in or a per-agent factory, copies only baseUrl/key, carries it through repeated preflight checks and final bundle/spawn. Factory receives business/instance; P2 owns acquisition and may be called twice due to existing launch recheck. No P2 store/client calls invented. Provider credential variables split out at actual session.json serialization and delivered only through spawn env. Account proxy source validates against the supplied context, not host upstream variables.
|
||||
|
||||
### Old-test changes authorized by sage-4325 (baseline1e47b0919)
|
||||
|
||||
P3 item4 (rows brief pi preflight bullet, lines250-252) mandates refusal without proxy/own credential:
|
||||
- plugins/tests/harness.test.mjs:102 before `assert.equal(pi.preflight({ env: {} }), null)`; after asserts `.code === no-session-credential`. Other assertions unchanged.
|
||||
- cli/tests/launcher.test.mjs prepare():84 before only fake Claude OAuth; after additionally supplies ZAI_API_KEY=fx332-pi only when chief primary/fallback names pi. Other tests' assertions unchanged; Claude-only preparation does not receive it.
|
||||
- cli/tests/launcher.test.mjs old no-credential pi test (sage reference697): before deletes OAuth then expects launch/pi and launch-log event; after also deletes newly supplied fake ZAI key, expects no-session-credential refusal, refused log code and no registered session. Test renamed to reflect mandated behavior. Existing no-session-credential Claude test unchanged.
|
||||
|
||||
No other old test was changed. Static review found these conflicts before execution and authorization preceded edits. No old-test RED occurred; baseline whole launcher had34 old passes.
|
||||
|
||||
### GPT wire API: PENDING
|
||||
|
||||
Single build-time value PROXY_CODEX_API=null in pi/index.mjs. A declared codex route refuses generation with a plain pending-evidence error until that value is settled; no guessed wire API, environment switch or runtime fallback. Consequently existing all-three-route bundle tests are not expected GREEN yet. P2 integration, full tests, pinned evidence, mutants and reviews remain pending.
|
||||
|
||||
Planned separate 4c evidence run (outside scripts/test-*.sh), requiring its own lane B CLEAR:
|
||||
1. Use landed P1 fetchPinned only under a fresh owned temp root for the exact PIN (8.0.42). Fetch is a separately approved preparation, not part of offline networking. Verify hashes via P1; never use host installation or another seat's scratch.
|
||||
2. Run the pinned proxy and local stand-in upstream inside unshare -rn with loopback enabled, empty private HOME/auth dir and a sanitized environment. No real auth file or network. All fake credentials under24 chars. Private test-only proxy config points only at the stand-in.
|
||||
3. Generate two private probe-only pi model configs, one openai-responses and one openai-completions, both baseUrl=the isolated proxy/v1. Run pinned pi turns and record safe path/body shape fields, statuses, stream result and upstream observations, omitting auth/header values. These probe configs do not select the production constant.
|
||||
4. Separately run the GLM completions turn under the same isolation and record whether thinkingFormat=zai/zaiToolStream-derived fields survive proxy translation.
|
||||
5. If the offline stand-in cannot distinguish the two GPT shapes for the Codex-login route, report inconclusive evidence to Sage for Mos; do not select a value. A compatibility route cannot be reported as a real Codex-auth turn. First real Codex turn remains row209 phaseA step7.
|
||||
|
||||
No tests, probes, binary invocation or fetch ran during implementation. Import audit below is source parsing only, never repository evaluation. New run list includes the old harness.test.mjs touched under ruling; case1-accept remains EXCLUDED. Shared stash already cleared by Sage after1e47b0919 confirmation; no further stash operation used.
|
||||
|
||||
## Six whole files on a5330386c — sage-4326 lane B
|
||||
|
||||
Each ran exactly once, in requested order, no edits between runs and no reruns. Fresh shell gXXX TMPDIR per file; every log records nice19; timeout-k10/180s (launcher300s). No mutants/probes/fetches or extra impact files. Logs green-attempt/*.txt.
|
||||
|
||||
| File | pass/fail/skip | exit | UTC start/end |
|
||||
| --- | --- | --- | --- |
|
||||
| business | 6/0/0 | 0 | 23:57:06Z/23:57:06Z |
|
||||
| seat | 2/0/0 | 0 | 23:57:06Z/23:57:06Z |
|
||||
| proxy-harness | 5/0/0 | 0 | 23:57:06Z/23:57:06Z |
|
||||
| harness | 9/0/0 | 0 | 23:57:12Z/23:57:12Z |
|
||||
| proxy-bundle | 1/5/0 | 1 | 23:57:12Z/23:57:12Z |
|
||||
| launcher | 34/1/0 | 1 | 23:57:12Z/23:57:42Z |
|
||||
|
||||
Expected-PENDING failures (each shared declared table includes codex), all stop before assertions with `Error: proxy GPT API is PENDING build-time evidence`:
|
||||
- P3 Anthropic route uses messages at proxy root and the declared model id
|
||||
- P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility
|
||||
- P3 GPT route selects a stack-owned provider instead of pi Codex OAuth
|
||||
- P3 models file is private, references the one session key, and stores no executable values or keys
|
||||
- P3 every launch regenerates proxy port, declared models and own key without caching
|
||||
|
||||
The omitted-route-only bundle case passed. Five pending failures do not establish the remaining route/file assertions; no claim of GREEN.
|
||||
|
||||
Real old-test RED: `row 65 a failed primary preflight launches the fallback on a fixture harness module, recording the route and the reason` (launcher.test.mjs:714). First expected operation `await launcher.launchPm()` throws before the result assertions: `PM launch refused: no-session-credential (fallback fixture: pi needs its own provider key or a session proxy key (primary down: fixture preflight fails))`. Fixture harness re-exports real pi; prepare() recognized literal pi primary/fallback only, so it did not supply the needed own key. Reported to Sage as fethry-resume-0012 before any edit; no fix or rerun authorized/performed. P3 serialization test and all other launcher tests passed.
|
||||
|
||||
After all runs finished, changed only harness.test.mjs:100 title per sage-4326 to `row 65 pi preflight refuses missing credentials, and its version is the package pin`; assertion unchanged, no rerun for title. Sweep after end23:57:42Z found the same six pre-existing tool services (2699602,2699605,2700525,2700526,2700531,2700931), no test node/chromium leftovers; no process killed. Lane B free. No other source/test fixes in this follow-up.
|
||||
|
||||
## Fixture correction authorized — sage-4327
|
||||
|
||||
Old-test list addition: launcher.test.mjs row65 fallback test (line714 at e9fc105ac), before: no own pi credential before setup; after: this test alone sets given.f.env.ZAI_API_KEY=fx332-pi immediately before setup. All assertions unchanged; prepare() condition unchanged. Reason: P3 item4 requires pi own/proxy credential; this fixture inherits pi preflight. Prior real RED and first thrown error preserved above.
|
||||
|
||||
New proxy-bundle tests now supply explicit per-test declared tables: Anthropic only, omitted/default only, GLM only, GPT only; privacy/regeneration use Anthropic+GLM and retain every key/mode/no-executable assertion applicable to those routes. Regeneration additionally checks changed GLM endpoint/model. Added expected refusal test for declared Codex with pending build-time API; no production source changes. Only GPT generation test should remain expected-PENDING. Fixture fixes committed untested before exactly two authorized whole-file runs.
|
||||
|
||||
### Two-file fixture verification — sage-4327
|
||||
|
||||
Fixture checkpoint f1e8cda07, no source change. Exactly one run each, no edits between runs or reruns. nice19, fresh gXXX TMPDIR per file, timeout-k10/180s bundle and300s launcher. Logs fixture-r3/*.txt.
|
||||
- proxy-bundle23:59:16Z:7tests,6pass,1fail,0skip,exit1. Sole expected-PENDING failure: `P3 GPT route selects a stack-owned provider instead of pi Codex OAuth`, error `proxy GPT API is PENDING build-time evidence`. All other route/privacy/regeneration cases and explicit pending-refusal case pass.
|
||||
- launcher23:59:16–23:59:45Z:35tests,35pass,0fail,0skip,exit0. Row65 fallback assertions unchanged and now pass; P3 transient serialization case passes.
|
||||
|
||||
No failure other than expected GPT generation; GPT wire evidence, P2 integration/rebase, mutants and reviews still pending. Sweep shows only same six pre-existing node/chrome tool services, no test leftovers. Lane B free after23:59:45Z. No probes/fetches/mutants or extra tests run.
|
||||
|
||||
## Route-required correction — sage-4328 restores sage-4293
|
||||
|
||||
sage-4325 default-Anthropic ruling withdrawn. Explicit route required again: missing proxy-route-missing, present invalid proxy-route-unknown, distinct own tests. Removed generation/session-model defaults; bundle omitted-route test now asserts missing-route code. Active plug-in documentation corrected. No catalog/prefix inference.
|
||||
|
||||
Old-test list (baseline1da28a7bd): launch-settings.test.mjs41,154,161,188,198 object fixtures before provider:proxy/model only; after identical objects plus route:anthropic. Line45 before assignment models.opus.provider=proxy; after adds models.opus.route=anthropic. Every assertion byte-unchanged; no assertion relaxed. Authority/reason sage-4293 restored by sage-4328: D9 proxy is any upstream route and omission cannot select Anthropic silently.
|
||||
|
||||
Pre-run git-grep audit scoped 'packages/*/tests/*', saved route-required/proxy-fixture-grep.txt:16 model/assignment lines in four files. Positive controls matched launch-settings41 literal,45 assignment and intentional missing inputs proxy-launch14/proxy-bundle47. Broader quoted-proxy literal audit saved proxy-literal-grep.txt, manually reviewed for multiline entries. Remaining route omissions only intentional refusal cases (proxy-launch14,proxy-bundle47); unknown-route test uses route variable. All six old fixtures explicit; launcher155 and remaining bundle model literals explicit. Other broad hits are account sentinels, CLI argv or filesystem strings, not model table entries. Findings sent inline as fethry-resume-0015 BEFORE any tests. No other missing-route positive fixture found.
|
||||
|
||||
Committed untested per instruction; four whole-file runs follow under lane B CLEAR, no reruns or extra files. GPT offline run and P1 fetch remain unstarted and require separate explicit go.
|
||||
|
||||
### Required-route four-file verification — sage-4328
|
||||
|
||||
Tested9563fbc8b, exactly once per whole file in authorized order. No edits between runs, no reruns/extra tests. Each fresh gXXX TMPDIR,nice19,timeout-k10/180s (launcher300s). Plain logs route-required/*.txt.
|
||||
|
||||
| File | pass/fail/skip | exit | UTC start/end (2026-10-25) |
|
||||
| --- | --- | --- | --- |
|
||||
| proxy-launch | 6/0/0 | 0 | 00:01:47Z/00:01:47Z |
|
||||
| launch-settings | 18/0/0 | 0 | 00:01:55Z/00:01:56Z |
|
||||
| proxy-bundle | 6/1/0 | 1 | 00:01:56Z/00:01:56Z |
|
||||
| launcher | 35/0/0 | 0 | 00:01:56Z/00:02:27Z |
|
||||
|
||||
Only failure: `P3 GPT route selects a stack-owned provider instead of pi Codex OAuth`, expected-PENDING error before assertions: proxy GPT API is PENDING build-time evidence. No other failures; missing-route and unknown-route separate-code tests pass; six old launch-settings fixture metadata changes preserve all assertions. All35 launcher tests pass.
|
||||
|
||||
Sweep after00:02:27Z: only same six pre-existing tool services; no test node/chromium leftovers and no process killed. Lane B free. GPT wire-shape evidence and P1 fetch NOT started; each still needs Sage explicit go/CLEAR. No mutants.
|
||||
|
||||
## GPT offline attempt1 and static diagnosis — sage-4329/4330
|
||||
|
||||
One authorized landed-P1 fetchPinned invocation succeeded, exact PIN8.0.42 executable SHA74661f8cf949977870231359e8bf4344e07946766a673c08fa25a3e5f72fc95e, panel1.26.7 SHA8c9c6b7d3fb311e6aad5d06e1993e53a2d28389e640448a1bc6304ed20b057b5. Fresh owned root named in evidence/root.txt, no alternate binary/new fetch. Fetch entry required nice19, end log observed16 due host renice; disclosed before continuing. Static-inspection invocation then failed entry nice guard before any binary read/launch; no turn. Main isolated attempt1 setPriority19 explicitly, but static binary tag scan again observed host renice16; subsequent child starts explicitly set19.
|
||||
|
||||
Attempt1 unshare-rn showed interfaces[lo], empty private HOME/auth and sanitized env. Proxy booted version8.0.42 commitbc064340, built2026-10-24T14:21:38Z. GET/v1/models response200 with modelIds[], script refused `stand-in routes absent from proxy catalog`; zero GPT-responses/GPT-completions/GLM pi turns ran, so zero compatibility evidence. Cleanup remainingManagedChildren0. No rerun under that CLEAR; reported0018. Raw sanitized receipt evidence/offline.txt preserved.
|
||||
|
||||
Startup network finding for P7/unit, plain text from isolated proxy log:
|
||||
`failed to fetch latest Grok CLI version from npm, keeping fallback/cached version error=npm registry request failed: Get https://registry.npmjs.org/@xai-official/grok/latest: dial tcp [2606:4700::6810:122]:443: connect: network is unreachable`.
|
||||
The namespace blocked external egress. Panel auto-update was disabled; this separate Grok version check still attempted startup egress. No real auth or host proxy touched.
|
||||
|
||||
### Static cause recorded BEFORE attempt2 (sage-4330)
|
||||
|
||||
No executable/probe invocation for diagnosis. Read the hash-pinned bundled management.html's config reader/serializer and P1 initialConfig in packages/model-proxy/src/settings.mjs. P1 produces nested server/management/access/oauth/observability/routing but adds no upstream provider config. Bundled panel Ip explicitly reads `api-keys.openai-compatibility`; zee reads e['api-keys'][provider]; Fp rejects groups without array group.keys; Np reads group name/base-url/keys/models; xv serializes a group with name,base-url,keys; hv serializes each key as api-key. Therefore the version8 payload is ROOT `api-keys: { openai-compatibility: [{name,base-url,keys:[{api-key}],models:[{name}]}] }`, distinct from the client allowlist under access.api-keys. Source excerpts/character offsets in evidence/bundled-panel-shape.txt; no header/auth values in receipts. This is actual pinned bundled UI reader/writer source, not a guessed provider nesting or an external/unpinned example.
|
||||
|
||||
Cause of first setup failure: my test used providers.openai-compatibility with api-key-entries, neither the root key nor the group-key field expected by that pinned writer. Initial readiness also stopped at first200 instead of waiting for required models; fixed to30s bound,1s intervals, model count logged per poll. Under sage-4330 one further isolated attempt only: reuse fetched binary and re-hash with P1 verifyInstall before launch; separate attempt2 test roots; actual pi turns each once, retry disabled in pi settings; API constant remains PENDING. Record/restore niceness for own descendants when host policy changes it. No actual turn has yet run as of this pre-attempt note.
|
||||
|
||||
## Offline attempt2 evidence — sage-4330, API STILL PENDING
|
||||
|
||||
Static diagnosis above preceded this one extra attempt. No new fetch. P1 verifyInstall recomputed existing executable/panel hashes before use and matched PIN8.0.42/panel1.26.7. unshare-rn verified only lo, empty private HOME/auth, sanitized env. Test config uses bundled writer's root api-keys.openai-compatibility/groups.keys shape. Readiness poll1 not-ready/modelCount0; poll2 status200/modelCount2; proxy lists gpt-fixture and glm-fixture. No setup failure on attempt2.
|
||||
|
||||
A transparent loopback HTTP tap captures pi's method/path and a whitelist of body shape fields; forwards original body bytes to pinned proxy; no header/auth values recorded. Upstream stand-in receives proxy output. Both remain inside network namespace. Each actual pi invocation once,50s timeout-k10; retry.enabled=false and provider.maxRetries=0 in private pi settings. Proxy has request-retry0. Outer isolation240s timeout-k10; no reruns. All three turn exits0 and marker P332_OFFLINE_OK observed:
|
||||
|
||||
| Turn | Pi request to proxy through transparent tap | Proxy response | Stand-in upstream observation |
|
||||
| --- | --- | --- | --- |
|
||||
| GPT responses | POST/v1/responses, modelgpt-fixture,streamtrue,reasoning={effort:low,summary:auto} |200,response.completed event, marker |POST/v1/chat/completions,reasoning_effort=low,max_tokens=16384,streamtrue |
|
||||
| GPT completions | POST/v1/chat/completions, modelgpt-fixture,roles[developer,user],reasoning_effort=low,max_completion_tokens=16384 |200,completion stream marker |POST/v1/chat/completions,roles[developer,user],reasoning_effort=low,max_tokens=16384 |
|
||||
| GLM completions | POST/v1/chat/completions,modelglm-fixture,thinking={type:enabled,clear_thinking:false},reasoning_effort=low,max_completion_tokens=16384 |200,completion stream marker |POST/v1/chat/completions,same thinking object and reasoning_effort retained,max_tokens=16384 |
|
||||
|
||||
GLM compatibility finding: thinkingFormat=zai-generated thinking.type=enabled/clear_thinking=false survives proxy translation, as does reasoning_effort=low. zaiToolStream-derived tool_stream was NOT emitted, because this turn disabled tools; its survival is NOT proven. Static pinned pi source node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js:612-618 sets params.tool_stream=true only with active tools and compat.zaiToolStream. No tool-call stream was exercised. This limitation is reported, not silently interpreted as pass or drop.
|
||||
|
||||
Both GPT shapes pass on the stand-in openai-compatibility credential route. This does not distinguish them for the Codex-login route; no Codex OAuth/auth file exists in this experiment. Evidence is INCONCLUSIVE for the production GPT choice. PROXY_CODEX_API remains null/PENDING; no source or API selection changed. Sage rules or takes to Mos per plan item5; first real Codex-auth turn stays row209 phaseA step7.
|
||||
|
||||
Niceness: attempt2 entry/emitted turn values19, explicit setPriority at entry/child start and100ms restore over owned descendants. Host policy temporarily changed processes to16 eight times; corrections restored19, disclosed here. Initial fetch end16 and failed inspection guard are retained separately, not represented as clean19 throughout. Full safe request/response receipts in evidence/offline-attempt2.txt; no auth/header value recorded. Process cleanup reports remainingManagedChildren0. Sweep over worktree and owned evidence root found same six pre-existing tool services only, no proxy/pi/timeout/chromium test leftovers. Lane B free. No mutants or other test files run.
|
||||
|
||||
## API choice and active-tool follow-up — sage-4331
|
||||
|
||||
Sage's ruling: PROXY_CODEX_API=openai-responses. The evidence does not separate the two shapes: both pass through pinned8.0.42. This is a tie broken on reasoning; it is NOT an evidence-decided pick. Sage's reason: Codex upstream speaks Responses natively and Responses carries pi's reasoning summary field, while completions drops that field; expected fewer translations/lost fields on the real route. This reasoning is a lead decision, not a claim of an authenticated Codex experiment. Row209 phaseA step7 verifies first real Codex turn; change the single constant if it fails there, with no runtime fallback/env switch. Earlier PENDING logs/notes remain historical evidence.
|
||||
|
||||
Set constant/remove pending refusal; GPT route test asserts openai-responses on mosaic-proxy-codex. Replaced temporary pending-refusal test with generated single-provider/responses/key-reference assertions per ruling. No other production change. Active plug-in docs updated.
|
||||
|
||||
Evidence script adds glm-tool mode: one GLM turn only, same pinned verified binary and isolated setup, distinct attempt3-tool root, active built-in read tool but stand-in still returns text only. Capture tool_stream and tool names before/after proxy, never header/auth values. No actual tool execution is demanded by stand-in, so this checks wire-field survival, not arbitrary tool-call semantics. Rehash before launch, no fetch,30s catalog readiness with counts,50s timeout-k10 for one turn,own descendants restored nice19. Commit untested before cleared run; then proxy-bundle and proxy-harness each whole once. No other runs/mutants.
|
||||
|
||||
### sage-4331 single active-tool GLM turn and two-file results
|
||||
|
||||
Tested ef0939e35. No fetch. P1 verifyInstall rehashed existing binary/panel and matched both PIN hashes before use. One isolated glm-tool run, unshare-rn interfaces[lo],empty private HOME/auth,sanitized env. Readiness poll1 not-ready/count0;poll2 status200/count2. One pi invocation with one active builtin read tool,exit0,markerP332_OFFLINE_OK; no rerun. Outer timeout-k10/140s,inner120s,pi50s;nice19 explicitly at entry/child starts and guard restores observed16→19 three times. No production API chosen by script.
|
||||
|
||||
Plain request/response evidence (full safe receipt evidence/glm-tool.txt):
|
||||
- pi POST/v1/chat/completions modelglm-fixture,streamtrue,tools=[read],tool_stream=true,thinking={type:enabled,clear_thinking:false},reasoning_effort=low,max_completion_tokens=16384.
|
||||
- pinned proxy200 completion stream,marker.
|
||||
- stand-in receives POST/v1/chat/completions,tools=[read],tool_stream=true and same thinking/reasoning_effort fields;max_tokens=16384. Thus zaiToolStream-derived tool_stream survives this proxy route. No tool invocation or tool-call delta sequence was requested by the stand-in; this proves field survival with active tool, not every tool-call streaming semantic.
|
||||
|
||||
Then exactly once each whole file, fresh gXXX TMPDIR,nice19,timeout-k10/180s:
|
||||
- packages/harness/tests/proxy-bundle.test.mjs00:14:20Z:7pass,0fail,0skip,exit0.
|
||||
- packages/plugins/tests/proxy-harness.test.mjs00:14:20Z:5pass,0fail,0skip,exit0.
|
||||
|
||||
No failures, no extra runs/mutants. Cleanup managed children0. Own-worktree/evidence-root sweep found only same six pre-existing tool services,no proxy/pi/test/timeout/chromium leftovers. Lane B free. P3 now waits for P2/row331 landing before rebase,mutants,Gladstone review and further gates; no landing/merge requested or performed.
|
||||
|
||||
## Mos1961 joined execution — 2026-10-26, test-first preparation
|
||||
|
||||
Status-only recovery identified old candidate c7c38a6aa on base9e2689dff; P2/P4 product prerequisite is met at362893d04/52ba14c5f and current authorized base09a847edaa25b609bac7728ff83f224708a29399. Queue331 tracking-only state is not a blocker. New local branch fethry/row332-join1961 preserves all prior branches/packets. Local merge --no-commit of09a847ed into c7c38a6aa; only append-only BUILD-LOG/SESSIONS conflicts, both histories retained. No merge commit yet; tests must verify joined tree first. No push authorized.
|
||||
|
||||
Mos1961 scope: real P2 modelPreflight context before harness credential preflight, same key through bundle/spawn/bind/stall; preserve655 ownership and653 stall assertions/deadlines; no662,657/658 backlog. P5 owns runtime createUsage~382/tick/close/client/plugin/accounting; no runtime edits needed/planned. Landed runtime.mjs and original653/655 test files remain byte-identical to09a847ed. Sage notified before edits; serial tests held until334 returns slot. Codex only; parent coordinates reviews/fullgate/landing.
|
||||
|
||||
Mechanical join exposes two bugs to pin first: P3 check consults old injected stand-in rather than actual P2 host.op modelPreflight, so proxy-only launch refuses early; auto-merged bundle has duplicate proxy properties and can overwrite actual P2 context. New proxy-context-join.test.mjs uses existing real managed-launch fixture/runtime/controller with stand-in management HTTP and fake adapter; no management key/token from host. Verifies actual zai and anthropic provider mapping, one successful acquisition, same generation binding/stall identity and runner key, different-agent exclusion, private model references/permissions and disk value absence; unsupported provider refuses distinct code with no fallback/key acquisition/spawn. New pure proxy-routing.test.mjs pins explicit provider identities, strict proxy routes and unchanged nonproxy shape. Tests authored before integration code, not yet run.
|
||||
|
||||
Owner clarified compatibility mapping inside supplied P2 context: anthropic→anthropic-messages, zai→GLM/openai-completions, no model-name/catalog inference; provider:proxy still explicit route required. Unsupported providers refuse proxy-provider-unsupported before launch; no fallback/upstream escape. No-context behavior retains original routing/env. This preserves existing653/655 business metadata rather than rewriting positive fixtures.
|
||||
|
||||
### Mos1961 actual joined source/fixture result — 2026-10-26
|
||||
|
||||
New tests ran RED before source fix: proxy-routing2pass/3fail and proxy-context-join0pass/3fail. Named defects: no identity route mapping/unsupported refusal; actual P2 launches failed no-session-credential before modelPreflight because P3 used its old stand-in seam. Mechanical merge also had duplicate proxy bundle properties. Full RED logs routing-red.txt/context-red.txt preserved.
|
||||
|
||||
Actual integration changes (no runtime area edit): metadata-only initial check for system.proxy; one real trusted host.op modelPreflight after existing admission/authorization/workspace preparation; same supplied context used in final harness preflight and bundle/spawn; only its hash bound/registered/stall-watched. Real system.proxy ignores injected stand-in option. Existing P2 first-turn marker, modelKeyId and trusted modelStall remain tied to that same admitted generation. Native provider mapping only in supplied context: anthropic→Anthropic and zai→GLM, original provider retained for accounting; proxy still strict explicit route; unsupported proxy-provider-unsupported refused before acquisition/fallback/spawn. No-context model/environment shape unchanged. Pi generation maps supported declared provider identities with same central route resolver. No new public field, policy authority or credential source.
|
||||
|
||||
Original653 and655 test bodies/assertions/deadlines are byte-identical to09a847ed; preservation-pins.json also proves runtime.mjs,process.mjs,model-keys.mjs unchanged. P5 createUsage~382/tick/close/client/plugin/accounting exact overlap: NONE. No662;657/658 stay backlog. All new actual proxy cases zai,anthropic,explicitproxy routes anthro/GLM/Codex and Claude transient auth pass. They prove one successful actual model preflight, same generation key hash bound and own raw key only in runner env, a second agent's key excluded, private model-file modes/references, no key value in session.json/bundle/history, and no fake upstream credential present in proxy fixture.
|
||||
|
||||
Unexpected RED1 (preserved managed-first.txt): original653 nonproxy positive lacked own pi credential, brief-mandated preflight refused. Minimal approved helper prerequisite if proxy:false only adds fake own ZAI key fx653-pi. Managed proxy cases receive none; source-credential PRESENCE list is asserted empty in every new proxy positive. Original test file/body/assertions/deadlines untouched. Helper also has a default-pi harness selector only for new real Claude-path control; no preflight stub or production dummy token added. Exact before/after helper diff and SHA pins retained.
|
||||
|
||||
Unexpected RED2 (whole launcher full log packages_cli_tests_launcher.test.mjs.txt; focused RED logs also retained): real local-CLI-to-stand-in test failed127. First diagnostic polling missed short-lived stderr; a diagnostic-only fs.rmSync pre-cleanup capture retained actual assembled adapter stderr: `/usr/bin/claude: line 4: /opt/claude-code/bin/claude: No such file or directory`. Command/environment PRESENCE only, no values, captured before original cleanup. /usr/bin/claude is a110-byte shell wrapper to existing /opt ELF; existing harness mounts skip extra bind for /usr wrapper, leaving its /opt target absent. This is an executable dependency, NOT missing-key/auth or launcher proxy behavior.
|
||||
|
||||
Minimal fixture prerequisite correction: test discovery before `which.status===0 ? which.stdout.trim():null`; after `process.env.MOSAIC_CLAUDE_BIN ?? (which.status===0 ? which.stdout.trim():null)`. Test body/assertions/deadlines unchanged. Run explicitly pins SAME existing /opt ELF so existing harness.mounts readonly binds declared executable; no PATH widening/install/arbitrary fallback/general production mount rewrite. Focused genuine reproduction failed before this correction, focused corrected test1/0, then full launcher35/0. Original /usr-wrapper dependency limitation remains disclosed; fixed verified executable required by dedicated runner profile.
|
||||
|
||||
Executable prerequisite: /opt/claude-code/bin/claude; SHA256 f7dd62ae415378018cd21dd950eb3bac174ab085830304d3b8b098146bfd47b6; local --version with empty private HOME/env: 2.1.259 (Claude Code). No real auth/provider turn. runner-profile.json fixes this executable/hash and retains PATH=/usr/bin:/bin; run-targeted.py verifies hash before launcher run, uses private HOME/MOSAIC_CONFIG/TMPDIR and original bounds, restores nice19 over owned descendants, records all corrections (not claiming no host renice).
|
||||
|
||||
Latest whole-file results (source-derived targeted list, no package/global gate):
|
||||
|
||||
| File | pass/fail/skip | exit | Receipt |
|
||||
| --- | --- | --- | --- |
|
||||
| packages/harness/tests/proxy-routing.test.mjs | 5/0/0 | 0 | join1961/routing-green.txt |
|
||||
| packages/cli/tests/proxy-context-join.test.mjs | 7/0/0 | 0 | join1961/context-final.txt |
|
||||
| packages/cli/tests/model-managed-launch.test.mjs | 5/0/0 | 0 | join1961/managed-green.txt |
|
||||
| packages/bus/tests/model-hire-ownership.test.mjs | 18/0/0 | 0 | join1961/ownership-green.txt |
|
||||
| packages/harness/tests/proxy-bundle.test.mjs | 7/0/0 | 0 | join1961/packages_harness_tests_proxy-bundle.test.mjs.txt |
|
||||
| packages/plugins/tests/proxy-harness.test.mjs | 5/0/0 | 0 | join1961/packages_plugins_tests_proxy-harness.test.mjs.txt |
|
||||
| packages/cli/tests/launcher.test.mjs | 35/0/0 | 0 | join1961/launcher-final-green.txt |
|
||||
| packages/seat/tests/proxy-session-env.test.mjs | 2/0/0 | 0 | join1961/packages_seat_tests_proxy-session-env.test.mjs.txt |
|
||||
| packages/business/tests/proxy-launch.test.mjs | 6/0/0 | 0 | join1961/packages_business_tests_proxy-launch.test.mjs.txt |
|
||||
| packages/business/tests/launch-settings.test.mjs | 18/0/0 | 0 | join1961/packages_business_tests_launch-settings.test.mjs.txt |
|
||||
| packages/plugins/tests/harness.test.mjs | 9/0/0 | 0 | join1961/packages_plugins_tests_harness.test.mjs.txt |
|
||||
|
||||
Total117pass/0fail/0skip across11wholefiles. Original REDs and diagnostic-focused runs remain separate, not hidden reruns or reported as suite passes. Every run fresh shell gXXX TMPDIR/private HOME/config, absolute nice19 with owned-descendant corrections, timeout-k10; no original assertion or deadline relaxed. No real provider/auth turn, no new binary fetch or dependency installation. Owned-root sweep cleanup.json finds0 leftovers. No privileged process stop/borrowed token. Local merge commit follows targeted verification, preserving old packets; no push.
|
||||
|
||||
Review packet: join1961/inventory.json complete source/test/fixture list; source-vs-current.diff six production-file delta vs09a847ed; fixture-delta.diff and preservation-pins.json; source-pins.json; imports.jsonl/targeted-imports.txt source parsed graphs (loader/fork/spawn edges explicit,case1-accept EXCLUDED); runner-profile.json; results.json and all full logs. Static preservation-inventory command initially named nonexistent model-organization.mjs and stopped without side effects; corrected to actual landed model-keys.mjs. No missing preservation comparison is silently assumed.
|
||||
|
||||
Parent coordinates334+332 integration, Darkwing's precise independent native-Case1 join base, Codex reviews/fullgate/landing. This branch contains09a847ed+P3 only, not newly returned334. Mutants/full package/globalgate/installation/liveprovider acceptance remain pending. #655 ownership and653 actual caller/stall wholefiles verified at original bounds; unmeasured live behavior remains UNVERIFIED. Slot released for227 after owned cleanup and local commit.
|
||||
|
||||
Commit integration correction: merge commit from oldc7HEAD refused by queue guard because incoming already-landed09 queue files appeared staged vs oldHEAD. No commit/queue edit/guard bypass occurred. Fixed-path scratch backup command was separately refused before execution by mktemp-guard; corrected to mktemp-created backup recorded in join1961/tested-patch-path.txt. Preserved full tested delta and original branchc7; moved only new localbranch/index onto authorized09a847ed with worktree retained (mixed reset). Verified every tested production SHA unchanged and both queue files byte-identical to09. Commit is ordinary P3-only child of09a847ed,not a merge that recommits queue records. No tests repeated for history/index-only correction.
|
||||
|
||||
Post-commit history proof: d6dc04e84fac839b7259488162b145b9683f943b is normal child of09a847ed, originalc7packet remains fethry/row332-p1. Compared saved PRE-reset full binary patch against committed09..d6dc package/test/script delta blocks: all identical, including new files. history-correction-pins.json records every block hash; six direct production-file hashes also unchanged. Queue delta0. No no-verify/commit-tree/shared-ref rewrite. Mutants remain NOT RUN: OAuth-env leak(sessionEnv),literal model-file key(pi.bundle),serialized session key(launcher harnessEnv). Latest positive controls117/0/0skip are not mutant kills/full acceptance. Return these exact pending checks to parent so slot227 is not delayed. Fullgate/reviews/installation/liveprovider acceptance remain pending.
|
||||
|
||||
## Named mutants completed — 2026-10-26, product bytes unchanged
|
||||
|
||||
Source productd6dc04e84 and docs569765f6 preserved; parent c91bd3787 journal repair is outside this worktree and does not alter these source bytes. Fresh independent review remains parent-owned. M1/M2 were tiny serial pure-unit runs while227 held heavy slot: in-process environment/file generation only, no namespace/native model/launcher child. M3 ran only after227 SLOTBACK under explicit heavy-slot go. Direct SLOTBACK sent to Steelbeak7f079f4a-114d-4be6-b352-f598f786596b and copied Sage after restoration/cleanup, before his rerun.
|
||||
|
||||
Native helper join1961/mutations/run.py records exact one-match source anchors and initial/mutant/restored SHA, refuses dirty/mismatched pinned source, restores original bytes in finally, then runs restored whole-file positive control. M3 requires explicit --heavy-slot. Every phase fresh shell-mktemp gXXX TMPDIR/private HOME/config,nice19 owned-descendant restoration,timeout-k10/original whole-file bounds (180s pure,300s context; original30s test deadlines unchanged). Existing nativeELF prerequisite hash reverified before M3; these actual context controls use fake adapters, so no extra realCLI/auth/provider invocation. No public/runtime ready flag or sourcecandidate commit changed. Fake values redacted from mutation output.
|
||||
|
||||
| Mutant | Whole file | Baseline p/f/s | Mutant p/f/s;exit | Restored p/f/s;exit | byte identity |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| M1: proxy mode still passes CLAUDE_CODE_OAUTH_TOKEN | packages/seat/tests/proxy-session-env.test.mjs | 2/0/0 | 1/1/0;1 | 2/0/0;0 | True |
|
||||
| M2: models.json gets literal key instead of environment reference | packages/harness/tests/proxy-bundle.test.mjs | 7/0/0 | 5/2/0;1 | 7/0/0;0 | True |
|
||||
| M3: proxy key serialized into session.json | packages/cli/tests/proxy-context-join.test.mjs | 7/0/0 | 1/6/0;1 | 7/0/0;0 | True |
|
||||
|
||||
M1 narrows filter bug to passing only Claude OAuth; proxy-removal assertion catches it while nonproxy control still passes. M2 mutates only final models.json write to replace environment reference with own fake key (after original in-memory safety check), so actual on-disk literal-key defect is exercised; single-Codex-provider reference and privacy assertions kill it. M3 changes actual serialized harnessEnv to bundle.env; six managed native/explicit-route/Claude privacy assertions fail on credential value in session.json, while unsupported-provider refusal control still passes. These are genuine assertion REDs, not syntax/fixture/timeouts;0cancelled/0skips every phase. All6 production hashes match original pinned candidate after each restore. No assertion/deadline weakened.
|
||||
|
||||
All3 named mutants now KILLED; prior pending notes remain historical. Receipts include each baseline/full mutant/full restored log and source-anchor/SHA details; cleanup.json verifies0remaining owned-root processes. Product-source git diff vsd6 is empty. Restored positive controls2/2,7/7,7/7. No further fullgate/global/package runs, shareddragon fallback,secret read,borrowed token,dependency install or realprovider/authturn. No push. Three kills plus117 targeted tests do NOT claim full acceptance; independent review/fullgate/installation/live behavior remain pending/UNVERIFIED.
|
||||
@@ -0,0 +1,51 @@
|
||||
# STOPPED — row 332 (P3), T3 crash handoff
|
||||
|
||||
Stopped on 2026-10-24 under Mos mos-1630, relaying Jason's instruction: do not restart long jobs; commit/push safe work, leave a handoff, then stop. No further thread messages, tests, probes, queue operations, or implementation will run in this session.
|
||||
|
||||
## Branch and completed work
|
||||
|
||||
- Worktree: /home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332
|
||||
- Branch: fethry/row332, based on refactor c8a9bcf94. No implementation commits, rebases, merges or production source edits.
|
||||
- Read P3 brief, rules, full pi amendment, gate template, design and named source files. Detailed notes in BUILD.md beside this handoff.
|
||||
- Root npm ci --ignore-scripts --no-audit --no-fund completed in this worktree only (128 packages). No canonical node_modules used.
|
||||
- Initial test files written before implementation; none executed. Sage has not sent CLEAR. No proxy fetch, binary probe, offline turn, mutant, or suite has run.
|
||||
- No real proxy, management key, host auth directory or live instance was accessed. No production service was started/stopped.
|
||||
- Canonical queue next returned nothing during the assignment. Queue start op fethry-332-start refused on locks, then owner sage, including a retry after two minutes. Latest completed queue show still had owner sage, state briefed, after 331; it also warned that the rendered table was unknown. Did not repair or bypass it. Sage sage-4293 says an assign/after=none batch is running. Queue metadata identifies shared Gitea issue #1830.
|
||||
|
||||
## Latest accepted design
|
||||
|
||||
Sage sage-4293 supersedes all earlier route proposals: explicit route metadata, never catalog membership or model-prefix inference. Selected spelling: launch.models.<selection>.route = anthropic | glm | codex, required only with provider proxy. Missing route: proxy-route-missing; unknown/nonstring route: proxy-route-unknown. Other providers keep provider/model-only entries. Proposed launch.account.credential literal proxy; existing name/credential field names retained. GPT generated provider: mosaic-proxy-codex, never openai-codex. GPT wire API is still undecided pending the authorized pinned-binary requests. P2's seam stays exactly { baseUrl, key }.
|
||||
|
||||
Important implementation finding: launcher.mjs:571 serializes bundle.env into session.harnessEnv. Harness env will contain the session key in proxy mode, so credentials must instead reach spawnSession through transient environment variables and be omitted from serialized harnessEnv. runner.mjs:390 already inherits the spawn environment. Preserve ENV_ALLOW; filter instance provider variables in proxy mode only.
|
||||
|
||||
## Uncommitted work, intentionally left for the next session
|
||||
|
||||
These are unrun, incomplete tests/audit code, excluded from the documentation-only crash commit:
|
||||
|
||||
- packages/business/tests/proxy-launch.test.mjs — explicit routes and refusal codes, proxy account credential, existing nonproxy/account behavior.
|
||||
- packages/plugins/tests/proxy-harness.test.mjs — Claude env/preflight, own-key isolation, pi preflight and OAuth-only refusal.
|
||||
- packages/seat/tests/proxy-session-env.test.mjs — instance credential filtering and unchanged nonproxy env.
|
||||
- packages/harness/tests/proxy-bundle.test.mjs — real bundle generation, all three providers, key reference/no-key/no-! invariants, file modes and launch freshness. Exact GPT API assertion deliberately pending probe evidence; add before its first run.
|
||||
- agents/fethry/work/queue-332/import-run-list.mjs — non-evaluating static import audit using vm.SourceTextModule plus explicit computed loader edges. It ran successfully after correcting its own root-depth setup error. It is not a test runner.
|
||||
|
||||
IMPORT-RUN-LIST.txt is a historical 211-entry candidate impact list, generated before proxy-bundle.test.mjs was added. It includes case1-accept as explicitly EXCLUDED (mos-1612). Regenerate the list after resuming and report the actual authorized run list inline before any whole-file run. Do not treat the historical manifest as a current run authorization.
|
||||
|
||||
## Reporting status
|
||||
|
||||
T3 reporting repeatedly failed during GET with a 30-second timeout. fethry-0004 was confirmed delivered. Some later short numeric keys returned reused:true unexpectedly; do not rely on them as delivery evidence. A row-scoped detailed design resend and the inline 211-line import manifest also timed out, including the manifest's same-key retry. Sage may not have those messages. This handoff and BUILD.md are being pushed so they can be read with git show; no new thread message is sent under mos-1630.
|
||||
|
||||
## Next session, after restart authorization
|
||||
|
||||
1. Read this handoff/BUILD.md and recover queue state from canonical checkout. Wait for owner fethry and no after, then retry the same start op. Never bypass a refusal.
|
||||
2. Recover Sage's slot status. Still NO tests or probes until Sage sends CLEAR. No job needs restarting merely to preserve current state.
|
||||
3. Review the four uncommitted test files. Add the pinned-proxy API probe and exact GPT assertion before the first relevant run. Initial RED has not happened; production implementation must follow the authorized first RED.
|
||||
4. Rebuild the import-derived run list and send it inline or in a reviewed pushed commit before runs. case1-accept remains off without Mos approval. Existing launch-settings.test.mjs proxy fixtures need explicit route metadata with their authorization assertions preserved; no old-test red has occurred.
|
||||
5. Use P1's committed fetchPinned code under an owned fresh temporary root (8.0.42 at the inspected magica/row329 revision), never live proxy assets or another seat's scratch. After CLEAR, try pi's responses and completions requests under unshare -rn against stand-in upstream, record evidence, choose one GPT API at build time. Separately prove offline GLM and record z.ai compat survival. Real Codex auth proof remains row209 phase A step7.
|
||||
6. Implement transient P2 context, model validation/route propagation, harness config, preflight, spawn env/serialization separation and tests. Named mutants: OAuth token leak; literal key in models.json. No policy or real credentials involved.
|
||||
7. Land only after 329 and 331 land, rebasing on both, Gladstone first review, Dewey landing review and Sage's required gate. No force-push or merge authority is added by the crash instruction.
|
||||
|
||||
All future tests use a fresh shell-created short TMPDIR, absolute nice 19, and timeout -k 10 for scripts/test-*.sh. First new-test red is reportable afterward; old-test red or a second red goes to Sage before changes/reruns. No test outcomes are claimed here.
|
||||
|
||||
## Crash commit
|
||||
|
||||
Only documentation and the historical plain-text import manifest are committed. The final STOPPED reply records the exact pushed commit. The uncommitted files above remain deliberately available in this worktree because they have never run and test-slot authorization has not arrived.
|
||||
@@ -0,0 +1,213 @@
|
||||
packages/bus/tests/access-revoke.test.mjs
|
||||
packages/bus/tests/broker.test.mjs
|
||||
packages/bus/tests/channel-proof.test.mjs
|
||||
packages/bus/tests/chief-of-staff.test.mjs
|
||||
packages/bus/tests/citation-guard.test.mjs
|
||||
packages/bus/tests/citation-runtime.test.mjs
|
||||
packages/bus/tests/creative.test.mjs
|
||||
packages/bus/tests/credential-verbs.test.mjs
|
||||
packages/bus/tests/grant-scope-runtime.test.mjs
|
||||
packages/bus/tests/host-run.test.mjs
|
||||
packages/bus/tests/land.test.mjs
|
||||
packages/bus/tests/library-credential.test.mjs
|
||||
packages/bus/tests/library-lookups.test.mjs
|
||||
packages/bus/tests/library-sync.test.mjs
|
||||
packages/bus/tests/library.test.mjs
|
||||
packages/bus/tests/lifecycle-revoke.test.mjs
|
||||
packages/bus/tests/limit-checks.test.mjs
|
||||
packages/bus/tests/messages.test.mjs
|
||||
packages/bus/tests/processing-runtime.test.mjs
|
||||
packages/bus/tests/project-runtime.test.mjs
|
||||
packages/bus/tests/reload.test.mjs
|
||||
packages/bus/tests/tasks.test.mjs
|
||||
packages/bus/tests/tester-writes.test.mjs
|
||||
packages/bus/tests/tester.test.mjs
|
||||
packages/bus/tests/usage-runtime.test.mjs
|
||||
packages/bus/tests/usage.test.mjs
|
||||
packages/bus/tests/workflow-roles.test.mjs
|
||||
packages/business/tests/access-levels.test.mjs
|
||||
packages/business/tests/access.test.mjs
|
||||
packages/business/tests/agent-identity.test.mjs
|
||||
packages/business/tests/assistant.test.mjs
|
||||
packages/business/tests/business.test.mjs
|
||||
packages/business/tests/case1-business-file.test.mjs
|
||||
packages/business/tests/chief-library-credentials.test.mjs
|
||||
packages/business/tests/chief-of-staff.test.mjs
|
||||
packages/business/tests/cli.test.mjs
|
||||
packages/business/tests/credentials.test.mjs
|
||||
packages/business/tests/csuite.test.mjs
|
||||
packages/business/tests/grant-scope.test.mjs
|
||||
packages/business/tests/hard-waits.test.mjs
|
||||
packages/business/tests/hosts.test.mjs
|
||||
packages/business/tests/instance-credential-transitions.test.mjs
|
||||
packages/business/tests/instance-settings.test.mjs
|
||||
packages/business/tests/launch-settings.test.mjs
|
||||
packages/business/tests/library-projects-protected.test.mjs
|
||||
packages/business/tests/library-seats.test.mjs
|
||||
packages/business/tests/lifecycle-settings.test.mjs
|
||||
packages/business/tests/optional-tracker.test.mjs
|
||||
packages/business/tests/plugin-settings.test.mjs
|
||||
packages/business/tests/project-repo.test.mjs
|
||||
packages/business/tests/project.test.mjs
|
||||
packages/business/tests/proxy-launch.test.mjs
|
||||
packages/business/tests/record-grants.test.mjs
|
||||
packages/business/tests/reply-limits.test.mjs
|
||||
packages/business/tests/resolve.test.mjs
|
||||
packages/business/tests/role.test.mjs
|
||||
packages/business/tests/token-limit-settings.test.mjs
|
||||
packages/business/tests/vars.test.mjs
|
||||
packages/business/tests/workflow-roles.test.mjs
|
||||
packages/cli/tests/access-boot.test.mjs
|
||||
packages/cli/tests/access.test.mjs
|
||||
packages/cli/tests/app.test.mjs
|
||||
packages/cli/tests/boot-status.test.mjs
|
||||
EXCLUDED (mos-1612) packages/cli/tests/case1-accept.test.mjs
|
||||
packages/cli/tests/case1-hostcheck.test.mjs
|
||||
packages/cli/tests/case2-install.test.mjs
|
||||
packages/cli/tests/case2-persona-import.test.mjs
|
||||
packages/cli/tests/case2-unit.test.mjs
|
||||
packages/cli/tests/channel-cli.test.mjs
|
||||
packages/cli/tests/channel-recovery.test.mjs
|
||||
packages/cli/tests/cli.test.mjs
|
||||
packages/cli/tests/compactions-launch.test.mjs
|
||||
packages/cli/tests/config.test.mjs
|
||||
packages/cli/tests/credentials.test.mjs
|
||||
packages/cli/tests/federation-acceptance.test.mjs
|
||||
packages/cli/tests/follow.test.mjs
|
||||
packages/cli/tests/git-socket.test.mjs
|
||||
packages/cli/tests/grants-scope.test.mjs
|
||||
packages/cli/tests/grants.test.mjs
|
||||
packages/cli/tests/host.test.mjs
|
||||
packages/cli/tests/hosts.test.mjs
|
||||
packages/cli/tests/idle-stop-race.test.mjs
|
||||
packages/cli/tests/instances.test.mjs
|
||||
packages/cli/tests/launch-account.test.mjs
|
||||
packages/cli/tests/launch-limit-checks.test.mjs
|
||||
packages/cli/tests/launch-limits.test.mjs
|
||||
packages/cli/tests/launch-routes.test.mjs
|
||||
packages/cli/tests/launcher.test.mjs
|
||||
packages/cli/tests/lifecycle.test.mjs
|
||||
packages/cli/tests/limits-tokens.test.mjs
|
||||
packages/cli/tests/limits.test.mjs
|
||||
packages/cli/tests/mark-read.test.mjs
|
||||
packages/cli/tests/model-proxy.test.mjs
|
||||
packages/cli/tests/names.test.mjs
|
||||
packages/cli/tests/notifier.test.mjs
|
||||
packages/cli/tests/optional-tracker.test.mjs
|
||||
packages/cli/tests/other-tree.test.mjs
|
||||
packages/cli/tests/processing-cli.test.mjs
|
||||
packages/cli/tests/project-name-repo.test.mjs
|
||||
packages/cli/tests/project.test.mjs
|
||||
packages/cli/tests/publish-socket.test.mjs
|
||||
packages/cli/tests/reply-limits.test.mjs
|
||||
packages/cli/tests/revoke-window.test.mjs
|
||||
packages/cli/tests/session-clear.test.mjs
|
||||
packages/cli/tests/session-cli.test.mjs
|
||||
packages/cli/tests/session-launch.test.mjs
|
||||
packages/cli/tests/stack-copy.test.mjs
|
||||
packages/cli/tests/stack-instances.test.mjs
|
||||
packages/cli/tests/tester-reads.test.mjs
|
||||
packages/cli/tests/tester-threads.test.mjs
|
||||
packages/cli/tests/tester.test.mjs
|
||||
packages/cli/tests/thread-cli.test.mjs
|
||||
packages/cli/tests/thread-launch.test.mjs
|
||||
packages/cli/tests/thread-revoke.test.mjs
|
||||
packages/cli/tests/trackers-boot.test.mjs
|
||||
packages/cli/tests/transport.test.mjs
|
||||
packages/cli/tests/usage.test.mjs
|
||||
packages/cli/tests/verbs.test.mjs
|
||||
packages/control-board/tests/creative-hidden.test.mjs
|
||||
packages/control-board/tests/discord.test.mjs
|
||||
packages/control-board/tests/serve.test.mjs
|
||||
packages/conversation/tests/flows.test.mjs
|
||||
packages/harness/tests/bundle.test.mjs
|
||||
packages/harness/tests/claude-gate.test.mjs
|
||||
packages/harness/tests/claude-session.test.mjs
|
||||
packages/harness/tests/creative.test.mjs
|
||||
packages/harness/tests/gate.test.mjs
|
||||
packages/harness/tests/git-tools.test.mjs
|
||||
packages/harness/tests/library-tools.test.mjs
|
||||
packages/harness/tests/mcp-server.test.mjs
|
||||
packages/harness/tests/pi-session.test.mjs
|
||||
packages/harness/tests/proxy-bundle.test.mjs
|
||||
packages/harness/tests/raise-domain.test.mjs
|
||||
packages/harness/tests/runner.test.mjs
|
||||
packages/harness/tests/skills.test.mjs
|
||||
packages/harness/tests/spec-tools.test.mjs
|
||||
packages/harness/tests/tools.test.mjs
|
||||
packages/plugins/tests/channel.test.mjs
|
||||
packages/plugins/tests/harness-compactions.test.mjs
|
||||
packages/plugins/tests/harness.test.mjs
|
||||
packages/plugins/tests/loader.test.mjs
|
||||
packages/plugins/tests/proxy-harness.test.mjs
|
||||
packages/plugins/tests/searxng.test.mjs
|
||||
packages/processing-control/tests/task.test.mjs
|
||||
packages/seat/tests/compactions-budget.test.mjs
|
||||
packages/seat/tests/compactions-ledger.test.mjs
|
||||
packages/seat/tests/compactions.test.mjs
|
||||
packages/seat/tests/proxy-session-env.test.mjs
|
||||
packages/seat/tests/sandbox.test.mjs
|
||||
packages/seat/tests/session-workspace.test.mjs
|
||||
packages/seat/tests/session.test.mjs
|
||||
packages/tasks/tests/fields.test.mjs
|
||||
packages/webui/tests/agents-browser.test.mjs
|
||||
packages/webui/tests/agents.test.mjs
|
||||
packages/webui/tests/assistant.test.mjs
|
||||
packages/webui/tests/board-held.test.mjs
|
||||
packages/webui/tests/browser-edge.test.mjs
|
||||
packages/webui/tests/browser.test.mjs
|
||||
packages/webui/tests/bus-browser.test.mjs
|
||||
packages/webui/tests/bus.test.mjs
|
||||
packages/webui/tests/channel-chat.test.mjs
|
||||
packages/webui/tests/chat-browser.test.mjs
|
||||
packages/webui/tests/chat-instances.test.mjs
|
||||
packages/webui/tests/chat-replies-browser.test.mjs
|
||||
packages/webui/tests/chat.test.mjs
|
||||
packages/webui/tests/conversation.test.mjs
|
||||
packages/webui/tests/decide-browser.test.mjs
|
||||
packages/webui/tests/decide-sso.test.mjs
|
||||
packages/webui/tests/discord.test.mjs
|
||||
packages/webui/tests/docs-browser.test.mjs
|
||||
packages/webui/tests/editor-browser.test.mjs
|
||||
packages/webui/tests/editor.test.mjs
|
||||
packages/webui/tests/granted-user.test.mjs
|
||||
packages/webui/tests/history-return-flow.test.mjs
|
||||
packages/webui/tests/instances-browser.test.mjs
|
||||
packages/webui/tests/instances.test.mjs
|
||||
packages/webui/tests/library-cli.test.mjs
|
||||
packages/webui/tests/library-routes.test.mjs
|
||||
packages/webui/tests/limits-browser.test.mjs
|
||||
packages/webui/tests/limits-route.test.mjs
|
||||
packages/webui/tests/messages.test.mjs
|
||||
packages/webui/tests/pinned-copy.test.mjs
|
||||
packages/webui/tests/preview.test.mjs
|
||||
packages/webui/tests/processing-browser.test.mjs
|
||||
packages/webui/tests/processing.test.mjs
|
||||
packages/webui/tests/project-file.test.mjs
|
||||
packages/webui/tests/proof-cli.test.mjs
|
||||
packages/webui/tests/proof.test.mjs
|
||||
packages/webui/tests/reads.test.mjs
|
||||
packages/webui/tests/relaunch.test.mjs
|
||||
packages/webui/tests/return-flow.test.mjs
|
||||
packages/webui/tests/room-browser.test.mjs
|
||||
packages/webui/tests/room-http.test.mjs
|
||||
packages/webui/tests/routes-browser.test.mjs
|
||||
packages/webui/tests/routes.test.mjs
|
||||
packages/webui/tests/send-browser.test.mjs
|
||||
packages/webui/tests/send.test.mjs
|
||||
packages/webui/tests/serve.test.mjs
|
||||
packages/webui/tests/settings-form.test.mjs
|
||||
packages/webui/tests/settings-write.test.mjs
|
||||
packages/webui/tests/shell.test.mjs
|
||||
packages/webui/tests/sso-browser.test.mjs
|
||||
packages/webui/tests/sso.test.mjs
|
||||
packages/webui/tests/tester-browser.test.mjs
|
||||
packages/webui/tests/tester-cli.test.mjs
|
||||
packages/webui/tests/tester-listener.test.mjs
|
||||
packages/webui/tests/thread-claims-browser.test.mjs
|
||||
packages/webui/tests/thread-claims.test.mjs
|
||||
packages/webui/tests/thread-sharing.test.mjs
|
||||
packages/webui/tests/usage-browser.test.mjs
|
||||
packages/webui/tests/usage.test.mjs
|
||||
packages/webui/tests/user-option-swap.test.mjs
|
||||
packages/webui/tests/views.test.mjs
|
||||
@@ -0,0 +1,19 @@
|
||||
00:14:20Z
|
||||
nice=19
|
||||
✔ P3 Anthropic route uses messages at proxy root and the declared model id (12.070131ms)
|
||||
✔ P3 omitted route refuses proxy-route-missing before model config generation (2.197623ms)
|
||||
✔ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (3.390562ms)
|
||||
✔ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (4.240948ms)
|
||||
✔ P3 a declared Codex route generates only the single build-time responses provider (3.37448ms)
|
||||
✔ P3 models file is private, references the one session key, and stores no executable values or keys (3.305299ms)
|
||||
✔ P3 every launch regenerates proxy port, declared models and own key without caching (6.287121ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 128.759611
|
||||
exit=0
|
||||
00:14:20Z
|
||||
@@ -0,0 +1,17 @@
|
||||
00:14:20Z
|
||||
nice=19
|
||||
✔ P3 Claude env receives the session proxy URL and key, without another agent or host credential (3.096286ms)
|
||||
✔ P3 Claude preflight accepts a proxy key without a host provider credential (1.305258ms)
|
||||
✔ P3 pi refuses no-session-credential with no provider key (1.23137ms)
|
||||
✔ P3 pi refuses no-session-credential with only a Claude OAuth token (3.659409ms)
|
||||
✔ P3 pi accepts its own provider key or a session proxy key (0.590987ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 5
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 68.648537
|
||||
exit=0
|
||||
00:14:20Z
|
||||
@@ -0,0 +1,17 @@
|
||||
Ip=e=> @ char 1054606:
|
||||
Ip=e=>{let t={raw:Dc(e)?e:{}};if(!Dc(e))return t;let n=t=>t.split(`.`).reduce((e,t)=>Dc(e)?e[t]:void 0,e);t.debug=wp(n(`observability.logs.debug`)),t.requestLog=wp(n(`observability.logs.request-log`)),t.loggingToFile=wp(n(`observability.logs.logging-to-file`));let r=n(`observability.logs.logs-max-total-size-mb`);typeof r==`number`&&(t.logsMaxTotalSizeMb=r);let i=n(`requests.proxy-url`);typeof i==`string`&&(t.proxyUrl=i);let a=n(`routing.retry.request-retry`);typeof a==`number`&&(t.requestRetry=a),t.wsAuth=wp(n(`oauth.providers.aistudio.ws-auth`))??!0,t.forceModelPrefix=wp(n(`routing.force-model-prefix`));let o=n(`routing.strategy`);typeof o==`string`&&(t.routingStrategy=o);let s=n(`access.api-keys`);return t.apiKeys=Array.isArray(s)?s.filter(e=>typeof e==`string`):[],t.quotaExceeded={antigravityCredits:wp(n(`oauth.providers.antigravity.antigravity-credits`))??!1},t.providerGroups=Dc(e[`api-keys`])?e[`api-keys`]:{},t.geminiApiKeys=Fp(n(`api-keys.gemini`)),t.interactionsApiKeys=Fp(n(`api-keys.interactions`)),t.codexApiKeys=Fp(n(`api-keys.codex`)),t.metaApiKeys=Fp(n(`api-keys.meta`)),t.xaiApiKeys=Fp(n(`api-keys.xai`)),t.claudeApiKeys=Fp(n(`api-keys.claude`)),t.vertexApiKeys=Fp(n(`api-keys.vertex`)),t.openaiCompatibility=Fp(n(`api-keys.openai-compatibility`),!0),t.oauthExcludedModels=Pp(n(`oauth.excluded-models`)),t},Lp={async getConfig(){return Ip(await W.get(`/config`))},updateRequestLog:e=>W.put(`/config/observability/logs/request-log`,e)},Rp=0,zp=null,Bp=null,Vp=()=>Bp!==null&&Date.now()-Bp.timestamp<3e4,Hp=Tc((e,t)=>({config:null,fetchConfig:async(t=!1)=>{if(!t&&Bp&&Vp())return Bp.data;if(zp)return zp.promise;let n=Rp+=1;try{let t=Lp.getConfig();zp={id:n,promise:t};let r
|
||||
|
||||
Fp=(e,t= @ char 1054198:
|
||||
Fp=(e,t=!1)=>Array.isArray(e)?e.flatMap((n,r)=>{if(!Dc(n)||!Array.isArray(n.keys))return[];if(t){let t=Np(n,r);return t?[{...t,source:{groupIndex:r,group:n,groups:e}}]:[]}return n.keys.flatMap((t,i)=>{if(!Dc(t))return[];let a={...n};delete a.keys,delete a.name,Object.entries(t).forEach(([e,t])=>{t!==null&&(a[e]=t)});let o=Mp(a);return o?[{...o,source:{groupIndex:r,keyIndex:i,group:n,groups:e}}]:[]})}):[],Ip=e=>{let t={raw:Dc(e)?e:{}};if(!Dc(e))return t;let n=t=>t.split(`.`).reduce((e,t)=>Dc(e)?e[t]:void 0,e);t.debug=wp(n(`observability.logs.debug`)),t.requestLog=wp(n(`observability.logs.reques
|
||||
|
||||
Np=(e,t)=> @ char 1053331:
|
||||
Np=(e,t)=>{if(!Dc(e))return null;let n=e.name,r=e[`base-url`];if(!n||!r)return null;let i=Array.isArray(e.keys)?e.keys.map((e,t)=>{let n=Ap(e);return n?{...n,sourceIndex:t}:null}).filter(Boolean):[],a=Ep(e.headers),o=Tp(e.models),s=e.priority,c={name:String(n),baseUrl:String(r),apiKeyEntries:i,...jp(e)},l=wp(e[`support-prompt-cache-key`]);l!==void 0&&(c.supportPromptCacheKey=l);let u=wp(e.disabled);u!==void 0&&(c.disabled=u);let d=wp(e[`disable-cooling`]);d!==void 0&&(c.disableCooling=d);let f=Op(e.prefix);f&&(c.prefix=f),a&&(c.headers=a),o.length&&(c.models=o),s!==void 0&&(c.priority=Number(s));let p=kp(e[`auth-index`]);return p&&(c.authIndex=p),t!==void 0&&(c.sourceIndex=t),c},Pp=e=>{if(!Dc(e))return;let t=e;if(!Dc(t))return;let n={};return Object.entries(t).forEach(([e,t])=>{let r=String(e||``).trim();if(!r)return;let i=Dp(t);n[r.toLow
|
||||
|
||||
xv=e=> @ char 1129493:
|
||||
xv=e=>{let t={name:e.name,"base-url":e.baseUrl,...gv(e),keys:Array.isArray(e.apiKeyEntries)?e.apiKeyEntries.map(e=>hv(e)):[]};e.prefix?.trim()&&(t.prefix=e.prefix.trim()),e.disabled!==void 0&&(t.disabled=e.disabled),e.supportPromptCacheKey!==void 0&&(t[`support-prompt-cache-key`]=e.supportPromptCacheKey);let n=pv(e.headers);n&&(t.headers=n);let r=mv(e.models,!0);return r&&r.length&&(t.models=r),e.priority!==void 0&&(t.priority=e.priority),e.disableCooling!==void 0&&(t[`disable-cooling`]=e.disableCooling),t},Sv=(e,t)=>{if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t))return e.length===t.length&&e.every((e,n)=>Sv(e,t[n]));if(Dc(e)&&Dc(t)){let n=Object.keys(e).filter(t=>e[t]!==void 0);re
|
||||
|
||||
hv=e=> @ char 1126395:
|
||||
hv=e=>{let t={"api-key":e.apiKey};return e.proxyUrl&&(t[`proxy-url`]=e.proxyUrl),e.weight!==void 0&&(t.weight=e.weight),t},gv=(e,t=!0)=>{let n={};return e.requestRetry!==void 0&&(n[`request-retry`]=e.requestRetry),t&&e.r
|
||||
|
||||
zee=(e,t)=> @ char 1130380:
|
||||
zee=(e,t)=>{if(!Dc(e)||!Dc(e[`api-keys`]))return[];let n=e[`api-keys`][t];if(n===void 0)return[];if(!Array.isArray(n)||!n.every(e=>Dc(e)&&Array.isArray(e.keys)))throw Cv();return n},wv=async e=>{let t=cv(),n=Nm.getState(),r=await W.get(`/config`);t();let i=Nm.getState();if(n.apiBase!==i.apiBase||n.managementKey!==i.managementKey||n.isAuthenticated!==i.isAuthenticated)throw Cv();return zee(r,e)},Tv
|
||||
@@ -0,0 +1,11 @@
|
||||
file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/agents/fethry/work/queue-332/proxy-evidence.mjs:9
|
||||
if (getPriority(0) !== 19) throw Error('nice19 required');
|
||||
^
|
||||
|
||||
Error: nice19 required
|
||||
at file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/agents/fethry/work/queue-332/proxy-evidence.mjs:9:34
|
||||
at ModuleJob.run (node:internal/modules/esm/module_job:569:25)
|
||||
at async node:internal/modules/esm/loader:650:26
|
||||
at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5)
|
||||
|
||||
Node.js v26.8.1
|
||||
@@ -0,0 +1 @@
|
||||
{"phase":"fetch","version":"8.0.42","binarySha256":"74661f8cf949977870231359e8bf4344e07946766a673c08fa25a3e5f72fc95e","panelVersion":"1.26.7","panelSha256":"8c9c6b7d3fb311e6aad5d06e1993e53a2d28389e640448a1bc6304ed20b057b5","nice":16,"verified":true}
|
||||
@@ -0,0 +1,8 @@
|
||||
{"phase":"isolation","interfaces":["lo"],"enteredNice":19,"nice":19,"version":"8.0.42","binarySha256":"74661f8cf949977870231359e8bf4344e07946766a673c08fa25a3e5f72fc95e","panelSha256":"8c9c6b7d3fb311e6aad5d06e1993e53a2d28389e640448a1bc6304ed20b057b5","reverified":true}
|
||||
{"phase":"readiness","poll":1,"status":"not-ready","modelCount":0}
|
||||
{"phase":"readiness","poll":2,"status":200,"modelCount":2}
|
||||
{"phase":"catalog","modelIds":["gpt-fixture","glm-fixture"]}
|
||||
{"phase":"turn","name":"glm-completions-tool","api":"openai-completions","exit":0,"signal":null,"marker":true,"piRequests":[{"method":"POST","path":"/v1/chat/completions","keys":["max_completion_tokens","messages","model","reasoning_effort","store","stream","stream_options","thinking","tool_stream","tools"],"model":"glm-fixture","stream":true,"roles":["developer","user"],"inputTypes":"undefined","thinking":{"type":"enabled","clear_thinking":false},"reasoning_effort":"low","tool_stream":true,"toolNames":["read"],"stream_options":{"include_usage":true},"max_completion_tokens":16384}],"proxyResponses":[{"request":0,"status":200,"events":[],"marker":true}],"upstreamRequests":[{"method":"POST","path":"/v1/chat/completions","keys":["max_tokens","messages","model","reasoning_effort","store","stream","stream_options","thinking","tool_stream","tools"],"model":"glm-fixture","stream":true,"roles":["developer","user"],"inputTypes":"undefined","thinking":{"type":"enabled","clear_thinking":false},"reasoning_effort":"low","tool_stream":true,"toolNames":["read"],"stream_options":{"include_usage":true},"max_tokens":16384}],"nice":19}
|
||||
{"phase":"conclusion","limitation":"Stand-in openai-compatibility credential only; no Codex OAuth credential or real-auth turn. This script never selects the production API."}
|
||||
{"phase":"nice-corrections","restoredTo":19,"observedBeforeRestore":{"16":3}}
|
||||
{"phase":"cleanup","remainingManagedChildren":0}
|
||||
@@ -0,0 +1,10 @@
|
||||
{"phase":"isolation","interfaces":["lo"],"enteredNice":19,"nice":19,"version":"8.0.42","binarySha256":"74661f8cf949977870231359e8bf4344e07946766a673c08fa25a3e5f72fc95e","panelSha256":"8c9c6b7d3fb311e6aad5d06e1993e53a2d28389e640448a1bc6304ed20b057b5","reverified":true}
|
||||
{"phase":"readiness","poll":1,"status":"not-ready","modelCount":0}
|
||||
{"phase":"readiness","poll":2,"status":200,"modelCount":2}
|
||||
{"phase":"catalog","modelIds":["gpt-fixture","glm-fixture"]}
|
||||
{"phase":"turn","name":"gpt-responses","api":"openai-responses","exit":0,"signal":null,"marker":true,"piRequests":[{"method":"POST","path":"/v1/responses","keys":["include","input","max_output_tokens","model","prompt_cache_key","reasoning","store","stream"],"model":"gpt-fixture","stream":true,"inputTypes":[null,null],"reasoning":{"effort":"low","summary":"auto"}}],"proxyResponses":[{"request":0,"status":200,"events":["response.created","response.in_progress","response.output_item.added","response.content_part.added","response.output_text.delta","response.output_text.done","response.content_part.done","response.output_item.done","response.completed"],"marker":true}],"upstreamRequests":[{"method":"POST","path":"/v1/chat/completions","keys":["max_tokens","messages","model","reasoning_effort","stream","stream_options"],"model":"gpt-fixture","stream":true,"roles":["user","user"],"inputTypes":"undefined","reasoning_effort":"low","stream_options":{"include_usage":true},"max_tokens":16384}],"nice":19}
|
||||
{"phase":"turn","name":"gpt-completions","api":"openai-completions","exit":0,"signal":null,"marker":true,"piRequests":[{"method":"POST","path":"/v1/chat/completions","keys":["max_completion_tokens","messages","model","reasoning_effort","store","stream","stream_options"],"model":"gpt-fixture","stream":true,"roles":["developer","user"],"inputTypes":"undefined","reasoning_effort":"low","stream_options":{"include_usage":true},"max_completion_tokens":16384}],"proxyResponses":[{"request":1,"status":200,"events":[],"marker":true}],"upstreamRequests":[{"method":"POST","path":"/v1/chat/completions","keys":["max_tokens","messages","model","reasoning_effort","store","stream","stream_options"],"model":"gpt-fixture","stream":true,"roles":["developer","user"],"inputTypes":"undefined","reasoning_effort":"low","stream_options":{"include_usage":true},"max_tokens":16384}],"nice":19}
|
||||
{"phase":"turn","name":"glm-completions","api":"openai-completions","exit":0,"signal":null,"marker":true,"piRequests":[{"method":"POST","path":"/v1/chat/completions","keys":["max_completion_tokens","messages","model","reasoning_effort","store","stream","stream_options","thinking"],"model":"glm-fixture","stream":true,"roles":["developer","user"],"inputTypes":"undefined","thinking":{"type":"enabled","clear_thinking":false},"reasoning_effort":"low","stream_options":{"include_usage":true},"max_completion_tokens":16384}],"proxyResponses":[{"request":2,"status":200,"events":[],"marker":true}],"upstreamRequests":[{"method":"POST","path":"/v1/chat/completions","keys":["max_tokens","messages","model","reasoning_effort","store","stream","stream_options","thinking"],"model":"glm-fixture","stream":true,"roles":["developer","user"],"inputTypes":"undefined","thinking":{"type":"enabled","clear_thinking":false},"reasoning_effort":"low","stream_options":{"include_usage":true},"max_tokens":16384}],"nice":19}
|
||||
{"phase":"conclusion","limitation":"Stand-in openai-compatibility credential only; no Codex OAuth credential or real-auth turn. API value remains PENDING."}
|
||||
{"phase":"nice-corrections","restoredTo":19,"observedBeforeRestore":{"16":8}}
|
||||
{"phase":"cleanup","remainingManagedChildren":0}
|
||||
@@ -0,0 +1,4 @@
|
||||
{"phase":"isolation","interfaces":["lo"],"enteredNice":19,"nice":16,"version":"8.0.42","configTags":["ntptr; X0 []string } \"*struct { F uintptr; X0 net.Conn } Models yaml:\"models\" json:\"models\" \"*config.DisableImageGene","ubscriptionCommand $*struct { F uintptr; R *api.Server } APIKey yaml:\"api-key\" json:\"api-key\" $EffectiveSignInWithChat","on:\\\"type\\\"\" } '*struct { F uintptr; X0 *bufio.Reader } BaseURL yaml:\"base-url\" json:\"base-url\" '*config.CodexWebSearch","ise-management\" json:\"advertise-management\" OpenAICompatibility7yaml:\"openai-compatibility\" json:\"openai-compatibility\" K*struct { "]}
|
||||
{"phase":"catalog","modelIds":[]}
|
||||
{"phase":"error","message":"stand-in routes absent from proxy catalog","proxyDiagnostic":"CLIProxyAPI Version: 8.0.42, Commit: bc064340, BuiltAt: 2026-10-24T14:21:38Z\n[2026-10-24 19:07:27] [--------] [info ] [main.go:641] CLIProxyAPI Version: 8.0.42, Commit: bc064340, BuiltAt: 2026-10-24T14:21:38Z\n[2026-10-24 19:07:27] [--------] [info ] [main.go:752] Local model mode: using embedded catalogs unless an explicit catalog source is configured\n[2026-10-24 19:07:27] [--------] [info ] [antigravity_version.go:71] periodic antigravity version refresh started (interval=3h0m0s)\n[2026-10-24 19:07:27] [--------] [info ] [service_lifecycle.go:103] core auth auto-refresh started (interval=15m0s)\n[2026-10-24 19:07:27] [--------] [info ] [server_management.go:22] management routes registered after secret key configuration\n[2026-10-24 19:07:27] [--------] [warn ] [xai_version.go:96] failed to fetch latest Grok CLI version from npm, keeping fallback/cached version error=npm registry request failed: Get \"https://registry.npmjs.org/@xai-official/grok/latest\": dial tcp [2606:4700::6810:122]:443: connect: network is unreachable\n[2026-10-24 19:07:27] [--------] [info ] [xai_version.go:79] periodic Grok CLI version refresh started (interval=3h0m0s)\n[2026-10-24 19:07:27] [b7852b37] [info ] [gin_logger.go:113] 200 | 0s | 127.0.0.1 | GET \"/v1/models\"\n"}
|
||||
{"phase":"cleanup","remainingManagedChildren":0}
|
||||
@@ -0,0 +1 @@
|
||||
/mnt/storage/scratch/tmp/g2Ta
|
||||
@@ -0,0 +1,63 @@
|
||||
23:59:16Z
|
||||
nice=19
|
||||
✔ C2-04: launcher workspace clones code but never the library (1450.400805ms)
|
||||
✔ P3 proxy key reaches the spawned runner but never session.json or the bundle (1347.117393ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1362.533548ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r5c4bfddc2d03","instance":"chief","turn":"2ce6282a-5e4f-4276-851e-3d8dd2d53a7a","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rf9b4b14789bc","instance":"coder","turn":"d7a0db99-cce3-417f-8e7d-9910641f0860","source":"@none","code":"baseline-unknown"}
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (842.489432ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rd5fa76df3fb0","instance":"chief","turn":"f739ef1e-c01f-401f-9a89-cf45bc15b976","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r2c414ea1d43f","instance":"pm","turn":"8852a197-c1be-4108-a3af-34dad0232264","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rd5fa76df3fb0","instance":"chief","turn":"6ccde05e-202a-43af-8556-43481f552676","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rd5fa76df3fb0","instance":"chief","turn":"4a8f168b-8676-4b54-9404-174a2a703fcf","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r2c414ea1d43f","instance":"pm","turn":"67ee96fd-1338-48aa-a4fc-edbb7e0aef0e","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r2c414ea1d43f","instance":"pm","turn":"ead68527-7bf4-49a1-8fd7-0107b9c6dfdf","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rd5fa76df3fb0","instance":"chief","turn":"c1cc3a5e-1afe-4994-aea4-a3ea811a8f30","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r2c414ea1d43f","instance":"pm","turn":"e60723f6-187d-4b55-bd81-66189ae014c0","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rd5fa76df3fb0","instance":"chief","turn":"1b7721ee-a337-4623-9fcc-1e05277336ce","source":"@none","code":"baseline-unknown"}
|
||||
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (1152.112093ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (4210.704487ms)
|
||||
✔ a role the broker says holds a merge decision gets land_work, its prompt line, its landing and the git socket; without it, none (713.043698ms)
|
||||
✔ REQ-LAUNCH-1 the tick starts a listed merge decision holder once, with land_work, the Landing line and its landing turn; an unlisted holder starts nothing (456.475273ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r0e259f41ad4d","instance":"coder","turn":"52bb41d8-5eb6-4c72-9c5c-0b8abf8eae42","source":"@none","code":"baseline-unknown"}
|
||||
✔ a holder running since before the resolution is stopped once the broker releases it, land-relaunch, and the next tick starts it: landing turn first, then the message that waited (838.095383ms)
|
||||
✔ a landing run that ended isn't started again for its decision, a spent decision starts nothing, and a new decision starts the holder (721.283915ms)
|
||||
✔ after a restart, the new host's first tick starts a holder whose decision is still held (963.365086ms)
|
||||
✔ a refused landing start is logged once per code with its decision, isn't a start, and the next tick with room starts the holder (708.305295ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (300.51414ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (380.448961ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (206.153531ms)
|
||||
✔ a pi launch with no own credential refuses no-session-credential (207.22057ms)
|
||||
usage: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/down is missing","kept":[]}
|
||||
plugins: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/down is missing","kept":[]}
|
||||
✔ row 65 a failed primary preflight launches the fallback on a fixture harness module, recording the route and the reason (398.352887ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (418.567314ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (211.208923ms)
|
||||
✔ row 64 a role skill that isn't enabled refuses skill-not-enabled, and one that isn't a plain directory skill-refused, before anything starts (215.670064ms)
|
||||
✔ row 213 a creative instance's persona is read from <configDir>/personas: off its digest the launch fails with the mismatch as its reason (321.498853ms)
|
||||
✔ row 64 on Claude Code a role skill that isn't enabled refuses the same way, before anything starts (208.543617ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r1f065863b517","instance":"chief","turn":"2c19dcc1-343e-4c12-93e3-4cd6dd65c4d9","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"reae1621f7ddf","instance":"coder","turn":"03cc3667-aab3-4f55-9e57-bf637e1be0dc","source":"@none","code":"baseline-unknown"}
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1566.080686ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (1164.65123ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (4189.297007ms)
|
||||
✔ bus start --no-launch leaves an earlier host's live session alone: no signal, no end, sessions.json as it was (258.381919ms)
|
||||
✔ bus start --no-launch refuses every launch: the PM launch and a session's request, each logged, nothing spawned (219.378242ms)
|
||||
✔ bus start --no-launch starts no thread tick; the same host with launches runs it (1236.400078ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (198.129142ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (200.659094ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (211.221353ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1398.582123ms)
|
||||
✔ kill switch refuses chief and hire before launch work and a clear permits a later request (373.807885ms)
|
||||
✔ kill switch stops an actual managed namespace and records the halt reason without rewriting its bundle (372.1022ms)
|
||||
✔ a launch waiting across halt and resume cannot use its stale admission (236.835216ms)
|
||||
ℹ tests 35
|
||||
ℹ suites 0
|
||||
ℹ pass 35
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 29398.149477
|
||||
exit=0
|
||||
23:59:45Z
|
||||
@@ -0,0 +1,35 @@
|
||||
23:59:16Z
|
||||
nice=19
|
||||
✔ P3 Anthropic route uses messages at proxy root and the declared model id (9.965114ms)
|
||||
✔ P3 omitted route generates the Anthropic provider at proxy root (3.050792ms)
|
||||
✔ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (2.833686ms)
|
||||
✖ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (2.980797ms)
|
||||
✔ P3 a declared Codex route refuses generation while the build-time API is PENDING (4.028363ms)
|
||||
✔ P3 models file is private, references the one session key, and stores no executable values or keys (3.814909ms)
|
||||
✔ P3 every launch regenerates proxy port, declared models and own key without caching (7.841047ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 6
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 117.036157
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:68:1
|
||||
✖ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (2.980797ms)
|
||||
Error: proxy GPT API is PENDING build-time evidence
|
||||
at Module.bundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/pi/index.mjs:78:62)
|
||||
at buildBundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/src/bundle.mjs:354:23)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:20:18)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:69:13)
|
||||
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)
|
||||
exit=1
|
||||
23:59:16Z
|
||||
@@ -0,0 +1,18 @@
|
||||
23:57:06Z
|
||||
nice=19
|
||||
✔ P3 proxy model validation preserves each explicit wire route and the proxy model id (1.161459ms)
|
||||
✔ P3 a proxy model without route preserves its stored shape for the default Anthropic route (0.134804ms)
|
||||
✔ P3 an unknown proxy route refuses proxy-route-unknown (0.823069ms)
|
||||
✔ P3 nonproxy models retain their provider/model-only shape and reject route metadata (0.170037ms)
|
||||
✔ P3 launch.account accepts the proxy credential source without naming host variables (0.132947ms)
|
||||
✔ P3 existing environment-set accounts retain their validated representation (0.200363ms)
|
||||
ℹ tests 6
|
||||
ℹ suites 0
|
||||
ℹ pass 6
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 52.197696
|
||||
exit=0
|
||||
23:57:06Z
|
||||
@@ -0,0 +1,21 @@
|
||||
23:57:12Z
|
||||
nice=19
|
||||
✔ row 65 both harness modules load through the loader with every export the kind names (7.907431ms)
|
||||
✔ row 65 each module answers for its own harness: adapter, levels, account, web, turn end and session files (0.745524ms)
|
||||
✔ row 65 claude-code preflight: a missing credential, then a missing or relative binary, each refuse with their code (3.501824ms)
|
||||
✔ row 65 claude-code version asks MOSAIC_CLAUDE_BIN when set, else claude on PATH, else null (3.715209ms)
|
||||
✔ row 65 pi preflight passes with the repository's pi, and its version is the package pin (0.570287ms)
|
||||
✔ row 65 env passes the thinking level to both adapters, and claude-code's bundle writes its hook and MCP files (1.263458ms)
|
||||
✔ row 65 a route's thinking reaches pi as --thinking and claude as --effort, through each module's env and adapter (14.961799ms)
|
||||
✔ row 65 no core source outside packages/plugins names a harness, apart from the listed exceptions (14.014352ms)
|
||||
✔ row 65 the grep's pattern catches a quoted name and a regex alternation, and not a word in prose (0.144087ms)
|
||||
ℹ tests 9
|
||||
ℹ suites 0
|
||||
ℹ pass 9
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 95.780618
|
||||
exit=0
|
||||
23:57:12Z
|
||||
@@ -0,0 +1,74 @@
|
||||
23:57:12Z
|
||||
nice=19
|
||||
✔ C2-04: launcher workspace clones code but never the library (1409.48354ms)
|
||||
✔ P3 proxy key reaches the spawned runner but never session.json or the bundle (1360.002763ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1355.188394ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r77c2d6253086","instance":"chief","turn":"492fcf7a-ee92-4637-b1ee-de6d29c5f536","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r0caee85973df","instance":"coder","turn":"a8f6e869-e911-4e61-8913-9bcb8c84bca5","source":"@none","code":"baseline-unknown"}
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (844.874148ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rdd1124f17d39","instance":"chief","turn":"99cbfb5d-a0b1-4de7-b94b-855285416cea","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r3ee360b6ea6f","instance":"pm","turn":"3299c709-0616-4d80-878e-589213b2833a","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rdd1124f17d39","instance":"chief","turn":"aaef40d5-2c04-4a58-8019-3a9fed2740d3","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rdd1124f17d39","instance":"chief","turn":"f7697cc5-383e-41e4-8f48-ca8032cb501f","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r3ee360b6ea6f","instance":"pm","turn":"b6f5d1de-a58e-40de-9d2c-9e79472bc8f5","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r3ee360b6ea6f","instance":"pm","turn":"7a8278f1-c934-418d-a62a-34528048a50c","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rdd1124f17d39","instance":"chief","turn":"c8f0554c-b415-4b2c-aa8e-8eebf3253c12","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r3ee360b6ea6f","instance":"pm","turn":"d5084f6b-43d9-48b4-ada8-14c78f9a6472","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rdd1124f17d39","instance":"chief","turn":"2b8f60d0-5e87-4823-a4c8-e7a13fdffae2","source":"@none","code":"baseline-unknown"}
|
||||
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (1499.426496ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (4214.335578ms)
|
||||
✔ a role the broker says holds a merge decision gets land_work, its prompt line, its landing and the git socket; without it, none (731.541713ms)
|
||||
✔ REQ-LAUNCH-1 the tick starts a listed merge decision holder once, with land_work, the Landing line and its landing turn; an unlisted holder starts nothing (452.219971ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r8dca21c7af83","instance":"coder","turn":"b0a65410-42a5-495d-a881-d7828ea5dc69","source":"@none","code":"baseline-unknown"}
|
||||
✔ a holder running since before the resolution is stopped once the broker releases it, land-relaunch, and the next tick starts it: landing turn first, then the message that waited (859.92414ms)
|
||||
✔ a landing run that ended isn't started again for its decision, a spent decision starts nothing, and a new decision starts the holder (813.442124ms)
|
||||
✔ after a restart, the new host's first tick starts a holder whose decision is still held (1026.204746ms)
|
||||
✔ a refused landing start is logged once per code with its decision, isn't a start, and the next tick with room starts the holder (698.000891ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (333.63354ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (392.682058ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (219.352153ms)
|
||||
✔ a pi launch with no own credential refuses no-session-credential (202.834512ms)
|
||||
usage: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/down is missing","kept":[]}
|
||||
plugins: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/down is missing","kept":[]}
|
||||
✖ row 65 a failed primary preflight launches the fallback on a fixture harness module, recording the route and the reason (214.464488ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (437.720138ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (240.940882ms)
|
||||
✔ row 64 a role skill that isn't enabled refuses skill-not-enabled, and one that isn't a plain directory skill-refused, before anything starts (220.344629ms)
|
||||
✔ row 213 a creative instance's persona is read from <configDir>/personas: off its digest the launch fails with the mismatch as its reason (288.705681ms)
|
||||
✔ row 64 on Claude Code a role skill that isn't enabled refuses the same way, before anything starts (211.010194ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r31e317a9ff60","instance":"chief","turn":"bf22f39d-2bf0-48ec-849b-bf8665a262af","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rcb1b05afaad6","instance":"coder","turn":"40f65cf7-8938-4265-949a-c816ef7084cd","source":"@none","code":"baseline-unknown"}
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1532.310766ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (1163.295788ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (4129.096956ms)
|
||||
✔ bus start --no-launch leaves an earlier host's live session alone: no signal, no end, sessions.json as it was (253.012747ms)
|
||||
✔ bus start --no-launch refuses every launch: the PM launch and a session's request, each logged, nothing spawned (210.12322ms)
|
||||
✔ bus start --no-launch starts no thread tick; the same host with launches runs it (1206.988059ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (200.617792ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (208.31407ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (210.5977ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1396.242105ms)
|
||||
✔ kill switch refuses chief and hire before launch work and a clear permits a later request (356.328128ms)
|
||||
✔ kill switch stops an actual managed namespace and records the halt reason without rewriting its bundle (411.659934ms)
|
||||
✔ a launch waiting across halt and resume cannot use its stale admission (248.122427ms)
|
||||
ℹ tests 35
|
||||
ℹ suites 0
|
||||
ℹ pass 34
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 29678.41987
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/cli/tests/launcher.test.mjs:714:1
|
||||
✖ row 65 a failed primary preflight launches the fallback on a fixture harness module, recording the route and the reason (214.464488ms)
|
||||
Error [CliError]: PM launch refused: no-session-credential (fallback fixture: pi needs its own provider key or a session proxy key (primary down: fixture preflight fails))
|
||||
at file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/src/launcher.mjs:1189:23
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
|
||||
exitCode: 3,
|
||||
code: 'no-session-credential'
|
||||
}
|
||||
exit=1
|
||||
23:57:42Z
|
||||
@@ -0,0 +1,88 @@
|
||||
23:57:12Z
|
||||
nice=19
|
||||
✖ P3 Anthropic route uses messages at proxy root and the declared model id (8.82863ms)
|
||||
✔ P3 omitted route generates the Anthropic provider at proxy root (3.493006ms)
|
||||
✖ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (2.169226ms)
|
||||
✖ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (2.321456ms)
|
||||
✖ P3 models file is private, references the one session key, and stores no executable values or keys (2.285532ms)
|
||||
✖ P3 every launch regenerates proxy port, declared models and own key without caching (2.062519ms)
|
||||
ℹ tests 6
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 5
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 94.962091
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:35:1
|
||||
✖ P3 Anthropic route uses messages at proxy root and the declared model id (8.82863ms)
|
||||
Error: proxy GPT API is PENDING build-time evidence
|
||||
at Module.bundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/pi/index.mjs:78:62)
|
||||
at buildBundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/src/bundle.mjs:354:23)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:20:18)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:36:13)
|
||||
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)
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:57:1
|
||||
✖ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (2.169226ms)
|
||||
Error: proxy GPT API is PENDING build-time evidence
|
||||
at Module.bundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/pi/index.mjs:78:62)
|
||||
at buildBundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/src/bundle.mjs:354:23)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:20:18)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:58:13)
|
||||
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)
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:68:1
|
||||
✖ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (2.321456ms)
|
||||
Error: proxy GPT API is PENDING build-time evidence
|
||||
at Module.bundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/pi/index.mjs:78:62)
|
||||
at buildBundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/src/bundle.mjs:354:23)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:20:18)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:69:13)
|
||||
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)
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:79:1
|
||||
✖ P3 models file is private, references the one session key, and stores no executable values or keys (2.285532ms)
|
||||
Error: proxy GPT API is PENDING build-time evidence
|
||||
at Module.bundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/pi/index.mjs:78:62)
|
||||
at buildBundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/src/bundle.mjs:354:23)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:20:18)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:81:13)
|
||||
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)
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:94:1
|
||||
✖ P3 every launch regenerates proxy port, declared models and own key without caching (2.062519ms)
|
||||
Error: proxy GPT API is PENDING build-time evidence
|
||||
at Module.bundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/pi/index.mjs:78:62)
|
||||
at buildBundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/src/bundle.mjs:354:23)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:20:18)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:95:17)
|
||||
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)
|
||||
exit=1
|
||||
23:57:12Z
|
||||
@@ -0,0 +1,17 @@
|
||||
23:57:06Z
|
||||
nice=19
|
||||
✔ P3 Claude env receives the session proxy URL and key, without another agent or host credential (2.459573ms)
|
||||
✔ P3 Claude preflight accepts a proxy key without a host provider credential (1.019636ms)
|
||||
✔ P3 pi refuses no-session-credential with no provider key (0.965529ms)
|
||||
✔ P3 pi refuses no-session-credential with only a Claude OAuth token (0.264623ms)
|
||||
✔ P3 pi accepts its own provider key or a session proxy key (0.345262ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 5
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 56.359357
|
||||
exit=0
|
||||
23:57:06Z
|
||||
@@ -0,0 +1,14 @@
|
||||
23:57:06Z
|
||||
nice=19
|
||||
✔ P3 proxy sessionEnv removes every instance provider credential without widening ENV_ALLOW (0.976855ms)
|
||||
✔ P3 no proxy retains the full existing allowlist and run environment (0.214793ms)
|
||||
ℹ tests 2
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 47.349955
|
||||
exit=0
|
||||
23:57:06Z
|
||||
@@ -0,0 +1,59 @@
|
||||
// Parse static imports without evaluating any repository module. This is an audit tool, not a test runner.
|
||||
// Usage: node --experimental-vm-modules agents/fethry/work/queue-332/import-run-list.mjs
|
||||
import { readdirSync, readFileSync } from 'node:fs';
|
||||
import { dirname, join, relative, resolve } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { SourceTextModule } from 'node:vm';
|
||||
const root = resolve(dirname(fileURLToPath(import.meta.url)), '../../../..');
|
||||
const files = [];
|
||||
function walk(dir) {
|
||||
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
||||
if (['node_modules', '.git', 'dist'].includes(entry.name)) continue;
|
||||
const path = join(dir, entry.name);
|
||||
if (entry.isDirectory()) walk(path);
|
||||
else if (entry.isFile() && path.endsWith('.mjs')) files.push(path);
|
||||
}
|
||||
}
|
||||
for (const dir of ['packages', 'scripts', 'adapters']) walk(join(root, dir));
|
||||
const graph = new Map();
|
||||
for (const file of files) {
|
||||
const module = new SourceTextModule(readFileSync(file, 'utf8'), { identifier: file });
|
||||
graph.set(file, module.dependencySpecifiers.filter(spec => spec.startsWith('.')).map(spec => resolve(dirname(file), spec)));
|
||||
}
|
||||
// The loader imports the configured harness via a computed path. Explicit runtime import edges:
|
||||
const loader = join(root, 'packages/plugins/src/loader.mjs');
|
||||
graph.get(loader).push(...['claude-code', 'pi'].map(name => join(root, 'packages/plugins/harness', name, 'index.mjs')));
|
||||
// Actual process entrypoints referenced by constants in fork/spawn calls.
|
||||
graph.get(join(root, 'packages/cli/src/host.mjs')).push(join(root, 'packages/bus/src/process.mjs'));
|
||||
graph.get(join(root, 'packages/seat/src/session.mjs')).push(join(root, 'packages/harness/src/runner.mjs'));
|
||||
const changed = new Set([
|
||||
'packages/seat/src/session.mjs', 'packages/business/src/launch.mjs',
|
||||
'packages/plugins/harness/claude-code/index.mjs', 'packages/plugins/harness/pi/index.mjs',
|
||||
'packages/harness/src/bundle.mjs', 'packages/cli/src/launcher.mjs',
|
||||
].map(file => join(root, file)));
|
||||
function affected(file, seen = new Set()) {
|
||||
if (changed.has(file)) return true;
|
||||
if (seen.has(file)) return false;
|
||||
seen.add(file);
|
||||
return (graph.get(file) ?? []).some(dep => affected(dep, seen));
|
||||
}
|
||||
function trace(file) {
|
||||
const pending = [[file]], seen = new Set();
|
||||
while (pending.length) {
|
||||
const path = pending.shift(), current = path.at(-1);
|
||||
if (changed.has(current)) return path;
|
||||
if (seen.has(current)) continue;
|
||||
seen.add(current);
|
||||
for (const dependency of graph.get(current) ?? []) pending.push([...path, dependency]);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
const excluded = 'packages/cli/tests/case1-accept.test.mjs';
|
||||
for (const file of files.filter(file => file.endsWith('.test.mjs')).sort()) {
|
||||
if (!affected(file)) continue;
|
||||
const path = relative(root, file);
|
||||
if (process.argv.includes('--explain')) console.log(JSON.stringify({ test: path, excluded: path === excluded,
|
||||
imports: trace(file).map(part => relative(root, part)) }));
|
||||
else console.log(`${path === excluded ? 'EXCLUDED (mos-1612) ' : ''}${path}`);
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
// Diagnostic only: retain owned adapter stderr before the fixture's normal cleanup.
|
||||
// No test assertion, deadline, fixture, process launch or production code is changed.
|
||||
import fs from 'node:fs';
|
||||
import { join, resolve } from 'node:path';
|
||||
import { syncBuiltinESMExports } from 'node:module';
|
||||
const remove = fs.rmSync;
|
||||
const tmp = resolve(process.env.TMPDIR);
|
||||
const output = process.env.P332_CLEANUP_DIAGNOSTIC;
|
||||
fs.rmSync = function(path, options) {
|
||||
const root = resolve(String(path));
|
||||
if (output && root.startsWith(tmp + '/') && root.slice(tmp.length + 1).startsWith('mosaic-launch-')) {
|
||||
try {
|
||||
const runs = join(root, 'data', 'launches', 'acme');
|
||||
const captured = [];
|
||||
for (const name of fs.readdirSync(runs)) {
|
||||
const run = join(runs, name), file = join(run, 'session.json');
|
||||
if (!fs.existsSync(file)) continue;
|
||||
const session = JSON.parse(fs.readFileSync(file, 'utf8'));
|
||||
const stderr = {};
|
||||
const turns = join(run, 'turns');
|
||||
if (fs.existsSync(turns)) for (const entry of fs.readdirSync(turns)) {
|
||||
if (!entry.endsWith('.stderr')) continue;
|
||||
let text = fs.readFileSync(join(turns, entry), 'utf8');
|
||||
for (const value of ['stand-in','fx332-pi','fx653-pi']) text = text.split(value).join('[fake-value-redacted]');
|
||||
stderr[entry] = text;
|
||||
}
|
||||
captured.push({ harness: session.harness, adapter: session.adapter,
|
||||
harnessEnvironmentNames: Object.keys(session.harnessEnv).sort(), stderr });
|
||||
}
|
||||
fs.writeFileSync(output, JSON.stringify(captured, null, 2) + '\n', { mode: 0o600 });
|
||||
} catch {}
|
||||
}
|
||||
return remove.call(this, path, options);
|
||||
};
|
||||
syncBuiltinESMExports();
|
||||
@@ -0,0 +1,2 @@
|
||||
356673de39ab5e9e4d19314c33b2d0b01fa06519a44c3374aa947bfbd71a4049 /usr/bin/claude
|
||||
f7dd62ae415378018cd21dd950eb3bac174ab085830304d3b8b098146bfd47b6 /opt/claude-code/bin/claude
|
||||
@@ -0,0 +1 @@
|
||||
2.1.259 (Claude Code)
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"utc": "2026-10-26T23:00:23.662022+00:00",
|
||||
"ownedTempRootsChecked": [
|
||||
"/mnt/storage/scratch/tmp/gB7i",
|
||||
"/mnt/storage/scratch/tmp/gBEU",
|
||||
"/mnt/storage/scratch/tmp/gIwJ",
|
||||
"/mnt/storage/scratch/tmp/gKIS",
|
||||
"/mnt/storage/scratch/tmp/gYTO",
|
||||
"/mnt/storage/scratch/tmp/gYee",
|
||||
"/mnt/storage/scratch/tmp/gZJb",
|
||||
"/mnt/storage/scratch/tmp/gZgu",
|
||||
"/mnt/storage/scratch/tmp/glVH",
|
||||
"/mnt/storage/scratch/tmp/goCn",
|
||||
"/mnt/storage/scratch/tmp/gzZL"
|
||||
],
|
||||
"remainingInOwnedRoots": []
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:49:17.184777+00:00", "test": "packages/cli/tests/proxy-context-join.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gxH8/home", "privateConfig": "/mnt/storage/scratch/tmp/gxH8/home/config/unconfigured.json"}
|
||||
✔ P3 joined managed zai uses its one admitted P2 key and private run-local config (1263.529285ms)
|
||||
✔ P3 joined managed anthropic uses its one admitted P2 key and private run-local config (1215.673026ms)
|
||||
✔ P3 joined managed proxy:anthropic uses its one admitted P2 key and private run-local config (1205.501528ms)
|
||||
✔ P3 joined managed proxy:glm uses its one admitted P2 key and private run-local config (1208.912172ms)
|
||||
✔ P3 joined managed proxy:codex uses its one admitted P2 key and private run-local config (1215.73445ms)
|
||||
✔ P3 joined Claude harness receives the admitted P2 key only through transient auth env (1222.422474ms)
|
||||
✔ P3 joined unsupported provider refuses with no key acquisition, fallback, or spawned session (78.898401ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 7566.191257
|
||||
{"phase": "end", "utc": "2026-10-26T22:49:24.791036+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 16, "10": 6}, "ownedPids": [2284436, 2284437, 2284443, 2284476, 2284477, 2284480, 2284484, 2284527, 2284529, 2284533, 2284534, 2284640, 2284643, 2284657, 2284658, 2284717, 2284720, 2284727, 2284741, 2284742, 2284746, 2284747, 2284827, 2284834, 2284836, 2284841, 2284842, 2284922, 2284925, 2284932, 2284941, 2284942, 2285226, 2285232, 2285234, 2285248, 2285250, 2285265, 2285267, 2285285, 2285287, 2285428, 2285435]}
|
||||
@@ -0,0 +1,17 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:50:04.549004+00:00", "test": "packages/cli/tests/proxy-context-join.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gzZL/home", "privateConfig": "/mnt/storage/scratch/tmp/gzZL/home/config/unconfigured.json"}
|
||||
✔ P3 joined managed zai uses its one admitted P2 key and private run-local config (1284.068583ms)
|
||||
✔ P3 joined managed anthropic uses its one admitted P2 key and private run-local config (1272.395517ms)
|
||||
✔ P3 joined managed proxy:anthropic uses its one admitted P2 key and private run-local config (1216.040698ms)
|
||||
✔ P3 joined managed proxy:glm uses its one admitted P2 key and private run-local config (1220.310626ms)
|
||||
✔ P3 joined managed proxy:codex uses its one admitted P2 key and private run-local config (1249.775639ms)
|
||||
✔ P3 joined Claude harness receives the admitted P2 key only through transient auth env (1208.651848ms)
|
||||
✔ P3 joined unsupported provider refuses with no key acquisition, fallback, or spawned session (73.459089ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 7679.665106
|
||||
{"phase": "end", "utc": "2026-10-26T22:50:12.272580+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 15, "10": 6}, "ownedPids": [2298721, 2298722, 2298749, 2298856, 2298857, 2298879, 2298897, 2298934, 2298967, 2298972, 2298977, 2298978, 2299988, 2300067, 2300094, 2300095, 2300474, 2300509, 2300510, 2300512, 2300551, 2300552, 2301181, 2301195, 2301198, 2301211, 2301238, 2301239, 2301630, 2301657, 2301695, 2301696, 2301733, 2301735, 2302118, 2302146, 2302150, 2302175, 2302176, 2302620, 2302646]}
|
||||
@@ -0,0 +1,13 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:47:38.299716+00:00", "test": "packages/cli/tests/proxy-context-join.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gWRm/home", "privateConfig": "/mnt/storage/scratch/tmp/gWRm/home/config/unconfigured.json"}
|
||||
✔ P3 joined managed zai uses its one admitted P2 key and private run-local config (1266.139987ms)
|
||||
✔ P3 joined managed anthropic uses its one admitted P2 key and private run-local config (1211.277575ms)
|
||||
✔ P3 joined unsupported provider refuses with no key acquisition, fallback, or spawned session (74.343675ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 2701.415588
|
||||
{"phase": "end", "utc": "2026-10-26T22:47:41.039259+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 8, "10": 2}, "ownedPids": [2259953, 2259954, 2259960, 2259987, 2260078, 2260146, 2260147, 2260622, 2260631, 2260633, 2260634, 2260648, 2260649, 2260711, 2260719]}
|
||||
@@ -0,0 +1,53 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:46:35.643686+00:00", "test": "packages/cli/tests/proxy-context-join.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gA9M/home", "privateConfig": "/mnt/storage/scratch/tmp/gA9M/home/config/unconfigured.json"}
|
||||
✖ P3 joined managed zai uses its one admitted P2 key and private run-local config (116.054928ms)
|
||||
✖ P3 joined managed anthropic uses its one admitted P2 key and private run-local config (75.411506ms)
|
||||
✖ P3 joined unsupported provider refuses with no key acquisition, fallback, or spawned session (80.27112ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 3
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 418.767533
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/cli/tests/proxy-context-join.test.mjs:41:3
|
||||
✖ P3 joined managed zai uses its one admitted P2 key and private run-local config (116.054928ms)
|
||||
Error [CliError]: PM launch refused: no-session-credential (pi needs its own provider key or a session proxy key)
|
||||
at file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/src/launcher.mjs:1207:23
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
|
||||
exitCode: 3,
|
||||
code: 'no-session-credential'
|
||||
}
|
||||
|
||||
test at packages/cli/tests/proxy-context-join.test.mjs:41:3
|
||||
✖ P3 joined managed anthropic uses its one admitted P2 key and private run-local config (75.411506ms)
|
||||
Error [CliError]: PM launch refused: no-session-credential (pi needs its own provider key or a session proxy key)
|
||||
at file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/src/launcher.mjs:1207:23
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5) {
|
||||
exitCode: 3,
|
||||
code: 'no-session-credential'
|
||||
}
|
||||
|
||||
test at packages/cli/tests/proxy-context-join.test.mjs:75:1
|
||||
✖ P3 joined unsupported provider refuses with no key acquisition, fallback, or spawned session (80.27112ms)
|
||||
AssertionError [ERR_ASSERTION]: The validation function is expected to return "true". Received false
|
||||
|
||||
Caught error:
|
||||
|
||||
CliError: PM launch refused: no-session-credential (fallback pi: pi needs its own provider key or a session proxy key (primary pi: pi needs its own provider key or a session proxy key))
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/proxy-context-join.test.mjs:81:3)
|
||||
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: CliError: PM launch refused: no-session-credential (fallback pi: pi needs its own provider key or a session proxy key (primary pi: pi needs its own provider key or a session proxy key))
|
||||
at file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/src/launcher.mjs:1207:23
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5),
|
||||
operator: 'rejects',
|
||||
diff: 'simple'
|
||||
}
|
||||
{"phase": "end", "utc": "2026-10-26T22:46:36.110434+00:00", "exit": 1, "niceRestoredTo": 19, "priorityCorrections": {"16": 2}, "ownedPids": [2245071, 2245072, 2245078, 2245093, 2245100, 2245106, 2245125, 2245131, 2245138]}
|
||||
@@ -0,0 +1,120 @@
|
||||
diff --git a/packages/cli/tests/launcher.test.mjs b/packages/cli/tests/launcher.test.mjs
|
||||
index 766bbb35a..df6dea07d 100644
|
||||
--- a/packages/cli/tests/launcher.test.mjs
|
||||
+++ b/packages/cli/tests/launcher.test.mjs
|
||||
@@ -82,6 +82,8 @@ function prepare(t, more = (doc) => doc) {
|
||||
const f = fixture(root, "acme", (doc) => more(edit(doc)));
|
||||
for (const k of SESSION_CREDENTIALS.flat()) delete f.env[k];
|
||||
f.env.CLAUDE_CODE_OAUTH_TOKEN = "stand-in";
|
||||
+ if (f.doc.roles.chief.vars.harness === "pi" || f.doc.roles.chief.vars["fallback.harness"] === "pi")
|
||||
+ f.env.ZAI_API_KEY = "fx332-pi";
|
||||
// The project root is a repository on main, so each launch can clone it.
|
||||
const project = f.doc.projects.stack.root;
|
||||
gitIn(project, "init", "-q", "-b", "main");
|
||||
@@ -145,6 +147,29 @@ function ask(path, line) {
|
||||
|
||||
const log = (f) => readFileSync(launchLogFile(f.dataRoot, "acme"), "utf8").trim().split("\n").map((l) => JSON.parse(l));
|
||||
|
||||
+// Named mutant: proxy key serialized into session.json. Keep the real launcher,
|
||||
+// harness env generation, session writer and runner; only the model adapter is fake.
|
||||
+test('P3 proxy key reaches the spawned runner but never session.json or the bundle', { skip, timeout: 30000 }, async t => {
|
||||
+ const proxy = { baseUrl: 'http://127.0.0.1:12345', key: 'fx332-agent-a' };
|
||||
+ const prepared = prepare(t, doc => {
|
||||
+ doc.launch.models['claude-opus-5-5'] = { provider: 'proxy', model: 'claude-fixture', route: 'anthropic' };
|
||||
+ return doc;
|
||||
+ });
|
||||
+ const { launcher, f, close } = await setup(t, doc => doc, prepared, { proxy });
|
||||
+ const launched = await launcher.launchPm();
|
||||
+ const session = readSessions(f.dataRoot).find(s => s.run === launched.run);
|
||||
+ assert.ok(session);
|
||||
+ const environ = readFileSync(`/proc/${session.runnerPid}/environ`, 'utf8').split('\0');
|
||||
+ assert.ok(environ.includes(`ANTHROPIC_API_KEY=${proxy.key}`));
|
||||
+ assert.ok(!environ.some(value => value.startsWith('CLAUDE_CODE_OAUTH_TOKEN=')));
|
||||
+ const stored = readFileSync(join(session.runDir, 'session.json'), 'utf8');
|
||||
+ assert.ok(!stored.includes(proxy.key), 'session.json must never persist the proxy key');
|
||||
+ const bundleFiles = readdirSync(join(session.runDir, 'bundle'), { recursive: true, withFileTypes: true })
|
||||
+ .filter(entry => entry.isFile()).map(entry => join(entry.parentPath, entry.name));
|
||||
+ for (const file of bundleFiles) assert.ok(!readFileSync(file, 'utf8').includes(proxy.key), file);
|
||||
+ assert.equal(await close(), 0);
|
||||
+});
|
||||
+
|
||||
test("bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest", { skip, timeout: 30000 }, async (t) => {
|
||||
// Row 122: uncertain write receipts cannot prevent the window's first chief launch.
|
||||
const prepared = prepare(t);
|
||||
@@ -672,14 +697,15 @@ test("a Claude Code launch with no session credential refuses before it starts",
|
||||
assert.deepEqual(readdirSync(join(f.dataRoot, "launches")), ["acme.jsonl"], "no run was made");
|
||||
});
|
||||
|
||||
-test("a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables", { skip, timeout: 30000 }, async (t) => {
|
||||
+test("a pi launch with no own credential refuses no-session-credential", { skip, timeout: 30000 }, async (t) => {
|
||||
const given = prepare(t);
|
||||
delete given.f.env.CLAUDE_CODE_OAUTH_TOKEN;
|
||||
+ delete given.f.env.ZAI_API_KEY;
|
||||
assert.deepEqual(SESSION_CREDENTIALS.flat().filter((k) => k in given.f.env), []);
|
||||
const { f, launcher } = await setup(t, undefined, given);
|
||||
- const chief = await launcher.launchPm();
|
||||
- assert.equal(chief.harness, "pi");
|
||||
- assert.deepEqual(log(f).map((e) => [e.event, e.instance]), [["launch", "chief"]]);
|
||||
+ await assert.rejects(launcher.launchPm(), /PM launch refused: no-session-credential/);
|
||||
+ assert.deepEqual(log(f).map((e) => [e.event, e.code]), [["refused", "no-session-credential"]]);
|
||||
+ assert.deepEqual(readSessions(f.dataRoot), []);
|
||||
});
|
||||
|
||||
// Row 65: a harness module no core file names, switched on in the organization file, runs a real
|
||||
@@ -696,6 +722,7 @@ test("row 65 a failed primary preflight launches the fallback on a fixture harne
|
||||
write("harness", "down", `export * from ${pi};\nexport const preflight = () => ({ code: "fixture-down", message: "fixture preflight fails" });\n`);
|
||||
write("harness", "fixture", `export * from ${pi};\nexport const adapter = () => ${JSON.stringify(given.adapter)};\n`);
|
||||
});
|
||||
+ given.f.env.ZAI_API_KEY = "fx332-pi";
|
||||
const { f, launcher } = await setup(t, undefined, given, { makeLoader });
|
||||
const chief = await launcher.launchPm();
|
||||
assert.deepEqual({ ...chief, run: undefined }, { run: undefined, instance: "chief", harness: "fixture", model: "claude-sonnet-5-5" });
|
||||
@@ -825,7 +852,7 @@ test("row 64 on Claude Code a role skill that isn't enabled refuses the same way
|
||||
// API, runs one Bash call that tries the founder's stand-ins, another run
|
||||
// and the checkout. No real credential and no real model.
|
||||
const which = spawnSync("sh", ["-c", "command -v claude"], { encoding: "utf8" });
|
||||
-const CLAUDE = which.status === 0 ? which.stdout.trim() : null;
|
||||
+const CLAUDE = process.env.MOSAIC_CLAUDE_BIN ?? (which.status === 0 ? which.stdout.trim() : null);
|
||||
|
||||
test("a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold", { skip: skip || (CLAUDE ? false : "claude is not on PATH"), timeout: 180000 }, async (t) => {
|
||||
const script = [];
|
||||
diff --git a/packages/cli/tests/model-managed-launch-fixture.mjs b/packages/cli/tests/model-managed-launch-fixture.mjs
|
||||
index 1a63106ba..3a3bcd42b 100644
|
||||
--- a/packages/cli/tests/model-managed-launch-fixture.mjs
|
||||
+++ b/packages/cli/tests/model-managed-launch-fixture.mjs
|
||||
@@ -15,13 +15,16 @@ import { readSessions, runsDir, sessionsFile, SESSIONS_VERSION, launchLogFile }
|
||||
export const waitFor = async (read, message, ms=15000) => { const end=Date.now()+ms;while(Date.now()<end){const value=await read();if(value)return value;await new Promise(r=>setTimeout(r,20));}throw Error(message); };
|
||||
export const pause = ms => new Promise(r=>setTimeout(r,ms));
|
||||
const id = value => createHash('sha256').update(value).digest('hex').slice(0,12);
|
||||
-export async function managedLaunchFixture(t,{proxy=true,launches=true,refuseProbe=false}={}){
|
||||
+export async function managedLaunchFixture(t,{proxy=true,launches=true,refuseProbe=false,harness='pi'}={}){
|
||||
const root=fs.mkdtempSync(join(tmpdir(),'ml653-')),closers=[],history=new Set(['fx653-manage']),proxyReceipts=[],logs=[];
|
||||
let server,bus,launcher,stderr;const trace={preflightAttempts:0,successfulPreflights:0,enableBeforeSpawn:[],bindings:[],stalls:[]};
|
||||
const checkHistory=entries=>{const text=JSON.stringify(entries);for(const value of history)if(text.includes(value))throw Error('fixture credential leaked');};
|
||||
t.after(async()=>{const failures=[];for(const close of [...closers].reverse()){try{await close();}catch{failures.push('owned-close');}}try{server?.closeAllConnections();if(server?.listening)await new Promise((resolve,reject)=>server.close(e=>e?reject(e):resolve()));}catch{failures.push('owned-server-close');}try{checkHistory({logs,proxyReceipts,trace});}catch{failures.push('value-free-receipts');}if(stderr)process.stderr.write=stderr;try{fs.rmSync(root,{recursive:true,force:true});}catch{failures.push('owned-root-close');}if(failures.length)throw new AggregateError(failures.map(code=>Error(code)),'owned managed fixture cleanup failed');});
|
||||
- const f=fixture(root,'acme',doc=>{doc.plugins={...doc.plugins,harness:['pi']};for(const role of Object.values(doc.roles))role.vars={...role.vars,harness:'pi'};doc.roles.chief.vars.model='claude-opus-5-5';return doc;});
|
||||
+ const f=fixture(root,'acme',doc=>{doc.plugins={...doc.plugins,harness:[harness]};for(const role of Object.values(doc.roles))role.vars={...role.vars,harness};doc.roles.chief.vars.model='claude-opus-5-5';return doc;});
|
||||
const env={PATH:process.env.PATH,HOME:process.env.HOME,TMPDIR:process.env.TMPDIR,MOSAIC_CONFIG:f.config,MOSAIC_ROLES_DIR:f.roles};
|
||||
+ // The nonproxy positive fixture supplies its own fake pi login. Managed
|
||||
+ // proxy fixtures deliberately hold no upstream credential at all.
|
||||
+ if(!proxy)env.ZAI_API_KEY='fx653-pi';
|
||||
const configDir=join(root,'config'),prefix=`msk-${id(configDir)}-`,sentinel=prefix+'sentinel-'+randomBytes(32).toString('base64url');history.add(sentinel);
|
||||
const state={keys:[sentinel],calls:[],refuseProbe};
|
||||
server=http.createServer(async(req,res)=>{try{
|
||||
@@ -78,7 +81,7 @@ export async function managedLaunchFixture(t,{proxy=true,launches=true,refusePro
|
||||
return actualOp(m);
|
||||
},
|
||||
bindLaunch:async record=>{const result=bus.bindLaunch(record);trace.bindings.push({run:record.run,pid:record.pid,startTime:record.startTime,modelKeyId:record.modelKeyId});return result;}};
|
||||
- const makeLoader=await fakeHarnesses({after:close=>closers.push(close)},{pi:adapter});
|
||||
+ const makeLoader=await fakeHarnesses({after:close=>closers.push(close)},{[harness]:adapter});
|
||||
launcher=createLauncher({host,system,env,launches,makeLoader,sessionDefaults:{pollInterval:50},harnessVersion:'0.85.1',log:line=>logs.push(line)});
|
||||
// The existing trusted host hook owns all launcher-created children. No registry
|
||||
// PID is signalled by fixture teardown; normal bounded launcher close is used.
|
||||
@@ -87,6 +90,7 @@ export async function managedLaunchFixture(t,{proxy=true,launches=true,refusePro
|
||||
const launchLog=()=>fs.existsSync(launchLogFile(f.dataRoot,'acme'))?fs.readFileSync(launchLogFile(f.dataRoot,'acme'),'utf8').trim().split('\n').filter(Boolean).map(l=>JSON.parse(l)):[];
|
||||
const valueFree=()=>checkHistory({logs,proxyReceipts,launch:launchLog(),trace});
|
||||
return {root,f,state,trace,proxyReceipts,logs,launcher,bus,launchLog,expectedKeyId:()=>expectedKeyId,valueFree,
|
||||
+ upstreamCredentialNames:Object.keys(env).filter(name=>['ANTHROPIC_API_KEY','ANTHROPIC_AUTH_TOKEN','CLAUDE_CODE_OAUTH_TOKEN','OPENAI_API_KEY','OPENROUTER_API_KEY','ZAI_API_KEY'].includes(name)),
|
||||
runDirectories:()=>fs.existsSync(runsDir(f.dataRoot,'acme'))?fs.readdirSync(runsDir(f.dataRoot,'acme')).map(name=>join(runsDir(f.dataRoot,'acme'),name)):[],
|
||||
sessions:()=>readSessions(f.dataRoot),send:body=>bus.broker.request(human,{verb:'message.send',args:{to:'chief',body,class:'REQUEST'}}),
|
||||
reply:sent=>waitFor(()=>bus.broker.request(human,{verb:'message.receive'}).find(m=>m.in_reply_to===sent.id),'real managed reply observed'),
|
||||
@@ -0,0 +1,112 @@
|
||||
{
|
||||
"originalPacket": "c7c38a6aa5f722d949d8ca16682a749aa76f1e75",
|
||||
"base": "09a847edaa25b609bac7728ff83f224708a29399",
|
||||
"productCommit": "d6dc04e84fac839b7259488162b145b9683f943b",
|
||||
"packageTestScriptDeltasIdentical": [
|
||||
{
|
||||
"file": "agents/fethry/work/queue-332/import-run-list.mjs",
|
||||
"beforeAfterPatchSha256": "dd2b64e735891cff21f6d71e73a1c05f3aef1b15a295dacb017b6b255d3e3d62",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "agents/fethry/work/queue-332/join1961/capture-cleanup.mjs",
|
||||
"beforeAfterPatchSha256": "3ebe99133722a3f3e1acf5c69fa6aac86a81d28ae56e5d28800b8f9a10f31cef",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "agents/fethry/work/queue-332/join1961/run-targeted.py",
|
||||
"beforeAfterPatchSha256": "d06b4da13a84ae94bf65eb469a975597bc4c870df5245109ca71f5443650a0ff",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "agents/fethry/work/queue-332/proxy-evidence.mjs",
|
||||
"beforeAfterPatchSha256": "6b674833618c02121d2934e2e3c22954b6a8690b02601de18c7bf2a64f5431bf",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/business/src/launch.mjs",
|
||||
"beforeAfterPatchSha256": "694420fc884118f813da5aac5d654b2fdaa2bfed7311622e55ff84bc846f873a",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/business/tests/launch-settings.test.mjs",
|
||||
"beforeAfterPatchSha256": "9e3eca292a53c86c7d50b4374b121f452e3fddfca52773ba7ae59be16811e9e8",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/business/tests/proxy-launch.test.mjs",
|
||||
"beforeAfterPatchSha256": "e4181b57a7a5bcf86ced60cb523094d1821ff6947bc1ea52b32c6c13ea6944cc",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/src/launcher.mjs",
|
||||
"beforeAfterPatchSha256": "15a8da52db92780c2a4c0bb24636f62a270e24f8b9b935d5447aca57b0d45500",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/launcher.test.mjs",
|
||||
"beforeAfterPatchSha256": "241d10641a0bac88889b2a1d7438f7bb9274a2560284bf46e6f8b4e4e9eb37d5",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/model-managed-launch-fixture.mjs",
|
||||
"beforeAfterPatchSha256": "08e47e91cfaf9f9df02676d0802f3ee22110cd6a6e0e5b8e609b24e34864f6d9",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/proxy-context-join.test.mjs",
|
||||
"beforeAfterPatchSha256": "418e68a7a01687694d6fdd1876625d7ed219587d05cdd14d49aa795e80035181",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/harness/src/bundle.mjs",
|
||||
"beforeAfterPatchSha256": "bdaf946965419d5a94a5fdba5cf11759564b4c5e23a915f45102336fa91c9564",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/harness/tests/proxy-bundle.test.mjs",
|
||||
"beforeAfterPatchSha256": "243a08c9ed52133069a8d22812290e368cb1a8e89c03e142b6e95fe959352436",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/harness/tests/proxy-routing.test.mjs",
|
||||
"beforeAfterPatchSha256": "891cb4ec88fa681aaf22ba6efef5e90c16628ae09e67fd8e89bc56553e1d18bd",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/plugins/README.md",
|
||||
"beforeAfterPatchSha256": "ed6e342ebf41174f8605f49bfc755c2e295a96e42a4fdd9150b536de5a7dc74d",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/plugins/harness/claude-code/index.mjs",
|
||||
"beforeAfterPatchSha256": "010c5f3bf942f876432f4f2e47414cd4a1796fcae385f5b659f7c17cc007434d",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/plugins/harness/pi/index.mjs",
|
||||
"beforeAfterPatchSha256": "704081e388093dc8df98c69c0e802c51b59d39be0ce5c6e9a2b9d94e6c2fdf4b",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/plugins/tests/harness.test.mjs",
|
||||
"beforeAfterPatchSha256": "a88facfad8e1f834ce3c167228bcc7350ef51bf7585b0a7645248a9aab00e2b7",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/plugins/tests/proxy-harness.test.mjs",
|
||||
"beforeAfterPatchSha256": "a927ad26fe272aa262bffb93512e4231958de4d4cebd436e5e16538792884da5",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/seat/src/session.mjs",
|
||||
"beforeAfterPatchSha256": "5b5970c09e4477318b3730dc374b7766db477cee27ab1072c2c5644991412a7d",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/seat/tests/proxy-session-env.test.mjs",
|
||||
"beforeAfterPatchSha256": "549a14f5699d64661ff508a6c5a735579b00449f5774d795a0a11777f0eb3919",
|
||||
"identical": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,241 @@
|
||||
{"test":"packages/bus/tests/access-revoke.test.mjs","excluded":false,"imports":["packages/bus/tests/access-revoke.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/broker.test.mjs","excluded":false,"imports":["packages/bus/tests/broker.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/bus/tests/channel-proof.test.mjs","excluded":false,"imports":["packages/bus/tests/channel-proof.test.mjs","packages/cli/tests/channel-fixture.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/bus/tests/chief-of-staff.test.mjs","excluded":false,"imports":["packages/bus/tests/chief-of-staff.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/citation-guard.test.mjs","excluded":false,"imports":["packages/bus/tests/citation-guard.test.mjs","packages/business/src/organization.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/bus/tests/citation-runtime.test.mjs","excluded":false,"imports":["packages/bus/tests/citation-runtime.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/creative.test.mjs","excluded":false,"imports":["packages/bus/tests/creative.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/credential-verbs.test.mjs","excluded":false,"imports":["packages/bus/tests/credential-verbs.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/grant-scope-runtime.test.mjs","excluded":false,"imports":["packages/bus/tests/grant-scope-runtime.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/host-run.test.mjs","excluded":false,"imports":["packages/bus/tests/host-run.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/land.test.mjs","excluded":false,"imports":["packages/bus/tests/land.test.mjs","packages/bus/src/usage.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/bus/tests/library-credential.test.mjs","excluded":false,"imports":["packages/bus/tests/library-credential.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/library-lookups.test.mjs","excluded":false,"imports":["packages/bus/tests/library-lookups.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/library-sync.test.mjs","excluded":false,"imports":["packages/bus/tests/library-sync.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/library-write.test.mjs","excluded":false,"imports":["packages/bus/tests/library-write.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/library.test.mjs","excluded":false,"imports":["packages/bus/tests/library.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/lifecycle-revoke.test.mjs","excluded":false,"imports":["packages/bus/tests/lifecycle-revoke.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/limit-checks.test.mjs","excluded":false,"imports":["packages/bus/tests/limit-checks.test.mjs","packages/bus/src/limits.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/bus/tests/messages.test.mjs","excluded":false,"imports":["packages/bus/tests/messages.test.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/bus/tests/model-completion-remove.test.mjs","excluded":false,"imports":["packages/bus/tests/model-completion-remove.test.mjs","packages/bus/tests/model-revocation-fixture.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/model-final-completion.test.mjs","excluded":false,"imports":["packages/bus/tests/model-final-completion.test.mjs","packages/bus/tests/model-revocation-fixture.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/model-hire-ownership.test.mjs","excluded":false,"imports":["packages/bus/tests/model-hire-ownership.test.mjs","packages/bus/tests/model-hire-ownership-fixture.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/bus/tests/model-historical-cleanup.test.mjs","excluded":false,"imports":["packages/bus/tests/model-historical-cleanup.test.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/bus/tests/model-historical-ipc.test.mjs","excluded":false,"imports":["packages/bus/tests/model-historical-ipc.test.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/bus/tests/model-key-loss-interaction.test.mjs","excluded":false,"imports":["packages/bus/tests/model-key-loss-interaction.test.mjs","packages/bus/tests/model-review-fixtures.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/model-key-provenance.test.mjs","excluded":false,"imports":["packages/bus/tests/model-key-provenance.test.mjs","packages/bus/tests/model-review-fixtures.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/model-keys.test.mjs","excluded":false,"imports":["packages/bus/tests/model-keys.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/model-organization-pending.test.mjs","excluded":false,"imports":["packages/bus/tests/model-organization-pending.test.mjs","packages/bus/tests/model-pending-fixture.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/model-orphan-hire.test.mjs","excluded":false,"imports":["packages/bus/tests/model-orphan-hire.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/model-restart.test.mjs","excluded":false,"imports":["packages/bus/tests/model-restart.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/model-terminal-proof.test.mjs","excluded":false,"imports":["packages/bus/tests/model-terminal-proof.test.mjs","packages/bus/tests/model-review-fixtures.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/model-tmp-recovery.test.mjs","excluded":false,"imports":["packages/bus/tests/model-tmp-recovery.test.mjs","packages/bus/tests/model-revocation-fixture.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/processing-runtime.test.mjs","excluded":false,"imports":["packages/bus/tests/processing-runtime.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/project-runtime.test.mjs","excluded":false,"imports":["packages/bus/tests/project-runtime.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/proxy-model-join.test.mjs","excluded":false,"imports":["packages/bus/tests/proxy-model-join.test.mjs","packages/bus/tests/model-revocation-fixture.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/reload.test.mjs","excluded":false,"imports":["packages/bus/tests/reload.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/tasks.test.mjs","excluded":false,"imports":["packages/bus/tests/tasks.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/tester-writes.test.mjs","excluded":false,"imports":["packages/bus/tests/tester-writes.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/tester.test.mjs","excluded":false,"imports":["packages/bus/tests/tester.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/usage-runtime.test.mjs","excluded":false,"imports":["packages/bus/tests/usage-runtime.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/bus/tests/usage.test.mjs","excluded":false,"imports":["packages/bus/tests/usage.test.mjs","packages/bus/src/usage.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/bus/tests/workflow-roles.test.mjs","excluded":false,"imports":["packages/bus/tests/workflow-roles.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/access-levels.test.mjs","excluded":false,"imports":["packages/business/tests/access-levels.test.mjs","packages/business/src/access.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/access.test.mjs","excluded":false,"imports":["packages/business/tests/access.test.mjs","packages/business/src/access.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/agent-identity.test.mjs","excluded":false,"imports":["packages/business/tests/agent-identity.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/assistant.test.mjs","excluded":false,"imports":["packages/business/tests/assistant.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/business.test.mjs","excluded":false,"imports":["packages/business/tests/business.test.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/case1-business-file.test.mjs","excluded":false,"imports":["packages/business/tests/case1-business-file.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/business/tests/chief-library-credentials.test.mjs","excluded":false,"imports":["packages/business/tests/chief-library-credentials.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/chief-of-staff.test.mjs","excluded":false,"imports":["packages/business/tests/chief-of-staff.test.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/cli.test.mjs","excluded":false,"imports":["packages/business/tests/cli.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/credentials.test.mjs","excluded":false,"imports":["packages/business/tests/credentials.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/csuite.test.mjs","excluded":false,"imports":["packages/business/tests/csuite.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/grant-scope.test.mjs","excluded":false,"imports":["packages/business/tests/grant-scope.test.mjs","packages/business/src/launch-settings.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/hard-waits.test.mjs","excluded":false,"imports":["packages/business/tests/hard-waits.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/hosts.test.mjs","excluded":false,"imports":["packages/business/tests/hosts.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/instance-credential-transitions.test.mjs","excluded":false,"imports":["packages/business/tests/instance-credential-transitions.test.mjs","packages/business/src/instance-settings.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/instance-settings.test.mjs","excluded":false,"imports":["packages/business/tests/instance-settings.test.mjs","packages/business/src/instance-settings.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/launch-settings.test.mjs","excluded":false,"imports":["packages/business/tests/launch-settings.test.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/library-projects-protected.test.mjs","excluded":false,"imports":["packages/business/tests/library-projects-protected.test.mjs","packages/business/src/organization.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/library-seats.test.mjs","excluded":false,"imports":["packages/business/tests/library-seats.test.mjs","packages/business/src/library-seats.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/lifecycle-settings.test.mjs","excluded":false,"imports":["packages/business/tests/lifecycle-settings.test.mjs","packages/business/src/instance-settings.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/optional-tracker.test.mjs","excluded":false,"imports":["packages/business/tests/optional-tracker.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/plugin-settings.test.mjs","excluded":false,"imports":["packages/business/tests/plugin-settings.test.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/project-repo.test.mjs","excluded":false,"imports":["packages/business/tests/project-repo.test.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/project.test.mjs","excluded":false,"imports":["packages/business/tests/project.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/proxy-launch.test.mjs","excluded":false,"imports":["packages/business/tests/proxy-launch.test.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/record-grants.test.mjs","excluded":false,"imports":["packages/business/tests/record-grants.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/reply-limits.test.mjs","excluded":false,"imports":["packages/business/tests/reply-limits.test.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/resolve.test.mjs","excluded":false,"imports":["packages/business/tests/resolve.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/role.test.mjs","excluded":false,"imports":["packages/business/tests/role.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/token-limit-settings.test.mjs","excluded":false,"imports":["packages/business/tests/token-limit-settings.test.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/vars.test.mjs","excluded":false,"imports":["packages/business/tests/vars.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/business/tests/workflow-roles.test.mjs","excluded":false,"imports":["packages/business/tests/workflow-roles.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/cli/tests/access-boot.test.mjs","excluded":false,"imports":["packages/cli/tests/access-boot.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/access.test.mjs","excluded":false,"imports":["packages/cli/tests/access.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/app.test.mjs","excluded":false,"imports":["packages/cli/tests/app.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/boot-status.test.mjs","excluded":false,"imports":["packages/cli/tests/boot-status.test.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/cli/tests/case1-accept.test.mjs","excluded":true,"imports":["packages/cli/tests/case1-accept.test.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/cli/tests/case1-hostcheck.test.mjs","excluded":false,"imports":["packages/cli/tests/case1-hostcheck.test.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/cli/tests/case2-install.test.mjs","excluded":false,"imports":["packages/cli/tests/case2-install.test.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/cli/tests/case2-persona-import.test.mjs","excluded":false,"imports":["packages/cli/tests/case2-persona-import.test.mjs","packages/harness/src/bundle.mjs"]}
|
||||
{"test":"packages/cli/tests/case2-unit.test.mjs","excluded":false,"imports":["packages/cli/tests/case2-unit.test.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/cli/tests/channel-cli.test.mjs","excluded":false,"imports":["packages/cli/tests/channel-cli.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/channel-recovery.test.mjs","excluded":false,"imports":["packages/cli/tests/channel-recovery.test.mjs","packages/cli/tests/channel-fixture.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/cli/tests/cli.test.mjs","excluded":false,"imports":["packages/cli/tests/cli.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/compactions-launch.test.mjs","excluded":false,"imports":["packages/cli/tests/compactions-launch.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/config.test.mjs","excluded":false,"imports":["packages/cli/tests/config.test.mjs","packages/cli/src/config.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/cli/tests/credentials.test.mjs","excluded":false,"imports":["packages/cli/tests/credentials.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/federation-acceptance.test.mjs","excluded":false,"imports":["packages/cli/tests/federation-acceptance.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/follow.test.mjs","excluded":false,"imports":["packages/cli/tests/follow.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/git-socket.test.mjs","excluded":false,"imports":["packages/cli/tests/git-socket.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/grants-scope.test.mjs","excluded":false,"imports":["packages/cli/tests/grants-scope.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/grants.test.mjs","excluded":false,"imports":["packages/cli/tests/grants.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/host.test.mjs","excluded":false,"imports":["packages/cli/tests/host.test.mjs","packages/cli/src/config.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/cli/tests/hosts.test.mjs","excluded":false,"imports":["packages/cli/tests/hosts.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/idle-stop-race.test.mjs","excluded":false,"imports":["packages/cli/tests/idle-stop-race.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/instances.test.mjs","excluded":false,"imports":["packages/cli/tests/instances.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/launch-account.test.mjs","excluded":false,"imports":["packages/cli/tests/launch-account.test.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/launch-limit-checks.test.mjs","excluded":false,"imports":["packages/cli/tests/launch-limit-checks.test.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/launch-limits.test.mjs","excluded":false,"imports":["packages/cli/tests/launch-limits.test.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/launch-routes.test.mjs","excluded":false,"imports":["packages/cli/tests/launch-routes.test.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/launcher.test.mjs","excluded":false,"imports":["packages/cli/tests/launcher.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/lifecycle.test.mjs","excluded":false,"imports":["packages/cli/tests/lifecycle.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/limits-tokens.test.mjs","excluded":false,"imports":["packages/cli/tests/limits-tokens.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/limits.test.mjs","excluded":false,"imports":["packages/cli/tests/limits.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/mark-read.test.mjs","excluded":false,"imports":["packages/cli/tests/mark-read.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/model-managed-launch.test.mjs","excluded":false,"imports":["packages/cli/tests/model-managed-launch.test.mjs","packages/cli/tests/model-managed-launch-fixture.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/model-proxy-guards.test.mjs","excluded":false,"imports":["packages/cli/tests/model-proxy-guards.test.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/cli/tests/model-proxy.test.mjs","excluded":false,"imports":["packages/cli/tests/model-proxy.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/names.test.mjs","excluded":false,"imports":["packages/cli/tests/names.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/notifier.test.mjs","excluded":false,"imports":["packages/cli/tests/notifier.test.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/cli/tests/optional-tracker.test.mjs","excluded":false,"imports":["packages/cli/tests/optional-tracker.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/other-tree.test.mjs","excluded":false,"imports":["packages/cli/tests/other-tree.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/processing-cli.test.mjs","excluded":false,"imports":["packages/cli/tests/processing-cli.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/project-name-repo.test.mjs","excluded":false,"imports":["packages/cli/tests/project-name-repo.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/project.test.mjs","excluded":false,"imports":["packages/cli/tests/project.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/proxy-context-join.test.mjs","excluded":false,"imports":["packages/cli/tests/proxy-context-join.test.mjs","packages/cli/tests/model-managed-launch-fixture.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/publish-socket.test.mjs","excluded":false,"imports":["packages/cli/tests/publish-socket.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/reply-limits.test.mjs","excluded":false,"imports":["packages/cli/tests/reply-limits.test.mjs","packages/cli/src/limits.mjs","packages/business/src/migrate-launch.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/cli/tests/revoke-window.test.mjs","excluded":false,"imports":["packages/cli/tests/revoke-window.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/session-clear.test.mjs","excluded":false,"imports":["packages/cli/tests/session-clear.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/session-cli.test.mjs","excluded":false,"imports":["packages/cli/tests/session-cli.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/session-launch.test.mjs","excluded":false,"imports":["packages/cli/tests/session-launch.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/stack-copy.test.mjs","excluded":false,"imports":["packages/cli/tests/stack-copy.test.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/cli/tests/stack-instances.test.mjs","excluded":false,"imports":["packages/cli/tests/stack-instances.test.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/cli/tests/tester-reads.test.mjs","excluded":false,"imports":["packages/cli/tests/tester-reads.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/tester-threads.test.mjs","excluded":false,"imports":["packages/cli/tests/tester-threads.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/tester.test.mjs","excluded":false,"imports":["packages/cli/tests/tester.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/thread-cli.test.mjs","excluded":false,"imports":["packages/cli/tests/thread-cli.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/thread-launch.test.mjs","excluded":false,"imports":["packages/cli/tests/thread-launch.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/thread-revoke.test.mjs","excluded":false,"imports":["packages/cli/tests/thread-revoke.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/cli/tests/trackers-boot.test.mjs","excluded":false,"imports":["packages/cli/tests/trackers-boot.test.mjs","packages/cli/src/config.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/cli/tests/transport.test.mjs","excluded":false,"imports":["packages/cli/tests/transport.test.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/cli/tests/usage.test.mjs","excluded":false,"imports":["packages/cli/tests/usage.test.mjs","packages/cli/src/cli.mjs","packages/cli/src/launcher.mjs"]}
|
||||
{"test":"packages/cli/tests/verbs.test.mjs","excluded":false,"imports":["packages/cli/tests/verbs.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/control-board/tests/creative-hidden.test.mjs","excluded":false,"imports":["packages/control-board/tests/creative-hidden.test.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/control-board/tests/discord.test.mjs","excluded":false,"imports":["packages/control-board/tests/discord.test.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/control-board/tests/serve.test.mjs","excluded":false,"imports":["packages/control-board/tests/serve.test.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/conversation/tests/flows.test.mjs","excluded":false,"imports":["packages/conversation/tests/flows.test.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/harness/tests/bundle.test.mjs","excluded":false,"imports":["packages/harness/tests/bundle.test.mjs","packages/harness/src/bundle.mjs"]}
|
||||
{"test":"packages/harness/tests/claude-gate.test.mjs","excluded":false,"imports":["packages/harness/tests/claude-gate.test.mjs","packages/harness/src/bundle.mjs"]}
|
||||
{"test":"packages/harness/tests/claude-session.test.mjs","excluded":false,"imports":["packages/harness/tests/claude-session.test.mjs","packages/harness/src/bundle.mjs"]}
|
||||
{"test":"packages/harness/tests/creative.test.mjs","excluded":false,"imports":["packages/harness/tests/creative.test.mjs","packages/harness/src/bundle.mjs"]}
|
||||
{"test":"packages/harness/tests/gate.test.mjs","excluded":false,"imports":["packages/harness/tests/gate.test.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/harness/tests/git-tools.test.mjs","excluded":false,"imports":["packages/harness/tests/git-tools.test.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/harness/tests/library-tools.test.mjs","excluded":false,"imports":["packages/harness/tests/library-tools.test.mjs","packages/harness/src/bundle.mjs"]}
|
||||
{"test":"packages/harness/tests/library-write-tools.test.mjs","excluded":false,"imports":["packages/harness/tests/library-write-tools.test.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/harness/tests/mcp-server.test.mjs","excluded":false,"imports":["packages/harness/tests/mcp-server.test.mjs","packages/harness/src/bundle.mjs"]}
|
||||
{"test":"packages/harness/tests/pi-session.test.mjs","excluded":false,"imports":["packages/harness/tests/pi-session.test.mjs","packages/harness/src/bundle.mjs"]}
|
||||
{"test":"packages/harness/tests/proxy-bundle.test.mjs","excluded":false,"imports":["packages/harness/tests/proxy-bundle.test.mjs","packages/harness/src/bundle.mjs"]}
|
||||
{"test":"packages/harness/tests/proxy-routing.test.mjs","excluded":false,"imports":["packages/harness/tests/proxy-routing.test.mjs","packages/harness/src/bundle.mjs"]}
|
||||
{"test":"packages/harness/tests/raise-domain.test.mjs","excluded":false,"imports":["packages/harness/tests/raise-domain.test.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/harness/tests/runner.test.mjs","excluded":false,"imports":["packages/harness/tests/runner.test.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/harness/tests/skills.test.mjs","excluded":false,"imports":["packages/harness/tests/skills.test.mjs","packages/harness/src/bundle.mjs"]}
|
||||
{"test":"packages/harness/tests/spec-tools.test.mjs","excluded":false,"imports":["packages/harness/tests/spec-tools.test.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/harness/tests/tools.test.mjs","excluded":false,"imports":["packages/harness/tests/tools.test.mjs","packages/business/src/launch-settings.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/plugins/tests/channel.test.mjs","excluded":false,"imports":["packages/plugins/tests/channel.test.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/plugins/tests/harness-compactions.test.mjs","excluded":false,"imports":["packages/plugins/tests/harness-compactions.test.mjs","packages/plugins/harness/pi/index.mjs"]}
|
||||
{"test":"packages/plugins/tests/harness.test.mjs","excluded":false,"imports":["packages/plugins/tests/harness.test.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/plugins/tests/loader.test.mjs","excluded":false,"imports":["packages/plugins/tests/loader.test.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/plugins/tests/proxy-harness.test.mjs","excluded":false,"imports":["packages/plugins/tests/proxy-harness.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/plugins/tests/searxng.test.mjs","excluded":false,"imports":["packages/plugins/tests/searxng.test.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/processing-control/tests/task.test.mjs","excluded":false,"imports":["packages/processing-control/tests/task.test.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/seat/tests/compactions-budget.test.mjs","excluded":false,"imports":["packages/seat/tests/compactions-budget.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/seat/tests/compactions-ledger.test.mjs","excluded":false,"imports":["packages/seat/tests/compactions-ledger.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/seat/tests/compactions.test.mjs","excluded":false,"imports":["packages/seat/tests/compactions.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/seat/tests/model-markers-confined.test.mjs","excluded":false,"imports":["packages/seat/tests/model-markers-confined.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/seat/tests/proxy-session-env.test.mjs","excluded":false,"imports":["packages/seat/tests/proxy-session-env.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/seat/tests/sandbox.test.mjs","excluded":false,"imports":["packages/seat/tests/sandbox.test.mjs","packages/harness/src/bundle.mjs"]}
|
||||
{"test":"packages/seat/tests/session-workspace.test.mjs","excluded":false,"imports":["packages/seat/tests/session-workspace.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/seat/tests/session.test.mjs","excluded":false,"imports":["packages/seat/tests/session.test.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/tasks/tests/fields.test.mjs","excluded":false,"imports":["packages/tasks/tests/fields.test.mjs","packages/business/src/index.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/webui/tests/agents-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/agents-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/agents.test.mjs","excluded":false,"imports":["packages/webui/tests/agents.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/assistant.test.mjs","excluded":false,"imports":["packages/webui/tests/assistant.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/board-held.test.mjs","excluded":false,"imports":["packages/webui/tests/board-held.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/browser-edge.test.mjs","excluded":false,"imports":["packages/webui/tests/browser-edge.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/browser.test.mjs","excluded":false,"imports":["packages/webui/tests/browser.test.mjs","packages/webui/tests/fixture.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/webui/tests/bus-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/bus-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/bus.test.mjs","excluded":false,"imports":["packages/webui/tests/bus.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/channel-chat.test.mjs","excluded":false,"imports":["packages/webui/tests/channel-chat.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/chat-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/chat-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/chat-instances.test.mjs","excluded":false,"imports":["packages/webui/tests/chat-instances.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/chat-replies-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/chat-replies-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/chat.test.mjs","excluded":false,"imports":["packages/webui/tests/chat.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/conversation.test.mjs","excluded":false,"imports":["packages/webui/tests/conversation.test.mjs","packages/webui/tests/history-fixture.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/webui/tests/decide-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/decide-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/decide-sso.test.mjs","excluded":false,"imports":["packages/webui/tests/decide-sso.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/decision-http.test.mjs","excluded":false,"imports":["packages/webui/tests/decision-http.test.mjs","packages/webui/src/bus.mjs","packages/cli/src/host.mjs","packages/bus/src/process.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/discord.test.mjs","excluded":false,"imports":["packages/webui/tests/discord.test.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/webui/tests/docs-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/docs-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/editor-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/editor-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/editor-wikilink.test.mjs","excluded":false,"imports":["packages/webui/tests/editor-wikilink.test.mjs","packages/webui/tests/fixture.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/webui/tests/editor.test.mjs","excluded":false,"imports":["packages/webui/tests/editor.test.mjs","packages/webui/tests/fixture.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/webui/tests/granted-user.test.mjs","excluded":false,"imports":["packages/webui/tests/granted-user.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/history-return-flow.test.mjs","excluded":false,"imports":["packages/webui/tests/history-return-flow.test.mjs","packages/webui/tests/history-fixture.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/webui/tests/instances-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/instances-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/instances.test.mjs","excluded":false,"imports":["packages/webui/tests/instances.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/library-cli.test.mjs","excluded":false,"imports":["packages/webui/tests/library-cli.test.mjs","packages/cli/tests/helpers.mjs","packages/harness/tests/helpers.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/webui/tests/library-routes.test.mjs","excluded":false,"imports":["packages/webui/tests/library-routes.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/library-status.test.mjs","excluded":false,"imports":["packages/webui/tests/library-status.test.mjs","packages/webui/src/bus.mjs","packages/cli/src/host.mjs","packages/bus/src/process.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/library-write-options.test.mjs","excluded":false,"imports":["packages/webui/tests/library-write-options.test.mjs","packages/webui/src/console-bus.mjs","packages/webui/src/chat.mjs","packages/plugins/src/channel.mjs","packages/plugins/src/loader.mjs","packages/plugins/harness/claude-code/index.mjs"]}
|
||||
{"test":"packages/webui/tests/limits-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/limits-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/limits-route.test.mjs","excluded":false,"imports":["packages/webui/tests/limits-route.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/messages.test.mjs","excluded":false,"imports":["packages/webui/tests/messages.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/pinned-copy.test.mjs","excluded":false,"imports":["packages/webui/tests/pinned-copy.test.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/preview.test.mjs","excluded":false,"imports":["packages/webui/tests/preview.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/processing-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/processing-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/processing.test.mjs","excluded":false,"imports":["packages/webui/tests/processing.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/project-file.test.mjs","excluded":false,"imports":["packages/webui/tests/project-file.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/project-name-repo.test.mjs","excluded":false,"imports":["packages/webui/tests/project-name-repo.test.mjs","packages/webui/src/bus.mjs","packages/cli/src/host.mjs","packages/bus/src/process.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/proof-cli.test.mjs","excluded":false,"imports":["packages/webui/tests/proof-cli.test.mjs","packages/webui/tests/tester-fixture.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/proof.test.mjs","excluded":false,"imports":["packages/webui/tests/proof.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/proxy-canary.test.mjs","excluded":false,"imports":["packages/webui/tests/proxy-canary.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/proxy-page.test.mjs","excluded":false,"imports":["packages/webui/tests/proxy-page.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/reads.test.mjs","excluded":false,"imports":["packages/webui/tests/reads.test.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/relaunch.test.mjs","excluded":false,"imports":["packages/webui/tests/relaunch.test.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/webui/tests/return-flow.test.mjs","excluded":false,"imports":["packages/webui/tests/return-flow.test.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/webui/tests/room-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/room-browser.test.mjs","packages/webui/tests/fixture.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/webui/tests/room-http.test.mjs","excluded":false,"imports":["packages/webui/tests/room-http.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/routes-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/routes-browser.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/routes.test.mjs","excluded":false,"imports":["packages/webui/tests/routes.test.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/send-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/send-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/send.test.mjs","excluded":false,"imports":["packages/webui/tests/send.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/serve.test.mjs","excluded":false,"imports":["packages/webui/tests/serve.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/settings-form.test.mjs","excluded":false,"imports":["packages/webui/tests/settings-form.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/settings-write.test.mjs","excluded":false,"imports":["packages/webui/tests/settings-write.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/shell.test.mjs","excluded":false,"imports":["packages/webui/tests/shell.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/sso-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/sso-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/sso.test.mjs","excluded":false,"imports":["packages/webui/tests/sso.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/tester-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/tester-browser.test.mjs","packages/webui/tests/tester-fixture.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/tester-cli.test.mjs","excluded":false,"imports":["packages/webui/tests/tester-cli.test.mjs","packages/webui/tests/tester-fixture.mjs","packages/bus/src/runtime.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/tester-listener.test.mjs","excluded":false,"imports":["packages/webui/tests/tester-listener.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/thread-claims-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/thread-claims-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/thread-claims.test.mjs","excluded":false,"imports":["packages/webui/tests/thread-claims.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/thread-sharing.test.mjs","excluded":false,"imports":["packages/webui/tests/thread-sharing.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/usage-browser.test.mjs","excluded":false,"imports":["packages/webui/tests/usage-browser.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/usage.test.mjs","excluded":false,"imports":["packages/webui/tests/usage.test.mjs","packages/webui/src/serve.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
{"test":"packages/webui/tests/user-option-swap.test.mjs","excluded":false,"imports":["packages/webui/tests/user-option-swap.test.mjs","packages/webui/tests/fixture.mjs","packages/control-board/src/serve.mjs","packages/business/src/business.mjs","packages/business/src/launch.mjs"]}
|
||||
{"test":"packages/webui/tests/views.test.mjs","excluded":false,"imports":["packages/webui/tests/views.test.mjs","packages/webui/src/reads.mjs","packages/seat/src/session.mjs"]}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"base": "09a847ed",
|
||||
"source": [
|
||||
"packages/business/src/launch.mjs",
|
||||
"packages/cli/src/launcher.mjs",
|
||||
"packages/harness/src/bundle.mjs",
|
||||
"packages/plugins/harness/claude-code/index.mjs",
|
||||
"packages/plugins/harness/pi/index.mjs",
|
||||
"packages/seat/src/session.mjs"
|
||||
],
|
||||
"testAndFixtureChanges": [
|
||||
"packages/business/tests/launch-settings.test.mjs",
|
||||
"packages/business/tests/proxy-launch.test.mjs",
|
||||
"packages/cli/tests/launcher.test.mjs",
|
||||
"packages/cli/tests/model-managed-launch-fixture.mjs",
|
||||
"packages/cli/tests/proxy-context-join.test.mjs",
|
||||
"packages/harness/tests/proxy-bundle.test.mjs",
|
||||
"packages/harness/tests/proxy-routing.test.mjs",
|
||||
"packages/plugins/tests/harness.test.mjs",
|
||||
"packages/plugins/tests/proxy-harness.test.mjs",
|
||||
"packages/seat/tests/proxy-session-env.test.mjs"
|
||||
],
|
||||
"runtimeOverlap": [],
|
||||
"preserved": [
|
||||
"packages/bus/src/runtime.mjs",
|
||||
"packages/bus/src/process.mjs",
|
||||
"packages/bus/src/model-keys.mjs",
|
||||
"packages/bus/tests/model-hire-ownership.test.mjs",
|
||||
"packages/cli/tests/model-managed-launch.test.mjs"
|
||||
],
|
||||
"excluded": [
|
||||
"#662",
|
||||
"657/658 backlog",
|
||||
"roles/contracts authority changes",
|
||||
"P5 createUsage/tick/close accounting",
|
||||
"full packages/global gate",
|
||||
"push",
|
||||
"real provider/auth turns"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
[
|
||||
{
|
||||
"harness": "claude-code",
|
||||
"adapter": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/adapters/claude/adapter.sh",
|
||||
"harnessEnvironmentNames": [
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS"
|
||||
],
|
||||
"stderr": {
|
||||
"0001.stderr": "\"claude-sonnet-5-5\" isn't described by this version's model catalog; update Claude Code, or map it with behavesAs on a modelPicker row (or modelOverrides, if it is a provider id of a model this version knows). Until then auto-compact keeps this session within 200k tokens (the context window it assumes); if the model accepts more, append [1m] to the model name for 1M; CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT=1 restores the previous wait-for-the-API behavior.\n[claude-code:unrecognized_model] {\"model\":\"claude-sonnet-5-5\",\"query_source\":\"generate_session_title\"}\n"
|
||||
}
|
||||
},
|
||||
{
|
||||
"harness": "pi",
|
||||
"adapter": "/mnt/storage/scratch/tmp/gemC/mosaic-launch-Hk09z8/adapter.sh",
|
||||
"harnessEnvironmentNames": [
|
||||
"MOSAIC_EXTENSIONS",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"PI_MODEL",
|
||||
"PI_PROVIDER"
|
||||
],
|
||||
"stderr": {
|
||||
"0001.stderr": "fake adapter: claude-opus-5-5\n"
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,60 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:58:02.931026+00:00", "test": "packages/cli/tests/launcher.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gKIS/home", "privateConfig": "/mnt/storage/scratch/tmp/gKIS/home/config/unconfigured.json"}
|
||||
✔ C2-04: launcher workspace clones code but never the library (1443.04225ms)
|
||||
✔ P3 proxy key reaches the spawned runner but never session.json or the bundle (1349.486385ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1372.479066ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r68b2227c6607","instance":"chief","turn":"5c3354ec-dc43-4681-90f3-c66dad0019ee","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r966d1991cee7","instance":"coder","turn":"b3e8791b-f438-4ccc-97cd-e871964650e6","source":"@none","code":"baseline-unknown"}
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (818.490421ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r2dd9e9808417","instance":"chief","turn":"b6bd8631-94fd-46bf-9d95-ca268437ca00","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r32a31a6080ab","instance":"pm","turn":"8e4a586c-fe32-4a8b-8d41-ca772353851a","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r2dd9e9808417","instance":"chief","turn":"643e12fe-6045-4f47-8496-93f1fd2d58c5","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r32a31a6080ab","instance":"pm","turn":"b299252b-f768-4e4b-b85a-7362c4f748d0","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r32a31a6080ab","instance":"pm","turn":"8ee653ce-1e52-481f-a4be-4bda272f7017","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r2dd9e9808417","instance":"chief","turn":"f8b7db9b-d7fe-406a-b491-66cc77ee3358","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r32a31a6080ab","instance":"pm","turn":"a7af45a2-8e86-4eb5-9eec-76a97445da78","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r2dd9e9808417","instance":"chief","turn":"3cee45ec-5c79-4f9e-9d60-99a518a4dd43","source":"@none","code":"baseline-unknown"}
|
||||
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (1256.629929ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (4160.454943ms)
|
||||
✔ a role the broker says holds a merge decision gets land_work, its prompt line, its landing and the git socket; without it, none (662.083278ms)
|
||||
✔ REQ-LAUNCH-1 the tick starts a listed merge decision holder once, with land_work, the Landing line and its landing turn; an unlisted holder starts nothing (429.874884ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"re6391860f2ad","instance":"coder","turn":"2a5fb3f3-4c0a-4238-8f89-773fe7be5f4f","source":"@none","code":"baseline-unknown"}
|
||||
✔ a holder running since before the resolution is stopped once the broker releases it, land-relaunch, and the next tick starts it: landing turn first, then the message that waited (809.67855ms)
|
||||
✔ a landing run that ended isn't started again for its decision, a spent decision starts nothing, and a new decision starts the holder (713.437032ms)
|
||||
✔ after a restart, the new host's first tick starts a holder whose decision is still held (963.125148ms)
|
||||
✔ a refused landing start is logged once per code with its decision, isn't a start, and the next tick with room starts the holder (676.70186ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (288.60408ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (360.76199ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (206.094628ms)
|
||||
✔ a pi launch with no own credential refuses no-session-credential (195.701992ms)
|
||||
usage: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/down is missing","kept":[]}
|
||||
plugins: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/down is missing","kept":[]}
|
||||
✔ row 65 a failed primary preflight launches the fallback on a fixture harness module, recording the route and the reason (401.323202ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (409.175675ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (204.671684ms)
|
||||
✔ row 64 a role skill that isn't enabled refuses skill-not-enabled, and one that isn't a plain directory skill-refused, before anything starts (207.24945ms)
|
||||
✔ row 213 a creative instance's persona is read from <configDir>/personas: off its digest the launch fails with the mismatch as its reason (308.296705ms)
|
||||
✔ row 64 on Claude Code a role skill that isn't enabled refuses the same way, before anything starts (207.648797ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r72b0ebb29780","instance":"chief","turn":"2369f6df-7175-42fa-b9af-c125d1170ba2","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rb4d8ccdb580b","instance":"coder","turn":"b488c089-b9ab-4806-9250-05141686fc28","source":"@none","code":"baseline-unknown"}
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1558.822593ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (1139.237314ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (4093.16298ms)
|
||||
✔ bus start --no-launch leaves an earlier host's live session alone: no signal, no end, sessions.json as it was (246.956914ms)
|
||||
✔ bus start --no-launch refuses every launch: the PM launch and a session's request, each logged, nothing spawned (206.996559ms)
|
||||
✔ bus start --no-launch starts no thread tick; the same host with launches runs it (1193.844756ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (189.09703ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (195.333474ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (196.934245ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1387.233782ms)
|
||||
✔ kill switch refuses chief and hire before launch work and a clear permits a later request (377.047914ms)
|
||||
✔ kill switch stops an actual managed namespace and records the halt reason without rewriting its bundle (372.016924ms)
|
||||
✔ a launch waiting across halt and resume cannot use its stale admission (208.426491ms)
|
||||
ℹ tests 35
|
||||
ℹ suites 0
|
||||
ℹ pass 35
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 28934.59698
|
||||
{"phase": "end", "utc": "2026-10-26T22:58:31.909376+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 108, "10": 18}, "ownedPids": [2402359, 2402362, 2402379, 2402411, 2402412, 2402432, 2402476, 2402622, 2402663, 2402664, 2402804, 2402805, 2403319, 2403325, 2403332, 2403377, 2403402, 2403420, 2403421, 2403422, 2403424, 2403425, 2403871, 2403896, 2404006, 2404007, 2404203, 2404210, 2404237, 2404245, 2404251, 2404273, 2404274, 2404295, 2404302, 2404303, 2404310, 2404311, 2404357, 2404364, 2404365, 2404383, 2404388, 2404395, 2404403, 2404408, 2404409, 2404413, 2404414, 2404422, 2404465, 2404466, 2404474, 2404481, 2404488, 2404495, 2404502, 2404510, 2404517, 2404542, 2404543, 2404551, 2404556, 2404557, 2404580, 2404587, 2404633, 2404634, 2404652, 2404653, 2404741, 2404748, 2404756, 2404763, 2404765, 2404775, 2404776, 2404948, 2404955, 2404963, 2404964, 2404965, 2405010, 2405014, 2405015, 2405021, 2405022, 2405023, 2405024, 2405103, 2405110, 2405142, 2405143, 2405144, 2405151, 2405152, 2405165, 2405193, 2405199, 2405231, 2405232, 2405247, 2405248, 2405249, 2405250, 2405265, 2405272, 2405280, 2405284, 2405289, 2405290, 2405298, 2405311, 2405318, 2405326, 2405335, 2405336, 2405365, 2405369, 2405378, 2405379, 2405380, 2405381, 2405382, 2405390, 2405397, 2405410, 2405429, 2405449, 2405464, 2405465, 2405479, 2405481, 2405482, 2405490, 2405521, 2405523, 2405549, 2405550, 2405582, 2405591, 2405619, 2405629, 2405630, 2405639, 2405648, 2405656, 2405665, 2405681, 2405682, 2405686, 2405687, 2405688, 2405689, 2405690, 2405698, 2405755, 2405763, 2405784, 2405785, 2405808, 2405809, 2405829, 2405830, 2405848, 2405865, 2405866, 2405885, 2405892, 2405898, 2405905, 2405933, 2405952, 2405967, 2405987, 2405995, 2406005, 2406006, 2406014, 2406020, 2406027, 2406042, 2406049, 2406063, 2406078, 2406082, 2406089, 2406109, 2406110, 2406118, 2406119, 2406133, 2406141, 2406172, 2406173, 2406174, 2406189, 2406190, 2406227, 2406228, 2406235, 2406255, 2406259, 2406263, 2406270, 2406300, 2406302, 2406309, 2406334, 2406354, 2406355, 2406356, 2406369, 2406376, 2406384, 2406391, 2406398, 2406406, 2406409, 2406410, 2406412, 2406413, 2406414, 2406415, 2406416, 2406424, 2406433, 2406434, 2406436, 2406439, 2406440, 2406448, 2406451, 2406486, 2406490, 2406491, 2406492, 2406493, 2406514, 2406538, 2406539, 2406541, 2406560, 2406561, 2406562, 2406576, 2406588, 2406589, 2406590, 2406591, 2406602, 2406612, 2406613, 2406614, 2406693, 2406701, 2406708, 2406740, 2406741, 2406746, 2406747, 2406755, 2406762, 2406776, 2406784, 2406785, 2406786, 2406787, 2406795, 2406803, 2406811, 2406812, 2406818, 2406826, 2406833, 2406841, 2406856, 2406857, 2406859, 2406889, 2406902, 2406903, 2407120, 2407127, 2407136, 2407139, 2407143, 2407145, 2407150, 2407152, 2407153, 2407161, 2407168, 2407176, 2407183, 2407184, 2407185, 2407186, 2407193, 2407213, 2407220, 2407239, 2407266, 2407281, 2407288, 2407296, 2407373, 2407377, 2407385, 2407393, 2407401, 2407408, 2407422, 2407423, 2407430, 2407438, 2407447, 2407473, 2407498, 2407504, 2407511, 2407543, 2407560, 2407562, 2407563, 2407564, 2407565, 2407566, 2407817, 2407824, 2407832, 2407857, 2407880, 2407885, 2407886, 2407894, 2407900, 2407907, 2407969, 2407970, 2408014, 2408022, 2408048]}
|
||||
@@ -0,0 +1,29 @@
|
||||
[
|
||||
{
|
||||
"harness": "pi",
|
||||
"adapter": "/mnt/storage/scratch/tmp/gK4t/mosaic-launch-iZKU4N/adapter.sh",
|
||||
"harnessEnvironmentNames": [
|
||||
"MOSAIC_EXTENSIONS",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"PI_MODEL",
|
||||
"PI_PROVIDER"
|
||||
],
|
||||
"stderr": {
|
||||
"0001.stderr": "fake adapter: claude-opus-5-5\n"
|
||||
}
|
||||
},
|
||||
{
|
||||
"harness": "claude-code",
|
||||
"adapter": "/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/adapters/claude/adapter.sh",
|
||||
"harnessEnvironmentNames": [
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS"
|
||||
],
|
||||
"stderr": {
|
||||
"0001.stderr": "/usr/bin/claude: line 4: /opt/claude-code/bin/claude: No such file or directory\n"
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"stderr": {
|
||||
"mosaic-launch-iZKU4N/data/launches/acme/ra8c2abd7bd04/turns/0001.stderr": "fake adapter: claude-opus-5-5\n"
|
||||
},
|
||||
"presenceOnly": {},
|
||||
"testNamePattern": "a real Claude Code coder's shell"
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:55:43.988482+00:00", "test": "packages/cli/tests/launcher.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gK4t/home", "privateConfig": "/mnt/storage/scratch/tmp/gK4t/home/config/unconfigured.json"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"ra8c2abd7bd04","instance":"chief","turn":"ff93015c-2e74-4e08-88b9-3b7643b1ca92","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rb7c42bc78ce8","instance":"coder","turn":"5c4d34fb-c559-4871-90a4-11a4de671a19","source":"@none","code":"baseline-unknown"}
|
||||
✖ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (715.519681ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 841.384409
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/cli/tests/launcher.test.mjs:857:1
|
||||
✖ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (715.519681ms)
|
||||
AssertionError [ERR_ASSERTION]: The turn failed: adapter exited 127
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/launcher.test.mjs:906: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: null,
|
||||
expected: true,
|
||||
operator: '==',
|
||||
diff: 'simple'
|
||||
}
|
||||
{"phase": "end", "utc": "2026-10-26T22:55:44.875299+00:00", "exit": 1, "niceRestoredTo": 19, "priorityCorrections": {"16": 7, "10": 2}, "ownedPids": [2373340, 2373341, 2373347, 2373367, 2373375, 2373399, 2373400, 2373413, 2373431, 2373432, 2373452, 2373459, 2373460, 2373467, 2373468]}
|
||||
@@ -0,0 +1,636 @@
|
||||
{
|
||||
"stderr": {
|
||||
"mosaic-launch-Hk09z8/data/launches/acme/rcd81cea1fcad/turns/0001.stderr": "fake adapter: claude-opus-5-5\n",
|
||||
"mosaic-launch-Hk09z8/data/launches/acme/r28a6e378f6fa/turns/0001.stderr": "\"claude-sonnet-5-5\" isn't described by this version's model catalog; update Claude Code, or map it with behavesAs on a modelPicker row (or modelOverrides, if it is a provider id of a model this version knows). Until then auto-compact keeps this session within 200k tokens (the context window it assumes); if the model accepts more, append [1m] to the model name for 1M; CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT=1 restores the previous wait-for-the-API behavior.\n[claude-code:unrecognized_model] {\"model\":\"claude-sonnet-5-5\",\"query_source\":\"generate_session_title\"}\n"
|
||||
},
|
||||
"presenceOnly": {
|
||||
"2377754": {
|
||||
"executable": "/bin/sh",
|
||||
"claudeAdapterArgumentPresent": true,
|
||||
"environmentNames": [
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"GIT_AUTHOR_EMAIL",
|
||||
"GIT_AUTHOR_NAME",
|
||||
"GIT_COMMITTER_EMAIL",
|
||||
"GIT_COMMITTER_NAME",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"MOSAIC_CLAUDE_BIN",
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_MODEL",
|
||||
"MOSAIC_POLICY_FILE",
|
||||
"MOSAIC_PROVIDER",
|
||||
"MOSAIC_REQUEST",
|
||||
"MOSAIC_RUN_ID",
|
||||
"MOSAIC_SESSION_DIR",
|
||||
"MOSAIC_SYSTEM_PROMPT_FILE",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"MOSAIC_TOOLS_FILE",
|
||||
"MOSAIC_TOOL_SOCKET",
|
||||
"MOSAIC_TURN_MARKER",
|
||||
"MOSAIC_UNSLOP_LOG",
|
||||
"MOSAIC_WORKSPACE",
|
||||
"PATH",
|
||||
"PWD",
|
||||
"TMPDIR",
|
||||
"TZ",
|
||||
"ZAI_API_KEY"
|
||||
]
|
||||
},
|
||||
"2377757": {
|
||||
"executable": "/opt/claude-code/bin/claude",
|
||||
"claudeAdapterArgumentPresent": false,
|
||||
"environmentNames": [
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"GIT_AUTHOR_EMAIL",
|
||||
"GIT_AUTHOR_NAME",
|
||||
"GIT_COMMITTER_EMAIL",
|
||||
"GIT_COMMITTER_NAME",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"MOSAIC_CLAUDE_BIN",
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_MODEL",
|
||||
"MOSAIC_POLICY_FILE",
|
||||
"MOSAIC_PROVIDER",
|
||||
"MOSAIC_REQUEST",
|
||||
"MOSAIC_RUN_ID",
|
||||
"MOSAIC_SESSION_DIR",
|
||||
"MOSAIC_SYSTEM_PROMPT_FILE",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"MOSAIC_TOOLS_FILE",
|
||||
"MOSAIC_TOOL_SOCKET",
|
||||
"MOSAIC_TURN_MARKER",
|
||||
"MOSAIC_UNSLOP_LOG",
|
||||
"MOSAIC_WORKSPACE",
|
||||
"OLDPWD",
|
||||
"PATH",
|
||||
"PWD",
|
||||
"SHLVL",
|
||||
"TMPDIR",
|
||||
"TZ",
|
||||
"ZAI_API_KEY",
|
||||
"_"
|
||||
]
|
||||
},
|
||||
"2377806": {
|
||||
"executable": "/usr/bin/node",
|
||||
"claudeAdapterArgumentPresent": false,
|
||||
"environmentNames": [
|
||||
"AI_AGENT",
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"CLAUDECODE",
|
||||
"CLAUDE_CODE_ENTRYPOINT",
|
||||
"CLAUDE_CODE_MESSAGING_SOCKET",
|
||||
"CLAUDE_CODE_MESSAGING_TOKEN",
|
||||
"CLAUDE_CODE_SESSION_ID",
|
||||
"CLAUDE_PROJECT_DIR",
|
||||
"COREPACK_ENABLE_AUTO_PIN",
|
||||
"GIT_AUTHOR_EMAIL",
|
||||
"GIT_AUTHOR_NAME",
|
||||
"GIT_COMMITTER_EMAIL",
|
||||
"GIT_COMMITTER_NAME",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"MOSAIC_CLAUDE_BIN",
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_MODEL",
|
||||
"MOSAIC_POLICY_FILE",
|
||||
"MOSAIC_PROVIDER",
|
||||
"MOSAIC_REQUEST",
|
||||
"MOSAIC_RUN_ID",
|
||||
"MOSAIC_SESSION_DIR",
|
||||
"MOSAIC_SYSTEM_PROMPT_FILE",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"MOSAIC_TOOLS_FILE",
|
||||
"MOSAIC_TOOL_SOCKET",
|
||||
"MOSAIC_TURN_MARKER",
|
||||
"MOSAIC_UNSLOP_LOG",
|
||||
"MOSAIC_WORKSPACE",
|
||||
"NoDefaultCurrentDirectoryInExePath",
|
||||
"OLDPWD",
|
||||
"PATH",
|
||||
"PWD",
|
||||
"SHLVL",
|
||||
"TMPDIR",
|
||||
"TZ",
|
||||
"ZAI_API_KEY",
|
||||
"_"
|
||||
]
|
||||
},
|
||||
"2377856": {
|
||||
"executable": "timeout",
|
||||
"claudeAdapterArgumentPresent": false,
|
||||
"environmentNames": [
|
||||
"AI_AGENT",
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"CLAUDECODE",
|
||||
"CLAUDE_CODE_CHILD_SESSION",
|
||||
"CLAUDE_CODE_ENTRYPOINT",
|
||||
"CLAUDE_CODE_MESSAGING_SOCKET",
|
||||
"CLAUDE_CODE_MESSAGING_TOKEN",
|
||||
"CLAUDE_CODE_SESSION_ID",
|
||||
"CLAUDE_PID",
|
||||
"CLAUDE_PROJECT_DIR",
|
||||
"COREPACK_ENABLE_AUTO_PIN",
|
||||
"GIT_AUTHOR_EMAIL",
|
||||
"GIT_AUTHOR_NAME",
|
||||
"GIT_COMMITTER_EMAIL",
|
||||
"GIT_COMMITTER_NAME",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"MOSAIC_CLAUDE_BIN",
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_MODEL",
|
||||
"MOSAIC_POLICY_FILE",
|
||||
"MOSAIC_PROVIDER",
|
||||
"MOSAIC_REQUEST",
|
||||
"MOSAIC_RUN_ID",
|
||||
"MOSAIC_SESSION_DIR",
|
||||
"MOSAIC_SYSTEM_PROMPT_FILE",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"MOSAIC_TOOLS_FILE",
|
||||
"MOSAIC_TOOL_SOCKET",
|
||||
"MOSAIC_TURN_MARKER",
|
||||
"MOSAIC_UNSLOP_LOG",
|
||||
"MOSAIC_WORKSPACE",
|
||||
"NoDefaultCurrentDirectoryInExePath",
|
||||
"OLDPWD",
|
||||
"PATH",
|
||||
"PWD",
|
||||
"SHLVL",
|
||||
"TMPDIR",
|
||||
"TZ",
|
||||
"ZAI_API_KEY",
|
||||
"_"
|
||||
]
|
||||
},
|
||||
"2377857": {
|
||||
"executable": "/usr/bin/node",
|
||||
"claudeAdapterArgumentPresent": false,
|
||||
"environmentNames": [
|
||||
"AI_AGENT",
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"CLAUDECODE",
|
||||
"CLAUDE_CODE_CHILD_SESSION",
|
||||
"CLAUDE_CODE_ENTRYPOINT",
|
||||
"CLAUDE_CODE_MESSAGING_SOCKET",
|
||||
"CLAUDE_CODE_MESSAGING_TOKEN",
|
||||
"CLAUDE_CODE_SESSION_ID",
|
||||
"CLAUDE_PID",
|
||||
"CLAUDE_PROJECT_DIR",
|
||||
"COREPACK_ENABLE_AUTO_PIN",
|
||||
"GIT_AUTHOR_EMAIL",
|
||||
"GIT_AUTHOR_NAME",
|
||||
"GIT_COMMITTER_EMAIL",
|
||||
"GIT_COMMITTER_NAME",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"MOSAIC_CLAUDE_BIN",
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_MODEL",
|
||||
"MOSAIC_POLICY_FILE",
|
||||
"MOSAIC_PROVIDER",
|
||||
"MOSAIC_REQUEST",
|
||||
"MOSAIC_RUN_ID",
|
||||
"MOSAIC_SESSION_DIR",
|
||||
"MOSAIC_SYSTEM_PROMPT_FILE",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"MOSAIC_TOOLS_FILE",
|
||||
"MOSAIC_TOOL_SOCKET",
|
||||
"MOSAIC_TURN_MARKER",
|
||||
"MOSAIC_UNSLOP_LOG",
|
||||
"MOSAIC_WORKSPACE",
|
||||
"NoDefaultCurrentDirectoryInExePath",
|
||||
"OLDPWD",
|
||||
"PATH",
|
||||
"PWD",
|
||||
"SHLVL",
|
||||
"TMPDIR",
|
||||
"TZ",
|
||||
"ZAI_API_KEY",
|
||||
"_"
|
||||
]
|
||||
},
|
||||
"2377854": {
|
||||
"executable": "/bin/sh",
|
||||
"claudeAdapterArgumentPresent": false,
|
||||
"environmentNames": [
|
||||
"AI_AGENT",
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"CLAUDECODE",
|
||||
"CLAUDE_CODE_CHILD_SESSION",
|
||||
"CLAUDE_CODE_ENTRYPOINT",
|
||||
"CLAUDE_CODE_MESSAGING_SOCKET",
|
||||
"CLAUDE_CODE_MESSAGING_TOKEN",
|
||||
"CLAUDE_CODE_SESSION_ID",
|
||||
"CLAUDE_PID",
|
||||
"CLAUDE_PROJECT_DIR",
|
||||
"COREPACK_ENABLE_AUTO_PIN",
|
||||
"GIT_AUTHOR_EMAIL",
|
||||
"GIT_AUTHOR_NAME",
|
||||
"GIT_COMMITTER_EMAIL",
|
||||
"GIT_COMMITTER_NAME",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"MOSAIC_CLAUDE_BIN",
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_MODEL",
|
||||
"MOSAIC_POLICY_FILE",
|
||||
"MOSAIC_PROVIDER",
|
||||
"MOSAIC_REQUEST",
|
||||
"MOSAIC_RUN_ID",
|
||||
"MOSAIC_SESSION_DIR",
|
||||
"MOSAIC_SYSTEM_PROMPT_FILE",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"MOSAIC_TOOLS_FILE",
|
||||
"MOSAIC_TOOL_SOCKET",
|
||||
"MOSAIC_TURN_MARKER",
|
||||
"MOSAIC_UNSLOP_LOG",
|
||||
"MOSAIC_WORKSPACE",
|
||||
"NoDefaultCurrentDirectoryInExePath",
|
||||
"OLDPWD",
|
||||
"PATH",
|
||||
"PWD",
|
||||
"SHLVL",
|
||||
"TMPDIR",
|
||||
"TZ",
|
||||
"ZAI_API_KEY",
|
||||
"_"
|
||||
]
|
||||
},
|
||||
"2377864": {
|
||||
"executable": "/bin/sh",
|
||||
"claudeAdapterArgumentPresent": false,
|
||||
"environmentNames": [
|
||||
"AI_AGENT",
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"CLAUDECODE",
|
||||
"CLAUDE_CODE_CHILD_SESSION",
|
||||
"CLAUDE_CODE_ENTRYPOINT",
|
||||
"CLAUDE_CODE_MESSAGING_SOCKET",
|
||||
"CLAUDE_CODE_MESSAGING_TOKEN",
|
||||
"CLAUDE_CODE_SESSION_ID",
|
||||
"CLAUDE_EFFORT",
|
||||
"CLAUDE_PID",
|
||||
"CLAUDE_PROJECT_DIR",
|
||||
"COREPACK_ENABLE_AUTO_PIN",
|
||||
"GIT_AUTHOR_EMAIL",
|
||||
"GIT_AUTHOR_NAME",
|
||||
"GIT_COMMITTER_EMAIL",
|
||||
"GIT_COMMITTER_NAME",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"MOSAIC_CLAUDE_BIN",
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_MODEL",
|
||||
"MOSAIC_POLICY_FILE",
|
||||
"MOSAIC_PROVIDER",
|
||||
"MOSAIC_REQUEST",
|
||||
"MOSAIC_RUN_ID",
|
||||
"MOSAIC_SESSION_DIR",
|
||||
"MOSAIC_SYSTEM_PROMPT_FILE",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"MOSAIC_TOOLS_FILE",
|
||||
"MOSAIC_TOOL_SOCKET",
|
||||
"MOSAIC_TURN_MARKER",
|
||||
"MOSAIC_UNSLOP_LOG",
|
||||
"MOSAIC_WORKSPACE",
|
||||
"NoDefaultCurrentDirectoryInExePath",
|
||||
"OLDPWD",
|
||||
"PATH",
|
||||
"PWD",
|
||||
"SHLVL",
|
||||
"TMPDIR",
|
||||
"TZ",
|
||||
"ZAI_API_KEY",
|
||||
"_"
|
||||
]
|
||||
},
|
||||
"2377865": {
|
||||
"executable": "timeout",
|
||||
"claudeAdapterArgumentPresent": false,
|
||||
"environmentNames": [
|
||||
"AI_AGENT",
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"CLAUDECODE",
|
||||
"CLAUDE_CODE_CHILD_SESSION",
|
||||
"CLAUDE_CODE_ENTRYPOINT",
|
||||
"CLAUDE_CODE_MESSAGING_SOCKET",
|
||||
"CLAUDE_CODE_MESSAGING_TOKEN",
|
||||
"CLAUDE_CODE_SESSION_ID",
|
||||
"CLAUDE_EFFORT",
|
||||
"CLAUDE_PID",
|
||||
"CLAUDE_PROJECT_DIR",
|
||||
"COREPACK_ENABLE_AUTO_PIN",
|
||||
"GIT_AUTHOR_EMAIL",
|
||||
"GIT_AUTHOR_NAME",
|
||||
"GIT_COMMITTER_EMAIL",
|
||||
"GIT_COMMITTER_NAME",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"MOSAIC_CLAUDE_BIN",
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_MODEL",
|
||||
"MOSAIC_POLICY_FILE",
|
||||
"MOSAIC_PROVIDER",
|
||||
"MOSAIC_REQUEST",
|
||||
"MOSAIC_RUN_ID",
|
||||
"MOSAIC_SESSION_DIR",
|
||||
"MOSAIC_SYSTEM_PROMPT_FILE",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"MOSAIC_TOOLS_FILE",
|
||||
"MOSAIC_TOOL_SOCKET",
|
||||
"MOSAIC_TURN_MARKER",
|
||||
"MOSAIC_UNSLOP_LOG",
|
||||
"MOSAIC_WORKSPACE",
|
||||
"NoDefaultCurrentDirectoryInExePath",
|
||||
"OLDPWD",
|
||||
"PATH",
|
||||
"PWD",
|
||||
"SHLVL",
|
||||
"TMPDIR",
|
||||
"TZ",
|
||||
"ZAI_API_KEY",
|
||||
"_"
|
||||
]
|
||||
},
|
||||
"2377866": {
|
||||
"executable": "/usr/bin/node",
|
||||
"claudeAdapterArgumentPresent": false,
|
||||
"environmentNames": [
|
||||
"AI_AGENT",
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"CLAUDECODE",
|
||||
"CLAUDE_CODE_CHILD_SESSION",
|
||||
"CLAUDE_CODE_ENTRYPOINT",
|
||||
"CLAUDE_CODE_MESSAGING_SOCKET",
|
||||
"CLAUDE_CODE_MESSAGING_TOKEN",
|
||||
"CLAUDE_CODE_SESSION_ID",
|
||||
"CLAUDE_EFFORT",
|
||||
"CLAUDE_PID",
|
||||
"CLAUDE_PROJECT_DIR",
|
||||
"COREPACK_ENABLE_AUTO_PIN",
|
||||
"GIT_AUTHOR_EMAIL",
|
||||
"GIT_AUTHOR_NAME",
|
||||
"GIT_COMMITTER_EMAIL",
|
||||
"GIT_COMMITTER_NAME",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"MOSAIC_CLAUDE_BIN",
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_MODEL",
|
||||
"MOSAIC_POLICY_FILE",
|
||||
"MOSAIC_PROVIDER",
|
||||
"MOSAIC_REQUEST",
|
||||
"MOSAIC_RUN_ID",
|
||||
"MOSAIC_SESSION_DIR",
|
||||
"MOSAIC_SYSTEM_PROMPT_FILE",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"MOSAIC_TOOLS_FILE",
|
||||
"MOSAIC_TOOL_SOCKET",
|
||||
"MOSAIC_TURN_MARKER",
|
||||
"MOSAIC_UNSLOP_LOG",
|
||||
"MOSAIC_WORKSPACE",
|
||||
"NoDefaultCurrentDirectoryInExePath",
|
||||
"OLDPWD",
|
||||
"PATH",
|
||||
"PWD",
|
||||
"SHLVL",
|
||||
"TMPDIR",
|
||||
"TZ",
|
||||
"ZAI_API_KEY",
|
||||
"_"
|
||||
]
|
||||
},
|
||||
"2377874": {
|
||||
"executable": "/usr/bin/zsh",
|
||||
"claudeAdapterArgumentPresent": false,
|
||||
"environmentNames": [
|
||||
"AI_AGENT",
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"CLAUDECODE",
|
||||
"CLAUDE_CODE_ENTRYPOINT",
|
||||
"CLAUDE_CODE_MESSAGING_SOCKET",
|
||||
"CLAUDE_CODE_MESSAGING_TOKEN",
|
||||
"COREPACK_ENABLE_AUTO_PIN",
|
||||
"GIT_AUTHOR_EMAIL",
|
||||
"GIT_AUTHOR_NAME",
|
||||
"GIT_COMMITTER_EMAIL",
|
||||
"GIT_COMMITTER_NAME",
|
||||
"GIT_EDITOR",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"MOSAIC_CLAUDE_BIN",
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_MODEL",
|
||||
"MOSAIC_POLICY_FILE",
|
||||
"MOSAIC_PROVIDER",
|
||||
"MOSAIC_REQUEST",
|
||||
"MOSAIC_RUN_ID",
|
||||
"MOSAIC_SESSION_DIR",
|
||||
"MOSAIC_SYSTEM_PROMPT_FILE",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"MOSAIC_TOOLS_FILE",
|
||||
"MOSAIC_TOOL_SOCKET",
|
||||
"MOSAIC_TURN_MARKER",
|
||||
"MOSAIC_UNSLOP_LOG",
|
||||
"MOSAIC_WORKSPACE",
|
||||
"NoDefaultCurrentDirectoryInExePath",
|
||||
"OLDPWD",
|
||||
"PATH",
|
||||
"PWD",
|
||||
"SHELL",
|
||||
"SHLVL",
|
||||
"TMPDIR",
|
||||
"TZ",
|
||||
"ZAI_API_KEY",
|
||||
"_"
|
||||
]
|
||||
},
|
||||
"2377907": {
|
||||
"executable": "/bin/sh",
|
||||
"claudeAdapterArgumentPresent": false,
|
||||
"environmentNames": [
|
||||
"AI_AGENT",
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"CLAUDECODE",
|
||||
"CLAUDE_CODE_CHILD_SESSION",
|
||||
"CLAUDE_CODE_ENTRYPOINT",
|
||||
"CLAUDE_CODE_MESSAGING_SOCKET",
|
||||
"CLAUDE_CODE_MESSAGING_TOKEN",
|
||||
"CLAUDE_CODE_SESSION_ID",
|
||||
"CLAUDE_EFFORT",
|
||||
"CLAUDE_PID",
|
||||
"CLAUDE_PROJECT_DIR",
|
||||
"COREPACK_ENABLE_AUTO_PIN",
|
||||
"GIT_AUTHOR_EMAIL",
|
||||
"GIT_AUTHOR_NAME",
|
||||
"GIT_COMMITTER_EMAIL",
|
||||
"GIT_COMMITTER_NAME",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"MOSAIC_CLAUDE_BIN",
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_MODEL",
|
||||
"MOSAIC_POLICY_FILE",
|
||||
"MOSAIC_PROVIDER",
|
||||
"MOSAIC_REQUEST",
|
||||
"MOSAIC_RUN_ID",
|
||||
"MOSAIC_SESSION_DIR",
|
||||
"MOSAIC_SYSTEM_PROMPT_FILE",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"MOSAIC_TOOLS_FILE",
|
||||
"MOSAIC_TOOL_SOCKET",
|
||||
"MOSAIC_TURN_MARKER",
|
||||
"MOSAIC_UNSLOP_LOG",
|
||||
"MOSAIC_WORKSPACE",
|
||||
"NoDefaultCurrentDirectoryInExePath",
|
||||
"OLDPWD",
|
||||
"PATH",
|
||||
"PWD",
|
||||
"SHLVL",
|
||||
"TMPDIR",
|
||||
"TZ",
|
||||
"ZAI_API_KEY",
|
||||
"_"
|
||||
]
|
||||
},
|
||||
"2377908": {
|
||||
"executable": "timeout",
|
||||
"claudeAdapterArgumentPresent": false,
|
||||
"environmentNames": [
|
||||
"AI_AGENT",
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"CLAUDECODE",
|
||||
"CLAUDE_CODE_CHILD_SESSION",
|
||||
"CLAUDE_CODE_ENTRYPOINT",
|
||||
"CLAUDE_CODE_MESSAGING_SOCKET",
|
||||
"CLAUDE_CODE_MESSAGING_TOKEN",
|
||||
"CLAUDE_CODE_SESSION_ID",
|
||||
"CLAUDE_EFFORT",
|
||||
"CLAUDE_PID",
|
||||
"CLAUDE_PROJECT_DIR",
|
||||
"COREPACK_ENABLE_AUTO_PIN",
|
||||
"GIT_AUTHOR_EMAIL",
|
||||
"GIT_AUTHOR_NAME",
|
||||
"GIT_COMMITTER_EMAIL",
|
||||
"GIT_COMMITTER_NAME",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"MOSAIC_CLAUDE_BIN",
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_MODEL",
|
||||
"MOSAIC_POLICY_FILE",
|
||||
"MOSAIC_PROVIDER",
|
||||
"MOSAIC_REQUEST",
|
||||
"MOSAIC_RUN_ID",
|
||||
"MOSAIC_SESSION_DIR",
|
||||
"MOSAIC_SYSTEM_PROMPT_FILE",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"MOSAIC_TOOLS_FILE",
|
||||
"MOSAIC_TOOL_SOCKET",
|
||||
"MOSAIC_TURN_MARKER",
|
||||
"MOSAIC_UNSLOP_LOG",
|
||||
"MOSAIC_WORKSPACE",
|
||||
"NoDefaultCurrentDirectoryInExePath",
|
||||
"OLDPWD",
|
||||
"PATH",
|
||||
"PWD",
|
||||
"SHLVL",
|
||||
"TMPDIR",
|
||||
"TZ",
|
||||
"ZAI_API_KEY",
|
||||
"_"
|
||||
]
|
||||
},
|
||||
"2377909": {
|
||||
"executable": "/usr/bin/node",
|
||||
"claudeAdapterArgumentPresent": false,
|
||||
"environmentNames": [
|
||||
"AI_AGENT",
|
||||
"ANTHROPIC_AUTH_TOKEN",
|
||||
"ANTHROPIC_BASE_URL",
|
||||
"CLAUDECODE",
|
||||
"CLAUDE_CODE_CHILD_SESSION",
|
||||
"CLAUDE_CODE_ENTRYPOINT",
|
||||
"CLAUDE_CODE_MESSAGING_SOCKET",
|
||||
"CLAUDE_CODE_MESSAGING_TOKEN",
|
||||
"CLAUDE_CODE_SESSION_ID",
|
||||
"CLAUDE_EFFORT",
|
||||
"CLAUDE_PID",
|
||||
"CLAUDE_PROJECT_DIR",
|
||||
"COREPACK_ENABLE_AUTO_PIN",
|
||||
"GIT_AUTHOR_EMAIL",
|
||||
"GIT_AUTHOR_NAME",
|
||||
"GIT_COMMITTER_EMAIL",
|
||||
"GIT_COMMITTER_NAME",
|
||||
"HOME",
|
||||
"LANG",
|
||||
"MOSAIC_CLAUDE_BIN",
|
||||
"MOSAIC_CLAUDE_MCP_CONFIG",
|
||||
"MOSAIC_CLAUDE_SETTINGS",
|
||||
"MOSAIC_MODEL",
|
||||
"MOSAIC_POLICY_FILE",
|
||||
"MOSAIC_PROVIDER",
|
||||
"MOSAIC_REQUEST",
|
||||
"MOSAIC_RUN_ID",
|
||||
"MOSAIC_SESSION_DIR",
|
||||
"MOSAIC_SYSTEM_PROMPT_FILE",
|
||||
"MOSAIC_THINKING",
|
||||
"MOSAIC_TOOLS",
|
||||
"MOSAIC_TOOLS_FILE",
|
||||
"MOSAIC_TOOL_SOCKET",
|
||||
"MOSAIC_TURN_MARKER",
|
||||
"MOSAIC_UNSLOP_LOG",
|
||||
"MOSAIC_WORKSPACE",
|
||||
"NoDefaultCurrentDirectoryInExePath",
|
||||
"OLDPWD",
|
||||
"PATH",
|
||||
"PWD",
|
||||
"SHLVL",
|
||||
"TMPDIR",
|
||||
"TZ",
|
||||
"ZAI_API_KEY",
|
||||
"_"
|
||||
]
|
||||
}
|
||||
},
|
||||
"testNamePattern": "a real Claude Code coder's shell"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:56:27.743053+00:00", "test": "packages/cli/tests/launcher.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gemC/home", "privateConfig": "/mnt/storage/scratch/tmp/gemC/home/config/unconfigured.json"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rcd81cea1fcad","instance":"chief","turn":"3753376e-f476-40c1-a9e0-bb66d398fe90","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r28a6e378f6fa","instance":"coder","turn":"fc79003d-0737-402f-ab6e-aa31df9035ef","source":"@none","code":"baseline-unknown"}
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1578.452164ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 1699.203833
|
||||
{"phase": "end", "utc": "2026-10-26T22:56:29.477663+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 9, "10": 2}, "ownedPids": [2377617, 2377618, 2377624, 2377632, 2377633, 2377642, 2377666, 2377674, 2377677, 2377678, 2377680, 2377681, 2377682, 2377683, 2377684, 2377692, 2377699, 2377700, 2377705, 2377707, 2377708, 2377754, 2377757, 2377790, 2377806, 2377807, 2377808, 2377809, 2377854, 2377856, 2377857, 2377864, 2377865, 2377866, 2377874, 2377907, 2377908, 2377909]}
|
||||
@@ -0,0 +1,30 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:54:34.244732+00:00", "test": "packages/cli/tests/launcher.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gfiQ/home", "privateConfig": "/mnt/storage/scratch/tmp/gfiQ/home/config/unconfigured.json"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r67b30228d843","instance":"chief","turn":"3a47b058-eabd-4ce4-a13d-9ab74231c27c","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r289541b58094","instance":"coder","turn":"02e4def8-4570-43c5-adc4-56e9d9d651aa","source":"@none","code":"baseline-unknown"}
|
||||
✖ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (730.253532ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 856.684974
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/cli/tests/launcher.test.mjs:857:1
|
||||
✖ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (730.253532ms)
|
||||
AssertionError [ERR_ASSERTION]: The turn failed: adapter exited 127
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/launcher.test.mjs:906: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: null,
|
||||
expected: true,
|
||||
operator: '==',
|
||||
diff: 'simple'
|
||||
}
|
||||
{"phase": "end", "utc": "2026-10-26T22:54:35.133671+00:00", "exit": 1, "niceRestoredTo": 19, "priorityCorrections": {"16": 3}, "ownedPids": [2358566, 2358567, 2358573, 2358661, 2358699, 2358793, 2358796, 2358797, 2358798, 2358803, 2358804, 2358812, 2358839, 2358841, 2358843, 2358846, 2358847, 2358911]}
|
||||
@@ -0,0 +1,39 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:48:15.569231+00:00", "test": "packages/cli/tests/model-managed-launch.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gUiI/home", "privateConfig": "/mnt/storage/scratch/tmp/gUiI/home/config/unconfigured.json"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rc9f20ca79ef3","instance":"chief","turn":"f3d2fafe-96de-4004-a550-82e54c9ebe0b","source":"@none","code":"baseline-unknown"}
|
||||
✔ 653 actual managed proxy launch stays idle unarmed then stops first silent turn through trusted runtime (2639.700775ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rbbdacab5de46","instance":"chief","turn":"8b5e446f-1d26-45a0-98b8-15b96c9e1b8c","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rbbdacab5de46","instance":"chief","turn":"9d65cb54-2192-4bb6-af78-901dd5b83fbe","source":"@none","code":"baseline-unknown"}
|
||||
✔ 653 actual managed proxy output cancels caller watcher and first timestamp never resets (1640.367138ms)
|
||||
✖ 653 actual nonproxy launch writes output without proxy enable or first-turn protocol (76.963712ms)
|
||||
✔ 653 actual refused proxy preflight never enables binds or spawns a managed session (142.056219ms)
|
||||
✔ 653 actual no-launch host refuses before proxy preflight and session side effects (74.66885ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 4
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4716.403381
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/cli/tests/model-managed-launch.test.mjs:21:1
|
||||
✖ 653 actual nonproxy launch writes output without proxy enable or first-turn protocol (76.963712ms)
|
||||
AssertionError [ERR_ASSERTION]: Got unwanted rejection: actual managed proxy launch succeeds after successful preflight
|
||||
Actual message: "PM launch refused: no-session-credential (pi needs its own provider key or a session proxy key)"
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async launched (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/model-managed-launch.test.mjs:10:93)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/model-managed-launch.test.mjs:22:14)
|
||||
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: CliError: PM launch refused: no-session-credential (pi needs its own provider key or a session proxy key)
|
||||
at file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/src/launcher.mjs:1217:23
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5),
|
||||
expected: undefined,
|
||||
operator: 'doesNotReject',
|
||||
diff: 'simple'
|
||||
}
|
||||
{"phase": "end", "utc": "2026-10-26T22:48:20.329972+00:00", "exit": 1, "niceRestoredTo": 19, "priorityCorrections": {"16": 8, "10": 2}, "ownedPids": [2266439, 2266440, 2266446, 2266481, 2266497, 2266499, 2266501, 2266515, 2266516, 2267878, 2269339, 2269365, 2269375, 2269397, 2269398, 2270267, 2270274, 2270275, 2270280, 2270287, 2270289, 2270293, 2270298, 2270305]}
|
||||
@@ -0,0 +1,19 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:50:36.827419+00:00", "test": "packages/cli/tests/model-managed-launch.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gB7i/home", "privateConfig": "/mnt/storage/scratch/tmp/gB7i/home/config/unconfigured.json"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"ref990abb4f3b","instance":"chief","turn":"ddd5278f-2877-4cb9-ac69-f74ad43f70ec","source":"@none","code":"baseline-unknown"}
|
||||
✔ 653 actual managed proxy launch stays idle unarmed then stops first silent turn through trusted runtime (2605.950689ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r2cdfdacb6fa0","instance":"chief","turn":"a07fbfcf-5af5-451a-96b1-f016ec967995","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r2cdfdacb6fa0","instance":"chief","turn":"86510331-2c99-4cfd-9c85-dfa3085b250e","source":"@none","code":"baseline-unknown"}
|
||||
✔ 653 actual managed proxy output cancels caller watcher and first timestamp never resets (1591.297307ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rbc1ba1fa54b9","instance":"chief","turn":"72c9cd83-7336-4be2-9636-74fe1a18e5d7","source":"@none","code":"baseline-unknown"}
|
||||
✔ 653 actual nonproxy launch writes output without proxy enable or first-turn protocol (279.810379ms)
|
||||
✔ 653 actual refused proxy preflight never enables binds or spawns a managed session (141.510868ms)
|
||||
✔ 653 actual no-launch host refuses before proxy preflight and session side effects (72.062877ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 5
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4825.934566
|
||||
{"phase": "end", "utc": "2026-10-26T22:50:41.692800+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 7, "10": 2}, "ownedPids": [2305619, 2305620, 2305626, 2305635, 2305636, 2305638, 2305642, 2305649, 2305651, 2305654, 2305656, 2305657, 2305779, 2305851, 2305859, 2305861, 2305885, 2305886, 2306000, 2306007, 2306008, 2306011, 2306016, 2306017, 2306031, 2306038, 2306039, 2306058, 2306067, 2306074]}
|
||||
@@ -0,0 +1,12 @@
|
||||
{"phase": "start", "utc": "2026-10-26T23:08:56.580845+00:00", "test": "packages/seat/tests/proxy-session-env.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gYDv/home", "privateConfig": "/mnt/storage/scratch/tmp/gYDv/home/config/unconfigured.json"}
|
||||
✔ P3 proxy sessionEnv removes every instance provider credential without widening ENV_ALLOW (0.992066ms)
|
||||
✔ P3 no proxy retains the full existing allowlist and run environment (0.216285ms)
|
||||
ℹ tests 2
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 51.776931
|
||||
{"phase": "end", "utc": "2026-10-26T23:08:56.662060+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {}, "ownedPids": [2533742, 2533744, 2533813]}
|
||||
@@ -0,0 +1,33 @@
|
||||
{"phase": "start", "utc": "2026-10-26T23:08:56.695084+00:00", "test": "packages/seat/tests/proxy-session-env.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/g0fB/home", "privateConfig": "/mnt/storage/scratch/tmp/g0fB/home/config/unconfigured.json"}
|
||||
✖ P3 proxy sessionEnv removes every instance provider credential without widening ENV_ALLOW (1.027092ms)
|
||||
✔ P3 no proxy retains the full existing allowlist and run environment (0.596291ms)
|
||||
ℹ tests 2
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 53.614217
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/seat/tests/proxy-session-env.test.mjs:16:1
|
||||
✖ P3 proxy sessionEnv removes every instance provider credential without widening ENV_ALLOW (1.027092ms)
|
||||
AssertionError [ERR_ASSERTION]: CLAUDE_CODE_OAUTH_TOKEN
|
||||
|
||||
true !== false
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/seat/tests/proxy-session-env.test.mjs:19:40)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: true,
|
||||
expected: false,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
{"phase": "end", "utc": "2026-10-26T23:08:56.796610+00:00", "exit": 1, "niceRestoredTo": 19, "priorityCorrections": {}, "ownedPids": [2533870, 2533871, 2533885]}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"mutant": "M1",
|
||||
"name": "proxy mode still passes CLAUDE_CODE_OAUTH_TOKEN",
|
||||
"source": "packages/seat/src/session.mjs",
|
||||
"test": "packages/seat/tests/proxy-session-env.test.mjs",
|
||||
"old": "!(proxy && isProviderVariable(k))",
|
||||
"new": "!(proxy && isProviderVariable(k) && k !== \"CLAUDE_CODE_OAUTH_TOKEN\")",
|
||||
"bound": 180,
|
||||
"product": "d6dc04e84fac839b7259488162b145b9683f943b",
|
||||
"head": "569765f6de72e82f5ef64c55ca0323ad8b26d7cc",
|
||||
"originalSha256": "488e593811adf369fc94e4b8528e8526bbef054aaa6912911be169eec3971f73",
|
||||
"anchorMatches": 1,
|
||||
"started": "2026-10-26T23:08:56.553917+00:00",
|
||||
"phases": [
|
||||
{
|
||||
"phase": "baseline",
|
||||
"exit": 0,
|
||||
"pass": 2,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"cancelled": 0,
|
||||
"assertionFailure": false
|
||||
},
|
||||
{
|
||||
"phase": "mutant",
|
||||
"exit": 1,
|
||||
"pass": 1,
|
||||
"fail": 1,
|
||||
"skip": 0,
|
||||
"cancelled": 0,
|
||||
"assertionFailure": true
|
||||
},
|
||||
{
|
||||
"phase": "restored",
|
||||
"exit": 0,
|
||||
"pass": 2,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"cancelled": 0,
|
||||
"assertionFailure": false
|
||||
}
|
||||
],
|
||||
"mutantSha256": "b37acf6ba05ee6e68282fd9607baa189377c8d7133cedb5f4992146263647d74",
|
||||
"killed": true,
|
||||
"restoredSha256": "488e593811adf369fc94e4b8528e8526bbef054aaa6912911be169eec3971f73",
|
||||
"byteIdentityRestored": true,
|
||||
"finished": "2026-10-26T23:08:56.915148+00:00",
|
||||
"restoredPositiveControl": true,
|
||||
"allSourcePinsMatch": true
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{"phase": "start", "utc": "2026-10-26T23:08:56.828586+00:00", "test": "packages/seat/tests/proxy-session-env.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gBee/home", "privateConfig": "/mnt/storage/scratch/tmp/gBee/home/config/unconfigured.json"}
|
||||
✔ P3 proxy sessionEnv removes every instance provider credential without widening ENV_ALLOW (0.931301ms)
|
||||
✔ P3 no proxy retains the full existing allowlist and run environment (0.208396ms)
|
||||
ℹ tests 2
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 50.185616
|
||||
{"phase": "end", "utc": "2026-10-26T23:08:56.909866+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 2}, "ownedPids": [2533896, 2533897, 2533903]}
|
||||
@@ -0,0 +1,17 @@
|
||||
{"phase": "start", "utc": "2026-10-26T23:09:04.420882+00:00", "test": "packages/harness/tests/proxy-bundle.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/g5zA/home", "privateConfig": "/mnt/storage/scratch/tmp/g5zA/home/config/unconfigured.json"}
|
||||
✔ P3 Anthropic route uses messages at proxy root and the declared model id (10.935535ms)
|
||||
✔ P3 omitted route refuses proxy-route-missing before model config generation (2.218381ms)
|
||||
✔ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (3.774635ms)
|
||||
✔ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (2.878883ms)
|
||||
✔ P3 a declared Codex route generates only the single build-time responses provider (2.568426ms)
|
||||
✔ P3 models file is private, references the one session key, and stores no executable values or keys (2.660559ms)
|
||||
✔ P3 every launch regenerates proxy port, declared models and own key without caching (4.772779ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 106.011806
|
||||
{"phase": "end", "utc": "2026-10-26T23:09:04.563069+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {}, "ownedPids": [2534458, 2534459, 2534465]}
|
||||
@@ -0,0 +1,65 @@
|
||||
{"phase": "start", "utc": "2026-10-26T23:09:04.595048+00:00", "test": "packages/harness/tests/proxy-bundle.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gItO/home", "privateConfig": "/mnt/storage/scratch/tmp/gItO/home/config/unconfigured.json"}
|
||||
✔ P3 Anthropic route uses messages at proxy root and the declared model id (9.845095ms)
|
||||
✔ P3 omitted route refuses proxy-route-missing before model config generation (1.926701ms)
|
||||
✔ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (2.610438ms)
|
||||
✔ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (2.705658ms)
|
||||
✖ P3 a declared Codex route generates only the single build-time responses provider (3.349943ms)
|
||||
✖ P3 models file is private, references the one session key, and stores no executable values or keys (2.616844ms)
|
||||
✔ P3 every launch regenerates proxy port, declared models and own key without caching (4.607562ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 5
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 103.506871
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:73:1
|
||||
✖ P3 a declared Codex route generates only the single build-time responses provider (3.349943ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ '[fake-value-redacted]'
|
||||
- '$ANTHROPIC_API_KEY'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:80: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: '[fake-value-redacted]',
|
||||
expected: '$ANTHROPIC_API_KEY',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:83:1
|
||||
✖ P3 models file is private, references the one session key, and stores no executable values or keys (2.616844ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ '[fake-value-redacted]'
|
||||
- '$ANTHROPIC_API_KEY'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:88:68)
|
||||
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: '[fake-value-redacted]',
|
||||
expected: '$ANTHROPIC_API_KEY',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
{"phase": "end", "utc": "2026-10-26T23:09:04.737146+00:00", "exit": 1, "niceRestoredTo": 19, "priorityCorrections": {}, "ownedPids": [2534500, 2534501, 2534507]}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"mutant": "M2",
|
||||
"name": "models.json gets literal key instead of environment reference",
|
||||
"source": "packages/plugins/harness/pi/index.mjs",
|
||||
"test": "packages/harness/tests/proxy-bundle.test.mjs",
|
||||
"old": "writeFileSync(file, text, { mode: 0o600, flag: \"wx\" });",
|
||||
"new": "writeFileSync(file, text.replaceAll(\"$ANTHROPIC_API_KEY\", proxy.key), { mode: 0o600, flag: \"wx\" });",
|
||||
"bound": 180,
|
||||
"product": "d6dc04e84fac839b7259488162b145b9683f943b",
|
||||
"head": "569765f6de72e82f5ef64c55ca0323ad8b26d7cc",
|
||||
"originalSha256": "299b5dadc74c2c51253c3d9c6eb2abccba5d59a52f07670b795a343515cd2887",
|
||||
"anchorMatches": 1,
|
||||
"started": "2026-10-26T23:09:04.394151+00:00",
|
||||
"phases": [
|
||||
{
|
||||
"phase": "baseline",
|
||||
"exit": 0,
|
||||
"pass": 7,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"cancelled": 0,
|
||||
"assertionFailure": false
|
||||
},
|
||||
{
|
||||
"phase": "mutant",
|
||||
"exit": 1,
|
||||
"pass": 5,
|
||||
"fail": 2,
|
||||
"skip": 0,
|
||||
"cancelled": 0,
|
||||
"assertionFailure": true
|
||||
},
|
||||
{
|
||||
"phase": "restored",
|
||||
"exit": 0,
|
||||
"pass": 7,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"cancelled": 0,
|
||||
"assertionFailure": false
|
||||
}
|
||||
],
|
||||
"mutantSha256": "4783cccee30cabebe575d39a40755f38f9134dd38a04375b4b35d900ec09291c",
|
||||
"killed": true,
|
||||
"restoredSha256": "299b5dadc74c2c51253c3d9c6eb2abccba5d59a52f07670b795a343515cd2887",
|
||||
"byteIdentityRestored": true,
|
||||
"finished": "2026-10-26T23:09:04.916419+00:00",
|
||||
"restoredPositiveControl": true,
|
||||
"allSourcePinsMatch": true
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{"phase": "start", "utc": "2026-10-26T23:09:04.769328+00:00", "test": "packages/harness/tests/proxy-bundle.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gp6I/home", "privateConfig": "/mnt/storage/scratch/tmp/gp6I/home/config/unconfigured.json"}
|
||||
✔ P3 Anthropic route uses messages at proxy root and the declared model id (9.360437ms)
|
||||
✔ P3 omitted route refuses proxy-route-missing before model config generation (1.792802ms)
|
||||
✔ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (2.527852ms)
|
||||
✔ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (2.711238ms)
|
||||
✔ P3 a declared Codex route generates only the single build-time responses provider (2.561802ms)
|
||||
✔ P3 models file is private, references the one session key, and stores no executable values or keys (2.609422ms)
|
||||
✔ P3 every launch regenerates proxy port, declared models and own key without caching (4.614577ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 99.389553
|
||||
{"phase": "end", "utc": "2026-10-26T23:09:04.911291+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 2}, "ownedPids": [2534563, 2534564, 2534570]}
|
||||
@@ -0,0 +1,17 @@
|
||||
{"phase": "start", "utc": "2026-10-26T23:10:30.722224+00:00", "test": "packages/cli/tests/proxy-context-join.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/grAt/home", "privateConfig": "/mnt/storage/scratch/tmp/grAt/home/config/unconfigured.json"}
|
||||
✔ P3 joined managed zai uses its one admitted P2 key and private run-local config (1276.155483ms)
|
||||
✔ P3 joined managed anthropic uses its one admitted P2 key and private run-local config (1216.348798ms)
|
||||
✔ P3 joined managed proxy:anthropic uses its one admitted P2 key and private run-local config (1212.687554ms)
|
||||
✔ P3 joined managed proxy:glm uses its one admitted P2 key and private run-local config (1216.376543ms)
|
||||
✔ P3 joined managed proxy:codex uses its one admitted P2 key and private run-local config (1266.09568ms)
|
||||
✔ P3 joined Claude harness receives the admitted P2 key only through transient auth env (1220.302261ms)
|
||||
✔ P3 joined unsupported provider refuses with no key acquisition, fallback, or spawned session (74.491685ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 7651.42792
|
||||
{"phase": "end", "utc": "2026-10-26T23:10:38.410259+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 17, "10": 6}, "ownedPids": [2553575, 2553576, 2553582, 2553592, 2553597, 2553604, 2553606, 2553611, 2553612, 2553740, 2553747, 2553749, 2553751, 2553752, 2553753, 2553754, 2553755, 2553837, 2553844, 2553858, 2553861, 2553862, 2553863, 2553864, 2553932, 2553936, 2553955, 2553957, 2553960, 2553961, 2553962, 2553963, 2554119, 2554126, 2554128, 2554171, 2554172, 2554173, 2554174, 2554197, 2554204, 2554205, 2554206, 2554234, 2554235, 2554318, 2554326]}
|
||||
@@ -0,0 +1,132 @@
|
||||
{"phase": "start", "utc": "2026-10-26T23:10:38.450146+00:00", "test": "packages/cli/tests/proxy-context-join.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gLgW/home", "privateConfig": "/mnt/storage/scratch/tmp/gLgW/home/config/unconfigured.json"}
|
||||
✖ P3 joined managed zai uses its one admitted P2 key and private run-local config (1257.519877ms)
|
||||
✖ P3 joined managed anthropic uses its one admitted P2 key and private run-local config (1217.880127ms)
|
||||
✖ P3 joined managed proxy:anthropic uses its one admitted P2 key and private run-local config (1210.996878ms)
|
||||
✖ P3 joined managed proxy:glm uses its one admitted P2 key and private run-local config (1215.453546ms)
|
||||
✖ P3 joined managed proxy:codex uses its one admitted P2 key and private run-local config (1209.946837ms)
|
||||
✖ P3 joined Claude harness receives the admitted P2 key only through transient auth env (1206.342899ms)
|
||||
✔ P3 joined unsupported provider refuses with no key acquisition, fallback, or spawned session (73.793277ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 6
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 7525.886004
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/cli/tests/proxy-context-join.test.mjs:44:3
|
||||
✖ P3 joined managed zai uses its one admitted P2 key and private run-local config (1257.519877ms)
|
||||
AssertionError [ERR_ASSERTION]: session.json contains no credential value
|
||||
|
||||
true !== false
|
||||
|
||||
at privateArtifacts (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/proxy-context-join.test.mjs:26:34)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/proxy-context-join.test.mjs:78:5)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: true,
|
||||
expected: false,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/cli/tests/proxy-context-join.test.mjs:44:3
|
||||
✖ P3 joined managed anthropic uses its one admitted P2 key and private run-local config (1217.880127ms)
|
||||
AssertionError [ERR_ASSERTION]: session.json contains no credential value
|
||||
|
||||
true !== false
|
||||
|
||||
at privateArtifacts (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/proxy-context-join.test.mjs:26:34)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/proxy-context-join.test.mjs:78:5)
|
||||
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: true,
|
||||
expected: false,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/cli/tests/proxy-context-join.test.mjs:44:3
|
||||
✖ P3 joined managed proxy:anthropic uses its one admitted P2 key and private run-local config (1210.996878ms)
|
||||
AssertionError [ERR_ASSERTION]: session.json contains no credential value
|
||||
|
||||
true !== false
|
||||
|
||||
at privateArtifacts (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/proxy-context-join.test.mjs:26:34)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/proxy-context-join.test.mjs:78:5)
|
||||
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: true,
|
||||
expected: false,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/cli/tests/proxy-context-join.test.mjs:44:3
|
||||
✖ P3 joined managed proxy:glm uses its one admitted P2 key and private run-local config (1215.453546ms)
|
||||
AssertionError [ERR_ASSERTION]: session.json contains no credential value
|
||||
|
||||
true !== false
|
||||
|
||||
at privateArtifacts (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/proxy-context-join.test.mjs:26:34)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/proxy-context-join.test.mjs:78:5)
|
||||
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: true,
|
||||
expected: false,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/cli/tests/proxy-context-join.test.mjs:44:3
|
||||
✖ P3 joined managed proxy:codex uses its one admitted P2 key and private run-local config (1209.946837ms)
|
||||
AssertionError [ERR_ASSERTION]: session.json contains no credential value
|
||||
|
||||
true !== false
|
||||
|
||||
at privateArtifacts (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/proxy-context-join.test.mjs:26:34)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/proxy-context-join.test.mjs:78:5)
|
||||
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: true,
|
||||
expected: false,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/cli/tests/proxy-context-join.test.mjs:82:1
|
||||
✖ P3 joined Claude harness receives the admitted P2 key only through transient auth env (1206.342899ms)
|
||||
AssertionError [ERR_ASSERTION]: session.json contains no credential value
|
||||
|
||||
true !== false
|
||||
|
||||
at privateArtifacts (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/proxy-context-join.test.mjs:26:34)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/proxy-context-join.test.mjs:97:3)
|
||||
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: true,
|
||||
expected: false,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
{"phase": "end", "utc": "2026-10-26T23:10:46.014153+00:00", "exit": 1, "niceRestoredTo": 19, "priorityCorrections": {"16": 18, "10": 6}, "ownedPids": [2554329, 2554330, 2554336, 2554351, 2554358, 2554383, 2554384, 2554385, 2554386, 2554638, 2554645, 2554646, 2554647, 2554653, 2554654, 2554772, 2554780, 2554782, 2554787, 2554788, 2554912, 2554919, 2554921, 2554925, 2554927, 2554928, 2554929, 2554930, 2555070, 2555075, 2555094, 2555102, 2555103, 2555173, 2555174, 2555177, 2555197, 2555202, 2555203, 2555286, 2555293]}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"mutant": "M3",
|
||||
"name": "proxy key serialized into session.json",
|
||||
"source": "packages/cli/src/launcher.mjs",
|
||||
"test": "packages/cli/tests/proxy-context-join.test.mjs",
|
||||
"old": "bundle: files,\n harnessEnv,",
|
||||
"new": "bundle: files,\n harnessEnv: bundle.env,",
|
||||
"bound": 300,
|
||||
"product": "d6dc04e84fac839b7259488162b145b9683f943b",
|
||||
"head": "569765f6de72e82f5ef64c55ca0323ad8b26d7cc",
|
||||
"originalSha256": "1001674131006a7e175570993294f72fee446f7b92732c324304eba92c902650",
|
||||
"anchorMatches": 1,
|
||||
"started": "2026-10-26T23:10:30.695062+00:00",
|
||||
"phases": [
|
||||
{
|
||||
"phase": "baseline",
|
||||
"exit": 0,
|
||||
"pass": 7,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"cancelled": 0,
|
||||
"assertionFailure": false
|
||||
},
|
||||
{
|
||||
"phase": "mutant",
|
||||
"exit": 1,
|
||||
"pass": 1,
|
||||
"fail": 6,
|
||||
"skip": 0,
|
||||
"cancelled": 0,
|
||||
"assertionFailure": true
|
||||
},
|
||||
{
|
||||
"phase": "restored",
|
||||
"exit": 0,
|
||||
"pass": 7,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"cancelled": 0,
|
||||
"assertionFailure": false
|
||||
}
|
||||
],
|
||||
"mutantSha256": "e32c3201919695896c1548711efea4a0d15388a6b6d240b2c092cfe9a5d65dc3",
|
||||
"killed": true,
|
||||
"restoredSha256": "1001674131006a7e175570993294f72fee446f7b92732c324304eba92c902650",
|
||||
"byteIdentityRestored": true,
|
||||
"finished": "2026-10-26T23:10:53.705956+00:00",
|
||||
"restoredPositiveControl": true,
|
||||
"allSourcePinsMatch": true
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{"phase": "start", "utc": "2026-10-26T23:10:46.046721+00:00", "test": "packages/cli/tests/proxy-context-join.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gLVM/home", "privateConfig": "/mnt/storage/scratch/tmp/gLVM/home/config/unconfigured.json"}
|
||||
✔ P3 joined managed zai uses its one admitted P2 key and private run-local config (1258.035035ms)
|
||||
✔ P3 joined managed anthropic uses its one admitted P2 key and private run-local config (1213.506446ms)
|
||||
✔ P3 joined managed proxy:anthropic uses its one admitted P2 key and private run-local config (1218.116116ms)
|
||||
✔ P3 joined managed proxy:glm uses its one admitted P2 key and private run-local config (1212.345423ms)
|
||||
✔ P3 joined managed proxy:codex uses its one admitted P2 key and private run-local config (1234.643867ms)
|
||||
✔ P3 joined Claude harness receives the admitted P2 key only through transient auth env (1276.417651ms)
|
||||
✔ P3 joined unsupported provider refuses with no key acquisition, fallback, or spawned session (75.156555ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 7622.740802
|
||||
{"phase": "end", "utc": "2026-10-26T23:10:53.700548+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 18, "10": 6}, "ownedPids": [2555296, 2555297, 2555303, 2555349, 2555350, 2555353, 2555356, 2555363, 2555368, 2555369, 2555370, 2555371, 2555445, 2555462, 2555463, 2555464, 2555465, 2555481, 2555482, 2555549, 2555556, 2555557, 2555569, 2555574, 2555575, 2555644, 2555651, 2555653, 2555655, 2555656, 2555658, 2555659, 2556830, 2556876, 2556901, 2556926, 2556929, 2557010, 2557014, 2558504, 2558588, 2558627, 2558660, 2558666, 2558667, 2559442, 2559468]}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"utc": "2026-10-26T23:11:56.271722+00:00",
|
||||
"ownedTempRootsChecked": [
|
||||
"/mnt/storage/scratch/tmp/g0fB",
|
||||
"/mnt/storage/scratch/tmp/g5zA",
|
||||
"/mnt/storage/scratch/tmp/gBee",
|
||||
"/mnt/storage/scratch/tmp/gItO",
|
||||
"/mnt/storage/scratch/tmp/gLVM",
|
||||
"/mnt/storage/scratch/tmp/gLgW",
|
||||
"/mnt/storage/scratch/tmp/gYDv",
|
||||
"/mnt/storage/scratch/tmp/gp6I",
|
||||
"/mnt/storage/scratch/tmp/grAt"
|
||||
],
|
||||
"remainingInOwnedRoots": [],
|
||||
"allSixProductionPinsMatch": true
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
# Exact, reversible mutations of this owned worktree only. No product commit changes.
|
||||
import argparse,datetime,hashlib,json,os,pathlib,re,subprocess,sys
|
||||
p=argparse.ArgumentParser();p.add_argument('mutant',choices=['M1','M2','M3']);p.add_argument('--heavy-slot',action='store_true');args=p.parse_args()
|
||||
if args.mutant=='M3' and not args.heavy_slot:p.error('M3 held until227 SLOTBACK; then require --heavy-slot')
|
||||
folder=pathlib.Path(__file__).resolve().parent;profile=folder.parent/'run-targeted.py'
|
||||
repo=pathlib.Path(subprocess.check_output(['git','rev-parse','--show-toplevel'],cwd=folder,text=True).strip())
|
||||
anchors={
|
||||
'M1':{'name':'proxy mode still passes CLAUDE_CODE_OAUTH_TOKEN','source':'packages/seat/src/session.mjs','test':'packages/seat/tests/proxy-session-env.test.mjs','old':'!(proxy && isProviderVariable(k))','new':'!(proxy && isProviderVariable(k) && k !== "CLAUDE_CODE_OAUTH_TOKEN")','bound':180},
|
||||
'M2':{'name':'models.json gets literal key instead of environment reference','source':'packages/plugins/harness/pi/index.mjs','test':'packages/harness/tests/proxy-bundle.test.mjs','old':'writeFileSync(file, text, { mode: 0o600, flag: "wx" });','new':'writeFileSync(file, text.replaceAll("$ANTHROPIC_API_KEY", proxy.key), { mode: 0o600, flag: "wx" });','bound':180},
|
||||
'M3':{'name':'proxy key serialized into session.json','source':'packages/cli/src/launcher.mjs','test':'packages/cli/tests/proxy-context-join.test.mjs','old':'bundle: files,\n harnessEnv,','new':'bundle: files,\n harnessEnv: bundle.env,','bound':300},
|
||||
}
|
||||
case=anchors[args.mutant];source=repo/case['source'];original=source.read_bytes();old=case['old'].encode();new=case['new'].encode()
|
||||
pins=json.loads((folder.parent/'source-pins.json').read_text());pin={r['file']:r['sha256'] for r in pins}
|
||||
def verify_all():
|
||||
for file,want in pin.items():
|
||||
if hashlib.sha256((repo/file).read_bytes()).hexdigest()!=want:raise RuntimeError('source identity mismatch:'+file)
|
||||
verify_all()
|
||||
if original.count(old)!=1:raise RuntimeError('exact anchor must match once')
|
||||
if subprocess.run(['git','diff','--quiet','HEAD','--',case['source']],cwd=repo).returncode:raise RuntimeError('source dirty before mutation')
|
||||
out=folder/args.mutant;out.mkdir(mode=0o700)
|
||||
receipt={'mutant':args.mutant,**case,'product':'d6dc04e84fac839b7259488162b145b9683f943b','head':subprocess.check_output(['git','rev-parse','HEAD'],cwd=repo,text=True).strip(),'originalSha256':hashlib.sha256(original).hexdigest(),'anchorMatches':1,'started':datetime.datetime.now(datetime.timezone.utc).isoformat(),'phases':[]}
|
||||
def run(phase):
|
||||
tmp=subprocess.check_output(['mktemp','-d','/mnt/storage/scratch/tmp/gXXX'],text=True).strip()
|
||||
result=subprocess.run([sys.executable,str(profile),case['test'],str(case['bound'])],cwd=repo,env={'PATH':'/usr/bin:/bin','TMPDIR':tmp,'LANG':'C.UTF-8'},stdout=subprocess.PIPE,stderr=subprocess.STDOUT,timeout=case['bound']+15)
|
||||
text=result.stdout.decode(errors='replace')
|
||||
# Only made-up unit-test values can occur, but never retain their values in receipts.
|
||||
text=re.sub(r'fx332-[A-Za-z0-9_-]+','[fake-value-redacted]',text)
|
||||
(out/(phase+'.txt')).write_text(text)
|
||||
def count(label):
|
||||
match=re.search(r'^ℹ '+label+r' (\d+)$',text,re.M);return int(match.group(1)) if match else None
|
||||
info={'phase':phase,'exit':result.returncode,'pass':count('pass'),'fail':count('fail'),'skip':count('skipped'),'cancelled':count('cancelled'),'assertionFailure':'ERR_ASSERTION' in text}
|
||||
receipt['phases'].append(info);return info
|
||||
mutated=False
|
||||
try:
|
||||
baseline=run('baseline')
|
||||
if baseline['exit']!=0 or baseline['fail']!=0 or baseline['skip']!=0:raise RuntimeError('baseline not green')
|
||||
source.write_bytes(original.replace(old,new,1));mutated=True
|
||||
receipt['mutantSha256']=hashlib.sha256(source.read_bytes()).hexdigest()
|
||||
negative=run('mutant')
|
||||
receipt['killed']=negative['exit']==1 and (negative['fail'] or 0)>0 and negative['assertionFailure'] and negative['cancelled']==0 and negative['skip']==0
|
||||
if not receipt['killed']:raise RuntimeError('mutant did not produce the required assertion RED')
|
||||
finally:
|
||||
if mutated:source.write_bytes(original)
|
||||
receipt['restoredSha256']=hashlib.sha256(source.read_bytes()).hexdigest()
|
||||
receipt['byteIdentityRestored']=source.read_bytes()==original
|
||||
verify_all()
|
||||
receipt['finished']=datetime.datetime.now(datetime.timezone.utc).isoformat()
|
||||
(out/'receipt.json').write_text(json.dumps(receipt,indent=2)+'\n')
|
||||
restored=run('restored')
|
||||
receipt['restoredPositiveControl']=restored['exit']==0 and restored['fail']==0 and restored['skip']==0
|
||||
verify_all()
|
||||
receipt['allSourcePinsMatch']=True
|
||||
receipt['finished']=datetime.datetime.now(datetime.timezone.utc).isoformat()
|
||||
(out/'receipt.json').write_text(json.dumps(receipt,indent=2)+'\n')
|
||||
print(json.dumps(receipt,indent=2))
|
||||
if not receipt['restoredPositiveControl']:raise SystemExit(1)
|
||||
@@ -0,0 +1,31 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:51:02.667881+00:00", "test": "packages/bus/tests/model-hire-ownership.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gZgu/home", "privateConfig": "/mnt/storage/scratch/tmp/gZgu/home/config/unconfigured.json"}
|
||||
✔ 655 listed duplicate with no record refuses before any model or management effects (109.794538ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rd49e11751f30","instance":"aide","turn":"75446f2f-e922-4314-9a9c-450ac12883cd","source":"@none","code":"baseline-unknown"}
|
||||
✔ 655 actual launch own preflight generation and bound consumer survive concurrent duplicate hire (349.076485ms)
|
||||
✔ 655 shared validation retired name has no credential effects (91.818098ms)
|
||||
✔ 655 shared validation listed duplicate vars has no credential effects (95.394949ms)
|
||||
✔ 655 shared validation fired mismatched legal definition has no credential effects (92.048172ms)
|
||||
✔ 655 shared validation fired matching definition with vars has no credential effects (78.009131ms)
|
||||
✔ 655 existing Broker kept target refusal remains before model effects (81.701415ms)
|
||||
✔ 655 existing Broker noHire definition refusal remains before model effects (85.595406ms)
|
||||
✔ 655 existing Broker ineligible definition refusal remains before model effects (90.966856ms)
|
||||
✔ 655 existing Broker invalid vars refusal remains before model effects (86.20613ms)
|
||||
✔ 655 existing nonchief actor refusal remains before shared checks and model effects (81.273629ms)
|
||||
✔ 655 valid fired matching definition rehire publishes before queued acquisition (115.399128ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rb3ae48cd9dc3","instance":"aide","turn":"1d5081c0-530e-4ca7-8ffd-2a8c8b220f94","source":"@none","code":"baseline-unknown"}
|
||||
✔ 655 preexisting admitted generation and retiring metadata survive duplicate failure (1113.448375ms)
|
||||
✔ 655 captured revision is checked after controller queue before generation issue (113.529417ms)
|
||||
✔ 655 genuine new generation revision failure cleans before queued acquisition receives a key (113.056302ms)
|
||||
✔ 655 failed cleanup retains revoking intent and refuses queued admission (108.822666ms)
|
||||
✔ 655 no-launch remains before own preflight and grants no consumer or stop authority (76.897772ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r9393a940ef12","instance":"aide","turn":"0fdebd39-7c8f-4089-9bdb-5be180566fb5","source":"@none","code":"baseline-unknown"}
|
||||
✔ 655 explicit lifecycle end confirms own exit before ordinary fire removes generation (330.668257ms)
|
||||
ℹ tests 18
|
||||
ℹ suites 0
|
||||
ℹ pass 18
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3353.476714
|
||||
{"phase": "end", "utc": "2026-10-26T22:51:06.057679+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 11, "10": 1}, "ownedPids": [2309035, 2309036, 2309054, 2309068, 2309069, 2309076, 2309090, 2309097, 2309103, 2309104, 2309105, 2309106, 2309128, 2309135, 2309137, 2309141, 2309154, 2309162, 2309171, 2309172, 2309177, 2309185, 2309187, 2309191, 2309199, 2309206, 2309211, 2309218, 2309224, 2309263, 2309272, 2309273, 2309275, 2309282, 2309288, 2309313, 2309316, 2309320, 2309345, 2309373, 2309382, 2309383, 2309384, 2309385, 2309445, 2309452, 2309453, 2309458, 2309465, 2309471, 2309478, 2309480, 2309485, 2309492, 2309495, 2309498, 2309508, 2309514, 2309515]}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:53:23.310656+00:00", "test": "packages/business/tests/launch-settings.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gYee/home", "privateConfig": "/mnt/storage/scratch/tmp/gYee/home/config/unconfigured.json"}
|
||||
✔ REQ-LIMIT-1 schema: every scope unset or zero, adjustable above four, bad values and unknown models refuse (11.573967ms)
|
||||
✔ REQ-LIMIT-1 counts each exact scope at/over limit, unlimited and old tuple after model reassignment (0.641878ms)
|
||||
✔ REQ-ROLE-3 writer: atomic validated revision, immutable previous bytes and authenticated actor/old/new receipt (16.972817ms)
|
||||
✔ REQ-ROLE-3 writer: pre-rename fault leaves old file, post-rename recovery records commit, conflicting recovery refuses (14.727833ms)
|
||||
✔ REQ-LIMIT-1 / decision145 migration prints only, preserves values, rejects ambiguity, and is idempotent (3.585985ms)
|
||||
✔ REQ-LIMIT-1 shared settings validates the complete proposed selection and logs exact actor (18.692699ms)
|
||||
✔ REQ-LIMIT-1 provider is table data: another provider routes separately and aliases share exact counts (1.752471ms)
|
||||
✔ REQ-ROLE-3 refuses live writer locks, symlink targets and uncertain recovery without changing bytes (9.876304ms)
|
||||
✔ Q169 assistants: vars and definition change and log the actor; tracker null leaves no tracker (16.131671ms)
|
||||
✔ Q169 assistants: refuses other instances, other definitions, holder and credentials, empty entries, a tracker the definition has no credential for and a stale revision (16.700057ms)
|
||||
✔ Q169 assistants: a definition with a vikunja credential takes a tracker change and refuses its removal or a used bot (11.084777ms)
|
||||
✔ row 65 routes lists every instance with harness, model, thinking and fallback, the switched-on harnesses, the model keys and each harness's levels (2.096125ms)
|
||||
✔ row 65 setRoutes saves a harness, model, thinking and whole fallback, reads each back from the file, logs the actor, and a null fallback clears all three (13.861841ms)
|
||||
✔ row 65 setRoutes refuses a partial fallback, a switched-off harness, a level the harness doesn't apply, an unloaded module, an unknown model or instance, a malformed route, no change and a stale revision, with the file unchanged (19.63921ms)
|
||||
✔ row 65 a file with harness vars and no plugins.harness loads and its views read; a model change still saves, and a route change refuses harness-off (9.537048ms)
|
||||
✔ B7 kept instance: the models keys it names and the instances key are the human's (24.366874ms)
|
||||
✔ B7 kept instance: its route is the human's (9.26314ms)
|
||||
✔ M10 creative instance: models keys it names, the instances key and its route are the human's (32.027407ms)
|
||||
ℹ tests 18
|
||||
ℹ suites 0
|
||||
ℹ pass 18
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 296.815481
|
||||
{"phase": "end", "utc": "2026-10-26T22:53:23.635024+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 2}, "ownedPids": [2343288, 2343289, 2343295]}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:53:23.165548+00:00", "test": "packages/business/tests/proxy-launch.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gBEU/home", "privateConfig": "/mnt/storage/scratch/tmp/gBEU/home/config/unconfigured.json"}
|
||||
✔ P3 proxy model validation preserves each explicit wire route and the proxy model id (1.16632ms)
|
||||
✔ P3 a proxy model without route refuses proxy-route-missing (0.346807ms)
|
||||
✔ P3 an unknown proxy route refuses proxy-route-unknown (0.622115ms)
|
||||
✔ P3 nonproxy models retain their provider/model-only shape and reject route metadata (0.170611ms)
|
||||
✔ P3 launch.account accepts the proxy credential source without naming host variables (0.127905ms)
|
||||
✔ P3 existing environment-set accounts retain their validated representation (0.200134ms)
|
||||
ℹ tests 6
|
||||
ℹ suites 0
|
||||
ℹ pass 6
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 50.372789
|
||||
{"phase": "end", "utc": "2026-10-26T22:53:23.246685+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {}, "ownedPids": [2343173, 2343174, 2343180]}
|
||||
@@ -0,0 +1,77 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:51:49.070987+00:00", "test": "packages/cli/tests/launcher.test.mjs", "bound": 300, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/g5QI/home", "privateConfig": "/mnt/storage/scratch/tmp/g5QI/home/config/unconfigured.json"}
|
||||
✔ C2-04: launcher workspace clones code but never the library (1432.07351ms)
|
||||
✔ P3 proxy key reaches the spawned runner but never session.json or the bundle (1352.552869ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1350.845871ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r43e77009d9c8","instance":"chief","turn":"9519aad8-1dee-4e95-b0f1-69e7d4154b3e","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r86de0c90a3e8","instance":"coder","turn":"33a2ec36-30eb-45ed-a072-49f14c6cce56","source":"@none","code":"baseline-unknown"}
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (822.691384ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"ra85df4cfc53c","instance":"chief","turn":"31b59f05-6257-400d-8f59-041d3c8f661d","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rb57ada0b5f2f","instance":"pm","turn":"d5f19274-8e66-4ec9-925e-8f068c0e0675","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"ra85df4cfc53c","instance":"chief","turn":"c4b2c218-47d5-4c7b-80b5-01bce5dc89d3","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rb57ada0b5f2f","instance":"pm","turn":"2da55dea-ea88-4292-8c64-24696c02d9d9","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rb57ada0b5f2f","instance":"pm","turn":"7f4309b9-1300-4a79-b9fa-fd0090d22def","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"ra85df4cfc53c","instance":"chief","turn":"bcd859c0-0020-4e04-b72c-6b7fdee57e78","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rb57ada0b5f2f","instance":"pm","turn":"d2626841-3004-490d-9734-5c674def324d","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"ra85df4cfc53c","instance":"chief","turn":"bbd65def-f6be-4d7c-8b01-73d1074845c8","source":"@none","code":"baseline-unknown"}
|
||||
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (1434.912744ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (4189.823793ms)
|
||||
✔ a role the broker says holds a merge decision gets land_work, its prompt line, its landing and the git socket; without it, none (763.507256ms)
|
||||
✔ REQ-LAUNCH-1 the tick starts a listed merge decision holder once, with land_work, the Landing line and its landing turn; an unlisted holder starts nothing (438.286278ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r53387b89999d","instance":"coder","turn":"f2b9ed92-b96b-43e3-b4f7-2a98e1830da7","source":"@none","code":"baseline-unknown"}
|
||||
✔ a holder running since before the resolution is stopped once the broker releases it, land-relaunch, and the next tick starts it: landing turn first, then the message that waited (794.46264ms)
|
||||
✔ a landing run that ended isn't started again for its decision, a spent decision starts nothing, and a new decision starts the holder (716.091801ms)
|
||||
✔ after a restart, the new host's first tick starts a holder whose decision is still held (943.977501ms)
|
||||
✔ a refused landing start is logged once per code with its decision, isn't a start, and the next tick with room starts the holder (673.659009ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (284.821234ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (360.102134ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (199.652127ms)
|
||||
✔ a pi launch with no own credential refuses no-session-credential (199.074179ms)
|
||||
usage: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/down is missing","kept":[]}
|
||||
plugins: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/down is missing","kept":[]}
|
||||
✔ row 65 a failed primary preflight launches the fallback on a fixture harness module, recording the route and the reason (381.375016ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (415.232853ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (204.320598ms)
|
||||
✔ row 64 a role skill that isn't enabled refuses skill-not-enabled, and one that isn't a plain directory skill-refused, before anything starts (200.26144ms)
|
||||
✔ row 213 a creative instance's persona is read from <configDir>/personas: off its digest the launch fails with the mismatch as its reason (279.065674ms)
|
||||
✔ row 64 on Claude Code a role skill that isn't enabled refuses the same way, before anything starts (200.123772ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r5d638c9ada62","instance":"chief","turn":"e02d32ab-d81f-41df-bd1f-e48f82c67a59","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rc8d3abf5a11e","instance":"coder","turn":"81185a44-d3c4-477a-8970-4e41b968a20c","source":"@none","code":"baseline-unknown"}
|
||||
✖ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (676.339329ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (1152.510326ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (4104.557885ms)
|
||||
✔ bus start --no-launch leaves an earlier host's live session alone: no signal, no end, sessions.json as it was (250.878026ms)
|
||||
✔ bus start --no-launch refuses every launch: the PM launch and a session's request, each logged, nothing spawned (209.095227ms)
|
||||
✔ bus start --no-launch starts no thread tick; the same host with launches runs it (1191.473972ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (193.639734ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (205.041619ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (200.32717ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1394.16726ms)
|
||||
✔ kill switch refuses chief and hire before launch work and a clear permits a later request (375.648822ms)
|
||||
✔ kill switch stops an actual managed namespace and records the halt reason without rewriting its bundle (362.279142ms)
|
||||
✔ a launch waiting across halt and resume cannot use its stale admission (211.837311ms)
|
||||
ℹ tests 35
|
||||
ℹ suites 0
|
||||
ℹ pass 34
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 28287.878381
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/cli/tests/launcher.test.mjs:857:1
|
||||
✖ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (676.339329ms)
|
||||
AssertionError [ERR_ASSERTION]: The turn failed: adapter exited 127
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/launcher.test.mjs:906:10)
|
||||
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: null,
|
||||
expected: true,
|
||||
operator: '==',
|
||||
diff: 'simple'
|
||||
}
|
||||
{"phase": "end", "utc": "2026-10-26T22:52:17.391871+00:00", "exit": 1, "niceRestoredTo": 19, "priorityCorrections": {"16": 105, "10": 19}, "ownedPids": [2321417, 2321418, 2321441, 2321450, 2321451, 2321455, 2321460, 2321518, 2321596, 2321597, 2321598, 2321603, 2321604, 2321629, 2321741, 2321742, 2321781, 2321782, 2321891, 2321923, 2322000, 2322007, 2322008, 2322011, 2322016, 2322017, 2322090, 2322098, 2322107, 2322108, 2322109, 2322113, 2322147, 2322148, 2322393, 2322400, 2322408, 2322412, 2322413, 2322416, 2322417, 2322418, 2322419, 2322434, 2322444, 2322447, 2322448, 2322449, 2322450, 2322503, 2322630, 2322637, 2322645, 2322646, 2322647, 2322649, 2322655, 2322656, 2322664, 2322683, 2322684, 2322709, 2322711, 2322779, 2322786, 2322794, 2322801, 2322821, 2322836, 2322845, 2322860, 2322861, 2322877, 2322884, 2322892, 2322897, 2322898, 2322900, 2322901, 2322902, 2322903, 2322904, 2322915, 2323008, 2323015, 2323023, 2323052, 2323053, 2323054, 2323055, 2323104, 2323143, 2323208, 2323222, 2323224, 2323295, 2323381, 2323385, 2323471, 2323478, 2323486, 2323487, 2323488, 2323495, 2323496, 2323509, 2323518, 2323529, 2323547, 2323562, 2323563, 2323566, 2323567, 2323568, 2323569, 2323596, 2323614, 2323652, 2323670, 2323706, 2323707, 2323716, 2323725, 2323729, 2323736, 2323746, 2323760, 2323761, 2323763, 2323766, 2323767, 2323775, 2323776, 2323779, 2323789, 2323790, 2323804, 2323805, 2323817, 2323824, 2323839, 2323856, 2323864, 2323868, 2323873, 2323874, 2323883, 2323917, 2324008, 2324009, 2324010, 2324011, 2324026, 2324033, 2324049, 2324065, 2324066, 2324101, 2324102, 2324140, 2324148, 2324155, 2324164, 2324172, 2324204, 2324210, 2324214, 2324215, 2324226, 2324247, 2324254, 2324263, 2324275, 2324280, 2324281, 2324291, 2324292, 2324294, 2324295, 2324302, 2324303, 2324311, 2324320, 2324325, 2324332, 2324359, 2324360, 2324361, 2324369, 2324374, 2324381, 2324389, 2324404, 2324405, 2324407, 2324408, 2324409, 2324410, 2324411, 2324469, 2324476, 2324516, 2324523, 2324531, 2324539, 2324546, 2324565, 2324585, 2324586, 2324597, 2324599, 2324608, 2324609, 2324648, 2324654, 2324661, 2324669, 2324673, 2324674, 2324679, 2324680, 2324694, 2324701, 2324709, 2324717, 2324724, 2324733, 2324740, 2324747, 2324759, 2324782, 2324789, 2324858, 2324877, 2324891, 2324895, 2324897, 2324898, 2324899, 2324900, 2324901, 2324909, 2324931, 2324934, 2324935, 2324937, 2324938, 2324963, 2324972, 2324979, 2324996, 2324997, 2325035, 2325056, 2325154, 2325192, 2325202, 2325205, 2325209, 2325210, 2325229, 2325241, 2325266, 2325284, 2325305, 2325312, 2325364, 2325393, 2325394, 2325735, 2325754, 2325773, 2325777, 2325781, 2325783, 2325792, 2325793, 2325801, 2325808, 2325829, 2325849, 2325850, 2325851, 2325864, 2325889, 2325928, 2325931, 2325936, 2325943, 2325951, 2325961, 2325979, 2326065, 2326076, 2326084, 2326248, 2326254, 2326261, 2326269, 2326276, 2326283, 2326317, 2326329, 2326336, 2326343, 2326385, 2326411, 2326419, 2326437, 2326445, 2326460, 2326463, 2326464, 2326465, 2326467, 2326524, 2326531, 2326539, 2326543, 2326545, 2326553, 2326559, 2326560, 2326561, 2326583, 2326587, 2326594, 2326645, 2326648, 2326649, 2326669, 2326671, 2326672, 2326673, 2326674, 2326688, 2326695, 2326716]}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:51:48.694586+00:00", "test": "packages/harness/tests/proxy-bundle.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/glVH/home", "privateConfig": "/mnt/storage/scratch/tmp/glVH/home/config/unconfigured.json"}
|
||||
✔ P3 Anthropic route uses messages at proxy root and the declared model id (11.100024ms)
|
||||
✔ P3 omitted route refuses proxy-route-missing before model config generation (1.82997ms)
|
||||
✔ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (2.540838ms)
|
||||
✔ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (2.882177ms)
|
||||
✔ P3 a declared Codex route generates only the single build-time responses provider (2.857517ms)
|
||||
✔ P3 models file is private, references the one session key, and stores no executable values or keys (2.776813ms)
|
||||
✔ P3 every launch regenerates proxy port, declared models and own key without caching (4.786048ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 109.718996
|
||||
{"phase": "end", "utc": "2026-10-26T22:51:48.836792+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {}, "ownedPids": [2321255, 2321256, 2321274]}
|
||||
@@ -0,0 +1,19 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:53:23.698563+00:00", "test": "packages/plugins/tests/harness.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gIwJ/home", "privateConfig": "/mnt/storage/scratch/tmp/gIwJ/home/config/unconfigured.json"}
|
||||
✔ row 65 both harness modules load through the loader with every export the kind names (8.766916ms)
|
||||
✔ row 65 each module answers for its own harness: adapter, levels, account, web, turn end and session files (0.74788ms)
|
||||
✔ row 65 claude-code preflight: a missing credential, then a missing or relative binary, each refuse with their code (3.653296ms)
|
||||
✔ row 65 claude-code version asks MOSAIC_CLAUDE_BIN when set, else claude on PATH, else null (3.721762ms)
|
||||
✔ row 65 pi preflight refuses missing credentials, and its version is the package pin (0.623282ms)
|
||||
✔ row 65 env passes the thinking level to both adapters, and claude-code's bundle writes its hook and MCP files (1.228188ms)
|
||||
✔ row 65 a route's thinking reaches pi as --thinking and claude as --effort, through each module's env and adapter (16.247576ms)
|
||||
✔ row 65 no core source outside packages/plugins names a harness, apart from the listed exceptions (38.861929ms)
|
||||
✔ row 65 the grep's pattern catches a quoted name and a regex alternation, and not a word in prose (0.137314ms)
|
||||
ℹ tests 9
|
||||
ℹ suites 0
|
||||
ℹ pass 9
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 123.176716
|
||||
{"phase": "end", "utc": "2026-10-26T22:53:23.860975+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {}, "ownedPids": [2343383, 2343384, 2343390]}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:51:48.903406+00:00", "test": "packages/plugins/tests/proxy-harness.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gZJb/home", "privateConfig": "/mnt/storage/scratch/tmp/gZJb/home/config/unconfigured.json"}
|
||||
✔ P3 Claude env receives the session proxy URL and key, without another agent or host credential (2.472782ms)
|
||||
✔ P3 Claude preflight accepts a proxy key without a host provider credential (1.1304ms)
|
||||
✔ P3 pi refuses no-session-credential with no provider key (2.19488ms)
|
||||
✔ P3 pi refuses no-session-credential with only a Claude OAuth token (0.272298ms)
|
||||
✔ P3 pi accepts its own provider key or a session proxy key (0.357178ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 5
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 65.753782
|
||||
{"phase": "end", "utc": "2026-10-26T22:51:49.004894+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 1}, "ownedPids": [2321337, 2321338, 2321345]}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:53:23.018103+00:00", "test": "packages/seat/tests/proxy-session-env.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gYTO/home", "privateConfig": "/mnt/storage/scratch/tmp/gYTO/home/config/unconfigured.json"}
|
||||
✔ P3 proxy sessionEnv removes every instance provider credential without widening ENV_ALLOW (0.985317ms)
|
||||
✔ P3 no proxy retains the full existing allowlist and run environment (0.201871ms)
|
||||
ℹ tests 2
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 48.593487
|
||||
{"phase": "end", "utc": "2026-10-26T22:53:23.099336+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {"16": 2}, "ownedPids": [2343110, 2343111, 2343117]}
|
||||
@@ -0,0 +1,44 @@
|
||||
[
|
||||
{
|
||||
"file": "packages/bus/src/runtime.mjs",
|
||||
"base": "09a847ed",
|
||||
"before": "7d3ec68826cc39a46833019e8647eda353def15d23713b118472202a7361aaa5",
|
||||
"after": "7d3ec68826cc39a46833019e8647eda353def15d23713b118472202a7361aaa5",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/bus/src/process.mjs",
|
||||
"base": "09a847ed",
|
||||
"before": "ed13afdce6359df31d35a79496ebb4afdefef82030a8326a76b2a25b37e98d9d",
|
||||
"after": "ed13afdce6359df31d35a79496ebb4afdefef82030a8326a76b2a25b37e98d9d",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/bus/src/model-keys.mjs",
|
||||
"base": "09a847ed",
|
||||
"before": "b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550",
|
||||
"after": "b4e11975bd56db4c816ada297902f033b3db7754d4a05319f03d640e17374550",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/bus/tests/model-hire-ownership.test.mjs",
|
||||
"base": "09a847ed",
|
||||
"before": "cdc7001973d5d88b6e02280431512cf207ff54f9988a2417d14ceeabf0396779",
|
||||
"after": "cdc7001973d5d88b6e02280431512cf207ff54f9988a2417d14ceeabf0396779",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/model-managed-launch.test.mjs",
|
||||
"base": "09a847ed",
|
||||
"before": "9719f1b1437ae306b0760c2d2af55cf796daec99e0205be45baa747f3f69f261",
|
||||
"after": "9719f1b1437ae306b0760c2d2af55cf796daec99e0205be45baa747f3f69f261",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/model-managed-launch-fixture.mjs",
|
||||
"base": "09a847ed",
|
||||
"before": "6382cbdbd57d50d62863e67f9cbe85b8bd5cc18ee2067a981555cc57d9a124df",
|
||||
"after": "8b106db7e823961db18a848297e5ed95ce295672822ad25abbe410afb6c718b7",
|
||||
"identical": false
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,112 @@
|
||||
[
|
||||
{
|
||||
"label": "routing",
|
||||
"file": "packages/harness/tests/proxy-routing.test.mjs",
|
||||
"pass": 5,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"exit": 0,
|
||||
"log": "routing-green.txt",
|
||||
"end": "2026-10-26T22:47:38.144608+00:00"
|
||||
},
|
||||
{
|
||||
"label": "context",
|
||||
"file": "packages/cli/tests/proxy-context-join.test.mjs",
|
||||
"pass": 7,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"exit": 0,
|
||||
"log": "context-final.txt",
|
||||
"end": "2026-10-26T22:50:12.272580+00:00"
|
||||
},
|
||||
{
|
||||
"label": "653",
|
||||
"file": "packages/cli/tests/model-managed-launch.test.mjs",
|
||||
"pass": 5,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"exit": 0,
|
||||
"log": "managed-green.txt",
|
||||
"end": "2026-10-26T22:50:41.692800+00:00"
|
||||
},
|
||||
{
|
||||
"label": "655",
|
||||
"file": "packages/bus/tests/model-hire-ownership.test.mjs",
|
||||
"pass": 18,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"exit": 0,
|
||||
"log": "ownership-green.txt",
|
||||
"end": "2026-10-26T22:51:06.057679+00:00"
|
||||
},
|
||||
{
|
||||
"label": "bundle",
|
||||
"file": "packages/harness/tests/proxy-bundle.test.mjs",
|
||||
"pass": 7,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"exit": 0,
|
||||
"log": "packages_harness_tests_proxy-bundle.test.mjs.txt",
|
||||
"end": "2026-10-26T22:51:48.836792+00:00"
|
||||
},
|
||||
{
|
||||
"label": "proxy-harness",
|
||||
"file": "packages/plugins/tests/proxy-harness.test.mjs",
|
||||
"pass": 5,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"exit": 0,
|
||||
"log": "packages_plugins_tests_proxy-harness.test.mjs.txt",
|
||||
"end": "2026-10-26T22:51:49.004894+00:00"
|
||||
},
|
||||
{
|
||||
"label": "launcher",
|
||||
"file": "packages/cli/tests/launcher.test.mjs",
|
||||
"pass": 35,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"exit": 0,
|
||||
"log": "launcher-final-green.txt",
|
||||
"end": "2026-10-26T22:58:31.909376+00:00"
|
||||
},
|
||||
{
|
||||
"label": "seat",
|
||||
"file": "packages/seat/tests/proxy-session-env.test.mjs",
|
||||
"pass": 2,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"exit": 0,
|
||||
"log": "packages_seat_tests_proxy-session-env.test.mjs.txt",
|
||||
"end": "2026-10-26T22:53:23.099336+00:00"
|
||||
},
|
||||
{
|
||||
"label": "business",
|
||||
"file": "packages/business/tests/proxy-launch.test.mjs",
|
||||
"pass": 6,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"exit": 0,
|
||||
"log": "packages_business_tests_proxy-launch.test.mjs.txt",
|
||||
"end": "2026-10-26T22:53:23.246685+00:00"
|
||||
},
|
||||
{
|
||||
"label": "launch-settings",
|
||||
"file": "packages/business/tests/launch-settings.test.mjs",
|
||||
"pass": 18,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"exit": 0,
|
||||
"log": "packages_business_tests_launch-settings.test.mjs.txt",
|
||||
"end": "2026-10-26T22:53:23.635024+00:00"
|
||||
},
|
||||
{
|
||||
"label": "harness",
|
||||
"file": "packages/plugins/tests/harness.test.mjs",
|
||||
"pass": 9,
|
||||
"fail": 0,
|
||||
"skip": 0,
|
||||
"exit": 0,
|
||||
"log": "packages_plugins_tests_harness.test.mjs.txt",
|
||||
"end": "2026-10-26T22:53:23.860975+00:00"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,15 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:47:38.063379+00:00", "test": "packages/harness/tests/proxy-routing.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/goCn/home", "privateConfig": "/mnt/storage/scratch/tmp/goCn/home/config/unconfigured.json"}
|
||||
✔ joined proxy context maps provider anthropic by identity, not model name (0.634793ms)
|
||||
✔ joined proxy context maps provider zai by identity, not model name (0.087321ms)
|
||||
✔ no proxy context preserves an arbitrary nonproxy provider and original route shape (0.453456ms)
|
||||
✔ joined proxy context refuses unsupported provider rather than using an upstream credential or guessed API (0.296772ms)
|
||||
✔ provider proxy still requires an explicit route inside joined context (0.130669ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 5
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 49.830087
|
||||
{"phase": "end", "utc": "2026-10-26T22:47:38.144608+00:00", "exit": 0, "niceRestoredTo": 19, "priorityCorrections": {}, "ownedPids": [2259848, 2259849, 2259855]}
|
||||
@@ -0,0 +1,77 @@
|
||||
{"phase": "start", "utc": "2026-10-26T22:46:35.392405+00:00", "test": "packages/harness/tests/proxy-routing.test.mjs", "bound": 180, "nice": 19, "privateHome": "/mnt/storage/scratch/tmp/gkdh/home", "privateConfig": "/mnt/storage/scratch/tmp/gkdh/home/config/unconfigured.json"}
|
||||
✖ joined proxy context maps provider anthropic by identity, not model name (1.364131ms)
|
||||
✖ joined proxy context maps provider zai by identity, not model name (0.201719ms)
|
||||
✔ no proxy context preserves an arbitrary nonproxy provider and original route shape (0.622618ms)
|
||||
✖ joined proxy context refuses unsupported provider rather than using an upstream credential or guessed API (0.249337ms)
|
||||
✔ provider proxy still requires an explicit route inside joined context (0.358346ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 3
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 60.487842
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/proxy-routing.test.mjs:10:3
|
||||
✖ joined proxy context maps provider anthropic by identity, not model name (1.364131ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ undefined
|
||||
- 'anthropic'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-routing.test.mjs:12:12)
|
||||
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: undefined,
|
||||
expected: 'anthropic',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/proxy-routing.test.mjs:10:3
|
||||
✖ joined proxy context maps provider zai by identity, not model name (0.201719ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
undefined !== 'glm'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-routing.test.mjs:12:12)
|
||||
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: undefined,
|
||||
expected: 'glm',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/proxy-routing.test.mjs:22:1
|
||||
✖ joined proxy context refuses unsupported provider rather than using an upstream credential or guessed API (0.249337ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-routing.test.mjs:23: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: { code: 'proxy-provider-unsupported' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
{"phase": "end", "utc": "2026-10-26T22:46:35.494174+00:00", "exit": 1, "niceRestoredTo": 19, "priorityCorrections": {"16": 1}, "ownedPids": [2244966, 2244967, 2244973]}
|
||||
@@ -0,0 +1,53 @@
|
||||
# One file per invocation. All test processes receive a private HOME/config/TMPDIR.
|
||||
import datetime,hashlib,json,os,pathlib,subprocess,sys,time
|
||||
file=sys.argv[1]
|
||||
bound=int(sys.argv[2])
|
||||
if not file.endswith('.test.mjs') or 'case1-accept' in file: raise SystemExit('unlisted test refused')
|
||||
root=os.environ['TMPDIR']; home=pathlib.Path(root,'home'); home.mkdir(mode=0o700)
|
||||
config=home/'config'; config.mkdir(mode=0o700)
|
||||
env={'PATH':'/usr/bin:/bin','HOME':str(home),'TMPDIR':root,'MOSAIC_CONFIG':str(config/'unconfigured.json'),'XDG_CONFIG_HOME':str(home/'.config'),'LANG':'C.UTF-8','TZ':'UTC'}
|
||||
if os.environ.get('P332_CLAUDE_EXECUTABLE'):
|
||||
pin=os.environ['P332_CLAUDE_EXECUTABLE']
|
||||
if not os.path.isabs(pin) or not os.path.isfile(pin) or not os.access(pin,os.X_OK):raise SystemExit('declared executable prerequisite missing')
|
||||
profile=json.loads((pathlib.Path(__file__).resolve().parent/'runner-profile.json').read_text())['claudeExecutable']
|
||||
if pin!=profile['path'] or hashlib.sha256(pathlib.Path(pin).read_bytes()).hexdigest()!=profile['sha256']:raise SystemExit('declared executable hash mismatch')
|
||||
env['MOSAIC_CLAUDE_BIN']=pin
|
||||
elif file=='packages/cli/tests/launcher.test.mjs':raise SystemExit('launcher profile requires explicit verified pinned executable')
|
||||
os.setpriority(os.PRIO_PROCESS,0,19)
|
||||
print(json.dumps({'phase':'start','utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),'test':file,'bound':bound,'nice':os.getpriority(os.PRIO_PROCESS,0),'privateHome':str(home),'privateConfig':env['MOSAIC_CONFIG']}),flush=True)
|
||||
pattern=sys.argv[3] if len(sys.argv)>3 else None
|
||||
node_args=['/usr/bin/node']+(['--import',str(pathlib.Path(__file__).resolve().parent/'capture-cleanup.mjs')] if pattern else [])+['--test']+(['--test-name-pattern',pattern] if pattern else [])+[file]
|
||||
if pattern:env['P332_CLEANUP_DIAGNOSTIC']=str(pathlib.Path(__file__).resolve().parent/'launcher-cleanup-diagnostic.json')
|
||||
child=subprocess.Popen(['/usr/bin/timeout','-k','10',str(bound),*node_args],env=env)
|
||||
corrections={}; known=set()
|
||||
retained={}; presence={}
|
||||
def retain_diagnostics():
|
||||
if not pattern:return
|
||||
for item in pathlib.Path(root).rglob('*.stderr'):
|
||||
try:
|
||||
text=item.read_text()
|
||||
if text:
|
||||
for value in ['stand-in','fx332-pi','fx653-pi']:text=text.replace(value,'[fake-value-redacted]')
|
||||
retained[str(item.relative_to(root))]=text
|
||||
except (OSError,UnicodeError):pass
|
||||
for pid in list(known):
|
||||
try:
|
||||
argv=pathlib.Path(f'/proc/{pid}/cmdline').read_bytes().split(b'\0')
|
||||
environment=pathlib.Path(f'/proc/{pid}/environ').read_bytes().split(b'\0')
|
||||
names=sorted({entry.split(b'=',1)[0].decode() for entry in environment if b'=' in entry})
|
||||
if 'MOSAIC_CLAUDE_SETTINGS' in names:
|
||||
presence[str(pid)]={'executable':argv[0].decode(),'claudeAdapterArgumentPresent':any(b'adapters/claude/adapter.sh' in arg for arg in argv),'environmentNames':names}
|
||||
except (OSError,UnicodeError):pass
|
||||
def guard(pid):
|
||||
try:
|
||||
known.add(pid); before=os.getpriority(os.PRIO_PROCESS,pid)
|
||||
if before!=19:
|
||||
corrections[str(before)]=corrections.get(str(before),0)+1;os.setpriority(os.PRIO_PROCESS,pid,19)
|
||||
for raw in pathlib.Path(f'/proc/{pid}/task/{pid}/children').read_text().split(): guard(int(raw))
|
||||
except (FileNotFoundError,ProcessLookupError,PermissionError): pass
|
||||
while child.poll() is None: guard(child.pid);retain_diagnostics();time.sleep(.02)
|
||||
if pattern:
|
||||
artifact=pathlib.Path(__file__).parent/'launcher-focused-diagnostic.json'
|
||||
artifact.write_text(json.dumps({'stderr':retained,'presenceOnly':presence,'testNamePattern':pattern},indent=2)+'\n')
|
||||
print(json.dumps({'phase':'end','utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),'exit':child.returncode,'niceRestoredTo':19,'priorityCorrections':corrections,'ownedPids':sorted(known)}),flush=True)
|
||||
sys.exit(child.returncode)
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"profile": "Mos1961 row332 serial targeted only",
|
||||
"base": "09a847edaa25b609bac7728ff83f224708a29399",
|
||||
"claudeExecutable": {
|
||||
"path": "/opt/claude-code/bin/claude",
|
||||
"sha256": "f7dd62ae415378018cd21dd950eb3bac174ab085830304d3b8b098146bfd47b6",
|
||||
"version": "2.1.259 (Claude Code)",
|
||||
"mountContract": "existing claude-code harness.mounts readonly declared executable, no production mount expansion"
|
||||
},
|
||||
"environmentAllowlist": [
|
||||
"PATH",
|
||||
"HOME",
|
||||
"TMPDIR",
|
||||
"MOSAIC_CONFIG",
|
||||
"XDG_CONFIG_HOME",
|
||||
"LANG",
|
||||
"TZ",
|
||||
"MOSAIC_CLAUDE_BIN"
|
||||
],
|
||||
"path": "/usr/bin:/bin",
|
||||
"tmpdirTemplate": "/mnt/storage/scratch/tmp/gXXX",
|
||||
"nice": 19,
|
||||
"killAfterSeconds": 10,
|
||||
"wholeFileBoundsSeconds": {
|
||||
"default": 180,
|
||||
"managed": 300
|
||||
},
|
||||
"prohibited": [
|
||||
"full packages/global gate",
|
||||
"#662",
|
||||
"real provider/auth turns",
|
||||
"push"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
[
|
||||
{
|
||||
"file": "packages/business/src/launch.mjs",
|
||||
"sha256": "37ddaf6e3a49a853b4a8ddf2008565900b0db1a6e7f4a69d0fce7090805989a9"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/src/launcher.mjs",
|
||||
"sha256": "1001674131006a7e175570993294f72fee446f7b92732c324304eba92c902650"
|
||||
},
|
||||
{
|
||||
"file": "packages/harness/src/bundle.mjs",
|
||||
"sha256": "7823ef555ca9cd858f39178771447be52e968f3cbe5479fb0999dffb5ccedf91"
|
||||
},
|
||||
{
|
||||
"file": "packages/plugins/harness/claude-code/index.mjs",
|
||||
"sha256": "4d7cd03749ce13243cbfbdbfbd305ade40f45fb8677d5df4e6658cd1fc689342"
|
||||
},
|
||||
{
|
||||
"file": "packages/plugins/harness/pi/index.mjs",
|
||||
"sha256": "299b5dadc74c2c51253c3d9c6eb2abccba5d59a52f07670b795a343515cd2887"
|
||||
},
|
||||
{
|
||||
"file": "packages/seat/src/session.mjs",
|
||||
"sha256": "488e593811adf369fc94e4b8528e8526bbef054aaa6912911be169eec3971f73"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,468 @@
|
||||
diff --git a/packages/business/src/launch.mjs b/packages/business/src/launch.mjs
|
||||
index 6f9b18690..d9ef01b40 100644
|
||||
--- a/packages/business/src/launch.mjs
|
||||
+++ b/packages/business/src/launch.mjs
|
||||
@@ -1,6 +1,6 @@
|
||||
// REQ-LIMIT-1: editable concurrency policy, never a compiled-in capacity ceiling.
|
||||
import { requireObject, requireId, requireString, rejectUnknownKeys } from "./util.mjs";
|
||||
-import { refuse } from "./errors.mjs";
|
||||
+import { BusinessError, refuse } from "./errors.mjs";
|
||||
|
||||
const name = (value, at) => requireString(value, at, { max: 200 });
|
||||
const count = (value, at) => {
|
||||
@@ -15,10 +15,19 @@ export function checkModels(value, where = "launch.models") {
|
||||
return Object.fromEntries(Object.entries(value).map(([key, entry]) => {
|
||||
requireId(key, where);
|
||||
requireObject(entry, `${where}.${key}`);
|
||||
- rejectUnknownKeys(entry, ["provider", "model"], `${where}.${key}`);
|
||||
+ rejectUnknownKeys(entry, entry.provider === "proxy" ? ["provider", "model", "route"] : ["provider", "model"], `${where}.${key}`);
|
||||
+ if (entry.provider === "proxy") {
|
||||
+ const missing = !Object.hasOwn(entry, "route");
|
||||
+ if (missing || !["anthropic", "glm", "codex"].includes(entry.route)) {
|
||||
+ throw Object.assign(new BusinessError(`${where}.${key}.route must name anthropic, glm or codex`), {
|
||||
+ code: missing ? "proxy-route-missing" : "proxy-route-unknown",
|
||||
+ });
|
||||
+ }
|
||||
+ }
|
||||
return [key, {
|
||||
provider: name(entry.provider, `${where}.${key}.provider`),
|
||||
model: name(entry.model, `${where}.${key}.model`),
|
||||
+ ...(entry.provider === "proxy" && Object.hasOwn(entry, "route") ? { route: entry.route } : {}),
|
||||
}];
|
||||
}));
|
||||
}
|
||||
@@ -82,7 +91,7 @@ export function checkAccount(value, where = "launch.account") {
|
||||
requireObject(value, where);
|
||||
rejectUnknownKeys(value, ["name", "credential"], where);
|
||||
const accountName = requireId(value.name, `${where}.name`);
|
||||
- if (typeof value.credential !== "string" || !CREDENTIAL.test(value.credential)) {
|
||||
+ if (typeof value.credential !== "string" || (value.credential !== "proxy" && !CREDENTIAL.test(value.credential))) {
|
||||
refuse(`${where}.credential must name environment variables, joined with "+"`);
|
||||
}
|
||||
return { name: accountName, credential: value.credential };
|
||||
diff --git a/packages/cli/src/launcher.mjs b/packages/cli/src/launcher.mjs
|
||||
index 556f09c69..45878750a 100644
|
||||
--- a/packages/cli/src/launcher.mjs
|
||||
+++ b/packages/cli/src/launcher.mjs
|
||||
@@ -159,6 +159,7 @@ import {
|
||||
runnerOf,
|
||||
SESSION_CREDENTIALS,
|
||||
sessionEnv,
|
||||
+ isProviderVariable,
|
||||
sessionExit,
|
||||
sessionStore,
|
||||
sessionWorkspace,
|
||||
@@ -218,6 +219,9 @@ export function createLauncher({
|
||||
host,
|
||||
system,
|
||||
env = process.env,
|
||||
+ // P2 supplies only {baseUrl,key}; a factory may supply the current agent's
|
||||
+ // context per check. P3 never reads a key store or calls the proxy itself.
|
||||
+ proxy = null,
|
||||
tracker = false,
|
||||
launches = true,
|
||||
makeLoader = createLoader,
|
||||
@@ -333,7 +337,7 @@ export function createLauncher({
|
||||
// nothing else launches for one. Row 194 (#1692, V2): `human` is the
|
||||
// human's launch request, which may name any declared instance. The listing
|
||||
// limits the chief, not the human. launch.by still takes the `pm` branch.
|
||||
- async function check(instance, { pm = false, thread = null, session = null, human = false } = {}) {
|
||||
+ async function check(instance, { pm = false, thread = null, session = null, human = false, proxyContext = null, proxyReady = false } = {}) {
|
||||
const admissionGeneration = admission().generation;
|
||||
try { b=loadBusiness(host.business,{dir:configDir(env),rolesDir:rolesDir(env)}); } catch(e){throw new Refusal("organization-refused",e.message);}
|
||||
if (!b.launch) throw new Refusal("launch-not-configured", `business ${b.id} has no launch block`);
|
||||
@@ -356,9 +360,10 @@ export function createLauncher({
|
||||
// Row 65 (#1558): the route's harness, model and thinking come from the instance's vars only.
|
||||
const routeOf = (which) => {
|
||||
try {
|
||||
- return sessionModel(resolved, b.launch.models, which);
|
||||
+ return sessionModel(resolved, b.launch.models, which, { proxy: Boolean(system.proxy || proxyContext) });
|
||||
} catch (e) {
|
||||
- throw new Refusal(e instanceof BundleError && e.code === "no-route" ? "no-route" : "unsupported-harness", e.message);
|
||||
+ const code = e instanceof BundleError && (e.code === "no-route" || e.code.startsWith("proxy-")) ? e.code : "unsupported-harness";
|
||||
+ throw new Refusal(code, e.message);
|
||||
}
|
||||
};
|
||||
const primary = routeOf("primary");
|
||||
@@ -390,7 +395,23 @@ export function createLauncher({
|
||||
let harness = await harnessOf(primary);
|
||||
let route = "primary";
|
||||
let routeReason = null;
|
||||
- const failed = call(primary.harness, "preflight", () => harness.preflight({ env }));
|
||||
+ // The first check validates the request before authorization/workspace work.
|
||||
+ // Managed credentials are acquired once in startLocked, then supplied to
|
||||
+ // the final check. Never reject proxy-only login using upstream host env.
|
||||
+ if (system.proxy && !proxyReady)
|
||||
+ return { resolved, model, account: null, harness, route, routeReason, admissionGeneration };
|
||||
+ const proxyFor = async (selected) => {
|
||||
+ if (!system.proxy && selected.provider !== "proxy") return null;
|
||||
+ const context = system.proxy ? proxyContext : typeof proxy === "function" ? await proxy({ business: b.id, instance }) : proxy;
|
||||
+ if (!context || typeof context.key !== "string" || !context.key
|
||||
+ || typeof context.baseUrl !== "string" || !/^http:\/\/127\.0\.0\.1:[0-9]+$/.test(context.baseUrl)) {
|
||||
+ throw new Refusal("no-session-credential", "proxy model needs its own session proxy context");
|
||||
+ }
|
||||
+ // Copy only the agreed seam; never keep a store or management handle.
|
||||
+ return { baseUrl: context.baseUrl, key: context.key };
|
||||
+ };
|
||||
+ let sessionProxy = await proxyFor(primary);
|
||||
+ const failed = call(primary.harness, "preflight", () => harness.preflight({ env: sessionProxy ? sessionEnv(env, "preflight", sessionProxy) : env, proxy: sessionProxy }));
|
||||
if (failed) {
|
||||
if (!fallback) throw new Refusal(failed.code, failed.message);
|
||||
// The fallback only on a failed primary preflight, and only at launch (row 65). Any refusal of
|
||||
@@ -399,7 +420,8 @@ export function createLauncher({
|
||||
if (e instanceof Refusal) e.message += ` (primary ${primary.harness}: ${failed.message})`;
|
||||
throw e;
|
||||
});
|
||||
- const also = call(fallback.harness, "preflight", () => second.preflight({ env }));
|
||||
+ sessionProxy = await proxyFor(fallback);
|
||||
+ const also = call(fallback.harness, "preflight", () => second.preflight({ env: sessionProxy ? sessionEnv(env, "preflight", sessionProxy) : env, proxy: sessionProxy }));
|
||||
if (also) throw new Refusal(also.code, `fallback ${fallback.harness}: ${also.message} (primary ${primary.harness}: ${failed.message})`);
|
||||
[model, harness, route, routeReason] = [fallback, second, "fallback", failed.code];
|
||||
}
|
||||
@@ -410,12 +432,18 @@ export function createLauncher({
|
||||
if (account !== null) {
|
||||
// The usage records keep this name (bus schema 3i), so it must never be a credential's value.
|
||||
const holds = [...new Set(SESSION_CREDENTIALS.flat())].filter((k) => env[k] === account);
|
||||
+ if (sessionProxy?.key === account) holds.push("session proxy key");
|
||||
if (holds.length) throw new Refusal("account-is-credential", `launch.account.name is the value of ${holds.join(", ")}; it names the account, never its credential`);
|
||||
- const named = b.launch.account.credential.split("+");
|
||||
- if (!SESSION_CREDENTIALS.some((set) => set.join("+") === named.join("+")) || !named.every((k) => Boolean(env[k])))
|
||||
- throw new Refusal("account-credential-missing", `account ${account} names ${named.join(" with ")}, which the bus host doesn't hold as a session login`);
|
||||
- const other = [...new Set(SESSION_CREDENTIALS.flat())].filter((k) => !named.includes(k) && Boolean(env[k]));
|
||||
- if (other.length) throw new Refusal("account-credential-ambiguous", `account ${account} names ${named.join(" with ")}, but the bus host also sets ${other.join(", ")}`);
|
||||
+ if (sessionProxy || b.launch.account.credential === "proxy") {
|
||||
+ if (!sessionProxy || b.launch.account.credential !== "proxy")
|
||||
+ throw new Refusal("account-credential-missing", `account ${account} needs the declared proxy credential`);
|
||||
+ } else {
|
||||
+ const named = b.launch.account.credential.split("+");
|
||||
+ if (!SESSION_CREDENTIALS.some((set) => set.join("+") === named.join("+")) || !named.every((k) => Boolean(env[k])))
|
||||
+ throw new Refusal("account-credential-missing", `account ${account} names ${named.join(" with ")}, which the bus host doesn't hold as a session login`);
|
||||
+ const other = [...new Set(SESSION_CREDENTIALS.flat())].filter((k) => !named.includes(k) && Boolean(env[k]));
|
||||
+ if (other.length) throw new Refusal("account-credential-ambiguous", `account ${account} names ${named.join(" with ")}, but the bus host also sets ${other.join(", ")}`);
|
||||
+ }
|
||||
}
|
||||
const unavailable = sandboxProblem({ bwrap });
|
||||
if (unavailable) throw new Refusal("sandbox-unavailable", unavailable);
|
||||
@@ -434,7 +462,7 @@ export function createLauncher({
|
||||
throw new Refusal("limit-check-failed", `${may?.check ?? "bus"}: ${may?.code ?? "malformed-answer"}`);
|
||||
}
|
||||
admission(admissionGeneration);
|
||||
- return { resolved, model, account, harness, route, routeReason, admissionGeneration };
|
||||
+ return { resolved, model, account, harness, route, routeReason, admissionGeneration, sessionProxy };
|
||||
}
|
||||
|
||||
// Bundle, spawn, bind, register, hand over the capability.
|
||||
@@ -505,16 +533,21 @@ export function createLauncher({
|
||||
if (c.outcome === "kept") record({ event: "checkout-kept", instance, project: c.project, reason: c.reason });
|
||||
else if (c.outcome === "fetched") record({ event: "checkout-fetched", instance, project: c.project, reason: c.reason });
|
||||
}
|
||||
- let harness, route, routeReason;
|
||||
- ({resolved,model,account,harness,route,routeReason}=await check(instance,{pm:instance===b.launch.by,thread,session,human}));
|
||||
- admission(admissionGeneration);
|
||||
- const { run, runDir } = newRun(dataRoot, b.id);
|
||||
- let proxy = null, modelKeyId;
|
||||
+ // Retain P2's real admission/ownership operation; do not substitute the
|
||||
+ // old stand-in option or acquire again in each metadata/preflight check.
|
||||
+ let admittedProxy = null;
|
||||
if (system.proxy) {
|
||||
- try { proxy = await host.op({ op: 'modelPreflight', business: b.id, role: instance }); }
|
||||
+ try { admittedProxy = await host.op({ op: 'modelPreflight', business: b.id, role: instance }); }
|
||||
catch (error) { throw new Refusal(error.code ?? 'proxy-down', error.code ?? 'proxy-down'); }
|
||||
- if (!proxy || typeof proxy.key !== 'string' || proxy.baseUrl !== `http://127.0.0.1:${system.proxy.port}`) throw new Refusal('proxy-down', 'proxy-down');
|
||||
- modelKeyId = createHash('sha256').update(proxy.key).digest('hex').slice(0, 12);
|
||||
+ if (!admittedProxy || typeof admittedProxy.key !== 'string' || !admittedProxy.key || admittedProxy.baseUrl !== `http://127.0.0.1:${system.proxy.port}`) throw new Refusal('proxy-down', 'proxy-down');
|
||||
+ }
|
||||
+ let harness, route, routeReason, sessionProxy;
|
||||
+ ({resolved,model,account,harness,route,routeReason,sessionProxy}=await check(instance,{pm:instance===b.launch.by,thread,session,human,proxyContext:admittedProxy,proxyReady:true}));
|
||||
+ admission(admissionGeneration);
|
||||
+ const { run, runDir } = newRun(dataRoot, b.id);
|
||||
+ let modelKeyId;
|
||||
+ if (admittedProxy) {
|
||||
+ modelKeyId = createHash('sha256').update(sessionProxy.key).digest('hex').slice(0, 12);
|
||||
// Internal opt-in only: no session.json, user environment or config field.
|
||||
try { writeFileSync(join(runDir, 'proxy-first-turn-enabled'), 'enabled\n', { flag: 'wx', mode: 0o600 }); }
|
||||
catch { throw new Refusal('launch-failed', 'first-turn protocol setup failed'); }
|
||||
@@ -534,10 +567,10 @@ export function createLauncher({
|
||||
const holding = holders?.filter((h) => h.instance === instance) ?? null;
|
||||
const land = thread ? await host.op({ op: "landHeld", record: { business: b.id, role: instance, thread } }) : holding.length > 0;
|
||||
const bundle = buildBundle({
|
||||
- ...(proxy ? { proxy } : {}),
|
||||
dir: join(runDir, "bundle"),
|
||||
resolved,
|
||||
models: b.launch.models,
|
||||
+ proxy: sessionProxy,
|
||||
contract: readFileSync(resolved.contract, "utf8"),
|
||||
arbiter: Object.values(b.arbiters).includes(instance),
|
||||
tracker,
|
||||
@@ -561,6 +594,12 @@ export function createLauncher({
|
||||
// Row 199 (D11): or publishes it, once a reviewed commit routes git.push.remote within-role.
|
||||
const held = [...resolved.limits.authority.withinRole, ...resolved.limits.authority.crossRole];
|
||||
const git = land || ["git.push.working", "review.verdict", "git.push.remote"].some((a) => held.includes(a)) ? gitSocketPath(dataRoot) : null;
|
||||
+ // Secrets go only to spawn, never session.json. Keep this split at the
|
||||
+ // actual serialization boundary, even if a harness adds another key.
|
||||
+ const harnessEnv = {}, transientEnv = {};
|
||||
+ for (const [name, value] of Object.entries(bundle.env)) {
|
||||
+ (sessionProxy && isProviderVariable(name) ? transientEnv : harnessEnv)[name] = value;
|
||||
+ }
|
||||
writeSessionFile(runDir, {
|
||||
...sessionDefaults,
|
||||
business: b.id,
|
||||
@@ -578,7 +617,7 @@ export function createLauncher({
|
||||
sessionDir,
|
||||
adapter,
|
||||
bundle: files,
|
||||
- harnessEnv: bundle.env,
|
||||
+ harnessEnv,
|
||||
turnEnd,
|
||||
toolSocket,
|
||||
turnMarker,
|
||||
@@ -602,7 +641,7 @@ export function createLauncher({
|
||||
try {
|
||||
admission(admissionGeneration);
|
||||
spawnedAt.set(run, Date.now());
|
||||
- child = spawnSession({ runDir, env: sessionEnv(env, run), paths, business: b.id, role: instance, bwrap });
|
||||
+ child = spawnSession({ runDir, env: { ...sessionEnv(env, run, sessionProxy), ...transientEnv }, paths, business: b.id, role: instance, bwrap });
|
||||
} catch (e) {
|
||||
spawnedAt.delete(run);
|
||||
unregisterRuntime(dataRoot, managed.id);
|
||||
@@ -624,13 +663,13 @@ export function createLauncher({
|
||||
admission(admissionGeneration);
|
||||
if (!outerStart) throw new Error("the session process exited at once");
|
||||
lock?.update({ run, runPid: child.pid, runStartTime: outerStart });
|
||||
- const launch = await host.bindLaunch({ business: b.id, role: instance, run, harness: model.harness, provider: model.provider, model: model.model, account, transcript, pid: child.pid, startTime: outerStart, ...(thread ? { thread, session } : {}), ...(proxy ? { modelKeyId } : {}) });
|
||||
+ const launch = await host.bindLaunch({ business: b.id, role: instance, run, harness: model.harness, provider: model.provider, model: model.model, account, transcript, pid: child.pid, startTime: outerStart, ...(thread ? { thread, session } : {}), ...(admittedProxy ? { modelKeyId } : {}) });
|
||||
bound = true;
|
||||
admission(admissionGeneration);
|
||||
entry = {
|
||||
business: b.id, instance, ...(thread ? { thread, session, workspace } : {}), run, launchedBy, harness: model.harness, model: model.model, provider: model.provider, modelKey: model.modelKey,
|
||||
pid: child.pid, startTime: outerStart, runnerPid: runner.pid, runnerStartTime: runner.startTime, runDir, startedAt: new Date().toISOString(),
|
||||
- ...(proxy ? { modelKeyId } : {}),
|
||||
+ ...(admittedProxy ? { modelKeyId } : {}),
|
||||
};
|
||||
registry.add(entry);
|
||||
// Row 156: one start per decision, whichever launch wrote it into landing.
|
||||
@@ -648,7 +687,7 @@ export function createLauncher({
|
||||
throw new Refusal("launch-failed", e.message);
|
||||
}
|
||||
children.set(run, exited);
|
||||
- const outputWatch = proxy ? watchModelOutput({ runDir, armAtFirstTurn: true, keyId: modelKeyId, seconds: system.proxy.firstOutputSeconds ?? 120,
|
||||
+ const outputWatch = admittedProxy ? watchModelOutput({ runDir, armAtFirstTurn: true, keyId: modelKeyId, seconds: system.proxy.firstOutputSeconds ?? 120,
|
||||
stop: () => host.op({ op: 'modelStall', business: b.id, role: instance, run, keyId: modelKeyId }), receipt: record }) : null;
|
||||
exited.then(async ({ code, signal }) => {
|
||||
outputWatch?.cancel();
|
||||
diff --git a/packages/harness/src/bundle.mjs b/packages/harness/src/bundle.mjs
|
||||
index ab0c72fa7..b037fe159 100644
|
||||
--- a/packages/harness/src/bundle.mjs
|
||||
+++ b/packages/harness/src/bundle.mjs
|
||||
@@ -74,7 +74,19 @@ export const hasFallback = (resolved) => Object.hasOwn(resolved.vars, "fallback.
|
||||
// "fallback". A missing var refuses no-route and names it. models is launch.models: the model var
|
||||
// is one of its keys, and the entry gives the provider and model; without a table the var is the
|
||||
// model and the provider is unknown.
|
||||
-export function sessionModel(resolved, models = null, which = "primary") {
|
||||
+export function proxyRouteFor(entry) {
|
||||
+ if (entry.provider === "proxy") {
|
||||
+ const missing = !Object.hasOwn(entry, "route");
|
||||
+ if (missing || !["anthropic", "glm", "codex"].includes(entry.route))
|
||||
+ throw new BundleError("proxy model needs an explicit anthropic, glm or codex route", missing ? "proxy-route-missing" : "proxy-route-unknown");
|
||||
+ return entry.route;
|
||||
+ }
|
||||
+ if (entry.provider === "anthropic") return "anthropic";
|
||||
+ if (entry.provider === "zai") return "glm";
|
||||
+ throw new BundleError("provider is unsupported by the supplied model proxy context", "proxy-provider-unsupported");
|
||||
+}
|
||||
+
|
||||
+export function sessionModel(resolved, models = null, which = "primary", { proxy = false } = {}) {
|
||||
const v = resolved.vars;
|
||||
const [harness, model, thinking] = ROUTE_VARS[which].map((name) => {
|
||||
if (typeof v[name] !== "string" || !v[name]) throw new BundleError(`instance ${resolved.instance}: no ${name} var`, "no-route", name);
|
||||
@@ -83,7 +95,8 @@ export function sessionModel(resolved, models = null, which = "primary") {
|
||||
if (models === null) return { harness, provider: null, model, thinking };
|
||||
const entry = Object.hasOwn(models, model) ? models[model] : null;
|
||||
if (!entry) throw new BundleError(`instance ${resolved.instance}: unknown model table selection ${model}`);
|
||||
- return { harness, provider: entry.provider, model: entry.model, modelKey: model, thinking };
|
||||
+ return { harness, provider: entry.provider, model: entry.model, modelKey: model, thinking,
|
||||
+ ...(entry.provider === "proxy" || proxy ? { proxyRoute: proxyRouteFor(entry) } : {}) };
|
||||
}
|
||||
|
||||
// Row 91 (#1585): the project clones the host made or kept in the workspace.
|
||||
@@ -309,10 +322,14 @@ function prompt({ contract, resolved, session, tools, untyped, builtins, persona
|
||||
// personaDir <configDir>/personas, where a creative instance's persona file is read from
|
||||
// (row 213); an instance with persona.sha256 and no personaDir refuses
|
||||
// Returns { manifest, files, policy, tools, env } with absolute paths; env is the module's
|
||||
-// adapter variables, which the host writes into session.json.
|
||||
-export function buildBundle({ dir, resolved, contract, arbiter = false, tracker = false, library = false, credentials = [], session, harness, route = "primary", routeReason = null, harnessVersion = null, models = null, land = false, skillsDir = null, personaDir = null }) {
|
||||
+// adapter variables. In proxy mode the host splits credentials into its
|
||||
+// transient spawn environment before writing the remaining variables to session.json.
|
||||
+export function buildBundle({ dir, resolved, contract, arbiter = false, tracker = false, library = false, credentials = [], session, harness, route = "primary", routeReason = null, harnessVersion = null, models = null, land = false, skillsDir = null, personaDir = null, proxy = null }) {
|
||||
if (route !== "primary" && route !== "fallback") throw new BundleError(`route ${JSON.stringify(route)} isn't primary or fallback`);
|
||||
- const model = sessionModel(resolved, models, route);
|
||||
+ const model = sessionModel(resolved, models, route, { proxy: Boolean(proxy) });
|
||||
+ if (model.provider === "proxy" && !proxy) throw new BundleError("proxy model needs its own session credential", "no-session-credential");
|
||||
+ if (proxy && (typeof proxy.key !== "string" || !proxy.key || typeof proxy.baseUrl !== "string"
|
||||
+ || !/^http:\/\/127\.0\.0\.1:[0-9]+$/.test(proxy.baseUrl))) throw new BundleError("invalid session proxy context");
|
||||
const web = webPlan(resolved, model.harness, harness.builtinWeb());
|
||||
const tools = typedTools({ resolved, arbiter, tracker, library, projects: (session.checkouts ?? []).map((c) => c.project), webTyped: !web.builtin, land });
|
||||
const untyped = untypedActions(resolved, tools);
|
||||
@@ -346,7 +363,7 @@ export function buildBundle({ dir, resolved, contract, arbiter = false, tracker
|
||||
write("tools.json", JSON.stringify(tools, null, 2) + "\n"),
|
||||
];
|
||||
// The module's own files. A name the bundle already wrote refuses at write (flag wx).
|
||||
- const own = harness.bundle({ dir, files: { ...files }, session, write, quote });
|
||||
+ const own = harness.bundle({ dir, files: { ...files }, session: { ...session, ...model }, write, quote, models, proxy });
|
||||
Object.assign(files, own.files);
|
||||
digests.push(...own.digests);
|
||||
const sources = { gate: SOURCES.gate, tools: SOURCES.tools, ...own.sources };
|
||||
@@ -373,6 +390,6 @@ export function buildBundle({ dir, resolved, contract, arbiter = false, tracker
|
||||
sources: Object.fromEntries(Object.entries(sources).map(([k, p]) => [k, { path: p, sha256: sha256(readFileSync(p)) }])),
|
||||
};
|
||||
writeFileSync(files.manifest, JSON.stringify(manifest, null, 2) + "\n", { mode: 0o600, flag: "wx" });
|
||||
- const env = harness.env({ files, policy, tools, session: { ...session, ...model } });
|
||||
+ const env = harness.env({ files, policy, tools, session: { ...session, ...model }, models, proxy });
|
||||
return { manifest, files, policy, tools, env };
|
||||
}
|
||||
diff --git a/packages/plugins/harness/claude-code/index.mjs b/packages/plugins/harness/claude-code/index.mjs
|
||||
index 3ae280c99..95f851a49 100644
|
||||
--- a/packages/plugins/harness/claude-code/index.mjs
|
||||
+++ b/packages/plugins/harness/claude-code/index.mjs
|
||||
@@ -53,8 +53,8 @@ function binary(env) {
|
||||
}
|
||||
|
||||
// A session needs a credential from the host's environment and the binary it runs.
|
||||
-export function preflight({ env }) {
|
||||
- if (!hasSessionCredential(env)) {
|
||||
+export function preflight({ env, proxy = null }) {
|
||||
+ if (!(typeof proxy?.key === "string" && proxy.key) && !hasSessionCredential(env)) {
|
||||
const names = SESSION_CREDENTIALS.map((set) => set.join(" with ")).join(", ");
|
||||
return { code: "no-session-credential", message: `the bus host has none of ${names}; the bus unit's EnvironmentFile sets one when the bus starts` };
|
||||
}
|
||||
@@ -116,12 +116,13 @@ export function bundle({ dir, files: core, session, write, quote }) {
|
||||
return { files, digests, sources: { claudeGate: GATE, mcpServer: MCP_SERVER, ...UNSLOP } };
|
||||
}
|
||||
|
||||
-export function env({ files, policy, session }) {
|
||||
+export function env({ files, policy, session, proxy = null }) {
|
||||
return {
|
||||
MOSAIC_TOOLS: claudeBuiltins(policy).join(","),
|
||||
MOSAIC_CLAUDE_SETTINGS: files.settings,
|
||||
MOSAIC_CLAUDE_MCP_CONFIG: files.mcp,
|
||||
MOSAIC_THINKING: session.thinking,
|
||||
+ ...(proxy ? { ANTHROPIC_BASE_URL: proxy.baseUrl, ANTHROPIC_AUTH_TOKEN: proxy.key } : {}),
|
||||
};
|
||||
}
|
||||
|
||||
diff --git a/packages/plugins/harness/pi/index.mjs b/packages/plugins/harness/pi/index.mjs
|
||||
index 2a3b2037f..875f274dc 100644
|
||||
--- a/packages/plugins/harness/pi/index.mjs
|
||||
+++ b/packages/plugins/harness/pi/index.mjs
|
||||
@@ -3,15 +3,21 @@
|
||||
// Pi extension, which stays in packages/harness (a module can't change that boundary). The
|
||||
// launcher, the bundle and the usage reader call these on the host; the runner gets the answers
|
||||
// as data in session.json. packages/plugins/README.md lists the interface.
|
||||
-import { existsSync, readFileSync, realpathSync } from "node:fs";
|
||||
-import { join } from "node:path";
|
||||
+import { existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
|
||||
+import { dirname, join } from "node:path";
|
||||
+import { createHash } from "node:crypto";
|
||||
import { fileURLToPath } from "node:url";
|
||||
+import { proxyRouteFor } from "../../../harness/src/bundle.mjs";
|
||||
|
||||
export const interfaceVersion = 1;
|
||||
|
||||
const REPO = fileURLToPath(new URL("../../../../", import.meta.url));
|
||||
const PACKAGE = "@earendil-works/pi-coding-agent";
|
||||
const BIN = join(REPO, "node_modules", ".bin", "pi");
|
||||
+// Sage sage-4331: reasoning-based tie-break; both pinned-proxy shapes passed.
|
||||
+// First real Codex verification remains row209 phase A step7. No runtime switch.
|
||||
+const PROXY_CODEX_API = "openai-responses";
|
||||
+const PROXY_PROVIDERS = Object.freeze({ anthropic: "anthropic", glm: "mosaic-proxy-glm", codex: "mosaic-proxy-codex" });
|
||||
const EXTENSION = fileURLToPath(new URL("../../../harness/src/pi-extension.mjs", import.meta.url));
|
||||
// Row 66 (#1559): the unslop check, loaded as a second extension. It logs to MOSAIC_UNSLOP_LOG,
|
||||
// which the runner sets, and the runner tells the operator.
|
||||
@@ -30,7 +36,11 @@ export const adapter = () => join(REPO, "adapters", "pi", "adapter.sh");
|
||||
export const levels = () => LEVELS;
|
||||
|
||||
// The session runs pi from the repository's node_modules, which the sandbox mounts.
|
||||
-export function preflight() {
|
||||
+export function preflight({ env = {}, proxy = null } = {}) {
|
||||
+ if (!(typeof proxy?.key === "string" && proxy.key)
|
||||
+ && !["ANTHROPIC_API_KEY", "OPENAI_API_KEY", "OPENROUTER_API_KEY", "ZAI_API_KEY"].some(name => Boolean(env[name]))) {
|
||||
+ return { code: "no-session-credential", message: "pi needs its own provider key or a session proxy key" };
|
||||
+ }
|
||||
if (!existsSync(BIN)) return { code: "harness-binary-missing", message: `pi isn't installed at ${BIN}; run npm ci in the repository` };
|
||||
return null;
|
||||
}
|
||||
@@ -57,16 +67,51 @@ export const builtins = ({ tools }) => [...tools];
|
||||
export const typedName = (name) => name;
|
||||
export const reliesOn = () => RELIES_ON;
|
||||
export const gateTimeout = () => null;
|
||||
-export const bundle = () => ({ files: {}, digests: [], sources: { piExtension: EXTENSION, ...UNSLOP } });
|
||||
+export function bundle({ dir, models, proxy = null }) {
|
||||
+ const sources = { piExtension: EXTENSION, ...UNSLOP };
|
||||
+ if (!proxy) return { files: {}, digests: [], sources };
|
||||
+ const providers = {};
|
||||
+ for (const entry of Object.values(models ?? {})) {
|
||||
+ const route = proxyRouteFor(entry);
|
||||
+ if (!Object.hasOwn(PROXY_PROVIDERS, route)) throw new Error("proxy model has no supported route");
|
||||
+ const provider = PROXY_PROVIDERS[route];
|
||||
+ if (typeof entry.model !== "string" || !entry.model || entry.model.startsWith("!")) throw new Error("unsafe proxy model id");
|
||||
+ const api = route === "anthropic" ? "anthropic-messages"
|
||||
+ : route === "glm" ? "openai-completions" : PROXY_CODEX_API;
|
||||
+ providers[provider] ??= {
|
||||
+ baseUrl: proxy.baseUrl + (route === "anthropic" ? "" : "/v1"),
|
||||
+ api, apiKey: "$ANTHROPIC_API_KEY",
|
||||
+ ...(route === "glm" ? { compat: { thinkingFormat: "zai", zaiToolStream: true } } : {}),
|
||||
+ models: [],
|
||||
+ };
|
||||
+ if (!providers[provider].models.some(model => model.id === entry.model)) {
|
||||
+ providers[provider].models.push({ id: entry.model, reasoning: true });
|
||||
+ }
|
||||
+ }
|
||||
+ const text = JSON.stringify({ providers }, null, 2) + "\n";
|
||||
+ // Even an accidental collision between a configured model id and the key fails closed.
|
||||
+ if (typeof proxy.key !== "string" || !proxy.key || text.includes(proxy.key)) throw new Error("unsafe proxy model configuration");
|
||||
+ const runDir = dirname(dir);
|
||||
+ for (const part of ["home", "home/.pi", "home/.pi/agent"]) {
|
||||
+ const path = join(runDir, part);
|
||||
+ mkdirSync(path, { recursive: true, mode: 0o700 });
|
||||
+ const stat = lstatSync(path);
|
||||
+ if (!stat.isDirectory() || (stat.mode & 0o777) !== 0o700) throw new Error("pi proxy config needs private run-local directories");
|
||||
+ }
|
||||
+ const file = join(runDir, "home", ".pi", "agent", "models.json");
|
||||
+ writeFileSync(file, text, { mode: 0o600, flag: "wx" });
|
||||
+ return { files: { proxyModels: file }, digests: [["../home/.pi/agent/models.json", createHash("sha256").update(text).digest("hex")]], sources };
|
||||
+}
|
||||
|
||||
// The tool limit is the built-ins plus the typed tools, which the extension serves.
|
||||
-export function env({ policy, tools, session }) {
|
||||
+export function env({ policy, tools, session, proxy = null }) {
|
||||
return {
|
||||
MOSAIC_TOOLS: [...policy.tools, ...tools.map((t) => t.name)].join(","),
|
||||
MOSAIC_EXTENSIONS: [EXTENSION, UNSLOP.unslopExtension].join(","),
|
||||
- PI_PROVIDER: session.provider ?? "",
|
||||
+ PI_PROVIDER: proxy ? PROXY_PROVIDERS[session.proxyRoute] : session.provider ?? "",
|
||||
PI_MODEL: session.model,
|
||||
MOSAIC_THINKING: session.thinking,
|
||||
+ ...(proxy ? { ANTHROPIC_API_KEY: proxy.key } : {}),
|
||||
};
|
||||
}
|
||||
|
||||
diff --git a/packages/seat/src/session.mjs b/packages/seat/src/session.mjs
|
||||
index c3a4db10e..52206d89b 100644
|
||||
--- a/packages/seat/src/session.mjs
|
||||
+++ b/packages/seat/src/session.mjs
|
||||
@@ -253,9 +253,13 @@ export const ENV_ALLOW = Object.freeze([
|
||||
export const SESSION_CREDENTIALS = Object.freeze([["CLAUDE_CODE_OAUTH_TOKEN"], ["ANTHROPIC_API_KEY"], ["ANTHROPIC_AUTH_TOKEN", "ANTHROPIC_BASE_URL"]].map((set) => Object.freeze(set)));
|
||||
export const hasSessionCredential = (env) => SESSION_CREDENTIALS.some((set) => set.every((k) => Boolean(env[k])));
|
||||
|
||||
-export function sessionEnv(env, run) {
|
||||
+// Used again at the serialization boundary: provider credentials are transient.
|
||||
+export const isProviderVariable = (name) => name.startsWith("ANTHROPIC_")
|
||||
+ || ["CLAUDE_CODE_OAUTH_TOKEN", "OPENAI_API_KEY", "OPENROUTER_API_KEY", "ZAI_API_KEY"].includes(name);
|
||||
+
|
||||
+export function sessionEnv(env, run, proxy = null) {
|
||||
const out = {};
|
||||
- for (const k of ENV_ALLOW) if (env[k] !== undefined) out[k] = env[k];
|
||||
+ for (const k of ENV_ALLOW) if (env[k] !== undefined && !(proxy && isProviderVariable(k))) out[k] = env[k];
|
||||
out.PATH = [join(REPO, "node_modules", ".bin"), env.PATH ?? "/usr/bin:/bin"].join(":");
|
||||
out.MOSAIC_RUN_ID = run;
|
||||
return out;
|
||||
@@ -0,0 +1,22 @@
|
||||
packages/harness/tests/proxy-routing.test.mjs
|
||||
packages/harness/tests/proxy-routing.test.mjs -> packages/harness/src/bundle.mjs
|
||||
packages/cli/tests/proxy-context-join.test.mjs
|
||||
packages/cli/tests/proxy-context-join.test.mjs -> packages/cli/tests/model-managed-launch-fixture.mjs -> packages/cli/src/launcher.mjs
|
||||
packages/cli/tests/model-managed-launch.test.mjs
|
||||
packages/cli/tests/model-managed-launch.test.mjs -> packages/cli/tests/model-managed-launch-fixture.mjs -> packages/cli/src/launcher.mjs
|
||||
packages/bus/tests/model-hire-ownership.test.mjs
|
||||
packages/bus/tests/model-hire-ownership.test.mjs -> packages/bus/tests/model-hire-ownership-fixture.mjs -> packages/cli/src/launcher.mjs
|
||||
packages/harness/tests/proxy-bundle.test.mjs
|
||||
packages/harness/tests/proxy-bundle.test.mjs -> packages/harness/src/bundle.mjs
|
||||
packages/plugins/tests/proxy-harness.test.mjs
|
||||
packages/plugins/tests/proxy-harness.test.mjs -> packages/seat/src/session.mjs
|
||||
packages/cli/tests/launcher.test.mjs
|
||||
packages/cli/tests/launcher.test.mjs -> packages/seat/src/session.mjs
|
||||
packages/seat/tests/proxy-session-env.test.mjs
|
||||
packages/seat/tests/proxy-session-env.test.mjs -> packages/seat/src/session.mjs
|
||||
packages/business/tests/proxy-launch.test.mjs
|
||||
packages/business/tests/proxy-launch.test.mjs -> packages/business/src/launch.mjs
|
||||
packages/business/tests/launch-settings.test.mjs
|
||||
packages/business/tests/launch-settings.test.mjs -> packages/business/src/business.mjs -> packages/business/src/launch.mjs
|
||||
packages/plugins/tests/harness.test.mjs
|
||||
packages/plugins/tests/harness.test.mjs -> packages/plugins/src/loader.mjs -> packages/plugins/harness/claude-code/index.mjs
|
||||
@@ -0,0 +1 @@
|
||||
/tmp/fethry-row332-join1961.snAwga.patch
|
||||
@@ -0,0 +1,211 @@
|
||||
// Row332 evidence. The only network-capable phase is the single authorized fetch.
|
||||
// offline runs in unshare -rn; a transparent local tap records pi payload shapes
|
||||
// without retaining headers, then pipes bytes unchanged to the pinned proxy.
|
||||
import { mkdirSync, readFileSync, readlinkSync, writeFileSync } from 'node:fs';
|
||||
import { dirname, join, resolve } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { getPriority, setPriority, networkInterfaces } from 'node:os';
|
||||
import { spawn } from 'node:child_process';
|
||||
import { once } from 'node:events';
|
||||
import http from 'node:http';
|
||||
import { fetchPinned } from '../../../../packages/model-proxy/src/fetch.mjs';
|
||||
import { PIN } from '../../../../packages/model-proxy/src/common.mjs';
|
||||
import { initialConfig, verifyInstall } from '../../../../packages/model-proxy/src/settings.mjs';
|
||||
const root = process.env.P3_EVIDENCE_ROOT;
|
||||
if (!root || !root.startsWith('/mnt/storage/scratch/') || resolve(root) !== root) throw Error('owned evidence root required');
|
||||
const enteredNice = getPriority(0);
|
||||
setPriority(0, 19);
|
||||
const repo = resolve(dirname(fileURLToPath(import.meta.url)), '../../../..');
|
||||
const mode = process.argv[2];
|
||||
const fakeKeys = ['fx332-client', 'fx332-upstream', 'fx332-manage'];
|
||||
function redact(value) {
|
||||
let text = String(value);
|
||||
for (const key of fakeKeys) text = text.split(key).join('[redacted]');
|
||||
return text;
|
||||
}
|
||||
const emit = (value) => console.log(redact(JSON.stringify(value)));
|
||||
if (mode === 'fetch') {
|
||||
const dataRoot = join(root, 'data');
|
||||
mkdirSync(dataRoot, { mode: 0o700 });
|
||||
const installed = await fetchPinned({ dataRoot, pin: PIN });
|
||||
writeFileSync(join(root, 'installed.json'), JSON.stringify(installed) + '\n', { mode: 0o600, flag: 'wx' });
|
||||
emit({ phase: 'fetch', version: PIN.version, binarySha256: PIN.binary.sha256,
|
||||
panelVersion: PIN.panel.version, panelSha256: PIN.panel.sha256, enteredNice, nice: getPriority(0), verified: true });
|
||||
} else if (mode === 'offline' || mode === 'glm-tool') {
|
||||
const withTool = mode === 'glm-tool';
|
||||
if (readlinkSync('/proc/self/ns/net') === process.env.P3_HOST_NET_NS) throw Error('network namespace was not isolated');
|
||||
if (Object.keys(networkInterfaces()).some(name => name !== 'lo')) throw Error('loopback-only namespace required');
|
||||
// Re-hash the already fetched assets; this function performs no network I/O.
|
||||
const installed = verifyInstall(join(root, 'data'), PIN);
|
||||
const attemptRoot = join(root, withTool ? 'attempt3-tool' : 'attempt2');
|
||||
mkdirSync(attemptRoot, { mode: 0o700 });
|
||||
setPriority(0, 19);
|
||||
emit({ phase: 'isolation', interfaces: Object.keys(networkInterfaces()), enteredNice, nice: getPriority(0), version: PIN.version,
|
||||
binarySha256: PIN.binary.sha256, panelSha256: PIN.panel.sha256, reverified: true });
|
||||
const requests = [], responses = [], upstreamRequests = [], children = new Set();
|
||||
const managed = (args, options = {}) => {
|
||||
setPriority(0, 19);
|
||||
const child = spawn('/usr/bin/timeout', ['-k', '10', ...args], { env: {
|
||||
PATH: '/usr/bin:/bin', HOME: join(root, 'home'), TMPDIR: process.env.TMPDIR,
|
||||
LANG: 'C.UTF-8', ...options.env,
|
||||
}, cwd: root, stdio: ['ignore', 'pipe', 'pipe'] });
|
||||
children.add(child);
|
||||
setPriority(child.pid, 19);
|
||||
child.once('close', () => children.delete(child));
|
||||
return child;
|
||||
};
|
||||
const summary = body => ({ keys: Object.keys(body).sort(), model: body.model, stream: body.stream,
|
||||
roles: Array.isArray(body.messages) ? body.messages.map(message => message.role) : undefined,
|
||||
inputTypes: Array.isArray(body.input) ? body.input.map(item => item.type) : typeof body.input,
|
||||
...(Object.hasOwn(body, 'reasoning') ? { reasoning: body.reasoning } : {}),
|
||||
...(Object.hasOwn(body, 'thinking') ? { thinking: body.thinking } : {}),
|
||||
...(Object.hasOwn(body, 'reasoning_effort') ? { reasoning_effort: body.reasoning_effort } : {}),
|
||||
...(Object.hasOwn(body, 'enable_thinking') ? { enable_thinking: body.enable_thinking } : {}),
|
||||
...(Object.hasOwn(body, 'tool_stream') ? { tool_stream: body.tool_stream } : {}),
|
||||
...(Array.isArray(body.tools) ? { toolNames: body.tools.map(tool => tool.function?.name) } : {}),
|
||||
...(Object.hasOwn(body, 'stream_options') ? { stream_options: body.stream_options } : {}),
|
||||
...(Object.hasOwn(body, 'max_tokens') ? { max_tokens: body.max_tokens } : {}),
|
||||
...(Object.hasOwn(body, 'max_completion_tokens') ? { max_completion_tokens: body.max_completion_tokens } : {}) });
|
||||
const payload = async req => { let text = ''; for await (const part of req) text += part; return JSON.parse(text || '{}'); };
|
||||
const listen = async server => { await new Promise((ok, no) => { server.once('error', no); server.listen(0, '127.0.0.1', ok); }); return server.address().port; };
|
||||
const marker = 'P332_OFFLINE_OK';
|
||||
const upstream = http.createServer(async (req, res) => {
|
||||
const body = await payload(req);
|
||||
upstreamRequests.push({ method: req.method, path: req.url, ...summary(body) });
|
||||
const item = { id: 'msg_fixture', type: 'message', role: 'assistant', status: 'completed', content: [{ type: 'output_text', text: marker, annotations: [] }] };
|
||||
if (req.url.endsWith('/chat/completions')) {
|
||||
res.writeHead(200, { 'Content-Type': 'text/event-stream' });
|
||||
const chunk = (delta, finish_reason = null) => res.write(`data: ${JSON.stringify({ id: 'chat_fixture', object: 'chat.completion.chunk', created: 1, model: body.model, choices: [{ index: 0, delta, finish_reason }] })}\n\n`);
|
||||
chunk({ role: 'assistant', content: marker }); chunk({}, 'stop');
|
||||
res.write(`data: ${JSON.stringify({ id: 'chat_fixture', object: 'chat.completion.chunk', created: 1, model: body.model, choices: [], usage: { prompt_tokens: 1, completion_tokens: 1, total_tokens: 2 } })}\n\n`);
|
||||
res.end('data: [DONE]\n\n');
|
||||
} else if (req.url.endsWith('/responses')) {
|
||||
res.writeHead(200, { 'Content-Type': 'text/event-stream' });
|
||||
const event = (type, more) => res.write(`event: ${type}\ndata: ${JSON.stringify({ type, ...more })}\n\n`);
|
||||
const response = { id: 'resp_fixture', object: 'response', model: body.model, status: 'in_progress', output: [] };
|
||||
event('response.created', { response });
|
||||
event('response.output_item.added', { output_index: 0, item: { ...item, status: 'in_progress', content: [] } });
|
||||
event('response.content_part.added', { item_id: item.id, output_index: 0, content_index: 0, part: { type: 'output_text', text: '', annotations: [] } });
|
||||
event('response.output_text.delta', { item_id: item.id, output_index: 0, content_index: 0, delta: marker });
|
||||
event('response.output_text.done', { item_id: item.id, output_index: 0, content_index: 0, text: marker });
|
||||
event('response.output_item.done', { output_index: 0, item });
|
||||
event('response.completed', { response: { ...response, status: 'completed', output: [item], usage: { input_tokens: 1, output_tokens: 1, total_tokens: 2 } } });
|
||||
res.end();
|
||||
} else { res.writeHead(404); res.end('{"error":"stand-in path refused"}'); }
|
||||
});
|
||||
let proxy, tap;
|
||||
let proxyText = '';
|
||||
const corrections = {};
|
||||
const restoreNice = pid => {
|
||||
try {
|
||||
const priority = getPriority(pid);
|
||||
if (priority !== 19) { corrections[priority] = (corrections[priority] ?? 0) + 1; setPriority(pid, 19); }
|
||||
const descendants = readFileSync(`/proc/${pid}/task/${pid}/children`, 'utf8').trim().split(/\s+/).filter(Boolean);
|
||||
for (const child of descendants) restoreNice(Number(child));
|
||||
} catch {}
|
||||
};
|
||||
const keepNice = setInterval(() => restoreNice(process.pid), 100);
|
||||
keepNice.unref();
|
||||
try {
|
||||
const upstreamPort = await listen(upstream);
|
||||
const reservation = http.createServer(); const proxyPort = await listen(reservation);
|
||||
await new Promise(ok => reservation.close(ok));
|
||||
if (proxyPort === 8317 || upstreamPort === 8317) throw Error('reserved host-proxy port excluded');
|
||||
const dataRoot = join(attemptRoot, 'offline');
|
||||
mkdirSync(dataRoot, { mode: 0o700 });
|
||||
mkdirSync(join(dataRoot, 'proxy'), { mode: 0o700 });
|
||||
mkdirSync(join(dataRoot, 'proxy', 'auth'), { mode: 0o700 });
|
||||
const config = initialConfig({ dataRoot, port: proxyPort, key: fakeKeys[2], sentinel: fakeKeys[0] });
|
||||
config.management['disable-control-panel'] = true;
|
||||
config.observability.logs['logging-to-file'] = false;
|
||||
// Bundled panel1.26.7: Ip reads api-keys.openai-compatibility;
|
||||
// Fp/Np require group.keys; xv/hv serialize keys:[{"api-key":...}].
|
||||
config['api-keys'] = { 'openai-compatibility': [{ name: 'p332-standin', 'base-url': `http://127.0.0.1:${upstreamPort}/v1`,
|
||||
keys: [{ 'api-key': fakeKeys[1] }], models: [{ name: 'gpt-fixture' }, { name: 'glm-fixture' }] }] };
|
||||
const configFile = join(dataRoot, 'config.yaml');
|
||||
writeFileSync(configFile, JSON.stringify(config, null, 2) + '\n', { mode: 0o600, flag: 'wx' });
|
||||
proxy = managed(['200', installed.binary, '-config', configFile, '-local-model'], { env: { MANAGEMENT_STATIC_PATH: dirname(installed.panel) } });
|
||||
proxy.stdout.on('data', bytes => { proxyText += bytes; });
|
||||
proxy.stderr.on('data', bytes => { proxyText += bytes; });
|
||||
let catalog, ids = [];
|
||||
const readinessDeadline = Date.now() + 30000;
|
||||
for (let poll = 1; Date.now() < readinessDeadline; poll++) {
|
||||
if (proxy.exitCode !== null) throw Error('proxy exited before readiness');
|
||||
try {
|
||||
const result = await fetch(`http://127.0.0.1:${proxyPort}/v1/models`, { headers: { Authorization: `Bearer ${fakeKeys[0]}` }, signal: AbortSignal.timeout(1000) });
|
||||
catalog = result.ok ? await result.json() : null;
|
||||
ids = (catalog?.data ?? []).map(model => model.id);
|
||||
emit({ phase: 'readiness', poll, status: result.status, modelCount: ids.length });
|
||||
if (['gpt-fixture', 'glm-fixture'].every(id => ids.includes(id))) break;
|
||||
} catch { emit({ phase: 'readiness', poll, status: 'not-ready', modelCount: 0 }); }
|
||||
await new Promise(ok => setTimeout(ok, 1000));
|
||||
}
|
||||
if (!catalog) throw Error('proxy readiness failed');
|
||||
emit({ phase: 'catalog', modelIds: ids });
|
||||
if (!['gpt-fixture', 'glm-fixture'].every(id => ids.includes(id))) throw Error('stand-in routes absent from proxy catalog');
|
||||
tap = http.createServer(async (req, res) => {
|
||||
let raw = ''; for await (const part of req) raw += part;
|
||||
const body = JSON.parse(raw || '{}');
|
||||
const index = requests.push({ method: req.method, path: req.url, ...summary(body) }) - 1;
|
||||
const outgoing = http.request({ hostname: '127.0.0.1', port: proxyPort, method: req.method, path: req.url,
|
||||
headers: { ...req.headers, host: `127.0.0.1:${proxyPort}` } }, incoming => {
|
||||
const chunks = [];
|
||||
res.writeHead(incoming.statusCode, incoming.headers);
|
||||
incoming.on('data', bytes => { chunks.push(bytes); res.write(bytes); });
|
||||
incoming.on('end', () => {
|
||||
const text = Buffer.concat(chunks).toString();
|
||||
const events = text.split('\n').filter(line => line.startsWith('event: ')).map(line => line.slice(7));
|
||||
responses.push({ request: index, status: incoming.statusCode, events, marker: text.includes(marker),
|
||||
...(incoming.statusCode >= 400 ? { errorBody: redact(text).slice(0, 800) } : {}) });
|
||||
res.end();
|
||||
});
|
||||
});
|
||||
outgoing.on('error', () => { res.writeHead(502); res.end(); });
|
||||
// Preserve exact body bytes and never log a header value.
|
||||
outgoing.end(raw);
|
||||
});
|
||||
const tapPort = await listen(tap);
|
||||
if (tapPort === 8317) throw Error('reserved host-proxy port excluded');
|
||||
const scenarios = [
|
||||
['gpt-responses', 'openai-responses', 'gpt-fixture', null],
|
||||
['gpt-completions', 'openai-completions', 'gpt-fixture', null],
|
||||
['glm-completions', 'openai-completions', 'glm-fixture', { thinkingFormat: 'zai', zaiToolStream: true }],
|
||||
];
|
||||
for (const [name, api, model, compat] of (withTool ? scenarios.filter(([name]) => name === 'glm-completions') : scenarios)) {
|
||||
const turnHome = join(attemptRoot, name, 'home');
|
||||
const agentDir = join(turnHome, '.pi', 'agent');
|
||||
mkdirSync(agentDir, { recursive: true, mode: 0o700 });
|
||||
const models = { providers: { 'p332-probe': { baseUrl: `http://127.0.0.1:${tapPort}/v1`, api,
|
||||
apiKey: '$ANTHROPIC_API_KEY', ...(compat ? { compat } : {}), models: [{ id: model, reasoning: true }] } } };
|
||||
writeFileSync(join(agentDir, 'models.json'), JSON.stringify(models) + '\n', { mode: 0o600, flag: 'wx' });
|
||||
writeFileSync(join(agentDir, 'settings.json'), JSON.stringify({ retry: { enabled: false, maxRetries: 0, provider: { maxRetries: 0 } } }) + '\n', { mode: 0o600, flag: 'wx' });
|
||||
const reqStart = requests.length, upstreamStart = upstreamRequests.length, responseStart = responses.length;
|
||||
const pi = managed(['50', '/usr/bin/node', join(repo, 'node_modules/@earendil-works/pi-coding-agent/dist/cli.js'),
|
||||
'--no-extensions', '--no-skills', '--no-prompt-templates', '--no-themes', '--no-context-files', '--no-session',
|
||||
...(withTool ? ['--tools', 'read'] : ['--no-tools']),
|
||||
'--provider', 'p332-probe', '--model', model, '--thinking', 'low', '-p', 'Reply P332_OFFLINE_OK only.'],
|
||||
{ env: { HOME: turnHome, PI_CODING_AGENT_DIR: agentDir, ANTHROPIC_API_KEY: fakeKeys[0] } });
|
||||
let stdout = '', stderr = '';
|
||||
pi.stdout.on('data', bytes => { stdout += bytes; });
|
||||
pi.stderr.on('data', bytes => { stderr += bytes; });
|
||||
const [exit, signal] = await once(pi, 'close');
|
||||
emit({ phase: 'turn', name: withTool ? `${name}-tool` : name, api, exit, signal, marker: stdout.includes(marker),
|
||||
piRequests: requests.slice(reqStart), proxyResponses: responses.slice(responseStart), upstreamRequests: upstreamRequests.slice(upstreamStart),
|
||||
...(exit !== 0 ? { stderr: redact(stderr).slice(0, 1200), stdout: redact(stdout).slice(0, 1200) } : {}), nice: getPriority(0) });
|
||||
}
|
||||
emit({ phase: 'conclusion', limitation: 'Stand-in openai-compatibility credential only; no Codex OAuth credential or real-auth turn. This script never selects the production API.' });
|
||||
emit({ phase: 'nice-corrections', restoredTo: 19, observedBeforeRestore: corrections });
|
||||
} catch (error) {
|
||||
emit({ phase: 'error', message: error.message, proxyDiagnostic: redact(proxyText).slice(-3000) });
|
||||
process.exitCode = 1;
|
||||
} finally {
|
||||
clearInterval(keepNice);
|
||||
for (const child of [...children]) child.kill('SIGTERM');
|
||||
for (const child of [...children]) {
|
||||
await Promise.race([once(child, 'close'), new Promise(ok => setTimeout(ok, 1200))]);
|
||||
if (child.exitCode === null) child.kill('SIGKILL');
|
||||
}
|
||||
for (const server of [tap, upstream].filter(Boolean)) { server.closeAllConnections(); await new Promise(ok => server.close(ok)); }
|
||||
emit({ phase: 'cleanup', remainingManagedChildren: children.size });
|
||||
}
|
||||
} else { throw Error('fetch, offline or glm-tool phase required'); }
|
||||
@@ -0,0 +1,104 @@
|
||||
23:41:37Z
|
||||
nice=19
|
||||
✖ P3 proxy model validation preserves each explicit wire route and the proxy model id (0.843397ms)
|
||||
✖ P3 a proxy model without route refuses proxy-route-missing (0.621133ms)
|
||||
✖ P3 an unknown proxy route refuses proxy-route-unknown (1.448927ms)
|
||||
✔ P3 nonproxy models retain their provider/model-only shape and reject route metadata (0.541212ms)
|
||||
✖ P3 launch.account accepts the proxy credential source without naming host variables (0.159973ms)
|
||||
✔ P3 existing environment-set accounts retain their validated representation (0.209852ms)
|
||||
ℹ tests 6
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 4
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 58.617716
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/business/tests/proxy-launch.test.mjs:6:1
|
||||
✖ P3 proxy model validation preserves each explicit wire route and the proxy model id (0.843397ms)
|
||||
Error [BusinessError]: unsupported launch.models.selected key: "route"
|
||||
at refuse (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/errors.mjs:12:9)
|
||||
at rejectUnknownKeys (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/util.mjs:17:33)
|
||||
at file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/launch.mjs:18:5
|
||||
at Array.map (<anonymous>)
|
||||
at checkModels (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/launch.mjs:15:51)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/tests/proxy-launch.test.mjs:9:22)
|
||||
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) {
|
||||
exitCode: 2
|
||||
}
|
||||
|
||||
test at packages/business/tests/proxy-launch.test.mjs:13:1
|
||||
✖ P3 a proxy model without route refuses proxy-route-missing (0.621133ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/tests/proxy-launch.test.mjs:14: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 startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: { code: 'proxy-route-missing' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/business/tests/proxy-launch.test.mjs:19:1
|
||||
✖ P3 an unknown proxy route refuses proxy-route-unknown (1.448927ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
+ Comparison {}
|
||||
- Comparison {
|
||||
- code: 'proxy-route-unknown'
|
||||
- }
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/tests/proxy-launch.test.mjs:21:12)
|
||||
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: BusinessError: unsupported launch.models.selected key: "route"
|
||||
at refuse (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/errors.mjs:12:9)
|
||||
at rejectUnknownKeys (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/util.mjs:17:33)
|
||||
at file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/launch.mjs:18:5
|
||||
at Array.map (<anonymous>)
|
||||
at checkModels (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/launch.mjs:15:51)
|
||||
at assert.throws.code (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/tests/proxy-launch.test.mjs:21:25)
|
||||
at getActual (node:assert:580:5)
|
||||
at strict.throws (node:assert:728:24)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/tests/proxy-launch.test.mjs:21:12)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14),
|
||||
expected: { code: 'proxy-route-unknown' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/business/tests/proxy-launch.test.mjs:34:1
|
||||
✖ P3 launch.account accepts the proxy credential source without naming host variables (0.159973ms)
|
||||
Error [BusinessError]: launch.account.credential must name environment variables, joined with "+"
|
||||
at refuse (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/errors.mjs:12:9)
|
||||
at checkAccount (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/launch.mjs:86:5)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/tests/proxy-launch.test.mjs:35:20)
|
||||
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) {
|
||||
exitCode: 2
|
||||
}
|
||||
exit=1
|
||||
23:41:37Z
|
||||
@@ -0,0 +1,107 @@
|
||||
23:44:40Z
|
||||
nice=19
|
||||
✖ P3 Anthropic route uses messages at proxy root and the declared model id (10.834783ms)
|
||||
✖ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (3.078049ms)
|
||||
✖ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (2.606176ms)
|
||||
✖ P3 models file is private, references the one session key, and stores no executable values or keys (2.917109ms)
|
||||
✖ P3 every launch regenerates proxy port, declared models and own key without caching (2.778195ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 5
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 117.630612
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:35:1
|
||||
✖ P3 Anthropic route uses messages at proxy root and the declared model id (10.834783ms)
|
||||
Error: ENOENT: no such file or directory, open '/mnt/storage/scratch/tmp/gxWP/p332-ddGpq6/run/home/.pi/agent/models.json'
|
||||
at readFileSync (node:fs:621:20)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:28:43)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:36:13)
|
||||
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) {
|
||||
errno: -2,
|
||||
code: 'ENOENT',
|
||||
syscall: 'open',
|
||||
path: '/mnt/storage/scratch/tmp/gxWP/p332-ddGpq6/run/home/.pi/agent/models.json'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:45:1
|
||||
✖ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (3.078049ms)
|
||||
Error: ENOENT: no such file or directory, open '/mnt/storage/scratch/tmp/gxWP/p332-7vqUkh/run/home/.pi/agent/models.json'
|
||||
at readFileSync (node:fs:621:20)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:28:43)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:46:13)
|
||||
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) {
|
||||
errno: -2,
|
||||
code: 'ENOENT',
|
||||
syscall: 'open',
|
||||
path: '/mnt/storage/scratch/tmp/gxWP/p332-7vqUkh/run/home/.pi/agent/models.json'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:56:1
|
||||
✖ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (2.606176ms)
|
||||
Error: ENOENT: no such file or directory, open '/mnt/storage/scratch/tmp/gxWP/p332-xqR4OI/run/home/.pi/agent/models.json'
|
||||
at readFileSync (node:fs:621:20)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:28:43)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:57:13)
|
||||
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) {
|
||||
errno: -2,
|
||||
code: 'ENOENT',
|
||||
syscall: 'open',
|
||||
path: '/mnt/storage/scratch/tmp/gxWP/p332-xqR4OI/run/home/.pi/agent/models.json'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:67:1
|
||||
✖ P3 models file is private, references the one session key, and stores no executable values or keys (2.917109ms)
|
||||
Error: ENOENT: no such file or directory, open '/mnt/storage/scratch/tmp/gxWP/p332-jAVWvp/run/home/.pi/agent/models.json'
|
||||
at readFileSync (node:fs:621:20)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:28:43)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:69:13)
|
||||
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) {
|
||||
errno: -2,
|
||||
code: 'ENOENT',
|
||||
syscall: 'open',
|
||||
path: '/mnt/storage/scratch/tmp/gxWP/p332-jAVWvp/run/home/.pi/agent/models.json'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:82:1
|
||||
✖ P3 every launch regenerates proxy port, declared models and own key without caching (2.778195ms)
|
||||
Error: ENOENT: no such file or directory, open '/mnt/storage/scratch/tmp/gxWP/p332-yUgdwP/run/home/.pi/agent/models.json'
|
||||
at readFileSync (node:fs:621:20)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:28:43)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:83:17)
|
||||
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) {
|
||||
errno: -2,
|
||||
code: 'ENOENT',
|
||||
syscall: 'open',
|
||||
path: '/mnt/storage/scratch/tmp/gxWP/p332-yUgdwP/run/home/.pi/agent/models.json'
|
||||
}
|
||||
exit=1
|
||||
23:44:40Z
|
||||
@@ -0,0 +1,99 @@
|
||||
23:42:41Z
|
||||
nice=19
|
||||
✖ P3 Anthropic route uses messages at proxy root and the declared model id (6.017482ms)
|
||||
✖ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (1.65735ms)
|
||||
✖ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (1.23753ms)
|
||||
✖ P3 models file is private, references the one session key, and stores no executable values or keys (1.202284ms)
|
||||
✖ P3 every launch regenerates proxy port, declared models and own key without caching (1.210998ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 5
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 88.02888
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:35:1
|
||||
✖ P3 Anthropic route uses messages at proxy root and the declared model id (6.017482ms)
|
||||
Error [BusinessError]: /mnt/storage/scratch/tmp/gQE5/mosaic-harness-biz-FaxPH3/businesses/acme.json launch: instance pm selects unknown model a
|
||||
at refuse (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/errors.mjs:12:9)
|
||||
at checkLaunch (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/business.mjs:204:125)
|
||||
at validateBusinessDocument (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/business.mjs:310:57)
|
||||
at resolvedFor (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/helpers.mjs:46:20)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:17:20)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:36:13)
|
||||
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) {
|
||||
exitCode: 2
|
||||
}
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:45:1
|
||||
✖ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (1.65735ms)
|
||||
Error [BusinessError]: /mnt/storage/scratch/tmp/gQE5/mosaic-harness-biz-rtXOnL/businesses/acme.json launch: instance pm selects unknown model z
|
||||
at refuse (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/errors.mjs:12:9)
|
||||
at checkLaunch (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/business.mjs:204:125)
|
||||
at validateBusinessDocument (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/business.mjs:310:57)
|
||||
at resolvedFor (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/helpers.mjs:46:20)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:17:20)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:46:13)
|
||||
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) {
|
||||
exitCode: 2
|
||||
}
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:56:1
|
||||
✖ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (1.23753ms)
|
||||
Error [BusinessError]: /mnt/storage/scratch/tmp/gQE5/mosaic-harness-biz-IGXaeo/businesses/acme.json launch: instance pm selects unknown model g
|
||||
at refuse (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/errors.mjs:12:9)
|
||||
at checkLaunch (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/business.mjs:204:125)
|
||||
at validateBusinessDocument (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/business.mjs:310:57)
|
||||
at resolvedFor (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/helpers.mjs:46:20)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:17:20)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:57:13)
|
||||
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) {
|
||||
exitCode: 2
|
||||
}
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:67:1
|
||||
✖ P3 models file is private, references the one session key, and stores no executable values or keys (1.202284ms)
|
||||
Error [BusinessError]: /mnt/storage/scratch/tmp/gQE5/mosaic-harness-biz-z5VTgc/businesses/acme.json launch: instance pm selects unknown model a
|
||||
at refuse (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/errors.mjs:12:9)
|
||||
at checkLaunch (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/business.mjs:204:125)
|
||||
at validateBusinessDocument (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/business.mjs:310:57)
|
||||
at resolvedFor (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/helpers.mjs:46:20)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:17:20)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:69:13)
|
||||
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) {
|
||||
exitCode: 2
|
||||
}
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:82:1
|
||||
✖ P3 every launch regenerates proxy port, declared models and own key without caching (1.210998ms)
|
||||
Error [BusinessError]: /mnt/storage/scratch/tmp/gQE5/mosaic-harness-biz-83xrrf/businesses/acme.json launch: instance pm selects unknown model a
|
||||
at refuse (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/errors.mjs:12:9)
|
||||
at checkLaunch (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/business.mjs:204:125)
|
||||
at validateBusinessDocument (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/business/src/business.mjs:310:57)
|
||||
at resolvedFor (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/helpers.mjs:46:20)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:17:20)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:83:17)
|
||||
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) {
|
||||
exitCode: 2
|
||||
}
|
||||
exit=1
|
||||
23:42:41Z
|
||||
@@ -0,0 +1,77 @@
|
||||
23:41:42Z
|
||||
nice=19
|
||||
✖ P3 Anthropic route uses messages at proxy root and the declared model id (8.181278ms)
|
||||
✖ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (1.652506ms)
|
||||
✖ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (1.297337ms)
|
||||
✖ P3 models file is private, references the one session key, and stores no executable values or keys (1.318875ms)
|
||||
✖ P3 every launch regenerates proxy port, declared models and own key without caching (1.353193ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 5
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 104.116628
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:34:1
|
||||
✖ P3 Anthropic route uses messages at proxy root and the declared model id (8.181278ms)
|
||||
TypeError: Cannot assign to read only property 'vars' of object '#<Object>'
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:18:17)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:35:13)
|
||||
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)
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:44:1
|
||||
✖ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (1.652506ms)
|
||||
TypeError: Cannot assign to read only property 'vars' of object '#<Object>'
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:18:17)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:45:13)
|
||||
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)
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:55:1
|
||||
✖ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (1.297337ms)
|
||||
TypeError: Cannot assign to read only property 'vars' of object '#<Object>'
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:18:17)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:56:13)
|
||||
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)
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:66:1
|
||||
✖ P3 models file is private, references the one session key, and stores no executable values or keys (1.318875ms)
|
||||
TypeError: Cannot assign to read only property 'vars' of object '#<Object>'
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:18:17)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:68:13)
|
||||
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)
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:81:1
|
||||
✖ P3 every launch regenerates proxy port, declared models and own key without caching (1.353193ms)
|
||||
TypeError: Cannot assign to read only property 'vars' of object '#<Object>'
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:18:17)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:82:17)
|
||||
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)
|
||||
exit=1
|
||||
23:41:42Z
|
||||
@@ -0,0 +1,78 @@
|
||||
23:41:55Z
|
||||
nice=19
|
||||
✔ C2-04: launcher workspace clones code but never the library (1499.521161ms)
|
||||
✖ P3 proxy key reaches the spawned runner but never session.json or the bundle (40.623657ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1361.267044ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r61b9e08ebd95","instance":"chief","turn":"a017a278-0466-41ec-b7d4-d05d7bb2b4e8","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r786eccbac72a","instance":"coder","turn":"5f857a62-f7e6-4662-a745-852935445baf","source":"@none","code":"baseline-unknown"}
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (853.066ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"raa425c1d9f99","instance":"chief","turn":"94eec92a-4189-4188-abf0-c0dd27eb3f7a","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r91d263cb44fe","instance":"pm","turn":"b3030547-e499-4465-ba6f-387ca92e7b2e","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"raa425c1d9f99","instance":"chief","turn":"2bb5f36b-953e-4f27-8368-d3cb77b0e68d","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r91d263cb44fe","instance":"pm","turn":"f393963d-90db-4cc3-ada0-9749bbe898e9","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r91d263cb44fe","instance":"pm","turn":"0fca073a-da7d-4cf2-953f-d590f37c6a9c","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"raa425c1d9f99","instance":"chief","turn":"9afffc56-5aca-4ac9-a8e9-ef50b859e54e","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r91d263cb44fe","instance":"pm","turn":"555642ca-00ee-4665-89ab-e68eee143f82","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"raa425c1d9f99","instance":"chief","turn":"1dad33fc-cbe9-404b-8752-3b68753ab199","source":"@none","code":"baseline-unknown"}
|
||||
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (1303.262398ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (4218.830472ms)
|
||||
✔ a role the broker says holds a merge decision gets land_work, its prompt line, its landing and the git socket; without it, none (747.37249ms)
|
||||
✔ REQ-LAUNCH-1 the tick starts a listed merge decision holder once, with land_work, the Landing line and its landing turn; an unlisted holder starts nothing (463.557222ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r18be47008dae","instance":"coder","turn":"52cd9cf6-57bd-41bf-96c0-fedd9ff9c092","source":"@none","code":"baseline-unknown"}
|
||||
✔ a holder running since before the resolution is stopped once the broker releases it, land-relaunch, and the next tick starts it: landing turn first, then the message that waited (763.066104ms)
|
||||
✔ a landing run that ended isn't started again for its decision, a spent decision starts nothing, and a new decision starts the holder (706.701053ms)
|
||||
✔ after a restart, the new host's first tick starts a holder whose decision is still held (956.687674ms)
|
||||
✔ a refused landing start is logged once per code with its decision, isn't a start, and the next tick with room starts the holder (721.85447ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (395.757947ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (463.349261ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (235.420433ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (443.687348ms)
|
||||
usage: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/down is missing","kept":[]}
|
||||
plugins: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/down is missing","kept":[]}
|
||||
✔ row 65 a failed primary preflight launches the fallback on a fixture harness module, recording the route and the reason (477.875324ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (491.276085ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (257.904073ms)
|
||||
✔ row 64 a role skill that isn't enabled refuses skill-not-enabled, and one that isn't a plain directory skill-refused, before anything starts (271.706852ms)
|
||||
✔ row 213 a creative instance's persona is read from <configDir>/personas: off its digest the launch fails with the mismatch as its reason (374.032091ms)
|
||||
✔ row 64 on Claude Code a role skill that isn't enabled refuses the same way, before anything starts (266.897065ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r505be704086e","instance":"chief","turn":"d3144fd2-644c-4bf1-95b5-5914f45dd040","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r505be704086e","instance":"chief","turn":"c61a5cf2-9714-4e2a-a335-a48d0d1dc430","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r96a1ff87bc5e","instance":"coder","turn":"bc58500e-35cc-47b5-b849-a56aa0438ace","source":"@none","code":"baseline-unknown"}
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1866.534461ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (1438.787679ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (4207.748283ms)
|
||||
✔ bus start --no-launch leaves an earlier host's live session alone: no signal, no end, sessions.json as it was (275.473348ms)
|
||||
✔ bus start --no-launch refuses every launch: the PM launch and a session's request, each logged, nothing spawned (235.254265ms)
|
||||
✔ bus start --no-launch starts no thread tick; the same host with launches runs it (1246.476055ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (188.603222ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (194.710702ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (204.602445ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1400.602264ms)
|
||||
✔ kill switch refuses chief and hire before launch work and a clear permits a later request (396.558108ms)
|
||||
✔ kill switch stops an actual managed namespace and records the halt reason without rewriting its bundle (362.427202ms)
|
||||
✔ a launch waiting across halt and resume cannot use its stale admission (218.641499ms)
|
||||
ℹ tests 35
|
||||
ℹ suites 0
|
||||
ℹ pass 34
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 29700.689398
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/cli/tests/launcher.test.mjs:150:1
|
||||
✖ P3 proxy key reaches the spawned runner but never session.json or the bundle (40.623657ms)
|
||||
Error [CliError]: unsupported /mnt/storage/scratch/tmp/gmDV/mosaic-launch-PVUXgr/config/businesses/acme.json launch.models.claude-opus-5-5 key: "route"
|
||||
at business (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/src/config.mjs:45:47)
|
||||
at bootConfig (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/src/config.mjs:126:10)
|
||||
at setup (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/launcher.test.mjs:99:16)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/cli/tests/launcher.test.mjs:156:34)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
exitCode: 3
|
||||
}
|
||||
exit=1
|
||||
23:42:25Z
|
||||
@@ -0,0 +1,98 @@
|
||||
23:42:41Z
|
||||
nice=19
|
||||
✖ P3 Claude env receives the session proxy URL and key, without another agent or host credential (3.24785ms)
|
||||
✖ P3 Claude preflight accepts a proxy key without a host provider credential (1.57681ms)
|
||||
✖ P3 pi refuses no-session-credential with no provider key (1.085777ms)
|
||||
✖ P3 pi refuses no-session-credential with only a Claude OAuth token (0.464216ms)
|
||||
✔ P3 pi accepts its own provider key or a session proxy key (0.351842ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 4
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 71.435137
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/plugins/tests/proxy-harness.test.mjs:24:1
|
||||
✖ P3 Claude env receives the session proxy URL and key, without another agent or host credential (3.24785ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ undefined
|
||||
- 'http://127.0.0.1:12345'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:30:12)
|
||||
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: undefined,
|
||||
expected: 'http://127.0.0.1:12345',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/plugins/tests/proxy-harness.test.mjs:39:1
|
||||
✖ P3 Claude preflight accepts a proxy key without a host provider credential (1.57681ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ {
|
||||
+ code: 'no-session-credential',
|
||||
+ message: "the bus host has none of CLAUDE_CODE_OAUTH_TOKEN, ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN with ANTHROPIC_BASE_URL; the bus unit's EnvironmentFile sets one when the bus starts"
|
||||
+ }
|
||||
- null
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:44: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: { code: 'no-session-credential', message: "the bus host has none of CLAUDE_CODE_OAUTH_TOKEN, ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN with ANTHROPIC_BASE_URL; the bus unit's EnvironmentFile sets one when the bus starts" },
|
||||
expected: null,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/plugins/tests/proxy-harness.test.mjs:49:1
|
||||
✖ P3 pi refuses no-session-credential with no provider key (1.085777ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ undefined
|
||||
- 'no-session-credential'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:51: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: undefined,
|
||||
expected: 'no-session-credential',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/plugins/tests/proxy-harness.test.mjs:54:1
|
||||
✖ P3 pi refuses no-session-credential with only a Claude OAuth token (0.464216ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ undefined
|
||||
- 'no-session-credential'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:56: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: undefined,
|
||||
expected: 'no-session-credential',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
exit=1
|
||||
23:42:41Z
|
||||
@@ -0,0 +1,82 @@
|
||||
23:41:44Z
|
||||
nice=19
|
||||
✖ P3 Claude env receives the session proxy URL and key, without another agent or host credential (0.739622ms)
|
||||
✖ P3 Claude preflight accepts a proxy key without a host provider credential (0.187719ms)
|
||||
✖ P3 pi refuses no-session-credential with no provider key (0.161237ms)
|
||||
✖ P3 pi refuses no-session-credential with only a Claude OAuth token (0.154227ms)
|
||||
✖ P3 pi accepts its own provider key or a session proxy key (0.168061ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 5
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 52.551274
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/plugins/tests/proxy-harness.test.mjs:24:1
|
||||
✖ P3 Claude env receives the session proxy URL and key, without another agent or host credential (0.739622ms)
|
||||
TypeError: Cannot destructure property 'log' of 'undefined' as it is undefined.
|
||||
at createLoader (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/src/loader.mjs:88:32)
|
||||
at harness (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:11:18)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:25:24)
|
||||
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)
|
||||
|
||||
test at packages/plugins/tests/proxy-harness.test.mjs:39:1
|
||||
✖ P3 Claude preflight accepts a proxy key without a host provider credential (0.187719ms)
|
||||
TypeError: Cannot destructure property 'log' of 'undefined' as it is undefined.
|
||||
at createLoader (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/src/loader.mjs:88:32)
|
||||
at harness (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:11:18)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:40:24)
|
||||
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)
|
||||
|
||||
test at packages/plugins/tests/proxy-harness.test.mjs:49:1
|
||||
✖ P3 pi refuses no-session-credential with no provider key (0.161237ms)
|
||||
TypeError: Cannot destructure property 'log' of 'undefined' as it is undefined.
|
||||
at createLoader (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/src/loader.mjs:88:32)
|
||||
at harness (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:11:18)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:50:20)
|
||||
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)
|
||||
|
||||
test at packages/plugins/tests/proxy-harness.test.mjs:54:1
|
||||
✖ P3 pi refuses no-session-credential with only a Claude OAuth token (0.154227ms)
|
||||
TypeError: Cannot destructure property 'log' of 'undefined' as it is undefined.
|
||||
at createLoader (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/src/loader.mjs:88:32)
|
||||
at harness (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:11:18)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:55:20)
|
||||
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)
|
||||
|
||||
test at packages/plugins/tests/proxy-harness.test.mjs:59:1
|
||||
✖ P3 pi accepts its own provider key or a session proxy key (0.168061ms)
|
||||
TypeError: Cannot destructure property 'log' of 'undefined' as it is undefined.
|
||||
at createLoader (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/src/loader.mjs:88:32)
|
||||
at harness (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:11:18)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/tests/proxy-harness.test.mjs:60:20)
|
||||
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)
|
||||
exit=1
|
||||
23:41:44Z
|
||||
@@ -0,0 +1,35 @@
|
||||
23:41:50Z
|
||||
nice=19
|
||||
✖ P3 proxy sessionEnv removes every instance provider credential without widening ENV_ALLOW (1.019646ms)
|
||||
✔ P3 no proxy retains the full existing allowlist and run environment (0.564867ms)
|
||||
ℹ tests 2
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 46.658896
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/seat/tests/proxy-session-env.test.mjs:16:1
|
||||
✖ P3 proxy sessionEnv removes every instance provider credential without widening ENV_ALLOW (1.019646ms)
|
||||
AssertionError [ERR_ASSERTION]: CLAUDE_CODE_OAUTH_TOKEN
|
||||
|
||||
true !== false
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/seat/tests/proxy-session-env.test.mjs:19:40)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: true,
|
||||
expected: false,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
exit=1
|
||||
23:41:50Z
|
||||
@@ -0,0 +1,30 @@
|
||||
00:01:55Z
|
||||
nice=19
|
||||
✔ REQ-LIMIT-1 schema: every scope unset or zero, adjustable above four, bad values and unknown models refuse (22.211777ms)
|
||||
✔ REQ-LIMIT-1 counts each exact scope at/over limit, unlimited and old tuple after model reassignment (0.666965ms)
|
||||
✔ REQ-ROLE-3 writer: atomic validated revision, immutable previous bytes and authenticated actor/old/new receipt (19.091287ms)
|
||||
✔ REQ-ROLE-3 writer: pre-rename fault leaves old file, post-rename recovery records commit, conflicting recovery refuses (15.98515ms)
|
||||
✔ REQ-LIMIT-1 / decision145 migration prints only, preserves values, rejects ambiguity, and is idempotent (4.713343ms)
|
||||
✔ REQ-LIMIT-1 shared settings validates the complete proposed selection and logs exact actor (20.35829ms)
|
||||
✔ REQ-LIMIT-1 provider is table data: another provider routes separately and aliases share exact counts (2.568186ms)
|
||||
✔ REQ-ROLE-3 refuses live writer locks, symlink targets and uncertain recovery without changing bytes (9.763289ms)
|
||||
✔ Q169 assistants: vars and definition change and log the actor; tracker null leaves no tracker (16.756637ms)
|
||||
✔ Q169 assistants: refuses other instances, other definitions, holder and credentials, empty entries, a tracker the definition has no credential for and a stale revision (19.737439ms)
|
||||
✔ Q169 assistants: a definition with a vikunja credential takes a tracker change and refuses its removal or a used bot (12.898928ms)
|
||||
✔ row 65 routes lists every instance with harness, model, thinking and fallback, the switched-on harnesses, the model keys and each harness's levels (2.552837ms)
|
||||
✔ row 65 setRoutes saves a harness, model, thinking and whole fallback, reads each back from the file, logs the actor, and a null fallback clears all three (16.235475ms)
|
||||
✔ row 65 setRoutes refuses a partial fallback, a switched-off harness, a level the harness doesn't apply, an unloaded module, an unknown model or instance, a malformed route, no change and a stale revision, with the file unchanged (20.272464ms)
|
||||
✔ row 65 a file with harness vars and no plugins.harness loads and its views read; a model change still saves, and a route change refuses harness-off (10.564122ms)
|
||||
✔ B7 kept instance: the models keys it names and the instances key are the human's (26.878317ms)
|
||||
✔ B7 kept instance: its route is the human's (10.786018ms)
|
||||
✔ M10 creative instance: models keys it names, the instances key and its route are the human's (35.64373ms)
|
||||
ℹ tests 18
|
||||
ℹ suites 0
|
||||
ℹ pass 18
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 331.736961
|
||||
exit=0
|
||||
00:01:56Z
|
||||
@@ -0,0 +1,62 @@
|
||||
00:01:56Z
|
||||
nice=19
|
||||
✔ C2-04: launcher workspace clones code but never the library (1457.042303ms)
|
||||
✔ P3 proxy key reaches the spawned runner but never session.json or the bundle (1365.062806ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1374.325436ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"ra78486da0ed8","instance":"chief","turn":"9402e726-ac22-4423-aea9-cf7dcc35c134","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r49e89e37520e","instance":"coder","turn":"6bf40609-ae81-49b3-96d0-de2d5811b135","source":"@none","code":"baseline-unknown"}
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (836.256914ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rf8408ce6a5b4","instance":"chief","turn":"e773abb1-268c-4404-a5da-81acd979905f","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r42524dd77612","instance":"pm","turn":"58e2bf95-0793-4495-bcdc-b27aa651caa1","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rf8408ce6a5b4","instance":"chief","turn":"cb53fe60-e24f-4760-b284-d3b1d3620050","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r42524dd77612","instance":"pm","turn":"7460fc5d-aea2-4343-98a5-00d063c730c5","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r42524dd77612","instance":"pm","turn":"1ee4cbc7-90b7-4275-b3ac-4cbbd0394912","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rf8408ce6a5b4","instance":"chief","turn":"1573dcc7-1d85-4783-b8c9-1a25c6ff71ac","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r42524dd77612","instance":"pm","turn":"bcb2aa05-7af5-4d9e-b085-c631754554ae","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"rf8408ce6a5b4","instance":"chief","turn":"9c77b01a-8f82-4d76-8e86-3eccdf5c05bc","source":"@none","code":"baseline-unknown"}
|
||||
✔ a launched pm's request_staff reaches the chief of staff; no other session has the tool and the launch limits still hold (1399.028095ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (4193.990785ms)
|
||||
✔ a role the broker says holds a merge decision gets land_work, its prompt line, its landing and the git socket; without it, none (707.949813ms)
|
||||
✔ REQ-LAUNCH-1 the tick starts a listed merge decision holder once, with land_work, the Landing line and its landing turn; an unlisted holder starts nothing (438.968553ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r33b3a0a89f29","instance":"coder","turn":"54d42057-6aeb-4460-bbbb-11bb7d96f6a0","source":"@none","code":"baseline-unknown"}
|
||||
✔ a holder running since before the resolution is stopped once the broker releases it, land-relaunch, and the next tick starts it: landing turn first, then the message that waited (784.946481ms)
|
||||
✔ a landing run that ended isn't started again for its decision, a spent decision starts nothing, and a new decision starts the holder (733.626616ms)
|
||||
✔ after a restart, the new host's first tick starts a holder whose decision is still held (1104.180428ms)
|
||||
✔ a refused landing start is logged once per code with its decision, isn't a start, and the next tick with room starts the holder (766.099638ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (314.836965ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (380.228742ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (206.698491ms)
|
||||
✔ a pi launch with no own credential refuses no-session-credential (194.63649ms)
|
||||
usage: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/down is missing","kept":[]}
|
||||
plugins: {"event":"plugin-refused","kind":"harness","name":"down","code":"missing","message":"/home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/down is missing","kept":[]}
|
||||
✔ row 65 a failed primary preflight launches the fallback on a fixture harness module, recording the route and the reason (395.760187ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (404.215037ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (204.482756ms)
|
||||
✔ row 64 a role skill that isn't enabled refuses skill-not-enabled, and one that isn't a plain directory skill-refused, before anything starts (223.681469ms)
|
||||
✔ row 213 a creative instance's persona is read from <configDir>/personas: off its digest the launch fails with the mismatch as its reason (294.218836ms)
|
||||
✔ row 64 on Claude Code a role skill that isn't enabled refuses the same way, before anything starts (216.464613ms)
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r4b699771c38c","instance":"chief","turn":"77969cf2-7fc8-41ff-8d52-7569e054b6f8","source":"@none","code":"baseline-unknown"}
|
||||
usage: {"event":"usage-unknown","business":"acme","run":"r6e6168e49a89","instance":"coder","turn":"e6dfb039-1843-41b7-8111-7992cfddac3d","source":"@none","code":"baseline-unknown"}
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (2155.647443ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (1620.990125ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (4336.758535ms)
|
||||
✔ bus start --no-launch leaves an earlier host's live session alone: no signal, no end, sessions.json as it was (279.143242ms)
|
||||
✔ bus start --no-launch refuses every launch: the PM launch and a session's request, each logged, nothing spawned (229.339371ms)
|
||||
✔ bus start --no-launch starts no thread tick; the same host with launches runs it (1236.511266ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (212.151607ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (201.563393ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (203.041695ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1399.240682ms)
|
||||
✔ kill switch refuses chief and hire before launch work and a clear permits a later request (362.776444ms)
|
||||
✔ kill switch stops an actual managed namespace and records the halt reason without rewriting its bundle (400.610758ms)
|
||||
✔ a launch waiting across halt and resume cannot use its stale admission (221.918115ms)
|
||||
ℹ tests 35
|
||||
ℹ suites 0
|
||||
ℹ pass 35
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 30999.3545
|
||||
exit=0
|
||||
00:02:27Z
|
||||
@@ -0,0 +1,35 @@
|
||||
00:01:56Z
|
||||
nice=19
|
||||
✔ P3 Anthropic route uses messages at proxy root and the declared model id (11.574291ms)
|
||||
✔ P3 omitted route refuses proxy-route-missing before model config generation (2.072933ms)
|
||||
✔ P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility (2.699568ms)
|
||||
✖ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (2.510206ms)
|
||||
✔ P3 a declared Codex route refuses generation while the build-time API is PENDING (2.334352ms)
|
||||
✔ P3 models file is private, references the one session key, and stores no executable values or keys (3.084202ms)
|
||||
✔ P3 every launch regenerates proxy port, declared models and own key without caching (5.343868ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 6
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 108.561079
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/proxy-bundle.test.mjs:62:1
|
||||
✖ P3 GPT route selects a stack-owned provider instead of pi Codex OAuth (2.510206ms)
|
||||
Error: proxy GPT API is PENDING build-time evidence
|
||||
at Module.bundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/plugins/harness/pi/index.mjs:78:62)
|
||||
at buildBundle (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/src/bundle.mjs:359:23)
|
||||
at build (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:20:18)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row332/packages/harness/tests/proxy-bundle.test.mjs:63:13)
|
||||
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)
|
||||
exit=1
|
||||
00:01:56Z
|
||||
@@ -0,0 +1,16 @@
|
||||
packages/business/tests/launch-settings.test.mjs:41: assert.throws(()=>migrateLaunch(old,{...mapping,families:{opus:'missing',sonnet:'sonnet'}},f.file,{rolesDir:f.rolesDir}));assert.throws(()=>migrateLaunch(old,{...mapping,families:{opus:'opus',sonnet:'opus'}},f.file,{rolesDir:f.rolesDir}),/ambiguous/);assert.throws(()=>migrateLaunch(old,{...mapping,models:{...mapping.models,proxy:{provider:'proxy',route:'anthropic',model:'claude-opus-5-5'}},instances:{pm:'proxy'}},f.file,{rolesDir:f.rolesDir}),/ambiguous/);const onlyOpus=structuredClone(old);onlyOpus.launch.max={opus:4};assert.throws(()=>migrateLaunch(onlyOpus,mapping,f.file,{rolesDir:f.rolesDir}),/unknown or ambiguous/);const allOpus=structuredClone(old);for(const r of Object.values(allOpus.roles))r.vars.model='claude-opus-5-5';assert.throws(()=>migrateLaunch(allOpus,{...mapping,families:{opus:'opus',sonnet:'opus'}},f.file,{rolesDir:f.rolesDir}),/ambiguous/);assert.equal(readFileSync(f.file,'utf8'),bytes);assert.equal(statSync(f.file).mtimeMs,mtime);
|
||||
packages/business/tests/launch-settings.test.mjs:45: const result=settings.set('acme',{revision:view.revision,limits:{total:0},instances:{coder:'opus'}},'jason');assert.equal(result.limits.total,0);assert.equal(result.instances.coder.modelKey,'opus');const models=structuredClone(result.models);models.opus.provider='proxy';models.opus.route='anthropic';const updated=settings.set('acme',{revision:result.revision,models},'jason');assert.equal(updated.instances.pm.provider,'proxy');assert.throws(()=>settings.set('acme',{revision:result.revision,instances:{coder:'ghost'}},'jason'));assert.throws(()=>settings.set('acme',{revision:result.revision,roles:{}},'jason'));
|
||||
packages/business/tests/launch-settings.test.mjs:154: const moved={...models,[key]:{provider:'proxy',route:'anthropic',model:'claude-sonnet-5-5'}};
|
||||
packages/business/tests/launch-settings.test.mjs:161: ({revision}=settings.set('acme',{revision,models:{...models,spare:{provider:'proxy',route:'anthropic',model:'claude-opus-5-5'}}},chief));
|
||||
packages/business/tests/launch-settings.test.mjs:188: const sonnet={...models,sonnet:{provider:'proxy',route:'anthropic',model:'claude-sonnet-5-5'}};
|
||||
packages/business/tests/launch-settings.test.mjs:198: ({revision}=settings.set('acme',{revision,models:{...models,opus:{provider:'proxy',route:'anthropic',model:'claude-opus-5-5'}}},chief));
|
||||
packages/business/tests/proxy-launch.test.mjs:8: const models = { selected: { provider: 'proxy', model: 'proxy-only-id', route } };
|
||||
packages/business/tests/proxy-launch.test.mjs:14: assert.throws(() => checkModels({ selected: { provider: 'proxy', model: 'proxy-only-id' } }), {
|
||||
packages/business/tests/proxy-launch.test.mjs:21: assert.throws(() => checkModels({ selected: { provider: 'proxy', model: 'proxy-only-id', route } }), {
|
||||
packages/cli/tests/launcher.test.mjs:155: doc.launch.models['claude-opus-5-5'] = { provider: 'proxy', model: 'claude-fixture', route: 'anthropic' };
|
||||
packages/harness/tests/proxy-bundle.test.mjs:10: a: { provider: 'proxy', model: 'claude-fixture', route: 'anthropic' },
|
||||
packages/harness/tests/proxy-bundle.test.mjs:11: z: { provider: 'proxy', model: 'glm-fixture', route: 'glm' },
|
||||
packages/harness/tests/proxy-bundle.test.mjs:12: g: { provider: 'proxy', model: 'gpt-fixture', route: 'codex' },
|
||||
packages/harness/tests/proxy-bundle.test.mjs:47: a: { provider: 'proxy', model: 'claude-fixture' },
|
||||
packages/harness/tests/proxy-bundle.test.mjs:97: a: { provider: 'proxy', model: 'changed-model-id', route: 'anthropic' },
|
||||
packages/harness/tests/proxy-bundle.test.mjs:98: z: { provider: 'proxy', model: 'changed-glm-id', route: 'glm' },
|
||||
@@ -0,0 +1,18 @@
|
||||
00:01:47Z
|
||||
nice=19
|
||||
✔ P3 proxy model validation preserves each explicit wire route and the proxy model id (1.21495ms)
|
||||
✔ P3 a proxy model without route refuses proxy-route-missing (0.356994ms)
|
||||
✔ P3 an unknown proxy route refuses proxy-route-unknown (0.767073ms)
|
||||
✔ P3 nonproxy models retain their provider/model-only shape and reject route metadata (0.17626ms)
|
||||
✔ P3 launch.account accepts the proxy credential source without naming host variables (0.179844ms)
|
||||
✔ P3 existing environment-set accounts retain their validated representation (0.312195ms)
|
||||
ℹ tests 6
|
||||
ℹ suites 0
|
||||
ℹ pass 6
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 57.913873
|
||||
exit=0
|
||||
00:01:47Z
|
||||
@@ -0,0 +1,31 @@
|
||||
packages/business/tests/launch-settings.test.mjs:41: assert.throws(()=>migrateLaunch(old,{...mapping,families:{opus:'missing',sonnet:'sonnet'}},f.file,{rolesDir:f.rolesDir}));assert.throws(()=>migrateLaunch(old,{...mapping,families:{opus:'opus',sonnet:'opus'}},f.file,{rolesDir:f.rolesDir}),/ambiguous/);assert.throws(()=>migrateLaunch(old,{...mapping,models:{...mapping.models,proxy:{provider:'proxy',route:'anthropic',model:'claude-opus-5-5'}},instances:{pm:'proxy'}},f.file,{rolesDir:f.rolesDir}),/ambiguous/);const onlyOpus=structuredClone(old);onlyOpus.launch.max={opus:4};assert.throws(()=>migrateLaunch(onlyOpus,mapping,f.file,{rolesDir:f.rolesDir}),/unknown or ambiguous/);const allOpus=structuredClone(old);for(const r of Object.values(allOpus.roles))r.vars.model='claude-opus-5-5';assert.throws(()=>migrateLaunch(allOpus,{...mapping,families:{opus:'opus',sonnet:'opus'}},f.file,{rolesDir:f.rolesDir}),/ambiguous/);assert.equal(readFileSync(f.file,'utf8'),bytes);assert.equal(statSync(f.file).mtimeMs,mtime);
|
||||
packages/business/tests/launch-settings.test.mjs:45: const result=settings.set('acme',{revision:view.revision,limits:{total:0},instances:{coder:'opus'}},'jason');assert.equal(result.limits.total,0);assert.equal(result.instances.coder.modelKey,'opus');const models=structuredClone(result.models);models.opus.provider='proxy';models.opus.route='anthropic';const updated=settings.set('acme',{revision:result.revision,models},'jason');assert.equal(updated.instances.pm.provider,'proxy');assert.throws(()=>settings.set('acme',{revision:result.revision,instances:{coder:'ghost'}},'jason'));assert.throws(()=>settings.set('acme',{revision:result.revision,roles:{}},'jason'));
|
||||
packages/business/tests/launch-settings.test.mjs:154: const moved={...models,[key]:{provider:'proxy',route:'anthropic',model:'claude-sonnet-5-5'}};
|
||||
packages/business/tests/launch-settings.test.mjs:161: ({revision}=settings.set('acme',{revision,models:{...models,spare:{provider:'proxy',route:'anthropic',model:'claude-opus-5-5'}}},chief));
|
||||
packages/business/tests/launch-settings.test.mjs:188: const sonnet={...models,sonnet:{provider:'proxy',route:'anthropic',model:'claude-sonnet-5-5'}};
|
||||
packages/business/tests/launch-settings.test.mjs:198: ({revision}=settings.set('acme',{revision,models:{...models,opus:{provider:'proxy',route:'anthropic',model:'claude-opus-5-5'}}},chief));
|
||||
packages/business/tests/proxy-launch.test.mjs:8: const models = { selected: { provider: 'proxy', model: 'proxy-only-id', route } };
|
||||
packages/business/tests/proxy-launch.test.mjs:14: assert.throws(() => checkModels({ selected: { provider: 'proxy', model: 'proxy-only-id' } }), {
|
||||
packages/business/tests/proxy-launch.test.mjs:21: assert.throws(() => checkModels({ selected: { provider: 'proxy', model: 'proxy-only-id', route } }), {
|
||||
packages/business/tests/proxy-launch.test.mjs:35: assert.deepEqual(checkAccount({ name: 'proxy', credential: 'proxy' }), { name: 'proxy', credential: 'proxy' });
|
||||
packages/business/tests/proxy-launch.test.mjs:43: assert.throws(() => checkAccount({ name: 'proxy', credential }), /launch\.account\.credential/);
|
||||
packages/cli/tests/launcher.test.mjs:155: doc.launch.models['claude-opus-5-5'] = { provider: 'proxy', model: 'claude-fixture', route: 'anthropic' };
|
||||
packages/cli/tests/model-proxy.test.mjs:11:test('proxy init agent and tester refuse before prompting or transport',async()=>{for(const args of [['proxy','init','--tester'],['proxy','init']]){const x=io(args.includes('--tester')?{}:{CODEX_THREAD_ID:'fixture'});await assert.rejects(main(args,x,{promptProxyKey:()=>{throw Error('must not prompt');}}),code('human-required'));}});
|
||||
packages/cli/tests/model-proxy.test.mjs:12:test('proxy init prompts twice through no-echo seam and sends key only through human transport',async()=>{const x=io();x.stdin.isTTY=true;x.stdout.isTTY=true;const prompts=[],calls=[];await main(['proxy','init','--business','demo','--port','18432'],x,{system:fakeSystem(),promptProxyKey:async()=>{prompts.push('hidden');return 'p1-management';},transport:b=>async(verb,args)=>{calls.push({b,verb,args});return {port:18432,binary:'/fixture'};}});assert.equal(prompts.length,2);assert.deepEqual(calls,[{b:'demo',verb:'proxy.init',args:{key:'p1-management',port:18432}}]);assert.equal(x.out.text.includes('p1-management'),false);});
|
||||
packages/cli/tests/model-proxy.test.mjs:13:test('proxy-key-mismatch: confirmation refuses without bus call',async()=>{const x=io();x.stdin.isTTY=true;x.stdout.isTTY=true;let count=0;await assert.rejects(main(['proxy','init','--business','demo'],x,{system:fakeSystem(),promptProxyKey:async()=>++count===1?'p1-one':'p1-two',transport:()=>()=>{throw Error('must not call');}}),code('proxy-key-mismatch'));});
|
||||
packages/cli/tests/model-proxy.test.mjs:14:test('proxy-terminal-required: stdin redirection refuses',async()=>{await assert.rejects(main(['proxy','init'],io(),{system:fakeSystem()}),code('proxy-terminal-required'));});
|
||||
packages/cli/tests/model-proxy.test.mjs:15:test('proxy-usage: invalid verb and repeated flags refuse',async()=>{for(const args of [['proxy','unknown'],['proxy','init','--port','18432','--port','18433']])await assert.rejects(main(args,io(),{system:fakeSystem()}),code('proxy-usage'));});
|
||||
packages/cli/tests/model-proxy.test.mjs:16:test('proxy-config-invalid: port 8317 refuses before prompting',async()=>await assert.rejects(main(['proxy','init','--port','8317'],io(),{system:fakeSystem()}),code('proxy-config-invalid')));
|
||||
packages/cli/tests/model-proxy.test.mjs:17:test('proxy-key-invalid: empty prompt refuses without printing input',async()=>{const x=io();x.stdin.isTTY=true;x.stdout.isTTY=true;await assert.rejects(main(['proxy','init','--business','demo'],x,{system:fakeSystem(),promptProxyKey:async()=>'',transport:()=>()=>{throw Error('must not call');}}),code('proxy-key-invalid'));});
|
||||
packages/harness/tests/proxy-bundle.test.mjs:10: a: { provider: 'proxy', model: 'claude-fixture', route: 'anthropic' },
|
||||
packages/harness/tests/proxy-bundle.test.mjs:11: z: { provider: 'proxy', model: 'glm-fixture', route: 'glm' },
|
||||
packages/harness/tests/proxy-bundle.test.mjs:12: g: { provider: 'proxy', model: 'gpt-fixture', route: 'codex' },
|
||||
packages/harness/tests/proxy-bundle.test.mjs:47: a: { provider: 'proxy', model: 'claude-fixture' },
|
||||
packages/harness/tests/proxy-bundle.test.mjs:97: a: { provider: 'proxy', model: 'changed-model-id', route: 'anthropic' },
|
||||
packages/harness/tests/proxy-bundle.test.mjs:98: z: { provider: 'proxy', model: 'changed-glm-id', route: 'glm' },
|
||||
packages/model-proxy/tests/config-unit.test.mjs:14:test('loader proxy absent is byte-compatible; present validates sidecar and preserves config.json',()=>{const f=fixture(),before=readFileSync(f.file);let r=run(f,'scripts/mosaic-config.mjs',['validate']);assert.equal(r.status,0,r.stderr);assert.equal(Object.hasOwn(JSON.parse(r.stdout),'proxy'),false);const value=proxy(f);r=run(f,'scripts/mosaic-config.mjs',['validate']);assert.equal(r.status,0,r.stderr);assert.deepEqual(JSON.parse(r.stdout).proxy,value);assert.deepEqual(readFileSync(f.file),before);});
|
||||
packages/model-proxy/tests/config-unit.test.mjs:23:test('historical no-proxy config loader works without new package dependency',()=>{const f=fixture();const copy=join(f.root,'historical/scripts');mkdirSync(copy,{recursive:true});writeFileSync(join(copy,'mosaic-config.mjs'),readFileSync(join(repo,'scripts/mosaic-config.mjs')));const r=spawnSync(process.execPath,[join(copy,'mosaic-config.mjs'),'validate'],{env:f.env,encoding:'utf8',timeout:10000});assert.equal(r.status,0,r.stderr);assert.equal(Object.hasOwn(JSON.parse(r.stdout),'proxy'),false);});
|
||||
packages/model-proxy/tests/management-key-encoding.test.mjs:71: assert.deepEqual(added('data'), ['proxy', 'proxy/auth', 'proxy/config.yaml', 'proxy/logs']);
|
||||
packages/model-proxy/tests/runner.test.mjs:9:test('runner verifies before spawning and supplies pinned panel and local model without ambient secrets',()=>{const {root,config,install}=fixture();const calls=[],child=new EventEmitter();startVerifiedProxy(config,{env:{HOME:join(root,'home'),MANAGEMENT_PASSWORD:'p1-management',OPENAI_API_KEY:'p1-upstream'},verify:dir=>{calls.push(['verify',dir]);return install;},spawnImpl:(...args)=>{calls.push(['spawn',...args]);return child;}});assert.equal(calls[0][0],'verify');assert.deepEqual(calls[1],['spawn',install.binary,['-config',join(config.dataRoot,'proxy/config.yaml'),'-local-model'],{cwd:join(config.dataRoot,'proxy'),stdio:'inherit',env:{HOME:join(root,'home'),PATH:'/usr/bin:/bin',MANAGEMENT_STATIC_PATH:join(root,'pin/static')}}]);});
|
||||
packages/model-proxy/tests/settings.test.mjs:19:test('exclusive initialization writes private sentinel config, never rewrites config.json or exposes key',async()=>{const f=fixture();installed(f);const key='p1-management';const result=await initializeProxy({...f,pin,key});assert.ok(result.port>=1024&&result.port!==8317);assert.equal(JSON.stringify(result).includes(key),false);const conf=JSON.parse(readFileSync(join(f.dataRoot,'proxy/config.yaml'),'utf8'));assert.equal(conf.server.host,'127.0.0.1');assert.equal(conf.management['allow-remote'],false);assert.equal(conf.management['disable-auto-update-panel'],true);assert.equal(conf.routing.strategy,'fill-first');assert.equal(conf.routing.retry['request-retry'],0);assert.match(conf.access['api-keys'][0],/^msk-.*-sentinel-/);for(const file of [join(f.configDir,'secrets/proxy-management.key'),join(f.dataRoot,'proxy/config.yaml')])assert.equal(lstatSync(file).mode&0o777,0o600);for(const dir of ['proxy','proxy/auth','proxy/logs'])assert.equal(lstatSync(join(f.dataRoot,dir)).mode&0o777,0o700);assert.equal(readFileSync(join(f.configDir,'config.json'),'utf8'),'unchanged');await assert.rejects(initializeProxy({...f,pin,key}),code('proxy-already-initialized'));});
|
||||
packages/model-proxy/tests/settings.test.mjs:23:test('proxy-already-initialized: each existing target is preserved and never followed',async()=>{for(const target of ['proxy','key','settings']){const f=fixture();installed(f);let file;if(target==='proxy'){file=join(f.dataRoot,'proxy');mkdirSync(file);writeFileSync(join(file,'marker'),'old');}else if(target==='key'){mkdirSync(join(f.configDir,'secrets'),{mode:0o700});file=join(f.configDir,'secrets/proxy-management.key');writeFileSync(file,'old');}else{file=join(f.configDir,'proxy.json');writeFileSync(file,'old');}await assert.rejects(initializeProxy({...f,pin,key:'p1-management'}),code('proxy-already-initialized'));assert.equal(readFileSync(target==='proxy'?join(file,'marker'):file,'utf8'),'old');}});
|
||||
@@ -0,0 +1,163 @@
|
||||
# Row 334 — Case 2 proxy unit (#1832)
|
||||
|
||||
## Design at 78b69e1e6 (2026-10-25)
|
||||
|
||||
Scope: mos-1616 ruling 1, P1 item 7 only. No template, runner, PIN,
|
||||
user-unit path, config/secret access, or live unit changes.
|
||||
|
||||
Current references: case2-unit.sh template seams 44-45, defaults 54-57,
|
||||
render 435, check_unit 489, render checks 548-551, re-install 553-573,
|
||||
active-state capture 576-580, writes/start/report 583-610.
|
||||
case2-install.sh Next: 231. P1 instance.sh PROXY_UNIT 86;
|
||||
bus-service.sh dependency insertion 93. P1 template ExecStart 13;
|
||||
run.mjs validates config 11-13 and calls startVerifiedProxy 14;
|
||||
runner.mjs refuses proxy-not-configured 8, verifyInstall 9;
|
||||
settings.mjs verifyInstall 23-30 refuses proxy-install-invalid for a hash
|
||||
mismatch. run.mjs catches that and exits 3. P1 item 7 is rows doc 86-90;
|
||||
row209 entry check 2 remains 32-36.
|
||||
|
||||
Add bare --proxy and CASE2_PROXY_TEMPLATE. Render P1's unmodified template
|
||||
with copy, PATH, node and deleted CONFIG_ENV; add User/Group plus bus's four
|
||||
hardening lines, no capabilities or EnvironmentFile. check_unit proxy uses
|
||||
exact node + copy/packages/model-proxy/src/run.mjs, NoNewPrivileges=yes,
|
||||
and every common refusal. Restrict CLAUDE_ENV expectation and capabilities
|
||||
to their existing bus/webui kinds. Insert bus Wants/After immediately after
|
||||
Description exactly as P1 does, only with --proxy. No-proxy output remains
|
||||
byte identical.
|
||||
|
||||
Re-install checks all selected units against render modulo copy id and
|
||||
compares every installed copy id. Existing proxy without --proxy refuses
|
||||
before writes, including a dangling symlink. No deletion. Enable all
|
||||
selected units, then start proxy, bus, Console. Capture/report already-running
|
||||
proxy with the others and name all three in restart-together guidance.
|
||||
Change only case2-install.sh's closing Next: to tell root to add --proxy
|
||||
when the config has a proxy section.
|
||||
|
||||
Tests first, unrun until Sage CLEAR: byte-identical non-proxy renders;
|
||||
proxy content and exact dependencies; each common/proxy check_unit refusal
|
||||
by message; rendered ExecStart wrong-PIN refusal proxy-install-invalid rc 3;
|
||||
three-unit re-install and mixed copies including proxy-only mismatch;
|
||||
installed proxy without flag preserves files; start order and failures;
|
||||
already-running report; install Next: guidance. Named mutants: remove bus
|
||||
After=; direct binary ExecStart bypassing run.mjs. Whole-file run list will
|
||||
be derived from static imports before any run; case1-accept stays off.
|
||||
|
||||
P2 is not present on this base (row331 still in progress); inspect landed
|
||||
P2 refusal code before final handoff. No flag/config false-positive check:
|
||||
P1 startVerifiedProxy refuses proxy-not-configured, run.mjs exits 3.
|
||||
|
||||
## Slot / session
|
||||
|
||||
No tests run. CLEAR pending from Sage. Canonical queue start initially
|
||||
refused: lock held by magica-331-start since 03:57:01.839Z. Same operation
|
||||
will be retried after a minute; no lock manipulation.
|
||||
|
||||
Correction to line references above: row209 entry check 2 is 29-33;
|
||||
run.mjs config validation 8-10, runner call 11, refusal exit status 18.
|
||||
case2-unit.sh is byte-identical to brief base 58b2bbb3a (sha256
|
||||
4ca8769134d83ee391bcc73af5bd042b9e2b161cac22821d29fcca710a9afad4).
|
||||
P1 paths named above have no diff between 86cb5c221 and 78b69e1e6.
|
||||
Own-worktree root npm ci --ignore-scripts --no-audit --no-fund: rc 0,
|
||||
128 packages. No tests invoked.
|
||||
|
||||
Sage sage-4346 accepts design, authorizes writing RED tests then code while
|
||||
holding all runs until CLEAR. Tests were written first, then implementation;
|
||||
no RED run has occurred. Installed proxy without --proxy explicitly refuses
|
||||
and preserves bytes; dangling symlink also refuses, never deletes. P2 code
|
||||
remains pending until row331 lands. Both wrong-flag P1 runner paths covered.
|
||||
|
||||
Import-manifest correction: expanded traversal to include multiline import
|
||||
and export-from edges (the business/library barrel modules). Closure is
|
||||
53 local modules; only the same two test entrypoints occur. The run list
|
||||
is unchanged; this is source inspection, no tests executed.
|
||||
|
||||
Queue start completed: rockerduck-334-start rev4079, row334
|
||||
briefed→in-progress. git diff --check passed. Implementation, tests and
|
||||
import manifest prepared; no tests, commits or pushes performed. Verification
|
||||
awaits Sage's CLEAR; no live host/instance access occurred.
|
||||
|
||||
## RED run authorized by sage-4387, 2026-10-25 04:21Z
|
||||
|
||||
Whole files, sequential, with each corresponding script temporarily restored
|
||||
from 78b69e1e6 and its implementation restored by EXIT trap afterwards:
|
||||
- case2-unit.test.mjs: rc1, 81 tests, 48 pass, 33 fail, 0 skips;
|
||||
TMPDIR=/mnt/storage/scratch/tmp/QD3vp5, nice=19, 77995.928687 ms.
|
||||
All 47 old tests pass; new no-proxy byte equality passes. 32 new failures
|
||||
encounter baseline unsupported --proxy usage rc4; dangling installed proxy
|
||||
symlink case gets rc0 rather than refusal because baseline ignores it.
|
||||
- case2-install.test.mjs: rc1, 28 tests, 27 pass, 1 fail, 0 skips;
|
||||
TMPDIR=/mnt/storage/scratch/tmp/YAGfKJ, nice=19, 10016.247032 ms.
|
||||
All old tests pass. New Next: guidance assertion fails because baseline
|
||||
lacks add --proxy when the config has a proxy section.
|
||||
|
||||
Every failure and cause is listed in red-results.txt; full plain-text
|
||||
outputs in red-unit.log and red-install.log. Absolute node/test paths used.
|
||||
Implementation restored, git diff --check clean. No old-test red, rerun,
|
||||
assertion change, GREEN or mutant run. P2 check still pending row331.
|
||||
Slot returned to Sage; GREEN and mutants await separate CLEAR.
|
||||
|
||||
Sage sage-4390 accepts clean RED and explicitly authorizes committing and
|
||||
pushing this candidate to rockerduck/row334 before GREEN. No force push.
|
||||
GREEN and mutants remain held for a separate CLEAR after row331 lands;
|
||||
then rebase onto landed P2 and check its missing-flag refusal code.
|
||||
|
||||
## Mos1961 targeted execution — 2026-10-26
|
||||
|
||||
Authority: integrate onto refactor09a847ed, preserve old RED, two whole
|
||||
files serial plus bounded named mutants/restoration. No push, borrowed
|
||||
posting, live operations or review dispatch. All reviewers Codex; parent
|
||||
arranges actual new review. Full package/global gate remains Sage's.
|
||||
|
||||
Integration: first attempted merge retained both append-only log sides but
|
||||
merge-continue was refused by the queue guard for incoming queue files.
|
||||
Diagnosed scripts/git-hooks/pre-commit and packages/queue/README.md's
|
||||
merge/rebase protocol; aborted merge, rebased normally without disabling
|
||||
or overriding any hook. Only BUILD-LOG.md and SESSIONS.md conflicted;
|
||||
retained current refactor log plus all candidate additions. Integrated
|
||||
source commit c4bba5d2a3936897035c0e8fc8c3e14ca96b73af on exact base
|
||||
09a847edaa25b609bac7728ff83f224708a29399. Old candidate bd5720662 stays
|
||||
on origin/rockerduck/row334; no push performed. Original RED files retain
|
||||
identical bytes (cleanup.txt records their hashes).
|
||||
|
||||
Resources: before runs, no other node --test process found, memory
|
||||
available 29270 MiB, swap free 85176 MiB, memory PSI full avg10 0.28.
|
||||
Own-worktree npm ci --ignore-scripts --no-audit --no-fund rc0, nice19.
|
||||
Fresh shell-mktemp short TMPDIR, private HOME/XDG_CONFIG_HOME and explicit
|
||||
private MOSAIC_CONFIG per run. No real config/keys/units accessed. Absolute
|
||||
node/test/TAP paths. Existing per-command and per-test deadlines preserved.
|
||||
Import/export-from graph refreshed in green-imports.txt (56 local modules,
|
||||
only case2-unit.test.mjs and case2-install.test.mjs as test entrypoints).
|
||||
Sage-owned case2-precheck.sh and case1-accept.test.mjs unchanged, not run.
|
||||
Only closing Next: line changed in case2-install.sh.
|
||||
|
||||
Measured serial runs (raw TAP beside this file):
|
||||
- green-unit.tap: rc0, 81/81 pass, zero skips, 78022.489026 ms.
|
||||
- green-install.tap: rc0, 28/28 pass, zero skips, 8298.345458 ms.
|
||||
- mutant-after.tap: rc1, selected test 1 fail, zero skips, 259.619391 ms.
|
||||
Removed only bus After= insertion; expected dependency assertion killed it.
|
||||
- mutant-exec.tap: rc1, selected test 1 fail, zero skips, 237.081878 ms.
|
||||
Changed proxy template ExecStart to direct binary; exact ExecStart check
|
||||
refused, selected content/start-order test killed it. Template restored.
|
||||
- restored.tap: rc0, 2/2 pass, zero skips, 569.147722 ms, content/start-order
|
||||
plus rendered ExecStart PIN/no-proxy refusals after both restorations.
|
||||
Each bounded mutant/restoration command had timeout -k10 60; no timeout hit.
|
||||
Each TAP header records private paths and measured nice19. No unexpected
|
||||
red, assertion relaxation, deadline change or blind retry. Mutation diffs
|
||||
and mutated-source hashes retained, source restored by EXIT traps.
|
||||
|
||||
P2 dependency correction: product362893d043ff96fdd35f18e326cce683db031471
|
||||
landed in refactor; queue331 is tracking-only per Mos1915/#436, not a
|
||||
product blocker. Landed packages/bus/src/model-keys.mjs:161 and :167 refuse
|
||||
proxy-down on connection/client failure; :168 refuses non2xx as
|
||||
proxy-key-refused. P1 runner still refuses proxy-not-configured with exit3
|
||||
when no proxy section exists. The rendered runner test now passes both
|
||||
wrong-PIN proxy-install-invalid exit3 and missing-proxy exit3 checks.
|
||||
This is temp-root test/source evidence; live .53/.54 behavior UNVERIFIED.
|
||||
|
||||
Restoration: every green-source.sha256 pin matches after mutants, including
|
||||
P1 template and PIN. Cleanup: all five logged test HOME/config/TMPDIR roots
|
||||
removed; no node --test process remains at 22:42:35Z. Test fixture cleanup
|
||||
completed. Temporary source backup copies were retained outside repository.
|
||||
Raw evidence hashes in green-evidence.sha256. SLOTBACK: targeted work
|
||||
complete; source ready for parent-arranged Codex review. Full package/global
|
||||
landing gate and live install acceptance are not claimed.
|
||||
@@ -0,0 +1,14 @@
|
||||
Mos1961 targeted serial-slot cleanup/restoration
|
||||
green-unit.tap: private root /mnt/storage/scratch/tmp/EHvgUM exists-before=True
|
||||
removed=True
|
||||
green-install.tap: private root /mnt/storage/scratch/tmp/iXTGcB exists-before=True
|
||||
removed=True
|
||||
mutant-after.tap: private root /mnt/storage/scratch/tmp/3LlK4H exists-before=True
|
||||
removed=True
|
||||
mutant-exec.tap: private root /mnt/storage/scratch/tmp/JuznlZ exists-before=True
|
||||
removed=True
|
||||
restored.tap: private root /mnt/storage/scratch/tmp/ayiWpX exists-before=True
|
||||
removed=True
|
||||
red-unit.log: old RED bytes preserved sha256=8a5c1074b520e3b4ff713e8766cae14b468d0589853499cb4ab0cc8510df3cea
|
||||
red-install.log: old RED bytes preserved sha256=11138bdf1dcd314e35bf240e0a46c5d9deef204508b5bbec1d298c84a2e05f6f
|
||||
red-results.txt: old RED bytes preserved sha256=d4e2fcb9c4387c6a328aa8d95576f2ec5a317b1a74210e341026ee89b3c1b76c
|
||||
@@ -0,0 +1,14 @@
|
||||
cf0390df3b2800ccfa74ca8e1701de6f23496f12e376f63a3ed415b1e8280ba7 agents/rockerduck/work/queue-334/green-unit.tap
|
||||
32d48a5bf5a9743e36525cef07c17989d3a4f3304d2c54359d5599ed548dde26 agents/rockerduck/work/queue-334/green-install.tap
|
||||
4f11595c78fd8bc63ccc6da58fec28231c5fec0a77638cfd1f92a2bcbd5c4ffa agents/rockerduck/work/queue-334/mutant-after.tap
|
||||
64545ce09254a7fd7674b4b91a19e31d093254917ae4370bb5e6d9372761cdd1 agents/rockerduck/work/queue-334/mutant-exec.tap
|
||||
b4d9e2f1f42422603c48dbf4fde5a10b789abd4cb46bbd17d759ddae4d26a203 agents/rockerduck/work/queue-334/restored.tap
|
||||
9d1a7b2c97a75cc22a35e62ab9d617289f62087e02f9dfb6eeb870de1cbd7a1c agents/rockerduck/work/queue-334/green-source.sha256
|
||||
0081e0326c000c066ac9245f7e31518cbf198d944bf11abc16c8d2379a04b100 agents/rockerduck/work/queue-334/green-imports.txt
|
||||
06b739ad1947f0059f71af354328fc307da594d262cf4c886a7b73143a872861 agents/rockerduck/work/queue-334/mutant-after.diff
|
||||
86b9100a1863f6c13e68c6638341659aed917254dee6c61207228fae41138158 agents/rockerduck/work/queue-334/mutant-exec.diff
|
||||
32b803c436830fc36e4dc5ce48d021d69617b3add0102554558147a20d31401e agents/rockerduck/work/queue-334/mutant-after-source.sha256
|
||||
eb85013c2b52472d1210a52268ecd5d337ea46026f2cf64cabcc97e168ba9a52 agents/rockerduck/work/queue-334/mutant-exec-source.sha256
|
||||
acf321d41771070a070d14806c8b84bd6be7c6e30ee95567a22ec2c08918e3bf agents/rockerduck/work/queue-334/restoration.txt
|
||||
8322de11b7085dc4de6e5be111cb55168598eb2ed631844569c2938c82ac42f7 agents/rockerduck/work/queue-334/cleanup.txt
|
||||
ecfdf44317fa3ffd544d0f5707970acad2e20cfd1f690a5652a1fdacbf6b83f8 agents/rockerduck/work/queue-334/remaining-test-processes.txt
|
||||
@@ -0,0 +1,57 @@
|
||||
Mos1961 static imports/export-from graph; whole files serial, case1-accept excluded.
|
||||
packages/cli/tests/case2-unit.test.mjs -> packages/business/tests/helpers.mjs, packages/seat/src/sandbox.mjs, packages/cli/tests/helpers.mjs, packages/cli/tests/case-sudo-fixture.mjs
|
||||
packages/business/tests/helpers.mjs -> (builtins/external only)
|
||||
packages/seat/src/sandbox.mjs -> packages/business/src/vocabulary.mjs
|
||||
packages/business/src/vocabulary.mjs -> (builtins/external only)
|
||||
packages/cli/tests/helpers.mjs -> packages/bus/src/broker.mjs, packages/bus/src/store.mjs, packages/business/tests/helpers.mjs, packages/harness/tests/helpers.mjs, packages/plugins/tests/helpers.mjs, packages/cli/src/transport.mjs
|
||||
packages/bus/src/broker.mjs -> packages/bus/src/proxy-page-vocabulary.mjs, packages/model-proxy/src/validation.mjs, packages/bus/src/address.mjs, packages/processing-control/src/state.mjs, packages/plugins/src/kinds.mjs, packages/tasks/src/requirements.mjs, packages/bus/src/landing.mjs, packages/business/src/vocabulary.mjs
|
||||
packages/bus/src/proxy-page-vocabulary.mjs -> (builtins/external only)
|
||||
packages/model-proxy/src/validation.mjs -> (builtins/external only)
|
||||
packages/bus/src/address.mjs -> (builtins/external only)
|
||||
packages/processing-control/src/state.mjs -> (builtins/external only)
|
||||
packages/plugins/src/kinds.mjs -> (builtins/external only)
|
||||
packages/tasks/src/requirements.mjs -> (builtins/external only)
|
||||
packages/bus/src/landing.mjs -> (builtins/external only)
|
||||
packages/bus/src/store.mjs -> (builtins/external only)
|
||||
packages/harness/tests/helpers.mjs -> packages/business/src/index.mjs, packages/business/tests/helpers.mjs, packages/plugins/src/loader.mjs
|
||||
packages/business/src/index.mjs -> packages/business/src/errors.mjs, packages/business/src/vocabulary.mjs, packages/business/src/role.mjs, packages/business/src/vars.mjs, packages/business/src/credentials.mjs, packages/business/src/business.mjs, packages/business/src/access.mjs, packages/business/src/project.mjs, packages/business/src/resolve.mjs, packages/business/src/library-seats.mjs
|
||||
packages/business/src/errors.mjs -> (builtins/external only)
|
||||
packages/business/src/role.mjs -> packages/business/src/errors.mjs, packages/business/src/vocabulary.mjs, packages/business/src/util.mjs
|
||||
packages/business/src/util.mjs -> packages/business/src/errors.mjs, packages/business/src/vocabulary.mjs
|
||||
packages/business/src/vars.mjs -> packages/business/src/errors.mjs, packages/business/src/vocabulary.mjs, packages/business/src/util.mjs, packages/plugins/src/kinds.mjs
|
||||
packages/business/src/credentials.mjs -> packages/business/src/errors.mjs, packages/business/src/vocabulary.mjs, packages/business/src/util.mjs
|
||||
packages/business/src/business.mjs -> packages/business/src/errors.mjs, packages/business/src/launch.mjs, packages/business/src/vars.mjs, packages/business/src/credentials.mjs, packages/business/src/role.mjs, packages/business/src/vocabulary.mjs, packages/plugins/src/kinds.mjs, packages/library/src/mapping.mjs, packages/business/src/util.mjs
|
||||
packages/business/src/launch.mjs -> packages/business/src/util.mjs, packages/business/src/errors.mjs
|
||||
packages/library/src/mapping.mjs -> packages/library/src/problems.mjs
|
||||
packages/library/src/problems.mjs -> (builtins/external only)
|
||||
packages/business/src/access.mjs -> packages/business/src/errors.mjs, packages/business/src/business.mjs, packages/business/src/util.mjs, packages/business/src/vocabulary.mjs
|
||||
packages/business/src/project.mjs -> packages/business/src/errors.mjs, packages/business/src/vars.mjs, packages/business/src/util.mjs
|
||||
packages/business/src/resolve.mjs -> packages/business/src/errors.mjs, packages/business/src/vocabulary.mjs, packages/business/src/vars.mjs, packages/business/src/util.mjs, packages/business/src/project.mjs
|
||||
packages/business/src/library-seats.mjs -> packages/business/src/errors.mjs, packages/business/src/business.mjs, packages/business/src/vocabulary.mjs
|
||||
packages/plugins/src/loader.mjs -> packages/plugins/src/kinds.mjs
|
||||
packages/plugins/tests/helpers.mjs -> (builtins/external only)
|
||||
packages/cli/src/transport.mjs -> packages/cli/src/errors.mjs
|
||||
packages/cli/src/errors.mjs -> (builtins/external only)
|
||||
packages/cli/tests/case-sudo-fixture.mjs -> (builtins/external only)
|
||||
packages/cli/tests/case2-install.test.mjs -> packages/business/tests/helpers.mjs, packages/library/tests/helpers.mjs, packages/library/src/index.mjs, packages/seat/src/checkout.mjs, packages/project/src/git.mjs, packages/cli/tests/helpers.mjs
|
||||
packages/library/tests/helpers.mjs -> packages/library/src/mapping.mjs
|
||||
packages/library/src/index.mjs -> packages/library/src/problems.mjs, packages/library/src/mapping.mjs, packages/library/src/scope.mjs, packages/library/src/supporting.mjs, packages/library/src/links.mjs, packages/library/src/reader.mjs, packages/library/src/render.mjs, packages/library/src/survey.mjs, packages/library/src/mirror.mjs, packages/library/src/sync.mjs, packages/library/src/index-build.mjs, packages/library/src/query.mjs, packages/library/src/limits.mjs, packages/library/src/guard.mjs, packages/library/src/write.mjs
|
||||
packages/library/src/scope.mjs -> (builtins/external only)
|
||||
packages/library/src/supporting.mjs -> packages/library/src/problems.mjs, packages/library/src/scope.mjs
|
||||
packages/library/src/links.mjs -> (builtins/external only)
|
||||
packages/library/src/reader.mjs -> packages/project/src/git.mjs, packages/library/src/scope.mjs, packages/library/src/links.mjs, packages/library/src/problems.mjs
|
||||
packages/project/src/git.mjs -> packages/seat/src/checkout.mjs, packages/project/src/paths.mjs, packages/processing-control/src/effects.mjs
|
||||
packages/seat/src/checkout.mjs -> packages/processing-control/src/effects.mjs
|
||||
packages/processing-control/src/effects.mjs -> packages/processing-control/src/state.mjs, packages/processing-control/src/runtimes.mjs
|
||||
packages/processing-control/src/runtimes.mjs -> packages/processing-control/src/state.mjs
|
||||
packages/project/src/paths.mjs -> (builtins/external only)
|
||||
packages/library/src/render.mjs -> (builtins/external only)
|
||||
packages/library/src/survey.mjs -> packages/library/src/mapping.mjs, packages/library/src/scope.mjs, packages/library/src/links.mjs, packages/library/src/reader.mjs, packages/library/src/problems.mjs
|
||||
packages/library/src/mirror.mjs -> packages/project/src/paths.mjs, packages/project/src/git.mjs, packages/library/src/mapping.mjs, packages/library/src/scope.mjs, packages/library/src/problems.mjs, packages/library/src/reader.mjs
|
||||
packages/library/src/sync.mjs -> packages/seat/src/checkout.mjs, packages/project/src/git.mjs, packages/library/src/mapping.mjs, packages/library/src/problems.mjs, packages/library/src/reader.mjs, packages/library/src/index-build.mjs, packages/library/src/mirror.mjs
|
||||
packages/library/src/index-build.mjs -> packages/library/src/reader.mjs, packages/library/src/problems.mjs
|
||||
packages/library/src/query.mjs -> packages/library/src/problems.mjs, packages/library/src/mapping.mjs, packages/library/src/index-build.mjs, packages/library/src/reader.mjs
|
||||
packages/library/src/limits.mjs -> (builtins/external only)
|
||||
packages/library/src/guard.mjs -> packages/project/src/git.mjs, packages/library/src/scope.mjs, packages/library/src/reader.mjs, packages/library/src/problems.mjs, packages/library/src/mirror.mjs, packages/library/src/limits.mjs, packages/library/src/reply-protocol.mjs
|
||||
packages/library/src/reply-protocol.mjs -> (builtins/external only)
|
||||
packages/library/src/write.mjs -> packages/project/src/git.mjs, packages/seat/src/checkout.mjs, packages/business/src/vocabulary.mjs, packages/library/src/mapping.mjs, packages/library/src/scope.mjs, packages/library/src/supporting.mjs, packages/library/src/problems.mjs, packages/library/src/reader.mjs, packages/library/src/mirror.mjs, packages/library/src/sync.mjs
|
||||
@@ -0,0 +1,179 @@
|
||||
# TMPDIR=/mnt/storage/scratch/tmp/iXTGcB HOME=/mnt/storage/scratch/tmp/iXTGcB/home MOSAIC_CONFIG=/mnt/storage/scratch/tmp/iXTGcB/home/.config/mosaic-dev/config.json nice=19
|
||||
TAP version 13
|
||||
# Subtest: the library install writes the business file, personas and slot dir, makes the copy and starts nothing
|
||||
ok 1 - the library install writes the business file, personas and slot dir, makes the copy and starts nothing
|
||||
---
|
||||
duration_ms: 247.114691
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a library re-run passes and leaves every file as it was
|
||||
ok 2 - a library re-run passes and leaves every file as it was
|
||||
---
|
||||
duration_ms: 409.006062
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a re-run refuses business-file-differs and leaves the file unchanged
|
||||
ok 3 - a re-run refuses business-file-differs and leaves the file unchanged
|
||||
---
|
||||
duration_ms: 279.306698
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a re-run refuses persona-differs when an installed persona isn't the staged one, and writes nothing
|
||||
ok 4 - a re-run refuses persona-differs when an installed persona isn't the staged one, and writes nothing
|
||||
---
|
||||
duration_ms: 282.805377
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the factory install writes no library mapping, persona or slot dir
|
||||
ok 5 - the factory install writes no library mapping, persona or slot dir
|
||||
---
|
||||
duration_ms: 183.788653
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the factory install refuses a library project and bus.tester off, before anything is written
|
||||
ok 6 - the factory install refuses a library project and bus.tester off, before anything is written
|
||||
---
|
||||
duration_ms: 75.316181
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the library install refuses bus.tester on and a persona var in the input
|
||||
ok 7 - the library install refuses bus.tester on and a persona var in the input
|
||||
---
|
||||
duration_ms: 94.011039
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the install refuses root, a business id mismatch, another --home and a config dir with group bits
|
||||
ok 8 - the install refuses root, a business id mismatch, another --home and a config dir with group bits
|
||||
---
|
||||
duration_ms: 68.69039
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the library install needs --personas
|
||||
ok 9 - the library install needs --personas
|
||||
---
|
||||
duration_ms: 6.411755
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a validate refusal removes the business file this run wrote
|
||||
ok 10 - a validate refusal removes the business file this run wrote
|
||||
---
|
||||
duration_ms: 254.969107
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: N4: a validate refusal on a re-run leaves the matching business file in place, byte for byte
|
||||
ok 11 - N4: a validate refusal on a re-run leaves the matching business file in place, byte for byte
|
||||
---
|
||||
duration_ms: 424.725266
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a clean library host passes the precheck with no mirror yet
|
||||
ok 12 - a clean library host passes the precheck with no mirror yet
|
||||
---
|
||||
duration_ms: 435.686925
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the library precheck refuses a persona file at 0644
|
||||
ok 13 - the library precheck refuses a persona file at 0644
|
||||
---
|
||||
duration_ms: 417.655889
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the library precheck refuses a persona whose digest isn't persona.sha256
|
||||
ok 14 - the library precheck refuses a persona whose digest isn't persona.sha256
|
||||
---
|
||||
duration_ms: 411.08414
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the library precheck refuses a persona dir with group bits
|
||||
ok 15 - the library precheck refuses a persona dir with group bits
|
||||
---
|
||||
duration_ms: 451.558674
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the library precheck refuses a business file at 0644
|
||||
ok 16 - the library precheck refuses a business file at 0644
|
||||
---
|
||||
duration_ms: 435.345965
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the library precheck refuses a changes.jsonl at 0644
|
||||
ok 17 - the library precheck refuses a changes.jsonl at 0644
|
||||
---
|
||||
duration_ms: 584.394398
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the library precheck refuses a Discord binding
|
||||
ok 18 - the library precheck refuses a Discord binding
|
||||
---
|
||||
duration_ms: 441.83167
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: --library-status refuses library-mirror-missing before the bus has made the mirror
|
||||
ok 19 - --library-status refuses library-mirror-missing before the bus has made the mirror
|
||||
---
|
||||
duration_ms: 337.042932
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: --library-status refuses library-never-synced on a fresh mirror
|
||||
ok 20 - --library-status refuses library-never-synced on a fresh mirror
|
||||
---
|
||||
duration_ms: 350.216282
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: --library-status names a recorded lastError before the null lastFetch it leaves (N3)
|
||||
ok 21 - --library-status names a recorded lastError before the null lastFetch it leaves (N3)
|
||||
---
|
||||
duration_ms: 369.786709
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: --library-status prints each R-problem's path as an escaped JSON string, then the count, and passes
|
||||
ok 22 - --library-status prints each R-problem's path as an escaped JSON string, then the count, and passes
|
||||
---
|
||||
duration_ms: 410.961598
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: --library-status takes no --profile
|
||||
ok 23 - --library-status takes no --profile
|
||||
---
|
||||
duration_ms: 5.4699
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: Vikunja 614: install preserves the explicit notifier decision bytes and mode and creates none when absent
|
||||
ok 24 - Vikunja 614: install preserves the explicit notifier decision bytes and mode and creates none when absent
|
||||
---
|
||||
duration_ms: 479.343091
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 322 F8: library personas install from the copy with no clone node_modules
|
||||
ok 25 - row 322 F8: library personas install from the copy with no clone node_modules
|
||||
---
|
||||
duration_ms: 146.617921
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 322 F9: importer refusal keeps the error line rather than the Node banner
|
||||
ok 26 - row 322 F9: importer refusal keeps the error line rather than the Node banner
|
||||
---
|
||||
duration_ms: 108.029088
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-21: library install supplies chief identity and books publish for its real read grant
|
||||
ok 27 - C2-21: library install supplies chief identity and books publish for its real read grant
|
||||
---
|
||||
duration_ms: 236.226186
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 install Next tells root to select proxy only when configured
|
||||
ok 28 - row334 install Next tells root to select proxy only when configured
|
||||
---
|
||||
duration_ms: 242.832964
|
||||
type: 'test'
|
||||
...
|
||||
1..28
|
||||
# tests 28
|
||||
# suites 0
|
||||
# pass 28
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 8298.345458
|
||||
@@ -0,0 +1,6 @@
|
||||
30d9674f6b5b704b82bf7dfcf054b425d6b9480144ab52bb00f668af514c17bd scripts/case2-unit.sh
|
||||
9e52d30113ae1cfa82f947674a4132dd689fc43ac1a1e8cdc4bce0c71e42fde1 scripts/case2-install.sh
|
||||
373f64bf56f031a1d76873f1444b35f2de2a8e26a84dca9107f1993dbd9669bb packages/cli/tests/case2-unit.test.mjs
|
||||
716f7728f018b16f917e60547459f6791dab5d3239dd4dcda5a7365f54850ade packages/cli/tests/case2-install.test.mjs
|
||||
16c31f119d064a836794d167d57a6a1b765303005d93d1feba3e07e4b9288bd2 packages/cli/systemd/mosaic-proxy.service.in
|
||||
889ac9589fadf7654d4dbb914f968cbafe4255ed215bd6a9ff3f331757c9017b packages/model-proxy/PIN
|
||||
@@ -0,0 +1,497 @@
|
||||
# TMPDIR=/mnt/storage/scratch/tmp/EHvgUM HOME=/mnt/storage/scratch/tmp/EHvgUM/home MOSAIC_CONFIG=/mnt/storage/scratch/tmp/EHvgUM/home/.config/mosaic-dev/config.json nice=19
|
||||
TAP version 13
|
||||
# Subtest: row253 factory socket uses actual config and target-uid query without widening hardening
|
||||
ok 1 - row253 factory socket uses actual config and target-uid query without widening hardening
|
||||
---
|
||||
duration_ms: 320.786952
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 installer refuses unsafe location and query facts before unit writes
|
||||
ok 2 - row253 installer refuses unsafe location and query facts before unit writes
|
||||
---
|
||||
duration_ms: 3259.255387
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 query timeout kills its process group and leaves no running child
|
||||
ok 3 - row253 query timeout kills its process group and leaves no running child
|
||||
---
|
||||
duration_ms: 7050.967328
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 protected homes refuse before any filesystem access
|
||||
ok 4 - row253 protected homes refuse before any filesystem access
|
||||
---
|
||||
duration_ms: 9.235035
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 sleep query has exact inner reason and cleans all members
|
||||
ok 5 - row253 C4 sleep query has exact inner reason and cleans all members
|
||||
---
|
||||
duration_ms: 10728.278487
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 signals query has exact inner reason and cleans all members
|
||||
ok 6 - row253 C4 signals query has exact inner reason and cleans all members
|
||||
---
|
||||
duration_ms: 10727.497398
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 member query has exact inner reason and cleans all members
|
||||
ok 7 - row253 C4 member query has exact inner reason and cleans all members
|
||||
---
|
||||
duration_ms: 10864.916145
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 overflow is output-limit in both sudo modes
|
||||
ok 8 - row253 C4 overflow is output-limit in both sudo modes
|
||||
---
|
||||
duration_ms: 471.505102
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 stalled supervisor uses the outer reason and explicit residual cleanup
|
||||
ok 9 - row253 C4 stalled supervisor uses the outer reason and explicit residual cleanup
|
||||
---
|
||||
duration_ms: 14141.133414
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 inline supervisor is byte-identical in both host scripts
|
||||
ok 10 - row253 C4 inline supervisor is byte-identical in both host scripts
|
||||
---
|
||||
duration_ms: 1.040122
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 cleanup budget starts after inventory pass one
|
||||
ok 11 - row253 C4 cleanup budget starts after inventory pass one
|
||||
---
|
||||
duration_ms: 36.998899
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 query reaps its group even when a child closes stdout before the query returns
|
||||
ok 12 - row253 query reaps its group even when a child closes stdout before the query returns
|
||||
---
|
||||
duration_ms: 128.332368
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 config parser is strict
|
||||
ok 13 - row253 config parser is strict
|
||||
---
|
||||
duration_ms: 8.326775
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a clean library render writes both units 0644 with the fixed lines, and enables both then starts the bus then the Console
|
||||
ok 14 - a clean library render writes both units 0644 with the fixed lines, and enables both then starts the bus then the Console
|
||||
---
|
||||
duration_ms: 95.375021
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: PATH starts with the --node directory, for a node outside the default list and for /usr/bin/node
|
||||
ok 15 - PATH starts with the --node directory, for a node outside the default list and for /usr/bin/node
|
||||
---
|
||||
duration_ms: 107.764189
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a failed bus start refuses with the Console not started
|
||||
ok 16 - a failed bus start refuses with the Console not started
|
||||
---
|
||||
duration_ms: 95.26919
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the script never links a unit file
|
||||
ok 17 - the script never links a unit file
|
||||
---
|
||||
duration_ms: 0.161935
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: factory renders --pm once and one MOSAIC_CLAUDE_BIN line, and without them both tokens render empty
|
||||
ok 18 - factory renders --pm once and one MOSAIC_CLAUDE_BIN line, and without them both tokens render empty
|
||||
---
|
||||
duration_ms: 601.778739
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a re-install over running units says they are still on the old copy and must restart together, never that it started them
|
||||
ok 19 - a re-install over running units says they are still on the old copy and must restart together, never that it started them
|
||||
---
|
||||
duration_ms: 414.344645
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a re-install to another copy re-renders both units, and an edited installed unit refuses
|
||||
ok 20 - a re-install to another copy re-renders both units, and an edited installed unit refuses
|
||||
---
|
||||
duration_ms: 994.134837
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a template with a namespace, user or system call restriction refuses
|
||||
ok 21 - a template with a namespace, user or system call restriction refuses
|
||||
---
|
||||
duration_ms: 263.798116
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the bus template's EnvironmentFile line must be there and point at the session env, and the Console template must have none
|
||||
ok 22 - the bus template's EnvironmentFile line must be there and point at the session env, and the Console template must have none
|
||||
---
|
||||
duration_ms: 181.439557
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a template holding an unknown token, PermissionsStartOnly or a privileged Exec prefix refuses
|
||||
ok 23 - a template holding an unknown token, PermissionsStartOnly or a privileged Exec prefix refuses
|
||||
---
|
||||
duration_ms: 138.913066
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a symlink at either unit path refuses
|
||||
ok 24 - a symlink at either unit path refuses
|
||||
---
|
||||
duration_ms: 167.097448
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a --node that is relative, not root-owned or under <home> refuses
|
||||
ok 25 - a --node that is relative, not root-owned or under <home> refuses
|
||||
---
|
||||
duration_ms: 18.382732
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a re-install with a different --node or different serve flags refuses
|
||||
ok 26 - a re-install with a different --node or different serve flags refuses
|
||||
---
|
||||
duration_ms: 476.601285
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: an installed pair whose units name different copies refuses
|
||||
ok 27 - an installed pair whose units name different copies refuses
|
||||
---
|
||||
duration_ms: 244.045399
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a copy id that is short, uppercase, holds / or .., or names no directory refuses
|
||||
ok 28 - a copy id that is short, uppercase, holds / or .., or names no directory refuses
|
||||
---
|
||||
duration_ms: 28.577084
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: library refuses a privileged-floor miss, a bad proof pair and every flag outside its set
|
||||
ok 29 - library refuses a privileged-floor miss, a bad proof pair and every flag outside its set
|
||||
---
|
||||
duration_ms: 270.700937
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: library refuses a proof file not owned by <user>'s uid
|
||||
ok 30 - library refuses a proof file not owned by <user>'s uid
|
||||
---
|
||||
duration_ms: 15.926859
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: factory refuses duplicate socket, a missing --port or --business, and each proxy flag
|
||||
ok 31 - factory refuses duplicate socket, a missing --port or --business, and each proxy flag
|
||||
---
|
||||
duration_ms: 178.797946
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 factory refuses retired TCP and a value after the socket marker
|
||||
ok 32 - row253 factory refuses retired TCP and a value after the socket marker
|
||||
---
|
||||
duration_ms: 26.729147
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: factory refuses a --claude that is relative, not root-owned or under <home>, and a re-install with another --pm or --claude
|
||||
ok 33 - factory refuses a --claude that is relative, not root-owned or under <home>, and a re-install with another --pm or --claude
|
||||
---
|
||||
duration_ms: 1287.523935
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the precheck passes on a good host and prints free memory, without the key
|
||||
ok 34 - the precheck passes on a good host and prints free memory, without the key
|
||||
---
|
||||
duration_ms: 165.265761
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the precheck refuses each failed host check
|
||||
ok 35 - the precheck refuses each failed host check
|
||||
---
|
||||
duration_ms: 1355.479314
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the precheck refuses a user missing from passwd, a business file that does not load, and a symlinked run root
|
||||
ok 36 - the precheck refuses a user missing from passwd, a business file that does not load, and a symlinked run root
|
||||
---
|
||||
duration_ms: 749.037298
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a bwrap that fails refuses and prints the sysctl and where bwrap is
|
||||
ok 37 - a bwrap that fails refuses and prints the sysctl and where bwrap is
|
||||
---
|
||||
duration_ms: 158.018943
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: an unprivileged port floor at or below the Console's port refuses, and so does a missing Console unit
|
||||
ok 38 - an unprivileged port floor at or below the Console's port refuses, and so does a missing Console unit
|
||||
---
|
||||
duration_ms: 775.768583
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: bus.tester: library refuses it on, factory needs it on, and factory refuses a library business
|
||||
ok 39 - bus.tester: library refuses it on, factory needs it on, and factory refuses a library business
|
||||
---
|
||||
duration_ms: 591.243454
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the claude check runs only for a claude-code instance, and refuses a claude that appends or answers wrong
|
||||
ok 40 - the claude check runs only for a claude-code instance, and refuses a claude that appends or answers wrong
|
||||
---
|
||||
duration_ms: 1192.916891
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the claude check runs the bus unit's MOSAIC_CLAUDE_BIN over claude on PATH
|
||||
ok 41 - the claude check runs the bus unit's MOSAIC_CLAUDE_BIN over claude on PATH
|
||||
---
|
||||
duration_ms: 380.298256
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the session env file refuses when missing, open to others, a symlink, empty, or emptied by a later line
|
||||
ok 42 - the session env file refuses when missing, open to others, a symlink, empty, or emptied by a later line
|
||||
---
|
||||
duration_ms: 944.757771
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: inside a session's sandbox a bind below 1024 fails with EACCES, and a bind on a free high port succeeds
|
||||
ok 43 - inside a session's sandbox a bind below 1024 fails with EACCES, and a bind on a free high port succeeds
|
||||
---
|
||||
duration_ms: 94.761095
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: Vikunja 614 factory: scoped @anthropic-ai Claude path renders and passes installed read-back
|
||||
ok 44 - Vikunja 614 factory: scoped @anthropic-ai Claude path renders and passes installed read-back
|
||||
---
|
||||
duration_ms: 804.156726
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: Vikunja 614 factory: plain paths still refuse every named unsafe character
|
||||
ok 45 - Vikunja 614 factory: plain paths still refuse every named unsafe character
|
||||
---
|
||||
duration_ms: 87.565396
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: Vikunja 614 precheck: explicit null and named notifier decisions pass
|
||||
ok 46 - Vikunja 614 precheck: explicit null and named notifier decisions pass
|
||||
---
|
||||
duration_ms: 305.744175
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: Vikunja 614 precheck: notifier config refuses missing, public, malformed and extra-key decisions
|
||||
ok 47 - Vikunja 614 precheck: notifier config refuses missing, public, malformed and extra-key decisions
|
||||
---
|
||||
duration_ms: 1300.724491
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 no-proxy renders stay byte-identical to the pre-row renderer
|
||||
ok 48 - row334 no-proxy renders stay byte-identical to the pre-row renderer
|
||||
---
|
||||
duration_ms: 257.734638
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy uses P1 runner, bus dependencies and proxy bus Console start order
|
||||
ok 49 - row334 proxy uses P1 runner, bus dependencies and proxy bus Console start order
|
||||
---
|
||||
duration_ms: 137.176987
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses continuation by message before writing
|
||||
ok 50 - row334 proxy refuses continuation by message before writing
|
||||
---
|
||||
duration_ms: 90.060095
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses not-setting by message before writing
|
||||
ok 51 - row334 proxy refuses not-setting by message before writing
|
||||
---
|
||||
duration_ms: 93.993348
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses RestrictNamespaces by message before writing
|
||||
ok 52 - row334 proxy refuses RestrictNamespaces by message before writing
|
||||
---
|
||||
duration_ms: 93.341838
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses PrivateUsers by message before writing
|
||||
ok 53 - row334 proxy refuses PrivateUsers by message before writing
|
||||
---
|
||||
duration_ms: 94.764023
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses SystemCallFilter by message before writing
|
||||
ok 54 - row334 proxy refuses SystemCallFilter by message before writing
|
||||
---
|
||||
duration_ms: 94.826317
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses PermissionsStartOnly by message before writing
|
||||
ok 55 - row334 proxy refuses PermissionsStartOnly by message before writing
|
||||
---
|
||||
duration_ms: 96.116509
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses EnvironmentFile by message before writing
|
||||
ok 56 - row334 proxy refuses EnvironmentFile by message before writing
|
||||
---
|
||||
duration_ms: 119.193391
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses AmbientCapabilities by message before writing
|
||||
ok 57 - row334 proxy refuses AmbientCapabilities by message before writing
|
||||
---
|
||||
duration_ms: 116.325629
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses CapabilityBoundingSet by message before writing
|
||||
ok 58 - row334 proxy refuses CapabilityBoundingSet by message before writing
|
||||
---
|
||||
duration_ms: 117.596342
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses privileged by message before writing
|
||||
ok 59 - row334 proxy refuses privileged by message before writing
|
||||
---
|
||||
duration_ms: 98.105075
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses direct-binary by message before writing
|
||||
ok 60 - row334 proxy refuses direct-binary by message before writing
|
||||
---
|
||||
duration_ms: 114.60378
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses nnp by message before writing
|
||||
ok 61 - row334 proxy refuses nnp by message before writing
|
||||
---
|
||||
duration_ms: 103.113825
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses cwd by message before writing
|
||||
ok 62 - row334 proxy refuses cwd by message before writing
|
||||
---
|
||||
duration_ms: 102.872946
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses environment by message before writing
|
||||
ok 63 - row334 proxy refuses environment by message before writing
|
||||
---
|
||||
duration_ms: 104.833099
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses install by message before writing
|
||||
ok 64 - row334 proxy refuses install by message before writing
|
||||
---
|
||||
duration_ms: 113.150594
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses user by message before writing
|
||||
ok 65 - row334 proxy refuses user by message before writing
|
||||
---
|
||||
duration_ms: 99.6967
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses group by message before writing
|
||||
ok 66 - row334 proxy refuses group by message before writing
|
||||
---
|
||||
duration_ms: 100.919966
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses ProtectSystem by message before writing
|
||||
ok 67 - row334 proxy refuses ProtectSystem by message before writing
|
||||
---
|
||||
duration_ms: 105.543055
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses ReadWritePaths by message before writing
|
||||
ok 68 - row334 proxy refuses ReadWritePaths by message before writing
|
||||
---
|
||||
duration_ms: 107.705639
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses ProtectHome by message before writing
|
||||
ok 69 - row334 proxy refuses ProtectHome by message before writing
|
||||
---
|
||||
duration_ms: 107.590511
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses PrivateTmp by message before writing
|
||||
ok 70 - row334 proxy refuses PrivateTmp by message before writing
|
||||
---
|
||||
duration_ms: 109.894567
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy refuses token by message before writing
|
||||
ok 71 - row334 proxy refuses token by message before writing
|
||||
---
|
||||
duration_ms: 85.918305
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy template missing or symlink refuses
|
||||
ok 72 - row334 proxy template missing or symlink refuses
|
||||
---
|
||||
duration_ms: 167.940142
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 rendered ExecStart refuses wrong PIN and missing proxy with P1 status
|
||||
ok 73 - row334 rendered ExecStart refuses wrong PIN and missing proxy with P1 status
|
||||
---
|
||||
duration_ms: 306.45812
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 reinstall repins all three and refuses a proxy copy mismatch
|
||||
ok 74 - row334 reinstall repins all three and refuses a proxy copy mismatch
|
||||
---
|
||||
duration_ms: 580.756121
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 installed proxy without --proxy refuses and preserves all bytes
|
||||
ok 75 - row334 installed proxy without --proxy refuses and preserves all bytes
|
||||
---
|
||||
duration_ms: 217.139684
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 dangling proxy symlink without flag refuses without deleting
|
||||
ok 76 - row334 dangling proxy symlink without flag refuses without deleting
|
||||
---
|
||||
duration_ms: 115.14093
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 active proxy reports old copy and all three must restart together
|
||||
ok 77 - row334 active proxy reports old copy and all three must restart together
|
||||
---
|
||||
duration_ms: 367.168744
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 failed mosaic-proxy.service start leaves later units unstarted
|
||||
ok 78 - row334 failed mosaic-proxy.service start leaves later units unstarted
|
||||
---
|
||||
duration_ms: 138.123277
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 failed [email protected] start leaves later units unstarted
|
||||
ok 79 - row334 failed [email protected] start leaves later units unstarted
|
||||
---
|
||||
duration_ms: 132.720562
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 installed proxy enforces hardening order and remaining common refusals
|
||||
ok 80 - row334 installed proxy enforces hardening order and remaining common refusals
|
||||
---
|
||||
duration_ms: 667.650113
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row334 proxy installed path rejects symlink and non-regular file
|
||||
ok 81 - row334 proxy installed path rejects symlink and non-regular file
|
||||
---
|
||||
duration_ms: 239.721676
|
||||
type: 'test'
|
||||
...
|
||||
1..81
|
||||
# tests 81
|
||||
# suites 0
|
||||
# pass 81
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 78022.489026
|
||||
@@ -0,0 +1,69 @@
|
||||
# Row334 whole-file run list (UNRUN; awaiting CLEAR)
|
||||
|
||||
Entrypoints are the brief-owned tests, which spawn the changed shell scripts.
|
||||
Their import graph is recorded below; no imported module is itself a test entrypoint.
|
||||
case1-accept.test.mjs is excluded (mos-1612).
|
||||
|
||||
packages/cli/tests/case2-unit.test.mjs -> packages/business/tests/helpers.mjs, packages/seat/src/sandbox.mjs, packages/cli/tests/helpers.mjs, packages/cli/tests/case-sudo-fixture.mjs
|
||||
packages/business/tests/helpers.mjs -> (builtins/external only)
|
||||
packages/seat/src/sandbox.mjs -> packages/business/src/vocabulary.mjs
|
||||
packages/business/src/vocabulary.mjs -> (builtins/external only)
|
||||
packages/cli/tests/helpers.mjs -> packages/bus/src/broker.mjs, packages/bus/src/store.mjs, packages/business/tests/helpers.mjs, packages/harness/tests/helpers.mjs, packages/plugins/tests/helpers.mjs, packages/cli/src/transport.mjs
|
||||
packages/bus/src/broker.mjs -> packages/bus/src/address.mjs, packages/processing-control/src/state.mjs, packages/plugins/src/kinds.mjs, packages/tasks/src/requirements.mjs, packages/bus/src/landing.mjs, packages/business/src/vocabulary.mjs
|
||||
packages/bus/src/address.mjs -> (builtins/external only)
|
||||
packages/processing-control/src/state.mjs -> (builtins/external only)
|
||||
packages/plugins/src/kinds.mjs -> (builtins/external only)
|
||||
packages/tasks/src/requirements.mjs -> (builtins/external only)
|
||||
packages/bus/src/landing.mjs -> (builtins/external only)
|
||||
packages/bus/src/store.mjs -> (builtins/external only)
|
||||
packages/harness/tests/helpers.mjs -> packages/business/src/index.mjs, packages/business/tests/helpers.mjs, packages/plugins/src/loader.mjs
|
||||
packages/business/src/index.mjs -> packages/business/src/errors.mjs, packages/business/src/vocabulary.mjs, packages/business/src/role.mjs, packages/business/src/vars.mjs, packages/business/src/credentials.mjs, packages/business/src/business.mjs, packages/business/src/access.mjs, packages/business/src/project.mjs, packages/business/src/resolve.mjs, packages/business/src/library-seats.mjs
|
||||
packages/business/src/errors.mjs -> (builtins/external only)
|
||||
packages/business/src/role.mjs -> packages/business/src/errors.mjs, packages/business/src/vocabulary.mjs, packages/business/src/util.mjs
|
||||
packages/business/src/util.mjs -> packages/business/src/errors.mjs, packages/business/src/vocabulary.mjs
|
||||
packages/business/src/vars.mjs -> packages/business/src/errors.mjs, packages/business/src/vocabulary.mjs, packages/business/src/util.mjs, packages/plugins/src/kinds.mjs
|
||||
packages/business/src/credentials.mjs -> packages/business/src/errors.mjs, packages/business/src/vocabulary.mjs, packages/business/src/util.mjs
|
||||
packages/business/src/business.mjs -> packages/business/src/errors.mjs, packages/business/src/launch.mjs, packages/business/src/vars.mjs, packages/business/src/credentials.mjs, packages/business/src/role.mjs, packages/business/src/vocabulary.mjs, packages/plugins/src/kinds.mjs, packages/library/src/mapping.mjs, packages/business/src/util.mjs
|
||||
packages/business/src/launch.mjs -> packages/business/src/util.mjs, packages/business/src/errors.mjs
|
||||
packages/library/src/mapping.mjs -> packages/library/src/problems.mjs
|
||||
packages/library/src/problems.mjs -> (builtins/external only)
|
||||
packages/business/src/access.mjs -> packages/business/src/errors.mjs, packages/business/src/business.mjs, packages/business/src/util.mjs, packages/business/src/vocabulary.mjs
|
||||
packages/business/src/project.mjs -> packages/business/src/errors.mjs, packages/business/src/vars.mjs, packages/business/src/util.mjs
|
||||
packages/business/src/resolve.mjs -> packages/business/src/errors.mjs, packages/business/src/vocabulary.mjs, packages/business/src/vars.mjs, packages/business/src/util.mjs, packages/business/src/project.mjs
|
||||
packages/business/src/library-seats.mjs -> packages/business/src/errors.mjs, packages/business/src/business.mjs, packages/business/src/vocabulary.mjs
|
||||
packages/plugins/src/loader.mjs -> packages/plugins/src/kinds.mjs
|
||||
packages/plugins/tests/helpers.mjs -> (builtins/external only)
|
||||
packages/cli/src/transport.mjs -> packages/cli/src/errors.mjs
|
||||
packages/cli/src/errors.mjs -> (builtins/external only)
|
||||
packages/cli/tests/case-sudo-fixture.mjs -> (builtins/external only)
|
||||
packages/cli/tests/case2-install.test.mjs -> packages/business/tests/helpers.mjs, packages/library/tests/helpers.mjs, packages/library/src/index.mjs, packages/seat/src/checkout.mjs, packages/project/src/git.mjs, packages/cli/tests/helpers.mjs
|
||||
packages/library/tests/helpers.mjs -> packages/library/src/mapping.mjs
|
||||
packages/library/src/index.mjs -> packages/library/src/problems.mjs, packages/library/src/mapping.mjs, packages/library/src/scope.mjs, packages/library/src/supporting.mjs, packages/library/src/links.mjs, packages/library/src/reader.mjs, packages/library/src/render.mjs, packages/library/src/survey.mjs, packages/library/src/mirror.mjs, packages/library/src/sync.mjs, packages/library/src/index-build.mjs, packages/library/src/query.mjs, packages/library/src/limits.mjs, packages/library/src/guard.mjs
|
||||
packages/library/src/scope.mjs -> (builtins/external only)
|
||||
packages/library/src/supporting.mjs -> packages/library/src/problems.mjs, packages/library/src/scope.mjs
|
||||
packages/library/src/links.mjs -> (builtins/external only)
|
||||
packages/library/src/reader.mjs -> packages/project/src/git.mjs, packages/library/src/scope.mjs, packages/library/src/links.mjs, packages/library/src/problems.mjs
|
||||
packages/project/src/git.mjs -> packages/seat/src/checkout.mjs, packages/project/src/paths.mjs, packages/processing-control/src/effects.mjs
|
||||
packages/seat/src/checkout.mjs -> packages/processing-control/src/effects.mjs
|
||||
packages/processing-control/src/effects.mjs -> packages/processing-control/src/state.mjs, packages/processing-control/src/runtimes.mjs
|
||||
packages/processing-control/src/runtimes.mjs -> packages/processing-control/src/state.mjs
|
||||
packages/project/src/paths.mjs -> (builtins/external only)
|
||||
packages/library/src/render.mjs -> (builtins/external only)
|
||||
packages/library/src/survey.mjs -> packages/library/src/mapping.mjs, packages/library/src/scope.mjs, packages/library/src/links.mjs, packages/library/src/reader.mjs, packages/library/src/problems.mjs
|
||||
packages/library/src/mirror.mjs -> packages/project/src/paths.mjs, packages/project/src/git.mjs, packages/library/src/mapping.mjs, packages/library/src/scope.mjs, packages/library/src/problems.mjs, packages/library/src/reader.mjs
|
||||
packages/library/src/sync.mjs -> packages/seat/src/checkout.mjs, packages/project/src/git.mjs, packages/library/src/mapping.mjs, packages/library/src/problems.mjs, packages/library/src/reader.mjs, packages/library/src/mirror.mjs
|
||||
packages/library/src/index-build.mjs -> packages/library/src/reader.mjs, packages/library/src/problems.mjs
|
||||
packages/library/src/query.mjs -> packages/library/src/problems.mjs, packages/library/src/mapping.mjs, packages/library/src/index-build.mjs, packages/library/src/reader.mjs
|
||||
packages/library/src/limits.mjs -> (builtins/external only)
|
||||
packages/library/src/guard.mjs -> packages/project/src/git.mjs, packages/library/src/scope.mjs, packages/library/src/reader.mjs, packages/library/src/problems.mjs, packages/library/src/mirror.mjs, packages/library/src/limits.mjs, packages/library/src/reply-protocol.mjs
|
||||
packages/library/src/reply-protocol.mjs -> (builtins/external only)
|
||||
|
||||
Whole-file commands after CLEAR (one fresh shell-mktemp TMPDIR each; nice=19):
|
||||
node --test packages/cli/tests/case2-unit.test.mjs
|
||||
node --test packages/cli/tests/case2-install.test.mjs
|
||||
|
||||
Before these: new row334 tests only on saved 78b69e1e6 scripts for RED,
|
||||
then restored implementation. After GREEN: named mutants individually,
|
||||
each with its directly relevant row334 test. No scripts/test-*.sh builder run planned.
|
||||
|
||||
Includes multiline imports and export-from module edges: 53 local modules.
|
||||
@@ -0,0 +1 @@
|
||||
3260d5f6498aaaf810412356c0fd2e1ff10e91f481c8b365ca32e6e4165166d9 scripts/case2-unit.sh
|
||||
Loaded 100 of 297 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user