Compare commits

..
Author SHA1 Message Date
jason.woltje d9a564e6d2 docs(proxy): record scoped Gladstone PASS and remaining review gates 2026-10-25 02:59:35 -05:00
jason.woltje a45c6c9ce5 docs(proxy): record verified Gladstone first-review handoff 2026-10-25 02:56:37 -05:00
jason.woltje b47ee2c0ef fix(proxy): normalize absent provider GET after regression RED and pinned acceptance 2026-10-25 02:50:29 -05:00
jason.woltje e7438743ff test(proxy): prepare empty-provider 404 regressions before normalization 2026-10-25 02:39:25 -05:00
jason.woltje c93df1608a docs(proxy): record empty-provider 404 and scoped normalization proposal 2026-10-25 02:34:33 -05:00
jason.woltje f2986b9ead diagnostic(proxy): retain safe HTTP status on empty-provider errors 2026-10-25 01:48:06 -05:00
jason.woltje 3df440d076 diagnostic(proxy): inspect empty provider response types and counts only 2026-10-25 01:47:31 -05:00
jason.woltje 1aac8bcd7a docs(proxy): record focused passes and initial account refusal 2026-10-25 01:42:58 -05:00
jason.woltje 69811540ce fix(proxy): give offline broker Store its existing fixture data root 2026-10-25 01:16:36 -05:00
jason.woltje 9e94575c5e docs(proxy): record single staged acceptance reproduction 2026-10-25 01:15:05 -05:00
jason.woltje a5251007bd diagnostic(proxy): observe own process scheduling policies 2026-10-25 01:10:05 -05:00
jason.woltje 4a2745a9da diagnostic(proxy): record isolated acceptance stages and observed priorities 2026-10-25 00:45:42 -05:00
jason.woltje 542b970d25 fix(proxy): confirm priority writes and record focused gate boundary 2026-10-25 00:43:07 -05:00
jason.woltje 48c7c3283a test(proxy): prepare focused gate, browser checks and upgrade acceptance 2026-10-24 23:42:42 -05:00
jason.woltje 40dcbabcbb feat(proxy): prepare native Console page candidate and RED evidence 2026-10-24 23:35:17 -05:00
196 changed files with 14124 additions and 526610 deletions

No files matched your search

+8
View File
@@ -5585,3 +5585,11 @@ claim. Receipts and limitations in agents/lena/work/queue-296/BUILD.md and run-r
2026-10-24T23:37:46Z | Sage | Row 329 (#1827, P1 pinned model proxy, Magica) LANDED 61ebf2c34, pushed 23:31:27Z 10-24. Before: refactor at 669cdf42c. After: Magica's 4 commits (94cde633e, c65fb34ee, d1f6f2b19, 61ebf2c34) cherry-picked onto 669cdf42c, diff vs the gated tree limited to drift paths, range-diff in scratch. Gate: one unchanged full landing gate in /mnt/storage/scratch/sage-r329l/wt (gate.sh 8b4978887 c8a9bcf94), started 23:08:12Z at load 14.35, GATE GREEN 23:29:14Z at load 8.67, no rerun, no test or timeout edit (mos-1634). Host note: two Codex workers cleaned T3 worktrees from about 23:14Z (mos-1639, Vikunja 632). Approvals: Dewey r2 c31643 rev 4047, Boyd r2 c31642 rev 4048. #1827 comment 31650, closed. Vikunja 237 comment 1109 (stays open for P2-P7); C4 P10 red filed as Vikunja 631. Queue: note rev 4063, done rev 4064, committed b24d917ec. DEFERRED: N2 and R2-N1 bound to row 331, N1 bound to P7. Overlap: row 284 (packages/bus/src/broker.mjs) and row 157 (scripts/mosaic-config.mjs) rebase onto 61ebf2c34 before their gates.
2026-10-25T00:15:48Z | Sage | Row 284 (#1789, C2-05c library.get scope, Della) LANDED ce0b6ed41, pushed 00:09:52Z 10-25. Before: refactor at 9e2689dff (row 329 landing docs). After: fast-forward to Della's 7 rebased commits 78b932feb..ce0b6ed41; 8 paths, manifest-r4 de505cfd matches the landed tree. Gate: one unchanged full landing gate in /mnt/storage/scratch/sage-r284l/wt (the 329 gate.sh with D and the compose project renamed), started 23:51:19Z at load 1.62, GATE GREEN 00:09:04Z at load 5.20, no rerun, no test or timeout edit. Counts: bus 1020/0, business 283/0, cli 999 pass 1 allowed skip (FED R7), harness 177/0, library 156/0, seat 218/0, webui 458/0, every scripts/test-*.sh rc 0; queue 34 and task 87/93 skips are the standing ones. Della's whole-file runs on ce0b6ed41: library-lookups 12/0, library-tools 5/0, query 34/0. Approval: Webby round 2 delta c31654 rev 4070 (round 1 rev 4062). Overlap sweep: rows 13, 157, 309, gyro/row310 and fethry/row332-p1 clean. #1789 comment 31655, closed. No Vikunja task for the row. Queue: note rev 4071, done rev 4072, committed 7c8dc2033. DEFERRED: Webby N1 (whole-tree listing per get) bound to the next library read-path row; N2 needs nothing; N3 is this gate.
2026-10-25T00:18:35Z | Sage | Follow-up tasks for mos-1647 item 3 (Q109): Vikunja 633 (P7 cutover, CLIProxyAPI 8.0.42 startup Grok-npm and antigravity version refreshes, from row 332 isolated runs) and 634 (row 284 Webby N1, library get lists the whole tree). DEFERRED gains the 633 entry and the 634 number for row 284 N1. Filing script and receipt in agents/sage/work/vikunja-setup/.
2026-10-24 Poe — row 330 / #1828 start: native Console proxy page and human-only bus verbs per Q250. Before: P1 client/config landed, no native page. Intended evidence: fake-management security/refusal tests, four named mutants, pinned offline upgrade acceptance, Gladstone/Filbert review. Tests remain held pending Sage CLEAR; P2 rebase required before gate. Notes: agents/poe/work/queue-330/BUILD.md.
2026-10-25 Poe — row330 / #1828 focused block: first account RED6pass/4expected; source-only fixes; eight new files88/88 green, no skips. Offline PIN8.0.42 acceptance then exited1 before initial-account checkpoint and reported nice16 despite19 wrapper. Stopped at first unexpected red, returned slot to Sage, no rerun or mutants. Root cause unresolved; no full-gate or landing claim. Evidence: agents/poe/work/queue-330/BUILD.md and green-*.txt / upgrade-8.0.42.txt.
2026-10-25 Poe — row330 focused retry per sage-4446: all8 files88/88 green again; uptime per step retained. After Store fixture correction, offline PIN8.0.42 acceptance reached broker-bound but refused proxy-down at initial-accounts (load5.98/15.98/16.44). Stopped, returned slot, no rerun or mutants. See agents/poe/work/queue-330/block2-* and BUILD.md. No full-gate or completion claim.
2026-10-25 Poe — row330 sage-4469 block: approved fixed GET provider404 normalization after exact RED2fail/9pass; GREEN10whole files99/99, pinned8.0.42 offline acceptance passed (both priority read-backs), four named mutants killed/restored with all controls green. No retries, old assertions or timeout changes. Slot returned. Evidence agents/poe/work/queue-330/404-* and BUILD.md. P2 integration/full global gate/Q246 reviews still pending; no landing claim.
-375
View File
@@ -1,375 +0,0 @@
# Row 309 / O2 W1 / Gitea #1823
2026-10-24 — Glomgold (d17504fd-2f56-4d9f-bff9-eabb450f8a94).
Base: d16958bcf; branch glomgold/row309. Read AGENTS.md, seat README,
W1, D2, D22, Proposed rows, G1 and CURRENT.md. Approved assignment provides
scope and acceptance; no runtime integration or new design approval required.
## Intended build and acceptance
Retain all 18 original WordNet files as text, preserving Princeton LICENSE
bytes; add NOTICE and per-file provenance. Keep the downloaded ZIP outside git.
No binary source archive needs to land. Implement a deterministic offline
importer/converter with source integrity, strict records and count checks.
Ship JSON lookup data plus license/notice under src/public/thesaurus, not source
or converter code. Prefer explicit sense identifiers, glosses, lemmas, index
and exceptions over a lossy synonym-only table. Record deterministic output
hashes and bytes; measure JSON parse heap under Node with explicit GC, labeling
it as Node rather than browser evidence. All tests and measurements await Sage
CLEAR, followed by Boyd review and a single Duckworth landing review. No runtime
fetch, UI, route, worker, CSP change, live stack or private books.
## Source intake — blocked on count mismatch
Fetched only the assigned source:
https://raw.githubusercontent.com/nltk/nltk_data/96f9b3252457a2b97e52aec64c3dfceeb5c312d5/packages/corpora/wordnet.zip
Archive retained outside repository:
/mnt/storage/scratch/tmp/glomgold-wordnet-3.0.zip
- Archive bytes: 10,775,600 — matches.
- Archive SHA-256: cbda5ea6eef7f36a97a43d4a75f85e07fccbb4f23657d27b4ccbc93e2646ab59 — matches.
- Regular entries: 18; uncompressed total: 36,353,991 — matches.
- data.*, index.* and *.exc total: 35,435,978 — matches.
- Synsets: 117,659 — matches.
- Distinct literal lemma strings in data.*: 149,229.
- Distinct lowercased lemmas after removing adjective (a)/(p)/(ip) suffixes: 147,306.
- Distinct first-field strings across index.noun/index.verb/index.adj/index.adv:
147,306. This is 28 above D22's cited Princeton statistic of 147,278.
Counting method: read the verified ZIP using Python standard-library zipfile;
exclude header lines beginning with two spaces. Each remaining data.* line is
one synset; field 4 is the hexadecimal word count and following alternating
word/lex_id fields supply its lemmas. Independently take the first whitespace
field of each nonheader index.* line into a union set across the four files.
Both normalized data and index counts agree at 147,306. This was source intake,
not a test-suite run. No converter, generated data, tests or heap measurement
has run or been written. Per explicit assignment, stop on differing count and
ask Sage to resolve the expected count before proceeding. No alternate source.
Queue next from the linked worktree refused because queue operations require
the canonical checkout. Retried there and received row 309. Claim operation
is glomgold-0001, initially still pending; do not repeat with a fresh key.
Claim completed: `ok glomgold-0001 rev 3856 row 309 briefed→in-progress`.
Sage notified through T3, glomgold-0002 at 05:38:57Z. No commit/push.
Session and BUILD-LOG registry entries require Sage coordination because those
shared files are outside the assignment's exclusive owned-file list. Proposed
session line: 2026-10-24 | glomgold | row 309 / #1823 W1 source intake |
blocked: pinned archive has 147,306 distinct headwords versus cited 147,278;
archive bytes/hash and synsets match; no tests, commit or push.
## Sage ruling sage-3972 (05:40:30Z)
Proceed with the exact pinned mirror. Pin 147,306 distinct headwords, 117,659
synsets and the source hashes. Record literal data lemmas =149,229. The 147,278
is the cited Princeton page figure, not an expected count measured on this ZIP.
The 28-string gap remains open for review and is not a build blocker.
Bounded investigation: the Princeton statistics page reports per-POS strings
117,798 noun; 11,529 verb; 21,479 adjective; 4,481 adverb, total 155,287.
All four match the pinned mirror. The page explicitly states its 147,278 is
the cross-POS union, so summing per-POS counts does not explain the gap.
Mirror index lowercasing, replacing underscores with spaces, and collapsing
repeated underscores each leave 147,306. Removing underscores entirely gives
146,449, not the cited count. Data normalization independently gives 147,306;
case/marker differences explain literal 149,229, not the remaining 28-string
gap. No proven explanation found; no source substitution or extra upstream
archive comparison. Investigation ended after these bounded checks.
References: https://wordnet.princeton.edu/documentation/wnstats7wn and
https://wordnet.princeton.edu/documentation/wndb5wn (format description).
Implementation choice: one JSON shard per POS, retaining glosses and full
lemma spelling (including markers), lowercase ordered sense index and exception
lists. This lets a future consumer release unused POS objects. JSON is data,
with no script, worker, UI or route. Consumer hints (max senses/synonyms) are
explicit tunable defaults and never truncate the dataset at build time.
The importer takes an explicit local ZIP, validates its bytes/hash before
Python stdlib extraction, and never downloads. Normal converter builds use
only the verified retained text; no archive or Python needed for regeneration.
Tests authored before converter; first run will follow implementation under
Sage's explicit code-then-CLEAR workflow rather than unslotted red runs.
Code and data tests written; no test/build/heap run yet. Proposed CLEAR work:
- Node syntax checks for both new converters and the new test.
- Offline archive import to scratch and generation into shipped public path.
- Independent thesaurus-data.test.mjs, with THESAURUS_ARCHIVE naming the verified
external ZIP (round-trip coverage), two full conversions and shipped-byte checks.
- Fresh-process --expose-gc measurement three times, recorded here as plain text.
- Full affected WebUI suite serially, preserving any existing failure for Sage.
- git diff --check and binary diff review before own-branch commit/push.
All commands run with TMPDIR from mktemp /mnt/storage/scratch/tmp/XXXXXX.
## Verification under CLEAR sage-3975
Runtime: Node v26.8.1; Python 3.12.8; Linux x64. Converter uses only Node standard
library; importer uses only Python stdlib zipfile, invoked over verified stdin.
Node syntax checks for both converters and the new test exited 0.
First generation refused `index.noun: 'hood`: my index grammar omitted the
aggregated domain pointer symbols `;` and `-` used in index files (data files
use the expanded variants). Inspected all source index pointer symbols,
added those two index-only symbols, regenerated successfully. No source edit
or old-test change. Generated evidence: generation.txt.
Independent test command (fresh scratch TMPDIR, THESAURUS_ARCHIVE set):
`node --test packages/webui/tests/thesaurus-data.test.mjs` — 8/8 pass, no skip,
no failure. Includes two complete conversions vs shipped bytes and each other,
all source/license hashes, malformed records, changed source/provenance,
missing license, extra inventory, invalid archive, full verified archive
round-trip and overwrite refusal. Log: thesaurus-test.tap.
Generated data: noun.json 15,617,486; verb.json 2,327,528; adj.json 3,319,398;
adv.json 648,351; LICENSE 1,625; NOTICE 649; manifest.json 1,623 bytes.
Total shipped: 21,916,660 bytes (plain text, no compressed/binary evidence).
The data files alone total 21,912,763 bytes. Suggested consumer limits in
manifest.json are maxSenses=8 and maxSynonyms=20, tunable hints; all data ships.
Fresh Node --expose-gc heap measurements (all four shards retained), each with
`uptime` immediately before the command; logs heap-1.txt through heap-3.txt:
| Run | Uptime display / load 1,5,15 | Baseline heap | Retained delta | Sampled post-parse delta |
| --- | --- | ---: | ---: | ---: |
| 1 | 00:44:34 / 1.47, 2.21, 2.52 | 4,758,736 | 59,679,616 | 60,374,568 |
| 2 | 00:44:34 / 1.47, 2.21, 2.52 | 4,758,984 | 59,679,616 | 60,374,568 |
| 3 | 00:44:35 / 1.47, 2.21, 2.52 | 4,758,736 | 59,679,616 | 60,374,568 |
Uptime is host-local; date -u is used for T3 headers. Measurements occurred
while Gyro's nice -n 19 cargo build was allowed concurrently. Retained delta
is after explicit GC, with objects kept live and 117,659 synsets checked.
The sampled post-parse number is not an instrumented high-water mark.
These are measured Node costs, not browser-memory claims. No browser/editor
code or actual books are involved.
Sage-3977 authorized ignored root node_modules symlink to canonical dependencies
and npm ci --ignore-scripts --no-audit --no-fund in packages/webui; two packages
installed from the existing lockfile. The first symlink command accidentally
used webui cwd; npm ci removed that temporary symlink, then the intended root
symlink was created. Canonical dependency files were not changed. Both final
node_modules paths are ignored and absent from git status --porcelain.
Full suite started with MOSAIC_REQUIRE_EDITOR_BUILD=1, concurrency=1 and the
verified external THESAURUS_ARCHIVE. No tracked package/lockfile changes.
Public-directory inventory review: shell.test.mjs enumerates only the font
subdirectory; editor-provenance.test.mjs hashes only third_party/editor and
specific editor outputs. No test found hashing/enumerating all src/public as
a closed file list. The new subdirectory does not enter those inventories.
SESSIONS and BUILD-LOG will be handled by Sage at landing (sage-3975).
## First full suite: missing dependency, superseded by isolated install
Full run exited 1: 426 tests, 376 pass, 50 fail, 0 skipped; 272657.498313 ms.
The summary confirms missing oauth4webapi (ERR_MODULE_NOT_FOUND). The authorized
canonical root node_modules symlink pointed at an incomplete installation.
No old tests or authentication code changed. Sage-3981 supersedes the base-worktree
comparison: remove ONLY my root symlink and npm ci from the root lockfile into
an isolated worktree root node_modules, then rerun decide-sso/granted-user once.
Only if both pass, run the full suite again. No baseline worktree was created.
Canonical node_modules remains untouched. All first-run failure details are
retained in webui-suite.tap; the five requested decide-sso stacks follow.
```text
test at packages/webui/tests/decide-sso.test.mjs:79:1
✖ a signed-in owner confirms and answers, with the session's provider, issuer and sub as the subject (26.393114ms)
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'oauth4webapi' imported from /home/jwoltje/.t3/worktrees/mosaic-stack/glomgold-row309/packages/webui/src/sso.mjs
at Object.getPackageJSONURL (node:internal/modules/package_json_reader:331:9)
at packageResolve (node:internal/modules/esm/resolve:784:25)
at moduleResolve (node:internal/modules/esm/resolve:873:18)
at defaultResolve (node:internal/modules/esm/resolve:1006:11)
at #cachedDefaultResolve (node:internal/modules/esm/loader:708:20)
at #resolveAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:728:38)
at ModuleLoader.resolveSync (node:internal/modules/esm/loader:766:56)
at #resolve (node:internal/modules/esm/loader:690:17)
at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:610:35)
at node:internal/modules/esm/loader:639:32 {
code: 'ERR_MODULE_NOT_FOUND'
}
test at packages/webui/tests/decide-sso.test.mjs:99:1
✖ the listener gates: no session, a cross-origin page, a loopback Host, a GET, and a sign-out between the steps (31.164949ms)
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'oauth4webapi' imported from /home/jwoltje/.t3/worktrees/mosaic-stack/glomgold-row309/packages/webui/src/sso.mjs
at Object.getPackageJSONURL (node:internal/modules/package_json_reader:331:9)
at packageResolve (node:internal/modules/esm/resolve:784:25)
at moduleResolve (node:internal/modules/esm/resolve:873:18)
at defaultResolve (node:internal/modules/esm/resolve:1006:11)
at #cachedDefaultResolve (node:internal/modules/esm/loader:708:20)
at #resolveAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:728:38)
at ModuleLoader.resolveSync (node:internal/modules/esm/loader:766:56)
at #resolve (node:internal/modules/esm/loader:690:17)
at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:610:35)
at node:internal/modules/esm/loader:639:32 {
code: 'ERR_MODULE_NOT_FOUND'
}
test at packages/webui/tests/decide-sso.test.mjs:121:1
✖ J16: without a decision transport the routes are read-only and /api/config says no; startServer refuses decide without sso or send (24.009216ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /need --sso and --send/. Input:
"Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'oauth4webapi' imported from /home/jwoltje/.t3/worktrees/mosaic-stack/glomgold-row309/packages/webui/src/sso.mjs"
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/glomgold-row309/packages/webui/tests/decide-sso.test.mjs:124: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: Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'oauth4webapi' imported from /home/jwoltje/.t3/worktrees/mosaic-stack/glomgold-row309/packages/webui/src/sso.mjs
at Object.getPackageJSONURL (node:internal/modules/package_json_reader:331:9)
at packageResolve (node:internal/modules/esm/resolve:784:25)
at moduleResolve (node:internal/modules/esm/resolve:873:18)
at defaultResolve (node:internal/modules/esm/resolve:1006:11)
at #cachedDefaultResolve (node:internal/modules/esm/loader:708:20)
at #resolveAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:728:38)
at ModuleLoader.resolveSync (node:internal/modules/esm/loader:766:56)
at #resolve (node:internal/modules/esm/loader:690:17)
at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:610:35)
at node:internal/modules/esm/loader:639:32,
expected: /need --sso and --send/,
operator: 'rejects',
diff: 'simple'
}
test at packages/webui/tests/decide-sso.test.mjs:147:1
✖ J19: a granted user's session gets decide false and the user page config, and a decision POST stops at owner-only (49.361897ms)
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'oauth4webapi' imported from /home/jwoltje/.t3/worktrees/mosaic-stack/glomgold-row309/packages/webui/src/sso.mjs
at Object.getPackageJSONURL (node:internal/modules/package_json_reader:331:9)
at packageResolve (node:internal/modules/esm/resolve:784:25)
at moduleResolve (node:internal/modules/esm/resolve:873:18)
at defaultResolve (node:internal/modules/esm/resolve:1006:11)
at #cachedDefaultResolve (node:internal/modules/esm/loader:708:20)
at #resolveAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:728:38)
at ModuleLoader.resolveSync (node:internal/modules/esm/loader:766:56)
at #resolve (node:internal/modules/esm/loader:690:17)
at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:610:35)
at node:internal/modules/esm/loader:639:32 {
code: 'ERR_MODULE_NOT_FOUND'
}
test at packages/webui/tests/decide-sso.test.mjs:173:1
✖ N4: decision.resolve has no Console route, the --send caller names no decision verb, and consoleCall takes only the two console verbs (70.935161ms)
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'oauth4webapi' imported from /home/jwoltje/.t3/worktrees/mosaic-stack/glomgold-row309/packages/webui/src/sso.mjs
at Object.getPackageJSONURL (node:internal/modules/package_json_reader:331:9)
at packageResolve (node:internal/modules/esm/resolve:784:25)
at moduleResolve (node:internal/modules/esm/resolve:873:18)
at defaultResolve (node:internal/modules/esm/resolve:1006:11)
at #cachedDefaultResolve (node:internal/modules/esm/loader:708:20)
at #resolveAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:728:38)
at ModuleLoader.resolveSync (node:internal/modules/esm/loader:766:56)
at #resolve (node:internal/modules/esm/loader:690:17)
at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:610:35)
at node:internal/modules/esm/loader:639:32 {
code: 'ERR_MODULE_NOT_FOUND'
}
```
## Environment repair and final candidate validation
Isolated worktree root npm ci installed 128 packages from the unchanged lockfile
(root-install.txt); no canonical install, lockfile or source edits.
`decide-sso.test.mjs` alone: 5/5 pass (decide-sso-rerun.tap).
`granted-user.test.mjs` alone: 19/19 pass (granted-user-rerun.tap).
Both used separate fresh scratch TMPDIRs and MOSAIC_REQUIRE_EDITOR_BUILD=1.
This confirms missing dependency setup rather than a W1 source regression;
no base worktree needed under sage-3981. Full serial suite restarted only after
both files passed; log webui-suite-final.tap.
Final source cleanup before the rerun: BUILD.json now explicitly records
Node v26.8.1 and the initial-import Python 3.12.8 in addition to API baselines
and input/output hashes. Removed the optional no-op heap-test wrapper: heap
measurement is three explicit CLI runs, not a reported test without assertions.
Regenerated metadata, syntax-checked all three new modules, reran the dedicated
data test independently: 7/7 pass, 0 skip (thesaurus-test-final.tap). Generated
data bytes/hashes are unchanged; only build metadata/input hashes changed.
## Landing hold mos-1573
Per sage-3980: W1 may build and push only glomgold/row309 for Boyd review.
Nothing lands on refactor until Jason decides whether roughly 58 MB of source
and derived text should be permanent repository history (Vikunja 618).
After a green local commit, measure the exact packed bytes via
`git rev-list --objects d16958bcf..HEAD | git pack-objects --stdout | wc -c`
and report `git count-objects -v` alongside it. No merge or protected-branch push.
Whitespace review: authored source/docs/data/evidence pass staged diff --check
when excluding only the original wordnet/ tree and its two exact LICENSE
copies. The unfiltered check reports 273,271 upstream whitespace findings in
13 files (all original WordNet text or LICENSE copies). Their exact bytes are
required by W1 and verified against the pinned archive; no normalization was
made. Evidence logs/stack excerpts have trailing blank-line spaces trimmed
for review only; test content, errors, statuses and counts are preserved.
No binary entries appear in staged numstat. The ZIP and the full whitespace
checker diagnostic remain outside git.
## Candidate completion
Final full affected suite:
`MOSAIC_REQUIRE_EDITOR_BUILD=1 THESAURUS_ARCHIVE=/mnt/storage/scratch/tmp/glomgold-wordnet-3.0.zip node --test --test-concurrency=1 packages/webui/tests/`
with fresh scratch TMPDIR — 425/425 pass, 0 failures, 0 skips, exit 0;
277018.268665 ms (webui-suite-final.tap). Old test files remained byte-identical.
This includes the required pinned esbuild provenance rebuild. The dedicated
new test independently passed 7/7 before the full run.
All committed additions are within W1's assigned source/data/test paths plus
this explicitly assigned seat work directory. Both node_modules paths are
ignored and absent from git status --porcelain. Source ZIP remains outside git.
Staged numstat contains no binary files. Authored-path staged diff --check
passes; the unmodified upstream whitespace findings are documented above.
License/provenance approval awaits Boyd, then Duckworth once on the landing
candidate. No refactor merge/push, release or deployment is authorized here.
Final registry line for Sage at landing: 2026-10-24 | glomgold | row 309 / #1823
W1 pinned WordNet data | 147306 headwords / 117659 synsets, deterministic
21,916,660-byte shipped data; Node retained heap 59,679,616 bytes (3 runs);
independent 7/7 and WebUI 425/425; source/data plain text; history-size hold
mos-1573 and independent review remain external gates.
## Revision 2 — sage-4367 / Duckworth B1, C1, N1 (2026-10-25 UTC)
Rebased original candidate b1071160363d5d0204de96b06a356c9a04845287 onto
78b69e1e6 on new branch glomgold/row309-r2; no force-push. Per explicit
sage-4367 instruction, push the written correction before tests; no new green
claim is made. All syntax checks, data tests, mutation execution and suites await
Sage CLEAR after MVP rows (post-10-27). Original branch remains untouched.
B1: exclude only tools.node from comparison with recorded BUILD.json; assert
current tools.node equals process.version and preserve the same-runtime complete
manifest comparison, every other recorded field, and all shipped bytes/hashes.
No converter or generated-data change, so input hashes remain valid.
N1: README documents ECMAScript integer-key enumeration and explicit sense order.
C2: Jason answered 618 yes, Q248; mos-1573 history-size hold is cleared and
Vikunja 618 closed. W1 does not depend on W2's license decision.
C1 named mutants (also named in G1):
- M309-NOTICE: attribution-free NOTICE; remove only its attribution guard.
- M309-REVERSE: dog/hound synset with hound omitted from index; remove reverse
membership guard, exercise parseIndex directly to isolate that refusal.
- M309-POINTER: syntactically valid pointer to absent noun offset 99999999;
remove only target validation.
- M309-COUNTS: valid four-synset fixture against expected five; remove counts guard.
- M309-NORMALIZED: inject an extra normalized bookkeeping entry after parsing;
remove union guard. Bidirectional index checks imply equality for parsed source,
so explicit fault injection isolates this defense-in-depth check.
Each scratch module uses synthetic source with recomputed fixture provenance,
never changes the pinned retained files or production converter, checks the
original refuses before output, then demonstrates removing exactly one guard
loses the refusal. These tests are written, NOT executed or claimed killed yet.
Requested run list on CLEAR (fresh TMPDIR from mktemp under
/mnt/storage/scratch/tmp/XXXXXX for each command; no canonical dependency links):
1. Node syntax checks for the dedicated test and converters.
2. THESAURUS_ARCHIVE=/mnt/storage/scratch/tmp/glomgold-wordnet-3.0.zip
node --test packages/webui/tests/thesaurus-data.test.mjs
(includes five named mutants and pinned archive round-trip).
3. Independent dedicated test on an available Node >=24 version other than
v26.8.1 to confirm B1 portability; report availability rather than substitute.
4. Own-worktree npm ci --ignore-scripts where dependency setup is needed;
MOSAIC_REQUIRE_EDITOR_BUILD=1 with THESAURUS_ARCHIVE, full serial WebUI suite.
5. Authored-path diff whitespace and text-only manifest review.
Sage owns N2 archive environment setup and formal landing review request.
Correction to earlier environment history above: the 05:45Z webui node_modules
symlink exposed canonical dependencies to npm ci; the earlier untouched claims
were unverified and incorrect. Reported to Sage in the prior session. mos-1575
forbids canonical installs/removals or dependency links; all new setup is isolated.
Shared SESSIONS/BUILD-LOG registration remains with Sage per sage-3975.
@@ -1,13 +0,0 @@
✔ a signed-in owner confirms and answers, with the session's provider, issuer and sub as the subject (92.914873ms)
✔ the listener gates: no session, a cross-origin page, a loopback Host, a GET, and a sign-out between the steps (36.478745ms)
✔ J16: without a decision transport the routes are read-only and /api/config says no; startServer refuses decide without sso or send (206.814095ms)
✔ J19: a granted user's session gets decide false and the user page config, and a decision POST stops at owner-only (77.212086ms)
✔ N4: decision.resolve has no Console route, the --send caller names no decision verb, and consoleCall takes only the two console verbs (44.65112ms)
ℹ tests 5
ℹ suites 0
ℹ pass 5
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 564.772519
@@ -1,55 +0,0 @@
{
"schema": 1,
"sourceManifestSha256": "e5a799a6693321be71c4e99080b9f89ba12a304c3092d05839bb85355194fe76",
"archive": {
"bytes": 10775600,
"sha256": "cbda5ea6eef7f36a97a43d4a75f85e07fccbb4f23657d27b4ccbc93e2646ab59"
},
"counts": {
"synsets": 117659,
"headwords": 147306,
"literalLemmas": 149229
},
"countMethod": "Union of first-field headwords across four index.* files; cross-checked with lowercased data.* lemmas stripping terminal (a)/(p)/(ip). Literal data lemmas counted without normalization.",
"openNote": "Princeton statistics page union 147278 differs by 28; unresolved, accepted in sage-3972.",
"tools": {
"node": "v26.8.1",
"initialImportPython": "3.12.8",
"converter": "Node.js >=24, standard library only; JSON UTF-8 LF, no timestamps, no locale sorting",
"importer": "Node.js >=24 plus Python 3 stdlib zipfile; local pinned ZIP only"
},
"inputs": {
"editor-data/import-wordnet.mjs": "9b3a668b83d40b5c2659b56c647c40db494d8a9f35fb7ab463b46892ae0d530a",
"editor-data/build-thesaurus.mjs": "f1b0b062452fedfb1298f9785f4934046a8b6a0ed8704f5cb82c683d6deb60aa"
},
"outputs": {
"noun.json": {
"bytes": 15617486,
"sha256": "5294d3f0e6cd7924f5be97d4d6e64b96a9dd8505f216e5c056c3f5b69c0c2dc9"
},
"verb.json": {
"bytes": 2327528,
"sha256": "3f99489858d8cbce9996c72135f82325bd2c067a64d2fb8b80dea386b99b6392"
},
"adj.json": {
"bytes": 3319398,
"sha256": "9965dbfdc35a11b829fedb19e7b22ab3ca8470f45c5532c1f310810012a23023"
},
"adv.json": {
"bytes": 648351,
"sha256": "c6effb7a1502cd3dcd81341cb296e039d238786712c91c30994f2e50ef1e9fcb"
},
"LICENSE": {
"bytes": 1625,
"sha256": "7731175a77952e259390b496fab905e57118b8d19ad3a8383c67eee724ff443f"
},
"NOTICE": {
"bytes": 649,
"sha256": "508e1a5d132e05ec888a79ec959b68d25203fee0aa3692b0610da7500a7c0251"
},
"manifest.json": {
"bytes": 1623,
"sha256": "2c58e1513991ea7505ffd8d9dda6e5e8189f8984a7167b051834eb9306e15c72"
}
}
}
@@ -1,29 +0,0 @@
✔ R6 G1 a granted user signs in, gets the user page and reaches the broker as itself (160.658638ms)
▶ R6 G2 a subject with no live grant in this business is refused subject-unknown
✔ a listed user with no grant (37.489252ms)
✔ a grant in another business (53.430666ms)
✔ an expired grant (54.675764ms)
✔ another user's grant (73.314097ms)
✔ a sub in no file (107.901995ms)
✔ a file the loader refuses (52.404505ms)
✔ R6 G2 a subject with no live grant in this business is refused subject-unknown (380.127672ms)
▶ R6 G3 a revoke counts on the next request: 401 and the session is gone
✔ grant removed (56.085631ms)
✔ subject removed (92.518855ms)
✔ grant expired (55.61104ms)
✔ file now refused (51.75472ms)
✔ R6 G3 a revoke counts on the next request: 401 and the session is gone (256.650806ms)
✔ R6 G4 every owner route answers 403 owner-only before any bus call (113.040167ms)
✔ R6 G5 the bus refuses every owner verb over the user transport on its own (62.938328ms)
✔ R6 G9 a user chat sends only the plugins read over the owner transport (103.067067ms)
✔ R6 G6 the user page holds the notice word for word (74.913868ms)
✔ R6 G7 the hub label and plain peer links render from config on both pages (794.402374ms)
✔ R6 G8 userCall spawns user-cli directly with the user nonce, no human nonce, and the user request (40.148927ms)
ℹ tests 19
ℹ suites 0
ℹ pass 19
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 2123.05789
-17
View File
@@ -1,17 +0,0 @@
00:44:34 up 10 days, 16:04, 2 users, load average: 1.47, 2.21, 2.52
{
"runtime": "v26.8.1",
"platform": "linux",
"arch": "x64",
"files": [
"noun.json",
"verb.json",
"adj.json",
"adv.json"
],
"method": "Fresh Node --expose-gc process; GC before/after parsing all four JSON shards; heapUsed delta. parseHeapBytes is a sampled post-parse value, not peak instrumentation; not a browser measurement.",
"baselineHeapBytes": 4758736,
"retainedHeapBytes": 59679616,
"parseHeapBytes": 60374568,
"synsets": 117659
}
-17
View File
@@ -1,17 +0,0 @@
00:44:34 up 10 days, 16:04, 2 users, load average: 1.47, 2.21, 2.52
{
"runtime": "v26.8.1",
"platform": "linux",
"arch": "x64",
"files": [
"noun.json",
"verb.json",
"adj.json",
"adv.json"
],
"method": "Fresh Node --expose-gc process; GC before/after parsing all four JSON shards; heapUsed delta. parseHeapBytes is a sampled post-parse value, not peak instrumentation; not a browser measurement.",
"baselineHeapBytes": 4758984,
"retainedHeapBytes": 59679616,
"parseHeapBytes": 60374568,
"synsets": 117659
}
-17
View File
@@ -1,17 +0,0 @@
00:44:35 up 10 days, 16:04, 2 users, load average: 1.47, 2.21, 2.52
{
"runtime": "v26.8.1",
"platform": "linux",
"arch": "x64",
"files": [
"noun.json",
"verb.json",
"adj.json",
"adv.json"
],
"method": "Fresh Node --expose-gc process; GC before/after parsing all four JSON shards; heapUsed delta. parseHeapBytes is a sampled post-parse value, not peak instrumentation; not a browser measurement.",
"baselineHeapBytes": 4758736,
"retainedHeapBytes": 59679616,
"parseHeapBytes": 60374568,
"synsets": 117659
}
@@ -1,3 +0,0 @@
npm warn deprecated [email protected]: Use your platform's native DOMException instead
added 128 packages in 1s
@@ -1,15 +0,0 @@
✔ pinned source keeps all original files and Princeton license bytes (38.297773ms)
✔ two complete conversions match shipped bytes and pinned counts (3418.378387ms)
✔ changed source, missing license, changed provenance and extra files refuse before output (68.788374ms)
✔ data parser refuses malformed words, offsets, pointers, verb frames and trailing fields (0.365038ms)
✔ index parser refuses wrong counts, nonexistent senses and incorrect lemma mapping (0.292268ms)
✔ offline importer refuses incorrect archive bytes before extraction (0.416171ms)
✔ verified pinned ZIP round-trips to all original text files (366.007687ms)
ℹ tests 7
ℹ suites 0
ℹ pass 7
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 3965.261961
@@ -1,16 +0,0 @@
✔ pinned source keeps all original files and Princeton license bytes (32.957522ms)
✔ two complete conversions match shipped bytes and pinned counts (3093.861766ms)
✔ changed source, missing license, changed provenance and extra files refuse before output (59.480475ms)
✔ data parser refuses malformed words, offsets, pointers, verb frames and trailing fields (0.334357ms)
✔ index parser refuses wrong counts, nonexistent senses and incorrect lemma mapping (0.233577ms)
✔ offline importer refuses incorrect archive bytes before extraction (0.371605ms)
✔ heap measurement runs explicitly in an isolated GC-enabled process (0.145852ms)
✔ verified pinned ZIP round-trips to all original text files (390.61197ms)
ℹ tests 8
ℹ suites 0
ℹ pass 8
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 3637.750779
@@ -1,458 +0,0 @@
✔ row 194 T16 Settings Agents: unavailable read-only, launch follows its request, confirms, reason and refusal (13120.49989ms)
✔ row 256 T7 T8 the human page offers Delete on a creative instance, the tester page never does (594.900276ms)
✔ row 194 T16: each agent action makes one call with only its keys, logs the user and answers the request (19.279785ms)
✔ row 194 T16: the boundary refuses before any bus call (8.864838ms)
✔ row 194 T16: read-only when send is off or no writer is wired; no route has a --send exception (4.555721ms)
✔ row 194 T16: a bus refusal names its reason and nothing changed; an unknown outcome or a bad shape is never retried (3.135758ms)
✔ row 194 T16: the request read takes one id, adds the refusal reason and refuses an unexpected shape (4.707014ms)
✔ row 194 T16: delete joins add and change on /api/instances with only revision, instance and op (2.172666ms)
✔ row 194 T16 D4.1: the tester listener launches, terminates and reads requests; regenerate, veto and delete are refused with no call (4.058214ms)
✔ row 194 N5: agents.js is served as JavaScript and index.html loads it once (1.320432ms)
✔ row 239 T6: a delete closed -revoked says the tokens may already be revoked, and outcome-unknown-revoked is an open outcome (2.197169ms)
✔ Q169 the signed-in human names a seat and stops the assistant, one bus call each, logged with the user (15.385947ms)
✔ Q169 the name and stop routes need send on, the public name, the user, the exact Origin and same-origin Fetch Metadata (7.953505ms)
✔ Q169 the name and stop routes take JSON within 4 KiB and only their own keys, all text (4.763975ms)
✔ Row 167 a null body on the name and stop routes is 400 invalid-request with no write, and the next request is answered (2.613751ms)
✔ Q169 a bus refusal says nothing changed; a lost or odd answer says the change may have been made (4.454523ms)
✔ Q169 the names read is a bus read like the others (1.187961ms)
✔ the Board: held roles with no machine sessions, a claim with no address, the toggle kept across a reload, and Message addressed to the role (2826.381092ms)
✔ a Seen click while a Board read is in flight waits for that read, then posts (1097.524589ms)
✔ a redirect answer on a Board read, a bus read, a conversation read, a board POST, a module read and a send signs the page out: one line, nothing stale, no further reads (4974.029468ms)
✔ browser edge states: loading, empty, malformed, stale, hostile/long values, in-flight reply and appearance fallback (1167.906408ms)
Rendered contrast: {"failures":[],"count":330,"lowest":4.504658476260286}
✔ served Console browser: real board fixtures, keyboard, drafts, receipts, themes, 320px and failures (1361.244374ms)
✔ the README says a refused field table names the file or the key at fault, never a path (0.895092ms)
✔ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes (2997.413698ms)
✔ bus routes serve the four reads from the reader view, unescaped JSON for the page to escape (71.009621ms)
✔ decisions route serves the roles and recent lists from the reader view (35.642956ms)
✔ credentials route serves the broker credential status from the reader view (12.415355ms)
✔ replies route serves the replies to one message from the reader view (33.836567ms)
✔ bus routes are GET-only, have no write verb, and keep the same-origin checks (53.12275ms)
✔ bus refusals map to statuses and never carry a path or a stack (25.300216ms)
✔ humanCall speaks the human transport protocol without blocking the server (1652.166732ms)
✔ busReader takes --business, else the live bus host, else refuses (179.503984ms)
✔ humanCall kills a transport that runs past its timeout (528.73483ms)
✔ serve refuses a --business value that is not a business id (288.679832ms)
✔ WebUI channel off returns 503 and named recovery for every chat route without a chat operation (32.840935ms)
✔ WebUI only selection keeps web chat enabled while retaining the old read envelope (2.07606ms)
✔ WebUI channel-disabled recovery text is fixed and never echoes transport text (1.29965ms)
✔ chat browser: list/create named projects and threads, hostile labels inert and no implicit writes (641.425225ms)
✔ chat browser: thread drafts, receipts and cursor history stay isolated; refresh never writes (734.207819ms)
✔ chat browser: uncertain writes retain draft, ownership refusal clears it, read-only cannot send (733.502029ms)
✔ chat browser: a late read from A cannot paint B; sign-out clears private state and stops reads (956.0031ms)
✔ chat browser: page forward and deduplicate replies; pending and byte-limit submissions do not duplicate (653.519467ms)
✔ chat browser: scrolled history stays put, New messages and an own send return to the tail (651.214034ms)
✔ chat browser: automatic polling follows a reply without a POST or a lost draft (10567.99751ms)
✔ chat browser: display stays bounded while every forward page remains reachable (646.919125ms)
✔ chat browser: a confirmed visible message replaces its pending receipt; malformed receipts stay unknown (666.089089ms)
✔ chat browser: a refusal elsewhere forgets private chat drafts (649.343576ms)
✔ chat browser: a late project creation receipt cannot navigate away from another thread (734.318814ms)
✔ C2-09a picker: no silent choice, duplicate hostile labels stay inert, selection survives refresh and reaches POST (633.758399ms)
✔ C2-09a picker: metadata failure, empty set and removed pick explain disabled state and recover without switching (705.839055ms)
✔ C2-09a picker: a single instance is chosen explicitly but read-only mode cannot create a thread (603.87131ms)
✔ 264e chooser: two sessions keep drafts, cursors, deep links and counts independent (709.28204ms)
✔ 264e clear confirmation and status never resend, force-stop or change selection (646.479049ms)
✔ 264e new session keeps its operation key after an unknown response and uses no implicit open (629.483981ms)
✔ 264e cancel shows before/after retirement and never starts or replays work (748.8715ms)
✔ 272 B1: a bad-session deep link preserves the draft and lost clear operation on A (679.330701ms)
✔ C2-09a metadata uses the human listener bus, projects labels only and refuses unauthenticated reads (17.636401ms)
✔ C2-09a metadata uses the private tester listener own bus and no human transport (2.812051ms)
✔ C2-09a metadata refuses missing or malformed reads and never echoes untrusted fields (3.36452ms)
✔ C2-09a metadata stays behind the SSO session check and a GET never refreshes session activity (2.031401ms)
✔ 272 fallback: granted legacy route keeps default history, send and open without session controls (551.938108ms)
✔ 272 fallback guard: granted explicit-session route refuses without default history or writes (446.9789ms)
✔ 272 fallback guard: human-required catalog failure never enables default-thread access (438.616041ms)
✔ 272 fallback guard: timeout catalog failure never enables default-thread access (332.141995ms)
✔ 272 fallback guard: no-bus-host catalog failure never enables default-thread access (345.68892ms)
✔ 272 fallback guard: malformed catalog failure never enables default-thread access (457.527881ms)
✔ 272 fallback guard: owner route retains chooser and explicit default-session addressing (356.922913ms)
✔ chat reads map only fixed verbs, strict forward paging and pure GET (22.513107ms)
✔ chat refuses malformed and repeated query/id values before transport (5.490672ms)
✔ chat project.create: one verified write, fixed identity/class and private log (2.177988ms)
✔ chat project.create: each existing Console write fence makes zero bus calls (6.741435ms)
✔ chat project.create: refusal or lost/malformed receipt never retries or invents success (3.881328ms)
✔ chat thread.create: one verified write, fixed identity/class and private log (1.282899ms)
✔ chat thread.create: each existing Console write fence makes zero bus calls (6.492244ms)
✔ chat thread.create: refusal or lost/malformed receipt never retries or invents success (3.376929ms)
✔ chat thread.send: one verified write, fixed identity/class and private log (1.218434ms)
✔ chat thread.send: each existing Console write fence makes zero bus calls (5.297186ms)
✔ chat thread.send: refusal or lost/malformed receipt never retries or invents success (3.045893ms)
✔ chat thread.open: one verified write, fixed identity/class and private log (1.093096ms)
✔ chat thread.open: each existing Console write fence makes zero bus calls (5.706024ms)
✔ chat thread.open: refusal or lost/malformed receipt never retries or invents success (3.010259ms)
✔ chat createThread receipt requires an instance even when its id is valid (1.918607ms)
✔ chat write receipts expose only the fields belonging to their operation (3.206521ms)
✔ chat validates names, body, project and strict empty open payload (4.821072ms)
✔ chat read failures redact ownership and refuse invalid transport arrays (5.618177ms)
✔ REQ-USER-2 real broker: owned catalog, create/name/filter, isolated history and 403/404 without mutations (90.748147ms)
✔ chat repeats every POST boundary even when called behind an admitted request (0.833696ms)
✔ configured Console process injects chat through its existing human transport (133.521935ms)
✔ chat assets, GET purity, method and unknown-route refusals are explicit (11.226856ms)
✔ the chat seam names the transport it is given: the human one and the tester one both pass, anything else is a TypeError (0.427616ms)
✔ C2-09a createThread forwards an explicit instance through the existing channel (3.442901ms)
✔ C2-09a malformed instance and extra thread fields refuse before the channel write (3.151853ms)
✔ 264e session catalog/create and explicit selectors keep the human transport and strict keys (4.390959ms)
✔ 264e session writes retain Origin/identity fences and explicit selector errors (2.283871ms)
✔ 264e clear envelope is projected, pending is preserved and GET never repeats the clear (3.67385ms)
✔ 264e cancel is an authenticated, confirmed human write and retains retirement distinction (6.231344ms)
✔ 272 N1: malformed clear/cancel write receipts get one redacted outcome-unknown audit line (4.493454ms)
✔ conversation view: full history, collapsed tools, hidden thinking, inert hostile content, malformed and reconcile markers (1005.423417ms)
✔ conversation view: a fork keeps the open branch, says so, and opens the new one on request (1370.56904ms)
✔ conversation view: a newer session with no readable history keeps the marker (954.423136ms)
✔ conversation view: seats without history say so and offer no reply (661.083302ms)
✔ J16: no controls without sso and decide, read-only reasons, terminal lines kept, and only an eligible grant gets the panel (4815.646894ms)
✔ J17: one POST per click, confirm then answer, cancel, refusals and an unknown outcome never retry (3929.059474ms)
✔ a sign-in redirect at either step signs the page out and answers nothing (1457.865765ms)
✔ a signed-in owner confirms and answers, with the session's provider, issuer and sub as the subject (70.013805ms)
✔ the listener gates: no session, a cross-origin page, a loopback Host, a GET, and a sign-out between the steps (92.743885ms)
✔ J16: without a decision transport the routes are read-only and /api/config says no; startServer refuses decide without sso or send (172.195474ms)
✔ J19: a granted user's session gets decide false and the user page config, and a decision POST stops at owner-only (37.306927ms)
✔ N4: decision.resolve has no Console route, the --send caller names no decision verb, and consoleCall takes only the two console verbs (36.688496ms)
✔ a confirmation then a resolve answers once with the held choice and digest, and a second resolve refuses (2.676004ms)
✔ deny resolves without a grant field (0.334827ms)
✔ the gates before the body: method, read-only, sign-in and same origin (0.377549ms)
✔ a bad body, id or content type refuses before the bus (0.595313ms)
✔ a choice that is neither key is decision-stale, and a malformed preview is confirmation-unavailable (0.51847ms)
✔ bus refusals map by code, and an unknown or missing code is unavailable at preview and outcome-unknown at resolve (1.757134ms)
✔ a confirmation binds the session, decision and choice, and any mismatch spends it (0.48989ms)
✔ a session that ends between the steps refuses before the bus (0.311432ms)
✔ confirmations expire after the TTL, cap at the limit without dropping a live one, and are one use (0.195193ms)
✔ Discord row through real board/WebUI: independent brake/liveness, no Reply, literal content (580.425029ms)
✔ the editor: the list, hostile markdown that runs nothing, the draft, and each save receipt (1538.990805ms)
✔ the Console's CSP stands and the editor runs under it; hostile markdown on the load path runs and loads nothing (878.229666ms)
✔ hostile content pasted into the editor runs and loads nothing, and a bad link target is refused in the link bar (684.461512ms)
✔ a pasted image span is kept only for a target the link gate accepts, and a save writes only those (550.259133ms)
✔ a switch of view reads nothing; a reload, and a trip away and back, each read the file exactly once (2485.105458ms)
✔ an edit rewrites only the block touched; a save sends the rest byte for byte; the Source view carries the draft (985.988893ms)
✔ a file the editor cannot write back byte for byte opens as Source, says so, cannot save, and the Visual button works once it can (1940.942348ms)
✔ a link title pasted with line breaks in it is written on one line, so no HTML block comes of it (545.329956ms)
✔ an image alt pasted with line breaks in it is written on one line, so no HTML block comes of it (541.469322ms)
✔ an image title pasted with line breaks in it is written on one line, so no HTML block comes of it (541.761624ms)
✔ a code block info string pasted with line breaks in it is written on one line, so no HTML block comes of it (529.938542ms)
✔ a link title holding a quote after a backslash then a tag is written with the backslash escaped, so the title stays closed (589.242396ms)
✔ an image title holding a quote after a backslash then a tag is written with the backslash escaped, so the title stays closed (496.075229ms)
✔ a link title holding a trailing backslash is written with the backslash escaped, so the title stays closed (495.515484ms)
✔ an image title holding a trailing backslash is written with the backslash escaped, so the title stays closed (559.520726ms)
✔ a code block info string with a backtick, pasted, is dropped on Save, so the fence stays closed (522.449511ms)
✔ a code block info string with a backtick, as a tilde fence can have, is kept as source, not rewritten without it (560.892119ms)
✔ the imported source is the tagged upstream source plus the recorded local changes, and nothing else (11.805683ms)
✔ every package names its origin and license, and NOTICE lists each (0.494144ms)
✔ the build reads only imported source and the editor's own files; the bundle is the recorded build (5.659658ms)
✔ MOSAIC_REQUIRE_EDITOR_BUILD: a missing or wrong esbuild skips without it and fails with it; a wrong binary always fails (3.429329ms)
✔ the toolchain check, run as a program, exits non-zero without esbuild when the build is required (117.432817ms)
▲ [WARNING] Ignoring this import because "third_party/editor/prosemirror-transform/src/mark.ts" was marked as having no side effects [ignored-bare-import]
third_party/editor/prosemirror-transform/src/index.ts:10:7:
10 │ import "./mark"
╵ ~~~~~~~~
"sideEffects" is false in the enclosing "package.json" file:
third_party/editor/prosemirror-transform/package.json:13:2:
13 │ "sideEffects": false,
╵ ~~~~~~~~~~~~~
✔ rebuilding from the source gives the same bytes (needs the pinned esbuild; MOSAIC_REQUIRE_EDITOR_BUILD=1 makes its absence a failure) (70.671292ms)
✔ the editor routes serve the built files with their types and no cache (33.152872ms)
✔ open and save with no edit writes the same bytes: the goals review and a doc with every element (14.952097ms)
✔ open and save with no edit writes the same bytes: every repository doc under docs/ and spec/ (1354.689164ms)
✔ the editor source builds markup only with DOM calls, and the bundle has no eval (2.049203ms)
✔ the link gate and the image rule are the preview's (0.333066ms)
✔ R6 G1 a granted user signs in, gets the user page and reaches the broker as itself (82.134951ms)
▶ R6 G2 a subject with no live grant in this business is refused subject-unknown
✔ a listed user with no grant (40.944625ms)
✔ a grant in another business (42.037987ms)
✔ an expired grant (147.367931ms)
✔ another user's grant (139.465978ms)
✔ a sub in no file (63.607001ms)
✔ a file the loader refuses (62.135909ms)
✔ R6 G2 a subject with no live grant in this business is refused subject-unknown (496.381708ms)
▶ R6 G3 a revoke counts on the next request: 401 and the session is gone
✔ grant removed (49.252373ms)
✔ subject removed (62.077208ms)
✔ grant expired (91.401492ms)
✔ file now refused (43.84123ms)
✔ R6 G3 a revoke counts on the next request: 401 and the session is gone (247.211075ms)
✔ R6 G4 every owner route answers 403 owner-only before any bus call (91.916815ms)
✔ R6 G5 the bus refuses every owner verb over the user transport on its own (76.065246ms)
✔ R6 G9 a user chat sends only the plugins read over the owner transport (75.816462ms)
✔ R6 G6 the user page holds the notice word for word (68.007509ms)
✔ R6 G7 the hub label and plain peer links render from config on both pages (769.528743ms)
✔ R6 G8 userCall spawns user-cli directly with the user nonce, no human nonce, and the user request (38.957533ms)
✔ return flow through the conversation view: send, tool call, delayed result, peer message, exact long answers, relaunch (51936.406505ms)
✔ row 165 Settings: role instances read, add with a restart named, change without one, a refusal keeps the draft (991.579686ms)
✔ row 165 Console: the signed-in human adds an instance through a real broker; validate exits 0, the log names the human and no restart is needed (row 194) (193.463891ms)
✔ row 165 Console: the instance write needs send on, the public name, the user, the exact Origin and same-origin Fetch Metadata (5.88349ms)
✔ row 165 Console: the instance write takes JSON within 16 KiB and only its own keys; holder, credentials and an actor are refused (6.540542ms)
✔ row 165 Console: a bus refusal says nothing changed; a lost or odd answer says the change may have been made (9.74122ms)
✔ row 165 Console: the instances read takes no arguments, needs a bus and refuses an answer without a revision (4.463583ms)
✔ C2-04 CLI: both listener callback pairs dispatch library verbs with their own transport (130.905358ms)
✔ row 254: each library sync code maps to its status (0.572723ms)
✔ REQ-LIMIT-3 REQ-LIMIT-4 Settings shows token limits counted, not enforced and check failed; Reset posts one path; a save keeps the token limits (975.696605ms)
✔ Row 167 with an assistant draft open, a token limit reset gives the assistant submit its revision (669.50689ms)
✔ REQ-LIMIT-3 limits read returns only the token rows; no query or write is accepted (26.70046ms)
✔ REQ-LIMIT-3 a limits answer without a token list is refused, not shown as no limits (7.994198ms)
2026-10-24T05:53:21.357Z settings user="jason" changed
✔ REQ-LIMIT-3 a Settings reset reaches the human write with its paths; a reset alone is enough (5.567108ms)
✔ REQ-LIMIT-3 the Console reader asks the bus limits verb with no arguments (0.235819ms)
✔ the preview source names none of the four string-to-markup sinks (0.846655ms)
✔ headings, paragraphs, emphasis and inline code render (1.131421ms)
✔ lists, block quotes and code blocks render (0.397914ms)
✔ a link is made for http, https and relative targets, with rel and the target shown (0.889923ms)
✔ a link with any other scheme, or an evasion of the scheme, stays source text (0.706367ms)
✔ an image shows alt text and URL, is never an img element and never loads (0.140692ms)
✔ raw HTML, entities and unsupported blocks show as source text, never as elements (0.276815ms)
✔ markup inside code and inside link text stays text (0.153012ms)
✔ hostile and pathological input stays within its look-ahead budget and under the nesting cap (31.828155ms)
✔ trailing blanks and closing hashes are cut by a walk from the end, not a regex that retries inside a blank run (25.168256ms)
✔ a link opener with no closer searches at most SPAN characters ahead (137.844248ms)
✔ the look-ahead work of one render is a fixed multiple of the text, whatever the opener (712.427405ms)
✔ past the budget an opener is source text, through the path all other text takes (14.790124ms)
✔ a normal 200 KiB document renders exactly as it did without a budget, and spends little of it (18.081668ms)
✔ a line separator inside a heading, a list item or a fence line does not end the marker line (0.486523ms)
✔ a thematic-break line is a paragraph, every other marker line opens a list (0.367498ms)
✔ every short line over space, tab, - * _ and a letter is a break exactly when the old regex said so (37.762407ms)
✔ one line of marks does not throw, at 4 MiB, whatever the mark or the spacing (6004.208904ms)
✔ CRLF and tabs are read like LF and spaces; empty input renders nothing (0.166234ms)
✔ messages HTTP read pages and preserves metadata; bad arguments refuse before a read; other reads unchanged (84.34292ms)
✔ Console Messages lists late unsolicited messages on polling with sender class time read state and trail; nav count includes beyond the page; reads never deliver (837.761934ms)
✔ Messages nav count polls on Tasks and Board and clears on a Board refusal; messages 403 refuses local pages (1639.975112ms)
✔ copy writes the Console paths at the full id, read-only, and leaves an existing copy alone (1706.657673ms)
✔ copy refuses a commit off refactor, an unknown one, a worktree and a bad copies directory (2260.993696ms)
✔ copy writes nothing when an archived path is missing at the commit (1015.292402ms)
✔ a copy that loses the rename race leaves no read-only temp directory behind (1239.052354ms)
✔ a copy whose rename fails with no target refuses, writes no copy and leaves no temp directory (1057.788945ms)
✔ a copy that meets a target holding files says exists: and moves nothing into it (1076.400999ms)
✔ a copy that meets an empty target directory replaces it by rename, not by moving into it (1032.466352ms)
✔ serve runs from a copy: /healthz 200, the config check, roles and RELEASE from the copy, the queue from --checkout (1472.800878ms)
✔ serve refuses a --checkout that is not an absolute directory path (273.230223ms)
✔ consoleReads runs the queue read under queueRoot and reads RELEASE under root (48.380515ms)
✔ preview options are all three or none, and each is checked (6.428862ms)
✔ the CLI refuses a partial or invalid preview flag set at start (664.583698ms)
✔ the CLI with all three flags serves the preview mode (146.290409ms)
✔ a request for the public name needs the header equal to the user id, else 401 and nothing read (21.367837ms)
✔ the header name matches without regard to case, and the value compare is exact (4.268357ms)
✔ the public name with the header reads the bus views, and the Host and Origin are checked first (28.252132ms)
✔ in preview mode every write answers 403 read-only, from the public name and loopback, and reaches nothing (13.326316ms)
✔ loopback requests are unchanged in preview mode, and the bus views work with the board down (5.577205ms)
✔ a proxy that rewrites Host to the loopback port gets 403 on its first request, whatever the user (18.130558ms)
✔ a repeated Host is 400 before any other check, in preview mode and without it (10.389963ms)
✔ without the preview flags the public name is refused and writes still reach the board (5.672682ms)
✔ processing browser: keyboard Stop, confirmed Resume, unknown outcome and persistent banner (765.31904ms)
✔ processing browser: Q175 read-only interim keeps both writes disabled and names CLI recovery at 320px (589.583065ms)
✔ processing browser: sign-out from config redirect blocks later refresh and writes (700.36576ms)
✔ processing browser: sign-out from state redirect blocks later refresh and writes (692.089186ms)
✔ processing browser: sign-out from write redirect blocks later refresh and writes (699.263448ms)
✔ processing browser: sign-out from config sign-in required blocks later refresh and writes (680.376298ms)
✔ processing browser: sign-out from state sign-in required blocks later refresh and writes (675.832789ms)
✔ processing browser: sign-out from write sign-in required blocks later refresh and writes (657.336986ms)
ROW191_LAYOUT {"width":400,"height":1000,"controls":97,"tree":324.0625,"main":1450.703125,"top":181.5,"bottom":217.5,"barBottom":129,"projectsTop":352.59375,"order":"0","visible":true}
ROW191_LAYOUT {"width":1440,"height":1000,"controls":127,"tree":914,"main":914,"top":135.5,"bottom":171.5,"barBottom":53,"projectsTop":636.59375,"order":"0","visible":true}
ROW191_LAYOUT {"width":1440,"height":420,"controls":127,"tree":334,"main":907.734375,"top":135.5,"bottom":171.5,"barBottom":53,"projectsTop":636.59375,"order":"0","visible":true}
ROW191_LAYOUT {"width":800,"height":420,"controls":127,"tree":334,"main":1131.65625,"top":135.5,"bottom":171.5,"barBottom":53,"projectsTop":618.59375,"order":"0","visible":true}
✔ processing browser: static nav controls keep Stop visible, ordered and keyboard reachable (603.718005ms)
✔ interim read-only controls show CLI recovery, disable both writes and retain a halted banner across views (7.334084ms)
✔ Stop sends one empty halt and Resume confirms before sending the displayed generation (2.849813ms)
✔ a cancelled resume never calls the writer (1.09297ms)
✔ unknown writes are not retried or displayed as success and partial stops remain explicit (1.839818ms)
✔ the persistent shell loads the control outside route-specific content with accessible status and native buttons (0.406741ms)
✔ read-only Console can read processing state but neither human control writes without --send (18.503358ms)
✔ Console halt and generation-bound resume use only the management writer and keep partial stops honest (3.909099ms)
✔ processing write fences refuse cross-site, wrong origin, unnamed host, duplicate identity and bad payload before writer (6.015997ms)
✔ tester cannot invoke either control writer and failures never echo backend text (3.943577ms)
✔ processing writes use the existing SSO signer and still require --send and same-origin (4.161332ms)
✔ processing handler independently refuses wrong origin and cross-site before its writer (0.550006ms)
✔ a signed-in same-origin save reaches exactly one human operation and returns the new commit (17.503534ms)
✔ a save needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata (6.181398ms)
✔ a save validates JSON, strict keys, text values and the 1 MiB body before the bus is asked (15.0983ms)
✔ a body that is JSON but not an object is refused 400, not thrown on (4.888629ms)
✔ the 1 MiB limit is this route only; Settings and messages keep 16 KiB (2.188725ms)
✔ a bus refusal is reported as not saved with its own status; stale-base tells the user to reload (5.071686ms)
✔ a save whose answer is lost or unusable is reported unknown and is never retried (3.102732ms)
✔ the file list and one file read take strict queries and arrive in the expected shape (4.368356ms)
✔ reads work without --send; an unusable bus answer is a bad response, a refusal keeps its status (2.429382ms)
✔ /api/config says edit only where a save can pass (1.854521ms)
✔ a repository-name project refusal is an HTTP conflict (0.512679ms)
✔ proof startup refuses partial flags non-preview and invalid fixture file metadata or bytes (1169.034096ms)
✔ serve argv carries only fixture proof path and header; startup explicitly reports proof on or off (243.582574ms)
✔ CLI applies proof on the main listener and rejects that header on its tester listener (226.911465ms)
✔ proxy proof admits named reads and sends, reads its fixture once, and never exposes the value (29.428285ms)
✔ proxy proof refuses missing wrong short or repeated proof before auth and before any read (8.872495ms)
✔ proxy proof header is refused on other Hosts and on the tester listener (4.215652ms)
✔ proof options reject unsafe or colliding header names without disclosing file contents (0.628262ms)
✔ redactor: config, dataRoot, any absolute path, Discord ids and the JSON parser quote (1.187629ms)
✔ credential state from the date alone, as the bus states it (0.131716ms)
✔ queue: rows, one row, ids and methods, notes; no path or id from a row (324.251778ms)
✔ queue: a refused read fails closed with the store's text, redacted (166.918485ms)
✔ queue: a store that fails to load, or a child that dies, gives a fixed message with no path or stack (702.513606ms)
✔ business: names, vars on the allowlist, authority, credential metadata only (8.976419ms)
✔ business: missing or invalid file refuses with the module's text, redacted (6.080389ms)
✔ business without --business: the live bus host, else no-bus-host; no system config: not-configured (6.341439ms)
✔ settings: release, board, loopback address, notifier binding name only (98.9594ms)
✔ task fields: the committed table with no reads configured, GET only; a bad table refuses with no path (16.845946ms)
✔ bus-status: a refused boot shows reason, file and last good load; a live host or an ok boot clears it (6.721379ms)
✔ both presentations replace old activity with relaunch notice, label retained history, then resume after new activity (636.416956ms)
✔ reported return flow and relative Age: reply sent from the inspector, then the new answer appears there without manual refresh (20712.001803ms)
organization: {"event":"reload-needs-restart","business":"acme"}
organization: {"event":"reload-needs-restart","business":"acme"}
✔ row 65 Settings: the routing table lists every instance, saves a harness, model, thinking and fallback to the file, and keeps the draft on each refusal (1289.24343ms)
organization: {"event":"reload-needs-restart","business":"acme"}
✔ row 65 Console: the signed-in human saves a route through a real broker; each refusal says nothing changed and leaves the file and the log (103.948331ms)
✔ row 65 Console: the routes write needs send on, a writer, the public name, the user, the exact Origin and same-origin Fetch Metadata (6.771368ms)
✔ row 65 Console: the routes write takes JSON within 16 KiB with a revision and routes only; an actor is refused and routes are never logged (7.008611ms)
✔ row 65 Console: a bus refusal maps to its status and says nothing changed; a lost or odd answer says the change may have been made (25.506113ms)
✔ row 65 Console: the routes read takes no arguments, needs a bus and refuses an odd answer (5.997376ms)
✔ the send box: held roles, the draft and caret across a refresh, each receipt, one POST per Send, and the trail link; the board Reply on a 4xx and a 5xx (2339.8884ms)
✔ a sent receipt lists its replies as the page refreshes, oldest first and capped, and marks none delivered or read (11096.659422ms)
✔ startServer takes send only as a function and only with the preview mode (5.436794ms)
✔ the CLI refuses --send without the preview flags, and without a configured bus (449.118647ms)
✔ the CLI with --send and a configured bus sends through the human transport and logs one line (150.581681ms)
✔ without --send the route is read-only like every other write, and config says no send (7.231271ms)
✔ with --send every other write is still 403 read-only, and nothing reaches the board or bus (5.874475ms)
✔ config says send only on the public name with --send on (2.230966ms)
✔ a send without the signed-in user is 401 and is neither sent nor logged, loopback included (3.855927ms)
✔ each request check refuses before anything is sent, and logs the refusal without the body (12.123809ms)
✔ a send passes exactly to, body and in_reply_to, answers the id, and logs it (2.548018ms)
✔ a crafted role name cannot forge a log line (1.815113ms)
✔ a bus refusal is not sent, with its status; an outcome the bus could not confirm is unknown and never retried (6.025781ms)
✔ through the human transport the request is exactly the business, message.send and the keys (82.134733ms)
✔ against a real broker: the message is written once as a human send, and its refusals map (32.652181ms)
✔ loopback host and board origin fail closed (6.088571ms)
✔ real board fixture passes through WebUI; assets and isolated seen/reply work (71.586234ms)
✔ proxy preserves exact request bytes, status and receipt, rejects forms and malformed JSON, never follows redirect (39.352406ms)
✔ unreachable board reports URL; CLI rejects unsupported options (398.535455ms)
✔ tester service render carries the tester port alongside existing flags (95.469287ms)
✔ tester service refuses forwarded 7332 even with another main port (58.686381ms)
✔ tester service invalid ports refuse render and install with exit 4 and leave the unit alone (703.380562ms)
✔ tester service counts the digits as written before it strips leading zeros (65.126118ms)
✔ tester service install and status show the tester port without changing send reporting (358.896996ms)
✔ render prints the unit without the preview flags (33.100741ms)
✔ render carries every serve flag, the preview set included (34.839285ms)
✔ a partial preview set is refused (94.945574ms)
✔ a value the unit cannot carry is refused, for every flag (1668.211167ms)
✔ the rendered unit names none of the human proof agent markers and sets no agent variable (105.101552ms)
✔ install into --dir with --no-reload writes the file whole, then reports unchanged (193.571828ms)
✔ install without --no-reload runs daemon-reload and nothing that starts the unit (44.720501ms)
✔ uninstall refuses while the unit is running, with or without --no-reload, and removes it once it is not (441.860555ms)
✔ status prints the unit state and GET /healthz on the installed port (265.638824ms)
✔ usage: an unknown verb or flag, and start or enable, exit 4 (629.337843ms)
✔ without --send, render is the template with its placeholders filled, byte for byte (173.097355ms)
✔ render --send with the preview set ends ExecStart with --send and changes nothing else (279.635691ms)
✔ --send without the whole preview set is refused and writes nothing (667.172745ms)
✔ install --send into --dir with --no-reload writes the sending unit, and status says whether it sends (450.623337ms)
✔ uninstall and status take no --send (149.404818ms)
✔ install refuses while the unit is running, in any state but inactive or failed, and changes nothing (654.290201ms)
✔ when the state read fails, install and uninstall refuse with one line and change nothing (210.540626ms)
✔ install needs --copy naming a copy that exists, and refuses outside the canonical checkout without --allow-worktree (293.268822ms)
✔ install refuses unless the bus unit runs from the same copy, naming both paths, and changes nothing (631.243119ms)
✔ render --copy runs the copy and reads the queue in the checkout; without --copy the unit is unchanged (93.452901ms)
✔ the uid header takes only an Authentik uid; the username header still takes a username (1786.499417ms)
✔ a preview value cannot start with - or . (190.355117ms)
✔ status names the copy and whether refactor has moved past it, and says when the unit runs from no copy (521.398589ms)
✔ proxy proof render carries both flags but never opens the fixture file (35.027753ms)
✔ proxy proof render refuses incomplete non-preview missing unsafe-mode and repo/copy paths (378.504771ms)
✔ proxy proof status retains send and tester reporting with both proof flags (156.354779ms)
✔ row196 socket flag renders only for supporting targets and refuses mixed transports (91.044454ms)
✔ Settings form shows every scope and held role; gated save, exact payload, retained draft and no automatic retry (1149.397483ms)
✔ Q169 Assistant section: gated, changed fields only, name and stop posts, retained draft and no automatic retry (1202.434375ms)
✔ Row 167 a refused names read gives the refused usage page; another names failure keeps the Assistant section (828.93179ms)
✔ Row 167 with a limits draft open, an assistant save gives the limits submit its revision and the typed limit stays (698.454133ms)
✔ Row 167 with an assistant draft open, a launch save gives the assistant submit its revision, and reload reads the current one (686.551532ms)
2026-10-24T05:54:48.215Z settings user="jason" changed
✔ REQ-WEB-1 signed-in same-origin Settings write reaches exactly one human operation (16.774402ms)
✔ REQ-WEB-1 Settings writes require enabled send, named Host, identity, exact Origin and same-origin Fetch Metadata (5.785092ms)
✔ REQ-WEB-1 Settings validates JSON, size, revision and strict writable keys before broker call (4.72348ms)
✔ Q169 a Console change of the assistant reaches the human operation unchanged, and the log names the signed-in user (2.505956ms)
✔ tokens.css and icons.svg are byte copies of docs/design (0.744344ms)
✔ JetBrains Mono files match the digests in their sources file, with the OFL text (1.776009ms)
✔ shipped strings are unchanged, and the web keeps its write boundary (3.276718ms)
ROW191_LAYOUT {"width":1440,"height":1000,"controls":212.5,"tree":914,"main":914}
✔ shell in a browser: System default, seeded states, 400px, focus and the Ctrl+K palette (5611.131411ms)
✔ five states on Board, Inbox, Tasks, Agents and Trail (2403.421938ms)
✔ a 401 sign-in required on each fetch path signs the page out with a sign-in link and stops the refresh; another 401 stays an error (5576.793869ms)
✔ the Sign out form shows only when /api/config says sso, and posts to /auth/logout (989.677029ms)
✔ positive: an RS256 provider signs in and sends one message, and the session reads (91.893637ms)
✔ positive: an ES256 provider signs in and sends (15.625044ms)
✔ positive: two providers each sign in their own subjects, and one provider's subject is unknown to the other (66.787533ms)
✔ 1: a forged x-authentik header without a cookie is 401 on the API and a sign-in redirect on a page (42.725108ms)
✔ 2: an HS256 ID token keyed with the client secret and a real RSA kid is refused (23.753077ms)
✔ 3: a wrong aud, and an aud list holding another client with no azp, are refused (98.135791ms)
✔ 4: a token that expired 10 minutes ago is refused (36.300718ms)
✔ 5: another issuer, and the issuer without its trailing slash, are refused (51.400149ms)
✔ 6: a nonce mismatch and a missing nonce are refused (38.472602ms)
✔ 7: state mismatch, no login cookie, a replay, an expired record and two login cookies are refused (89.360558ms)
✔ 8: the token request carries the PKCE verifier, and the OP refuses a wrong one (89.511481ms)
✔ 9: alg none, a changed payload under a real kid, and an unknown kid even after the refetch are refused (122.689814ms)
✔ 10: a valid token for a subject not configured is 403 with one subject-unknown line (30.706987ms)
✔ 11: start refusals: HS or none algs, reserved names, HS-only discovery, an empty JWKS, no S256, an issuer mismatch, a short RSA key (260.021698ms)
✔ 11: slot files: a symlink, mode 0644, mode 0640 and a file under the repository are refused, and no message holds the value (2.066508ms)
✔ 11: the CLI refuses --sso with the old flags and without console.sso, and starts with a good one (1041.934871ms)
✔ 12: under --sso the tester listener refuses each kind of sign-in, has no /auth, and startServer refuses tester with sso (72.329262ms)
✔ 13: idle and absolute expiry, logout then reuse, a cross-origin logout, and background reads that don't keep a session (61.151874ms)
✔ 13: the CSP lets the Sign out form reach the provider's end-session origin, and only under --sso (83.673402ms)
✔ 14: open redirects land on /, and a path on the Console lands there (43.000196ms)
✔ 15: a callback for A carrying B's code and iss, and a provider= query, is refused (179.356624ms)
✔ 16: a provider with RS256 and ES256 takes either, and refuses PS256 with a usable PS256 key in the JWKS (73.208932ms)
✔ 17: 33 started logins leave 32 records, and the first one's callback finds none (83.204408ms)
✔ 18: after a key rotation a sign-in works through one refetch, and the removed kid is refused (68.667369ms)
✔ 20 and 21: the store holds no raw session id, and the cookie strings are exact (52.309181ms)
✔ 22: a loopback Host is 403 on a page, a read and a write; /healthz on loopback is 200; a redirect_uri never comes from the Host (47.799698ms)
✔ 23: a provider down at start leaves the Console up and 503, and the retry makes sign-in work (220.406623ms)
✔ 19: no captured log line holds a token, code, state, nonce, verifier, client secret or session id (4.620525ms)
✔ tester Console banner exposes only instance route and name editors and saves a route as tester (775.631416ms)
✔ row 177: the tester Console chat composer is enabled and a send shows in its own thread (615.88403ms)
✔ tester-port validates range tunnel main port and requires configured bus before listening (886.511066ms)
✔ CLI tester listener binds a private Unix socket and spawns TESTER_CLI for every Console bus read (2552.468157ms)
✔ main listener refuses x-mosaic-tester before any board or bus read for every Host (18.054152ms)
✔ tester listener rejects preview binding and requires its fixed logical Host and no proxy auth header (101.487921ms)
✔ tester listener writes only instances routes and names with tester receipts and actor (118.690594ms)
✔ tester listener refuses every human-only write with no bus call (78.483618ms)
✔ tester-off and tester-required reads return HTTP 403 (81.141155ms)
✔ tester credentials routes and committed project reads keep secrets and paths bounded (151.187355ms)
✔ row 177 W1: the tester chat makes, sends to, opens and reads its own thread as tester (22.229762ms)
✔ row 177 W2: tester chat writes refuse a missing or foreign Origin, cross-site, text/plain and the proxy header with no bus call (11.497956ms)
✔ row 177 W3: the human thread through the tester chat is thread-not-owned, and bus.tester off answers tester-off (27.903135ms)
✔ row 177 W4: the main listener refuses x-mosaic-tester on chat reads and writes before the chat (1.945782ms)
✔ Row 252: the tester listener has no decision answer routes, and its config never offers them (80.149998ms)
✔ private tester HTTP serves on 0600 socket in 0700 parent and fixed origin (61.944248ms)
✔ private tester refuses symlink, unsafe parent and long path without repairs (0.861963ms)
✔ tester cleanup must leave a replacement inode untouched (1.465444ms)
✔ pinned source keeps all original files and Princeton license bytes (36.50702ms)
✔ two complete conversions match shipped bytes and pinned counts (4310.208292ms)
✔ changed source, missing license, changed provenance and extra files refuse before output (64.379074ms)
✔ data parser refuses malformed words, offsets, pointers, verb frames and trailing fields (0.3536ms)
✔ index parser refuses wrong counts, nonexistent senses and incorrect lemma mapping (0.261971ms)
✔ offline importer refuses incorrect archive bytes before extraction (0.385742ms)
✔ verified pinned ZIP round-trips to all original text files (456.953703ms)
✔ row278 browser lists held claims and release preserves role rows and totals (624.706447ms)
✔ row278 browser claims 403 stays local and role section remains byte-equal (631.071998ms)
✔ row278 browser renders only four escaped claim fields and never instance or other extras (576.777382ms)
✔ row278 browser sign-out removes claims and prevents reuse of cached answers (640.568833ms)
✔ row278 tester browser keeps role rows without requesting the owner claims section (467.05576ms)
✔ row278 browser discards a late claims answer after sign-out (614.541457ms)
✔ row278 HTTP read returns held claims without send and refuses arguments before the bus (29.289475ms)
✔ row278 HTTP read preserves bus refusal and rejects a malformed result (8.116407ms)
✔ row278 tester socket refuses thread claims explicitly with zero bus calls (4.484986ms)
✔ row278 Console adapter calls argument-free thread.claims through the normal transport (124.206412ms)
✔ 193d HTTP shares use the caller, plain/shared lists, exact args and write fences (75.202228ms)
✔ 193d config supplies only the signed-in user live collaborator scopes and updates on downgrade (34.238825ms)
✔ 193d viewer UI has no composer, resume, share, session mutations or create controls (516.480948ms)
✔ 193d mixed grants keep viewer project read-only and collaborator own thread writable; downgrade hides controls (634.31794ms)
✔ 193d owner has share controls on own threads and shared threads remain read-only (407.707207ms)
✔ 193d bypassed UI checks still reach a refusing bus for every viewer write (481.425536ms)
✔ 193d collaborator shares stay read-only and never expose reshare or wake controls (476.049259ms)
✔ REQ-LIMIT-4 Settings shows all token kinds and unknown turns beside every total, as a read-only separate section (568.273975ms)
✔ REQ-WEB-1 usage read keeps unknown counts and each token kind; no query or write is accepted (28.001462ms)
✔ REQ-WEB-1 malformed usage is refused instead of shown as zero (5.810443ms)
✔ R6-N1 with the userRoute gate open, a user session reaches no owner option over HTTP (121.924867ms)
✔ Queue, Business and Settings in their five states, with no move button (3101.488368ms)
✔ seeded secrets, Discord ids and paths reach no response and no page; business refusals in the module's words (1089.111187ms)
✔ the server log names no config path when the system config refuses (317.48495ms)
ℹ tests 425
ℹ suites 0
ℹ pass 425
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 277018.268665
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,2 @@
2026-10-25T07:47:01Z
02:47:01 up 11 days, 18:06, 2 users, load average: 13.77, 14.23, 20.51
@@ -0,0 +1,2 @@
2026-10-25T07:46:54Z
02:46:54 up 11 days, 18:06, 2 users, load average: 13.49, 14.18, 20.53
@@ -0,0 +1,20 @@
P4 offline upgrade version=8.0.42 nice=16
P4 diagnostic {"stage":"binary-start","nodePriority":16,"childPriority":16,"lastClientErrorCode":null,"nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"management-ready","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"store-open","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"broker-bound","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"initial-accounts","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 empty-provider diagnostic {"httpStatus":404,"type":"object","isArray":true,"count":0}
proxy.accounts initial empty; GET /credentials + GET /config/api-keys/claude
proxy.login.start claude GET /oauth/auth-url; fields=url,state only
proxy.login.submit POST /oauth/callback; fake code never ok; GET /oauth/status=wait
proxy.login.cancel DELETE /oauth/session confirmed
proxy.login.start codex GET /oauth/auth-url; fields=url,state only
proxy.login.submit POST /oauth/callback; fake code never ok; GET /oauth/status=wait
proxy.login.cancel DELETE /oauth/session confirmed
proxy.apikey.add PUT /config/api-keys/claude; account fields=accountId,provider,displayName,status,priority; id from auth_index
proxy.priority.set API-key PUT /config/api-keys/claude; priority read-back=7
proxy.keys GET /config/access/api-keys; fields=keyId,management,agent,issuedAt,state; sentinel labelled; values absent
proxy.priority.set OAuth PATCH /credentials/fields body={name,priority}; priority read-back=8
PASS offline native-page bus contract and secret-free receipts
P4 diagnostic {"stage":"initial-accounts","nodePriority":16,"childPriority":null,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":null,"childExitCode":0,"childSignal":null}
@@ -0,0 +1,19 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/ICE0YV
✔ accounts have exactly the allowlisted public fields, id from credential identifier (28.859027ms)
✔ token-like data in every upstream field never reaches public accounts (5.070752ms)
✔ API key account is derived from proxy auth_index, never api-key, and can set priority (12.225188ms)
✔ OAuth priority uses top-level name/priority and confirms it through list (4.580885ms)
✔ priority-unconfirmed: accepted API-key write with unchanged read-back refuses (5.588673ms)
✔ priority-write-refused: OAuth PATCH status 201 (3.491938ms)
✔ priority-write-refused: OAuth PATCH status 400 (4.410853ms)
✔ priority-invalid: unknown account refuses before any write (2.983779ms)
✔ proxy-down: a closed management listener refuses once (1.996951ms)
✔ client keys return ids, sentinel/foreign labels and only scoped record metadata (3.672515ms)
ℹ tests 10
ℹ suites 0
ℹ pass 10
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 183.915712
@@ -0,0 +1,2 @@
2026-10-25T07:46:24Z
02:46:24 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,2 @@
2026-10-25T07:46:24Z
02:46:24 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,12 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/WlQ8bY
✔ fresh404 yields no accounts, then adds the first key once with no value leakage (32.08173ms)
✔ malformed200 null remains proxy-down, no retry or write (7.8998ms)
✔ malformed200 object remains proxy-down, no retry or write (3.878116ms)
ℹ tests 3
ℹ suites 0
ℹ pass 3
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 147.324337
@@ -0,0 +1,2 @@
2026-10-25T07:46:23Z
02:46:23 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,2 @@
2026-10-25T07:46:22Z
02:46:22 up 11 days, 18:06, 2 users, load average: 13.76, 14.37, 20.83
@@ -0,0 +1,26 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/zFmWGh
✔ proxy.login.start: provider-not-allowed (32.675653ms)
✔ proxy.apikey.add: provider-not-allowed (0.468026ms)
✔ apikey-invalid empty (0.345583ms)
✔ apikey-invalid too long (0.330348ms)
✔ apikey-invalid charset (0.281139ms)
✔ callback-url-invalid not URL (1.581908ms)
✔ callback-url-invalid oversize (0.382376ms)
✔ callback-url-invalid repeated state (0.344928ms)
✔ login-state-unknown callback never reaches proxy (0.456109ms)
✔ login state is scoped to the human and business (0.514738ms)
✔ accepted callback wait is pending; only a status ok completes and retires state (0.915716ms)
✔ expiry reports login-timeout once with no management call and retires state (0.306001ms)
✔ cancel calls DELETE and retires state (0.39506ms)
✔ upstream OAuth error body never crosses bus response (0.266204ms)
✔ priority-invalid {"accountId":"bad","priority":1} (0.216492ms)
✔ priority-invalid {"accountId":"aaaaaaaaaaaa","priority":1.5} (0.206751ms)
✔ priority-invalid {"accountId":"aaaaaaaaaaaa","priority":1001} (0.245944ms)
ℹ tests 17
ℹ suites 0
ℹ pass 17
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 107.671923
@@ -0,0 +1,2 @@
2026-10-25T07:46:24Z
02:46:24 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,2 @@
2026-10-25T07:46:24Z
02:46:24 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,50 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/WXpqyV
✔ proxy.accounts: owner calls page once with business/human scope (26.116796ms)
✔ proxy.accounts: tester human-required (20.297319ms)
✔ proxy.accounts: agent human-required (16.822485ms)
✔ proxy.accounts: user human-required (17.662186ms)
✔ proxy.accounts: not-configured (23.121015ms)
✔ proxy.login.start: owner calls page once with business/human scope (17.138825ms)
✔ proxy.login.start: tester human-required (17.581147ms)
✔ proxy.login.start: agent human-required (20.879742ms)
✔ proxy.login.start: user human-required (24.234711ms)
✔ proxy.login.start: not-configured (19.75879ms)
✔ proxy.login.submit: owner calls page once with business/human scope (22.157242ms)
✔ proxy.login.submit: tester human-required (25.380596ms)
✔ proxy.login.submit: agent human-required (21.217295ms)
✔ proxy.login.submit: user human-required (23.521967ms)
✔ proxy.login.submit: not-configured (24.585017ms)
✔ proxy.login.status: owner calls page once with business/human scope (22.913517ms)
✔ proxy.login.status: tester human-required (21.7594ms)
✔ proxy.login.status: agent human-required (28.198167ms)
✔ proxy.login.status: user human-required (18.344285ms)
✔ proxy.login.status: not-configured (20.030294ms)
✔ proxy.login.cancel: owner calls page once with business/human scope (16.420549ms)
✔ proxy.login.cancel: tester human-required (20.486195ms)
✔ proxy.login.cancel: agent human-required (17.871874ms)
✔ proxy.login.cancel: user human-required (20.801042ms)
✔ proxy.login.cancel: not-configured (24.049445ms)
✔ proxy.apikey.add: owner calls page once with business/human scope (20.743633ms)
✔ proxy.apikey.add: tester human-required (20.590224ms)
✔ proxy.apikey.add: agent human-required (20.621701ms)
✔ proxy.apikey.add: user human-required (23.304327ms)
✔ proxy.apikey.add: not-configured (26.176447ms)
✔ proxy.priority.set: owner calls page once with business/human scope (18.750335ms)
✔ proxy.priority.set: tester human-required (19.039252ms)
✔ proxy.priority.set: agent human-required (18.745218ms)
✔ proxy.priority.set: user human-required (17.214992ms)
✔ proxy.priority.set: not-configured (17.152828ms)
✔ proxy.keys: owner calls page once with business/human scope (18.060003ms)
✔ proxy.keys: tester human-required (17.424731ms)
✔ proxy.keys: agent human-required (14.943668ms)
✔ proxy.keys: user human-required (16.025103ms)
✔ proxy.keys: not-configured (16.373436ms)
✔ API-key canary never enters broker events or unknown error output (15.813479ms)
ℹ tests 41
ℹ suites 0
ℹ pass 41
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 994.095736
@@ -0,0 +1,2 @@
2026-10-25T07:46:24Z
02:46:24 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,2 @@
2026-10-25T07:46:23Z
02:46:23 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,17 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/qBvaqm
✔ empty provider GET404 yields empty array, discards body and receipts actual404 once (23.337829ms)
✔ provider GET401 remains proxy-client-refused, no retry (5.03975ms)
✔ provider GET403 remains proxy-client-refused, no retry (2.874184ms)
✔ provider GET500 remains proxy-client-refused, no retry (2.839998ms)
✔ getCredentials404 remains proxy-client-refused, no retry (3.031846ms)
✔ getKeys404 remains proxy-client-refused, no retry (2.739596ms)
✔ provider PUT404 remains proxy-client-refused, never treated as empty GET (1.681292ms)
✔ provider GET200 array passes through, with receipt and no retry (1.893456ms)
ℹ tests 8
ℹ suites 0
ℹ pass 8
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 148.993332
@@ -0,0 +1,2 @@
2026-10-25T07:46:22Z
02:46:22 up 11 days, 18:06, 2 users, load average: 13.76, 14.37, 20.83
@@ -0,0 +1,2 @@
2026-10-25T07:46:22Z
02:46:22 up 11 days, 18:06, 2 users, load average: 13.76, 14.37, 20.83
@@ -0,0 +1,12 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/NaZhtr
✔ OAuth management calls keep URL and state out of receipts (25.417454ms)
✔ upstream key goes only in request body and upstream refusal body is discarded (5.332331ms)
✔ redirected management calls are not followed or retried (2.562305ms)
ℹ tests 3
ℹ suites 0
ℹ pass 3
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 139.356091
@@ -0,0 +1,2 @@
2026-10-25T07:46:23Z
02:46:23 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,2 @@
2026-10-25T07:46:23Z
02:46:23 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,10 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/UVkG6Q
✔ Console production module graph cannot import the model-proxy client (93.862563ms)
ℹ tests 1
ℹ suites 0
ℹ pass 1
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 177.142216
@@ -0,0 +1,2 @@
2026-10-25T07:46:30Z
02:46:30 up 11 days, 18:06, 2 users, load average: 12.40, 14.06, 20.66
@@ -0,0 +1,2 @@
2026-10-25T07:46:29Z
02:46:29 up 11 days, 18:06, 2 users, load average: 12.40, 14.06, 20.66
@@ -0,0 +1,12 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/HkzUFL
✔ proxy browser clears write-only key immediately, sends once and renders data as text (923.252097ms)
✔ proxy browser OAuth opens safely, callback wait stays pending, status ok completes (2763.533016ms)
✔ proxy browser read-only disables account changes (662.846864ms)
ℹ tests 3
ℹ suites 0
ℹ pass 3
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 4447.991189
@@ -0,0 +1,2 @@
2026-10-25T07:46:29Z
02:46:29 up 11 days, 18:06, 2 users, load average: 12.40, 14.06, 20.66
@@ -0,0 +1,2 @@
2026-10-25T07:46:25Z
02:46:25 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,11 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/MVzxL3
✔ API-key canary reaches fake once and zero responses/logs/receipts/store files (49.859682ms)
✔ OAuth URLs, state and code stay out of broker records and management receipts (21.222227ms)
ℹ tests 2
ℹ suites 0
ℹ pass 2
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 266.31653
@@ -0,0 +1,2 @@
2026-10-25T07:46:25Z
02:46:25 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,2 @@
2026-10-25T07:46:25Z
02:46:25 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,20 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/pooz0I
✔ owner proxy routes each make exactly one allowlisted call (30.857128ms)
✔ proxy write refuses signed-out (3.336504ms)
✔ proxy write refuses loopback (2.704228ms)
✔ proxy write refuses cross-origin (1.698264ms)
✔ proxy write refuses missing Fetch Metadata (1.705732ms)
✔ all proxy writes are read-only without --send (4.69854ms)
✔ granted user never reaches owner page or any proxy route (7.577808ms)
✔ native page offers write-only key input and no panel script (2.379451ms)
✔ Console caller rejects every non-proxy verb (1.337229ms)
✔ tester socket refuses proxy page, reads and writes before any owner call (8.577124ms)
✔ malformed API-key JSON never appears in errors or logs (1.827938ms)
ℹ tests 11
ℹ suites 0
ℹ pass 11
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 255.783124
@@ -0,0 +1,2 @@
2026-10-25T07:46:25Z
02:46:25 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,2 @@
2026-10-25T07:46:24Z
02:46:24 up 11 days, 18:06, 2 users, load average: 13.22, 14.25, 20.76
@@ -0,0 +1,10 @@
packages/model-proxy/tests/empty-provider.test.mjs
packages/bus/tests/proxy-page-empty-provider.test.mjs
packages/model-proxy/tests/page-client.test.mjs
packages/bus/tests/proxy-page.test.mjs
packages/bus/tests/proxy-page-state.test.mjs
packages/bus/tests/proxy-page-accounts.test.mjs
packages/webui/tests/proxy-page.test.mjs
packages/webui/tests/proxy-canary.test.mjs
packages/webui/tests/proxy-browser.test.mjs
packages/webui/tests/proxy-architecture.test.mjs
@@ -0,0 +1,2 @@
2026-10-25T07:47:52Z
02:47:52 up 11 days, 18:07, 2 users, load average: 9.43, 13.06, 19.79
@@ -0,0 +1,2 @@
2026-10-25T07:47:50Z
02:47:50 up 11 days, 18:07, 2 users, load average: 9.43, 13.06, 19.79
@@ -0,0 +1,8 @@
{"mutant":"accounts-unfiltered-field","test":"packages/bus/tests/proxy-page-accounts.test.mjs","exit":1,"nice":19,"failures":2,"passes":8,"failingTests":["accounts have exactly the allowlisted public fields, id from credential identifier","token-like data in every upstream field never reaches public accounts"],"killed":true,"restored":true,"originalSha256":"14acdb4d3fdaabad508eec7378740b13c175d4bdd0c6e707a673138eff82365b"}
{"mutant":"accounts-unfiltered-field","positiveControl":true,"test":"packages/bus/tests/proxy-page-accounts.test.mjs","exit":0,"nice":19,"failures":0,"passes":10,"failingTests":[],"positive":true}
{"mutant":"callback-skips-state","test":"packages/bus/tests/proxy-page-state.test.mjs","exit":1,"nice":19,"failures":2,"passes":15,"failingTests":["login-state-unknown callback never reaches proxy","accepted callback wait is pending; only a status ok completes and retires state"],"killed":true,"restored":true,"originalSha256":"14acdb4d3fdaabad508eec7378740b13c175d4bdd0c6e707a673138eff82365b"}
{"mutant":"callback-skips-state","positiveControl":true,"test":"packages/bus/tests/proxy-page-state.test.mjs","exit":0,"nice":19,"failures":0,"passes":17,"failingTests":[],"positive":true}
{"mutant":"proxy-route-accepts-granted-user","test":"packages/webui/tests/proxy-page.test.mjs","exit":1,"nice":19,"failures":1,"passes":10,"failingTests":["granted user never reaches owner page or any proxy route"],"killed":true,"restored":true,"originalSha256":"7b7bee91604b7bd973027b177de83205db9aed366e694072fc6343b46465b5ba"}
{"mutant":"proxy-route-accepts-granted-user","positiveControl":true,"test":"packages/webui/tests/proxy-page.test.mjs","exit":0,"nice":19,"failures":0,"passes":11,"failingTests":[],"positive":true}
{"mutant":"apikey-logged","test":"packages/webui/tests/proxy-canary.test.mjs","exit":1,"nice":19,"failures":1,"passes":1,"failingTests":["API-key canary reaches fake once and zero responses/logs/receipts/store files"],"killed":true,"restored":true,"originalSha256":"14acdb4d3fdaabad508eec7378740b13c175d4bdd0c6e707a673138eff82365b"}
{"mutant":"apikey-logged","positiveControl":true,"test":"packages/webui/tests/proxy-canary.test.mjs","exit":0,"nice":19,"failures":0,"passes":2,"failingTests":[],"positive":true}
@@ -0,0 +1,26 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/zwP2zD
✖ fresh404 yields no accounts, then adds the first key once with no value leakage (31.629717ms)
✔ malformed200 null remains proxy-down, no retry or write (10.121658ms)
✔ malformed200 object remains proxy-down, no retry or write (5.73007ms)
ℹ tests 3
ℹ suites 0
ℹ pass 2
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 218.324391
✖ failing tests:
test at packages/bus/tests/proxy-page-empty-provider.test.mjs:7:1
✖ fresh404 yields no accounts, then adds the first key once with no value leakage (31.629717ms)
Error [ProxyError]: proxy-down
at refuse (file:///home/jwoltje/.t3/worktrees/mosaic-stack/poe-row330/packages/model-proxy/src/common.mjs:8:39)
at ProxyPage.request (file:///home/jwoltje/.t3/worktrees/mosaic-stack/poe-row330/packages/bus/src/proxy-page.mjs:80:7)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/poe-row330/packages/bus/tests/proxy-page-empty-provider.test.mjs:10:17)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
code: 'proxy-down'
}
@@ -0,0 +1,2 @@
2026-10-25T07:46:06Z
02:46:06 up 11 days, 18:05, 2 users, load average: 15.17, 14.64, 21.02
@@ -0,0 +1,2 @@
2026-10-25T07:46:06Z
02:46:06 up 11 days, 18:05, 2 users, load average: 15.17, 14.64, 21.02
@@ -0,0 +1,35 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/gJcxnP
✖ empty provider GET404 yields empty array, discards body and receipts actual404 once (30.718928ms)
✔ provider GET401 remains proxy-client-refused, no retry (8.324236ms)
✔ provider GET403 remains proxy-client-refused, no retry (2.996504ms)
✔ provider GET500 remains proxy-client-refused, no retry (2.838583ms)
✔ getCredentials404 remains proxy-client-refused, no retry (3.923009ms)
✔ getKeys404 remains proxy-client-refused, no retry (4.502681ms)
✔ provider PUT404 remains proxy-client-refused, never treated as empty GET (2.271108ms)
✔ provider GET200 array passes through, with receipt and no retry (2.585158ms)
ℹ tests 8
ℹ suites 0
ℹ pass 7
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 192.563954
✖ failing tests:
test at packages/model-proxy/tests/empty-provider.test.mjs:35:1
✖ empty provider GET404 yields empty array, discards body and receipts actual404 once (30.718928ms)
Error [ProxyError]: proxy-client-refused
at ClientRequest.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/poe-row330/packages/model-proxy/src/client.mjs:30:49)
at ClientRequest.wrapper (node:events:639:12)
at ClientRequest.emit (node:events:514:20)
at HTTPParser.parserOnIncomingClient (node:_http_client:973:27)
at HTTPParser.parserOnHeadersComplete (node:_http_common:125:17)
at Socket.socketOnData (node:_http_client:808:22)
at Socket.emit (node:events:514:20)
at addChunk (node:internal/streams/readable:575:12)
at readableAddChunkPushByteMode (node:internal/streams/readable:526:3)
at Readable.push (node:internal/streams/readable:406:5) {
code: 'proxy-client-refused'
}
@@ -0,0 +1,2 @@
2026-10-25T07:46:06Z
02:46:06 up 11 days, 18:05, 2 users, load average: 15.17, 14.64, 21.02
@@ -0,0 +1,2 @@
2026-10-25T07:46:05Z
02:46:05 up 11 days, 18:05, 2 users, load average: 15.17, 14.64, 21.02
+618
View File
@@ -0,0 +1,618 @@
# Row 330 / P4 Console proxy page — #1828
2026-10-24 Poe. Base: refactor 78b69e1e6; branch poe/row330.
## Requirements and boundaries
Replacement brief blob 4c005dc4936c, heading line 17. At 78b69e1e6 the
0ce22dde6 line references remain unchanged: verbs 27–36; accounts 37–44;
OAuth 45–61; upstream API keys 62–74; priority 75–78; client keys 79–83;
usage 84–85; Console routes/page 86–98; upgrade check 99–110;
tests 112–132; order 142–143; gate and named mutants 145–150.
Rows document Rules for every row remain at line 12.
No live proxy/config/credential access. No host proxy calls. Work uses its own
node_modules. No tests until Sage CLEAR; run list derived from imports before
whole-file runs. P2 must land and be rebased before gate; P4 lands after P2.
Gladstone first review; Filbert landing review. No refactor push authority.
## Proposed implementation contract
Verbs: proxy.accounts, proxy.login.start, proxy.login.submit,
proxy.login.status, proxy.login.cancel, proxy.apikey.add,
proxy.priority.set, proxy.keys. The broker checks human transport before
configuration, including granted users (human-required). Missing proxy:
not-configured. Management connection failure: proxy-down, no retry.
Accounts return only accountId, provider, displayName, status, priority.
accountId hashes the proxy credential identifier (12 hex SHA256), never a token.
Provider/status values must be constrained and names must be derived from safe
metadata; arbitrary credential field values must not be reflected. Exact pinned
8.0.42 endpoint/field mapping still to be confirmed on the offline stand-in.
Login sessions live in bus memory, scoped to the owning business/human, with
300-second default expiry. A pasted URL is bounded, parsed and matched to a
pending state started by this bus. Finished/expired/unknown state refuses
login-state-unknown; malformed URL refuses callback-url-invalid. Only status ok
finishes sign-in; callback acceptance/wait never does. No URLs, states or codes
in logs/receipts/errors. Start allows claude/codex only; API-key add allows z.ai
only. API keys are write-only printable ASCII, bounded, never echoed.
Owner-only /proxy page; /api/proxy/accounts and /api/proxy/keys reads;
/api/proxy/login/start, /submit, /status, /cancel; /api/proxy/apikey/add;
/api/proxy/priority/set. Each maps to exactly one allowlisted bus call.
Writes require named host, owner sign-in, own Origin, same-origin Fetch Metadata
and --send. Tester, granted user and loopback refuse. Console holds no client,
proxy settings or management key. Usage placeholder accepts P5's later view;
P4 creates no usage source.
## Test plan (not yet run)
Management client: pinned endpoint/method/body contract, loopback-only auth,
redirect refusal, bounded response, safe receipts, no retry.
Bus: all eight verbs against fake server; separate refusal cases for missing
config, tester/agent/granted user human-required, both provider allowlists,
unknown/expired/finished state, invalid callback URL, each API-key invalid case,
invalid priority/account id, and proxy-down. Explicit wait-is-not-ok test.
Accounts: strict allowlist, ids from identifier, toxic-field fake, API-key account
and priority round-trip. Keys: ids only, sentinel and foreign-key labels, P2 join.
Console: owner success; granted/tester/loopback/signed-out/cross-origin/missing
Fetch Metadata refusals; every write refuses without --send; caller allowlist;
no webui import of management client or proxy config access.
Canary: fake management receives API key exactly once, and all responses, logs,
receipts, errors and store files contain zero copies. OAuth secrets likewise.
Named mutants: unfiltered account field; skipped callback state check; granted
user accepted at /api/proxy/; API-key echoed by error/log.
Full model-proxy, bus, webui (MOSAIC_REQUIRE_EDITOR_BUILD=1), touched test files;
Sage landing gate all packages except queue and scripts/test-*.sh. Upgrade check
under unshare -rn on PIN 8.0.42; output must land here. No runs claimed yet.
## Design clarification (Sage sage-4347)
Committed researcher/P1 artifacts may be read in this checkout. Read v8.0.27
management reference and P1 BUILD/REVIEW. P1 confirms 8.0.42 key list is an array
and OAuth redirect URLs localhost:54545/callback (Claude) and
localhost:1455/auth/callback (Codex). P1 does not record credential response
fields, z.ai upstream config schema or credentials/fields PATCH payload.
Those remain unconfirmed, not guessed as a pinned contract.
Expiry behavior: status for an expired pending state returns
{status:"error", reason:"login-timeout"}, deletes the state and makes no proxy
call. It is not signed in; later status/submit/cancel refuses login-state-unknown.
No code or upstream error body is returned. Timeout can be provided as a trusted
host setting, default300s; no page/agent verb may widen it.
Setup: npm ci --ignore-scripts --no-audit --no-fund completed in worktree root
(128 packages) and packages/webui (2 packages), both launched at nice19 with
fresh shell-created short TMPDIR. No canonical npm or node_modules links.
Canonical queue next completed with view-unknown warning; move returned
ok poe-330-start rev4077 row330 briefed→in-progress. No repair performed.
## Pre-run list (no execution)
Static esbuild import parsing of the initial RED entrypoints (no tests executed)
produced red-import-graph.json and red-run-list.txt. Whole-file list:
packages/model-proxy/tests/page-client.test.mjs;
packages/bus/tests/proxy-page.test.mjs;
packages/bus/tests/proxy-page-state.test.mjs;
packages/webui/tests/proxy-page.test.mjs.
The new state test's dynamic URL import points at the not-yet-implemented
packages/bus/src/proxy-page.mjs; expected first RED is missing implementation.
No case1-accept file is selected. Probe.sh is also slot work, on a random
loopback port inside unshare-rn, using only the verified own fixture executable.
No test or binary probe has run yet. The three open pinned contracts remain
probe-pending. Priority tests currently choose integer range -1000..1000.
Sage sage-4352 authorizes P1 fetch into this fresh fixture. Fetch succeeded at
nice19, verified archive, executable and panel hashes against PIN8.0.42, and
installed only under /mnt/storage/scratch/tmp/76TDtz/download/opt/cliproxyapi/8.0.42.
Receipt fetch.txt contains paths only. No host executable was used or inspected.
2026-10-24T04:04Z: node --check on all four new test files and probe.mjs,
bash -n probe.sh, and git diff --check passed. Syntax checks only: no test
module or pinned executable ran. No production implementation changed yet;
RED-first requirement and Sage CLEAR slot gate remain in force. Canonical
queue start is complete; waiting for the authorized test slot, not a Jason
decision. No commit or push made.
## First RED and pinned contract probe (sage-4391 CLEAR)
2026-10-24T04:24Z. Four whole files ran serially, absolute paths, a fresh
shell-created short TMPDIR per run, nice19 recorded in each receipt. No old
test file ran and no test was rerun. All four exited1 as expected:
- page-client: 0pass/3fail. OAuth receipt test fails because oauthStart is
undefined; upstream refusal/canary test because putUpstreamGroups is undefined;
redirect test because getCredentials is undefined. Receipt red-page-client.txt.
- broker proxy-page: 0pass/41fail. For each of the eight verbs, the owner gets
unknown-verb instead of a page response, tester gets tester-refused instead of
human-required, agent gets unknown-verb instead of human-required, granted user
gets access-refused instead of human-required, and missing configuration gets
unknown-verb instead of not-configured. Canary error test gets unknown-verb
instead of proxy-down. All are the missing P4 dispatch boundary, not a fixture
setup failure. Receipt red-broker.txt enumerates every failing test.
- proxy-page-state: 0pass/17fail. Every named provider/key/callback/state/expiry/
cancellation/priority case fails ERR_MODULE_NOT_FOUND for the not-yet-created
packages/bus/src/proxy-page.mjs. Receipt red-state.txt enumerates each case.
- webui proxy-page: 6pass/3fail. Owner routes return404; native page returns404;
Console caller proxyCall is undefined. Signed-out, loopback, cross-origin,
absent Fetch Metadata, no-send and granted-user boundary cases pass through
existing general refusals. Receipt red-webui.txt.
probe.sh exited0 under unshare-rn, random loopback port, own config and made-up
short key, verified PIN8.0.42 binary, nice19. Child exited and namespace closed.
No host proxy or real instance state was used. probe.txt is shape-only output:
- GET /credentials:200 {files:[], observed_at:string}.
- GET /oauth/auth-url?provider=claude and provider=codex:200 with url/state/status
strings. DELETE /oauth/session?state=[redacted]:200 cancelled/status.
- PUT /config/api-keys/claude with
[{name,base-url,priority,keys:[{api-key}]}]:200 status/config-version.
Used z.ai's Claude-compatible endpoint; no request reached that endpoint.
- GET /config/api-keys/claude: array of groups, name/base-url/priority; keys
include api-key and a proxy-generated auth_index. Values were not printed.
- GET /credentials after API-key add remains files:[]: API-key credentials are
not listed here. Accounts must join the provider config's safe metadata.
- The script's priority PATCH branch required a credential row; no row existed,
so it did NOT run. Credentials field payload and populated OAuth response fields
remain unconfirmed. Reported rather than treating rc0 as full contract proof.
Slot returned to Sage after this report. GREEN, mutants and further binary probes
require separate CLEAR. No implementation run, commit or push claimed.
## Probe 2 observed contract (sage-4394 CLEAR)
2026-10-24T04:25Z. probe2.sh exited0 under unshare-rn, own random loopback
port/config/short made-up key, nice19. Fixture child exited; EXIT trap removed
the entire shell-created fixture TMPDIR, including fabricated credential/config.
Only verified fetched binary outside this temporary runtime root was retained.
Receipt probe2.txt contains types/shapes only, no credential values.
POST /v8/management/credentials?name=[fixture filename] with JSON
{type,access_token,refresh_token,expired,email} returns200 {status:string}.
No multipart fallback was needed. Populated GET /credentials returns
{files:[...],observed_at:string}. Credential row fields/types:
account/string, account_type/string, auth_index/string, cooldowns/array,
created_at/string, disabled/boolean, email/string, failed/number, id/string,
label/string, modtime/string, name/string, path/string, provider/string,
quota/object, recent_requests/array, runtime_only/boolean, size/number,
source/string, status/string, status_message/string, success/number,
type/string, unavailable/boolean, updated_at/string. priority/number appears
after setting it. Fields other than the explicit public projection are dropped.
PATCH /credentials/fields observations:
- {id,priority}400; {id,fields:{priority}}400.
- {name:<OAuth id>,priority}200; {name:<OAuth name>,priority}200.
- {name:<OAuth name>,fields:{priority}}200, but200 alone does not prove it changed
priority (this may be an ignored unknown field); use top-level priority.
- {auth_index,priority}400; {auth_index,fields:{priority}}400 for both OAuth
and API-key identifiers.
- {name:<auth_index>,priority}404 for both OAuth and API key.
Final OAuth list has numeric priority and changed to one of the requested values.
API-key group priority did not change. Consequently priority uses top-level
{name,priority} for OAuth files; API-key priority must update its provider config,
not credentials/fields. A future upgrade acceptance must verify both read-backs.
Slot returned after probe2. No GREEN or mutant run authorized yet.
## Candidate implementation (not GREEN-verified)
Written after the first RED run: fixed client operations and receipts, human-only
broker dispatch before generic tester/user gates, bus-owned pending-state machine,
strict public account projection, native owner-only HTTP routes and /proxy page.
No management client/config access in the Console's new code. Reads use the owner
human transport and writes independently require --send/Origin/Fetch Metadata.
Generated display names use the constrained provider and credential-id hash,
rather than upstream label/email/group-name strings. This is a consequential
security/usability tradeoff: the toxic-all-fields fake cannot reflect a credential,
but the list identifies accounts by stable ids rather than email addresses.
P2 join remains provisional until P2 lands and this branch rebases. Current
runtime seam projects model status metadata by business and does not read key
files. New refusal tests for priority-unconfirmed (read-back mismatch) and
priority-write-refused (PATCH other than200) are written FIRST; their source fixes
await the next authorized first RED run. Provider config read-only auth_index
must not be echoed in a config write; its preservation test is also pending.
Sage sage-4394 explicitly authorizes committing/pushing incremental candidate
commits before GREEN on poe/row330; refactor landing remains gated on all green
checks and reviews. No candidate commit is a verification/completion claim.
## Prepared next slot (not run)
Sage sage-4400 accepts the two priority paths. New code-specific first-RED tests
are in proxy-page-accounts.test.mjs for priority-unconfirmed and
priority-write-refused. This file must run first, then those source fixes may
be written; no assertion is loosened. No second RED has occurred.
Focused list is eight whole files in focused-run-list.txt, generated by esbuild's
import parser (focused-import-graph.json). Additional tests exercise actual
Chromium UI behavior and the parsed Console import boundary. The canary now
intercepts process stdout/stderr during the API-key operation, as well as
structured HTTP/client logs and durable bus files. Deliberate log mutants cannot
print their made-up key. Four slot-only named mutants are prepared in mutants.mjs;
no mutant has executed. The upgrade check is prepared in acceptance.sh/mjs;
it has not run. New refusal source fixes remain pending first RED.
Broader import inventory: gate-imports.mjs statically parses package test imports,
traces paths to changed production modules, and adds all mandatory model-proxy,
bus and webui test files. Exact paths are gate-run-list.txt; summary includes
additional collateral files. case1-accept.test.mjs is explicitly excluded even
if imported, per mos-1612. No text search of fixture payloads selects a run.
Webui's eventual full gate requires editor build and MOSAIC_REQUIRE_EDITOR_BUILD=1.
These inventory commands parse source only; they do not import/execute tests.
Sage-authorized incremental candidate40dcbabcb pushed successfully to poe/row330.
No PR or review request yet, no refactor modification/push, no live change.
2026-10-24T04:42Z refactor input check requested by sage-4411:
`git diff --name-only 78b69e1e6 775bbe236` names45 paths; intersection with
focused-import-graph.json's111 parsed inputs is empty. Exact receipts:
refactor-775bbe236-paths.txt and refactor-775bbe236-input-check.json.
Correction to the shorthand report poe-330-0011: the generated broader inventory
contains280 selected files, not281. Mandatory199 (model-proxy/bus/webui), plus81
additional import dependents. case1-accept remains excluded. Preserve the exact
list, not the mistaken shorthand count. The large full graph is kept off Git;
gate-import-summary.json cites its scratch path and SHA256. A compact per-file
import witness and the reproducible parser script land instead.
Sage sage-4411 accepts first-RED account test → source fix → eight focused whole
files → offline acceptance → four mutants. No CLEAR yet: slot order is Bubba288,
Magica331 GREEN, then this block. Full gate follows P2 landing/rebase/key join.
## Focused block sage-4430 — stopped at offline acceptance failure
2026-10-25T05:39Z precheck on candidate48c7c3283:
`git diff --name-only 78b69e1e6 e1d8756b5` names47 paths; none overlaps the111
focused parsed inputs. refactor-e1d8756b5-input-check.json records the check.
First RED of proxy-page-accounts.test.mjs:6pass/4expected failures, rc1. Failed
API priority write included derived auth_index; mismatch refusal was proxy-down;
PATCH201 and400 refusals were proxy-down. Receipt red-accounts.txt.
Source fix only, no test edits: remove derived auth_index from provider config
writes; require exactly200 for priority PATCH/PUT; preserve priority-write-refused
for refused/redirected writes and priority-unconfirmed for a mismatching read-back.
Console forwards those safe refusal codes. No raw errors/keys introduced.
Eight focused whole files then passed88/88 with0skip, serialized, absolute paths,
one shell-created short TMPDIR per run. Every shell wrapper recorded nice19:
page-client3; broker41; state17; accounts10; webui HTTP11; canary2; browser3;
architecture1. Receipts green-*.txt. These are focused checks, not full suites
or landing evidence. No old test file ran and no assertion/timeout changed.
Offline acceptance.sh on the same own PIN8.0.42 fetched executable exited1.
Raw receipt upgrade-8.0.42.txt is only:
P4 offline upgrade version=8.0.42 nice=16
P4 upgrade FAILED code=acceptance-failed
This was the FIRST unexpected red. It occurred before the initial empty-accounts
checkpoint. The catch intentionally strips exception detail, so the failed
assertion/location is not known. Node reported16 despite the absolute19 shell
wrapper; no claim that the binary acceptance ran at19. The private namespace
child was stopped and the shell trap deleted its own fixture root as designed.
No host proxy, real key or real data root was involved.
Stopped immediately and reported poe-330-0014 to Sage; slot returned for
Magica331r2. No rerun, post-failure source fix, test edit or timeout change.
Four mutants were NOT RUN. Before this failure, their runner was prepared to
restore each source and run its whole-file positive control at nice19.
Next acceptance diagnosis needs Sage's ruling/CLEAR. Full suites, P2 rebase/key
join, mutants and Gladstone/Filbert reviews remain outstanding.
## Diagnostic-only preparation — sage-4432
2026-10-25T05:45Z. Prepared a separate acceptance.mjs diagnostic, with no run:
fixed stage labels binary-start, management-ready, store-open, broker-bound,
initial-accounts; observed Node/own fixture-child priorities; whitelisted last
management client failure code; child exit code/signal; sanitized catch class/code.
No exception message, actual/expected, request/response body, URL or key is printed.
A child-exit observation reads no priority once that child is known to have exited.
No priority setter was added. The shell wrapper and every assertion, retry count,
pause and timeout remain unchanged, as required to repeat the failed conditions.
Static comparison confirms assertion lines and timeout expressions unchanged;
git diff --check passes. No acceptance, test, proxy binary or mutant executed.
This is a diagnostic commit only, not a product fix. Slot remains with Sage;
next run waits for CLEAR after288 gate rerun and Magica331r2. The full focused /
acceptance / mutant block after diagnosis still requires Sage's CLEAR.
## Scheduling observation preparation — sage-4438 / mos-1675
2026-10-25T06:09Z. Slot order changed: Magica331r2, Sage's short288 diagnostic,
then this row's diagnostic; wait for Sage CLEAR. Added only numeric scheduling
policy observations from /proc/<own Node pid>/sched and the still-live fixture
child's sched file. No raw proc content, other process, scheduling setter or
host configuration access/change. Diagnostic module not executed.
Context supplied by Sage (not independently measured here): ananicy-cpp's node
rule assigns BG_CPUIO (nice16, sched idle, ioclass idle), and bash's Doc-View rule
sets nice-4. Sage reports local ASR/ffmpeg load05:41–05:50Z overlapping the failed
acceptance. These facts explain why a launch wrapper's19 is insufficient proof
of the Node process's later policy. Causation of the acceptance failure remains
unestablished until the authorized stage diagnostic. No assertion, timeout,
product code, fixture condition or priority/policy setter changed.
## One diagnostic reproduction — sage-4440 CLEAR
2026-10-25T06:14:19Z–06:14:23Z. Ran acceptance.sh exactly once on unchanged
candidatea5251007b, with no source/assertion/timeout/priority edits in the slot.
Start uptime/load:11 days16:34,2.90/5.40/9.26. End:11 days16:34,3.15/5.41/9.24.
Receipts diagnostic-start-uptime.txt, diagnostic-8.0.42.txt and
diagnostic-end-uptime.txt preserve exact output.
Reproduced rc1. Reached binary-start, management-ready, store-open, then:
{stage:store-open,errorClass:Error,code:acceptance-failed}. Did not reach
broker-bound or initial-accounts. Store-open is observed AFTER Store construction;
remaining interval includes ProxyPage/Broker construction and human binding.
No failed assertion location or root cause is claimed from the sanitized code.
Readiness succeeded. lastClientErrorCode proxy-client-down records an earlier
transient startup refusal, not a readiness failure.
Node and the live fixture child both observed nice16 and numeric scheduling
policy5 at all checkpoints. This establishes scheduling conditions, not cause.
Cleanup observed fixture child exit0 with no signal; its private temp root was
removed by the existing trap. No live proxy/key/data access occurred.
Stopped after that one run and reported poe-330-0019; SLOT BACK to Sage for288
whole-gate rerun, then Magica331r3. No focused suites, mutants or second diagnostic.
No product or diagnostic source change after this result. Receipt-only commit
follows outside the returned slot; next investigative step awaits Sage's ruling.
## Source-established fixture correction — sage-4442 option1
2026-10-25T06:16Z, source reading only, no run. Root cause: acceptance.mjs:74
(at9e94575c5) passes path.join(root,'bus') to new Store. Fixture preparation at
:24–:27 creates root/proxy/auth, root/home and config.yaml, but no root/bus.
packages/bus/src/store.mjs:163 immediately lstatSync(dataRoot), requiring an
existing directory; :166 then creates its OWN bus child. Thus this acceptance
passes a nonexistent data root and gets filesystem ENOENT before Store can open.
ENOENT was not in the diagnostic allowlist and was sanitized to acceptance-failed.
The smallest fix is new Store(root), the existing fresh fixture data root,
matching the focused fixtures. No production behavior or authority changes.
Correction to poe-330-0019 and the prior diagnostic interpretation: the
store-open observation does NOT prove successful Store construction. observe()
in the catch emits the same stage, so the observed line can be the catch's line.
The successful management-ready checkpoint remains valid; there was no later
broker-bound. Our earlier post-Store inference was wrong. Source resolves this
without another diagnostic: the missing fixture directory explains the precise
failure and its sanitized Error/code independently of scheduling/load.
Also read ProxyPage constructor validation (:27–:30), Broker business validation
(:373–:389, :558), and bindHuman (:1482–:1487). The page settings, business id/
human/authority/arbiters and the CLI/outsideAgent:true record meet those checks.
No human-boundary workaround is needed or made.
Prepared a separate single-line acceptance fixture fix, plus this append-only
explanation. No assertion, timeout, diagnostic extension, product change or
priority/policy setter. No diagnostic, acceptance, test or mutant execution;
next run waits for Sage CLEAR after the288 gate.
## Full focused block retry — sage-4446 CLEAR, stopped at initial accounts
2026-10-25T06:41Z–06:42Z on unchanged69811540c. All eight focused files ran
whole, serialized with fresh short TMPDIR and absolute nice19 wrappers;88/88
passed,0skip. Each step has UTC timestamp and uptime start/end in
block2-<test-path>.txt.start/.end, with complete test receipt block2-*.txt.
No old test file, assertion edit or timeout change.
Offline acceptance started06:42:18Z and ended06:42:22Z, uptime11days17:02,
load5.98/15.98/16.44 both endpoints. Reached management-ready, store-open,
broker-bound, then initial-accounts. Failed rc1 with code proxy-down,
errorClass Error, before the initial-empty assertion checkpoint. Thus the
previous missing Store root failure is traversed, but the native account-list
boundary now refuses. No root-cause inference or source fix yet.
Node observed nice19/policy0 through the initial-accounts entry, and nice16/
policy5 at the failure. Fixture child observed nice19/policy0 until cleanup,
then cleanexit0 with no signal. Idle scheduling is accepted under mos-1678;
these observations do not establish a scheduling cause. The remembered
proxy-client-down remains the earlier transient readiness failure.
Stopped at this FIRST unexpected red and reported poe-330-0022, SLOT BACK for
Magica331r3. No acceptance rerun, focused-file retry, product/fixture edit or
mutant execution. New receipt block2-acceptance.txt preserves sanitized output;
private fixture root removed by the existing trap. Receipt-only commit follows;
next step requires Sage's ruling/CLEAR. Full gate/P2 join/reviews still pending.
## Empty-provider source reading and diagnostic — sage-4448/4451/4452
2026-10-25T06:47Z, no run. Available committed upstream reference is8.0.27,
not a pinned8.0.42 implementation source. management-api-v8.0.27.md:25–27 says
GET does not add omitted runtime defaults; it does not specify the HTTP status
or body shape for a missing provider group. P1 and our previous probes measured
provider GET only after adding a group. Baseline-empty shape remains unproven.
page-client.test.mjs:7–14 defaults to200/{status:ok}, but no case calls
getUpstreamGroups. The actual accounts fake proxy-page-fixture.mjs:7,:18–19
returns200/[] for no groups. If the real binary returns another valid shape,
client.mjs/proxy-page.mjs has a product contract finding, not a fixture bug.
Reported to Sage before making this diagnostic; no product fix is assumed.
Prepared a separate diagnostic-only change: immediately before initial account
assertion, call client.getUpstreamGroups once directly and print only HTTP
status, type, array flag and count (array length or object top-level key count).
Per narrower sage-4452/mos-1683 it prints NO key names and NO values. Null is
reported as type null/count0; no response body is printed. On client error only
a fixed allowlisted client code is printed, never a raw error/message/body.
Status comes from the existing safe management receipt, not another request.
No assertions, timeouts, retries, scheduling settings, product source or test
fixtures changed. No module/test/binary/diagnostic executed. Wait for Sage's
review and CLEAR after the288 processing diagnostic before one acceptance run.
2026-10-25T06:49Z sage-4454 review addition: diagnostic error output now includes
httpStatus from the same existing receipt written by ManagementClient finally,
using the identical receipt-count guard as success. No new request or raw
exception data; this distinguishes404 from5xx without names or values. Separate
one-line diagnostic commit, no module/test/binary execution. Hold for CLEAR after
Sage's288 processing pair; no independent load-based run decision.
## Empty-provider diagnostic result — sage-4458 CLEAR
2026-10-25T07:32:25Z–07:32:30Z, exactly one acceptance diagnostic on unchanged
f2986b9ea. Start load52.34/45.27/29.51; end51.91/45.30/29.60. Reached the target
under this unusually high load; Node and fixture child nice16/policy5. Allowed
empty-provider output: {httpStatus:404,code:proxy-client-refused}. No response
body or key names/values were parsed/printed on that error path. Management
readiness succeeded; broker binding succeeded; subsequent proxy.accounts refused
proxy-down at initial-accounts. Fixture child cleanup exit0, no signal.
This proves the product's fresh-provider contract mismatch: same pinned8.0.42
route returns404 before any Claude provider group is configured, while earlier
probe/probe2 receipts prove200/array after a group is added. Our accounts fake
returns200/[] before configuration. This is not another acceptance fixture bug.
Stopped, reported poe-330-0027 and returned SLOT BACK for Magica331r4. No retry,
focused file, mutant, scheduling change, product/test/assertion/timeout edit.
Receipts empty-provider-diagnostic.txt and .start/.end preserve the single run.
## Proposed product diff — NOT APPLIED, review before edits
proposed-empty-provider.patch gives the exact proposed source change: in the
management client's fixed page operation, normalize404 to[] ONLY for
GET /v8/management/config/api-keys/claude. Keep the actual404 receipt. Every other
endpoint, method and status keeps existing errors; no broad error-to-empty fall
back. The page then renders no accounts and can add the first z.ai group.
This introduces no new refusal code or public schema/policy change.
Proposed verification, awaiting Sage: write a new client RED test for this exact
404 normalization before applying the patch; prove credentials/key-list404 and
provider401/403/500 remain proxy-client-refused without retry; prove200/array
passes through. Add account-level cases for fresh404 -> empty accounts -> first
key add, with no key in responses/receipts; malformed200 null/object still
refuses proxy-down. Existing assertion strength stays intact. Update the
stand-in's empty-route option only to model the observed contract; no fake can
silently turn unknown failures into empty data. Run lists/CLEAR precede tests.
No product or test changed in this receipt/proposal commit. Proposed patch is
review material, not a fix claim or a substitute for RED/GREEN/upgrade evidence.
## Regression preparation — sage-4460, no Node execution
2026-10-25T07:38Z. Authored11 cases in two new whole test files:
packages/model-proxy/tests/empty-provider.test.mjs (8): exact fixed GET404 ->[],
actual404 receipt/discarded canary body/one request; credentials404 and key-list404
remain proxy-client-refused; provider401/403/500 remain proxy-client-refused;
providerPUT404 remains proxy-client-refused (exercises GET-only guard);200 array
passes through. Every case pins exactly one call and status receipt, no retry,
no response-body/management-key leakage into receipts or error output.
packages/bus/tests/proxy-page-empty-provider.test.mjs (3): fresh404 empty account
list followed by one first-key PUT and a public safe account; malformed200 null
and object each refuse existing proxy-down with no write/retry.
Stand-in addition only: optional emptyProviderResponse controls the empty-route
status/body for these new cases. Existing fake baseline and every old assertion
and timeout remain unchanged. Imports are declared directly to ManagementClient
and the existing management fixture (which imports ProxyPage/client). Static
single-line import declarations are recorded in empty-provider-prepared-imports
and rooted in the prior esbuild graph; no fixture-text search selects tests.
Exact initial RED list: empty-provider-red-run-list.txt. Prepared source/test/patch
hashes: empty-provider-prepared-MANIFEST.sha256. Product files remain unmodified;
proposed-empty-provider.patch is still NOT APPLIED.
Expected first RED: new exact404 client case rejects proxy-client-refused instead
of returning[]; new fresh account case rejects proxy-down before add. No new
refusal code; all negative cases preserve existing named refusals. Observe this
RED under the next CLEAR before applying the approved scoped source patch.
Required later GREEN should include both new whole files and the8 focused whole
files because the helper is shared; full gate and P2 key-join still wait their
separate authorized stage. No Node syntax check, test, acceptance, mutant or
proxy process ran during preparation. Slot remains with Magica331r4.
## Test-first404 block — sage-4469 CLEAR
2026-10-25T07:46Z–07:47Z. On prepared e7438743f, unchanged product RED was
exactly the two intended failures: model-proxy empty-provider8cases7pass/1fail
(proxy-client-refused rather than[]), bus empty-provider3cases2pass/1fail
(proxy-down on fresh accounts). Negative controls all passed; no skipped,
cancelled or timed-out case. Receipts404-red-*.txt plus per-file uptime.start/.end.
Applied ONLY the approved proposed-empty-provider.patch: three lines in the
client's #page catch normalize404 only for the fixed GET provider-config path.
Actual404 receipt remains; error body was discarded by #request. No assertion,
timeout, scheduling, public schema, other product file or refusal code changed.
GREEN: both new files and the existing8focused files whole, serialized,99/99
passes,0skip/cancel. Fresh short TMPDIR per file; shell wrappers requested and
recorded nice19. No automatic retry. Receipts404-green-*.txt and each file's
UTC/uptime start/end. Idle scheduling is accepted under mos-1678/sage-4446.
Pinned8.0.42 acceptance rc0,07:46:54Z–07:47:01Z. Load13.49/14.18/20.53 ->
13.77/14.23/20.51. Node and its fixture child observed nice16/policy5. Exact
safe output is copied below from404-acceptance.txt; private namespace/temp-root
cleanup completed with childexit0. No real provider credential or external
upstream request; the made-up OAuth codes never complete sign-in.
P4 offline upgrade version=8.0.42 nice=16
P4 diagnostic {"stage":"binary-start","nodePriority":16,"childPriority":16,"lastClientErrorCode":null,"nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"management-ready","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"store-open","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"broker-bound","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"initial-accounts","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 empty-provider diagnostic {"httpStatus":404,"type":"object","isArray":true,"count":0}
proxy.accounts initial empty; GET /credentials + GET /config/api-keys/claude
proxy.login.start claude GET /oauth/auth-url; fields=url,state only
proxy.login.submit POST /oauth/callback; fake code never ok; GET /oauth/status=wait
proxy.login.cancel DELETE /oauth/session confirmed
proxy.login.start codex GET /oauth/auth-url; fields=url,state only
proxy.login.submit POST /oauth/callback; fake code never ok; GET /oauth/status=wait
proxy.login.cancel DELETE /oauth/session confirmed
proxy.apikey.add PUT /config/api-keys/claude; account fields=accountId,provider,displayName,status,priority; id from auth_index
proxy.priority.set API-key PUT /config/api-keys/claude; priority read-back=7
proxy.keys GET /config/access/api-keys; fields=keyId,management,agent,issuedAt,state; sentinel labelled; values absent
proxy.priority.set OAuth PATCH /credentials/fields body={name,priority}; priority read-back=8
PASS offline native-page bus contract and secret-free receipts
P4 diagnostic {"stage":"initial-accounts","nodePriority":16,"childPriority":null,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":null,"childExitCode":0,"childSignal":null}
Named mutants rc0 overall,07:47:50Z–07:47:52Z, load9.43/13.06/19.79 at both
endpoints. Each mutated whole file ran once, was restored byte-for-byte, then
its restored positive control ran once before the next mutant:
- accounts-unfiltered-field:2fail, restored control10pass;
- callback-skips-state:2fail, restored control17pass;
- proxy-route-accepts-granted-user:1fail, restored control11pass;
- apikey-logged:1fail, restored control2pass.
Runner records nice19 launch observations and original source SHA256s. All4
killed, all4 restored, all4 controls green. No raw mutant output/key values
were written; canary captures process output. Receipt404-mutants.txt/.start/.end.
SLOT BACK reported to Sage as poe-330-0030. No unexpected result in this block,
no retry, no old assertion or timeout edits, no protected action. This is scoped
99-test/upgrade/mutant evidence, NOT the full package/global landing gate. P2
landing/rebase/key-record join and Q246 independent review remain outstanding.
Final product/test diff and manifest prepared for independent review; no landing
or refactor push authorized. No further test/process run after returning slot.
2026-10-25T07:56Z sage-4473 verified Gladstone exact thread
433058fc-9cea-46e3-8554-6ddefb312762 (roster433058fc). Direct planned-seat
read-only first Codex review handoff delivered as poe-330-0032 for frozen
candidateb47ee2c0ef6580175e8fdd617878c4644861350e. Full24path diff, exact3line404
regression,74hashmanifest, scoped99/acceptance/mutant receipts, and P2/globalgate
limitations included. Explicitly no duplicate test/proxy run, private/live
worktree/transcript access or landing claim. Sage copied as poe-330-0033.
This is not a delegated child review round. Filbert landing review and required
fresh Claude guard/security review remain separate/pending. No new run or
product/test change. Frozen review source/manifest unchanged by this log append.
## First independent Codex review — Gladstone gladstone-0028
2026-10-25T07:57:51Z verdict received for frozen
b47ee2c0ef6580175e8fdd617878c4644861350e versus78b69e1e6: scoped PASS, no blocking
findings in the full24path product/test/docs diff. Reviewer independently
verified74/74 hashes from committed blobs and packet diff equality to actual
git diff; reviewed brief/design/gates and supplied99/upgrade/mutant receipts.
No reviewer test, acceptance, mutant, proxy/provider execution, live credential
access or repository writes. Queue next refused the linked worktree; reviewer
did not work around it or claim queue/global readiness. Sage already received
the detailed verdict under gladstone-0028.
Owner static check: package diff b47ee2c0e..current HEAD is empty; only tracking
notes have advanced. No finding requires a product change, and no new run is
launched. This first read-only Codex PASS does NOT waive P2 rebase/key-record
join (runtime projection still provisional), required whole package/editor/
collateral/global gate checks, Filbert landing review, or required fresh Claude
guard/security review. Those remain distinct and pending. No landing authority.
+49
View File
@@ -0,0 +1,49 @@
# Row330 / P4 review packet — #1828
Owner Poe; first independent Codex review Gladstone; landing review Filbert.
Brief docs/plans/2026-10-24_proxy-page-brief.md (heading17, blob4c005dc4936c).
Original base78b69e1e6. Candidate branch poe/row330. No landing authority.
## Review scope and evidence
review-product-test.diff is the complete changed packages/ source/test/docs diff
from78b69e1e6. review-404-normalization.diff is the exact latest three-line product
fix against prepared e7438743f; its tests/helper were committed first there.
review-MANIFEST.sha256 pins every changed package file and the current offline
acceptance/mutant scripts, diff artifacts, run list and successful scoped receipts.
BUILD.md preserves all earlier failures and corrections append-only.
Current scoped verification: exact intended RED2fail/9pass, then99/99 focused
GREEN, pinned8.0.42 offline bus acceptance, four named mutants killed with four
restored positive controls (10/17/11/2passes). Whole-file receipts and uptime
are404-*.txt/.start/.end. Actual idle scheduling is reported, not overwritten.
No test reruns after an unexpected outcome. Earlier fixture-root and missing
provider404 findings are separate commits; product normalization is exactly
GET /v8/management/config/api-keys/claude HTTP404 ->[], with original404 receipt.
Every other endpoint/method/status still refuses, malformed200 null/object still
refuses proxy-down; no new refusal code, assertion weakening or timeout change.
## Security focus
- Owner human-only broker gate before generic user/tester handling; all8verbs.
- Native /proxy and /api/proxy routes through fixed Console caller allowlist;
writes require signed-in owner, named host, --send, own Origin and Fetch
Metadata. Granted/tester/loopback callers refuse. No webui management client.
- API-key input is write-only, promptly cleared, no browser storage; management
header only numeric loopback. OAuth pending-state ownership/expiry/finish
guards, no wait-to-success shortcut. Unknown errors are sanitized.
- Accounts project exactly5public fields. Stable generated display names avoid
arbitrary upstream credential strings; ids derive from proxy identifiers,
never token/key values. Client keys return ids and management labels only.
- Canary checks HTTP responses, structured logs/receipts, captured process output
and bus files; fake receives first key once. No real host proxy/credential access.
## Explicit outstanding work / review limits
P2 has not yet been rebased/joined into this branch. Runtime key-status projection
is provisional until the actual P2 metadata contract lands. Broad package suites
(model-proxy/bus/webui, webui requiring editor build), collateral import-derived
files and Sage's global landing gate still need authorized execution after that
integration. The prior broader inventory is not a current post-P2 manifest.
Independent Q246 first/landing verdicts are not claimed. Do not treat this packet
or the scoped checks as approval to land, push refactor, deploy or cut over.
+157
View File
@@ -0,0 +1,157 @@
// Offline upgrade contract: real bus verbs, pinned proxy, no real credentials.
import fs from 'node:fs';
import path from 'node:path';
import net from 'node:net';
import assert from 'node:assert/strict';
import { spawn } from 'node:child_process';
import { createHash } from 'node:crypto';
import { getPriority } from 'node:os';
import { initialConfig } from '../../../../packages/model-proxy/src/settings.mjs';
import { PIN } from '../../../../packages/model-proxy/src/common.mjs';
import { ManagementClient } from '../../../../packages/model-proxy/src/client.mjs';
import { ProxyPage } from '../../../../packages/bus/src/proxy-page.mjs';
import { Broker } from '../../../../packages/bus/src/broker.mjs';
import { Store } from '../../../../packages/bus/src/store.mjs';
const [root, binary] = process.argv.slice(2);
if (process.env.P4_UPGRADE_ISOLATED !== 'yes' || !root?.startsWith('/mnt/storage/scratch/tmp/')) throw Error('wrapper required');
if (createHash('sha256').update(fs.readFileSync(binary)).digest('hex') !== PIN.binary.sha256) throw Error('binary does not match PIN');
const reserve = net.createServer(); await new Promise(r => reserve.listen(0, '127.0.0.1', r));
const port = reserve.address().port; await new Promise(r => reserve.close(r));
if (port === 8317) throw Error('forbidden port');
const management = 'p4-management', canary = 'p4-upstream';
const config = initialConfig({ dataRoot: root, port, key: management, sentinel: 'msk-fixture-sentinel-x' });
config.management['disable-control-panel'] = true; config.observability.logs['logging-to-file'] = false;
fs.mkdirSync(path.join(root, 'proxy/auth'), { recursive: true, mode: 0o700 });
fs.mkdirSync(path.join(root, 'home'));
fs.writeFileSync(path.join(root, 'config.yaml'), JSON.stringify(config), { mode: 0o600 });
const child = spawn(binary, ['-config', path.join(root, 'config.yaml'), '-local-model'], {
cwd: root, env: { HOME: path.join(root, 'home'), PATH: '/usr/bin:/bin' }, stdio: 'ignore',
});
// Diagnostic-only (sage-4432): observe the same run conditions, never change
// priority or print exception values, fixture credentials or upstream content.
let stage = 'binary-start', lastClientErrorCode = null;
const clientErrorCodes = ['proxy-client-down', 'proxy-client-response', 'proxy-client-refused',
'proxy-client-redirect', 'proxy-client-invalid'];
const errorCodes = [...clientErrorCodes, 'ERR_ASSERTION', 'ERR_SQLITE_ERROR', 'SQLITE_ERROR',
'proxy-down', 'not-configured', 'human-required', 'invalid-request', 'invalid-business',
'priority-invalid', 'priority-unconfirmed', 'priority-write-refused', 'login-state-unknown'];
function schedulingPolicy(pid) {
try {
// Only our Node process or the still-live child we spawned. Never print
// raw /proc content; retain just Linux's numeric scheduling-policy field.
const policy = fs.readFileSync(`/proc/${pid}/sched`, 'utf8').match(/^policy\s*:\s*(\d+)\s*$/m)?.[1];
return policy === undefined ? null : Number(policy);
} catch { return null; }
}
function observe() {
let nodePriority = null, childPriority = null, childSchedulingPolicy = null;
try { nodePriority = getPriority(); } catch {}
if (Number.isInteger(child.pid) && child.exitCode === null && child.signalCode === null) {
try { childPriority = getPriority(child.pid); } catch {}
childSchedulingPolicy = schedulingPolicy(child.pid);
}
console.log('P4 diagnostic ' + JSON.stringify({ stage, nodePriority, childPriority, lastClientErrorCode,
nodeSchedulingPolicy: schedulingPolicy(process.pid), childSchedulingPolicy,
childExitCode: Number.isInteger(child.exitCode) ? child.exitCode : null,
childSignal: /^SIG[A-Z0-9]{1,16}$/.test(child.signalCode ?? '') ? child.signalCode : null }));
}
child.once('exit', observe);
let store;
const pause = ms => new Promise(r => setTimeout(r, ms));
const receipts = [], answers = [];
const client = new ManagementClient({ baseUrl: `http://127.0.0.1:${port}`, key: management, receipt: r => receipts.push(r) });
try {
console.log('P4 offline upgrade version=' + PIN.version + ' nice=' + getPriority());
observe();
let ready = false;
for (let n = 0; n < 100; n++) {
try { await client.getCredentials(); ready = true; break; }
catch (error) { lastClientErrorCode = clientErrorCodes.includes(error.code) ? error.code : 'unclassified'; await pause(50); }
}
assert.equal(ready, true, 'fixture listener starts');
stage = 'management-ready'; observe();
stage = 'store-open';
store = new Store(root);
observe();
const page = new ProxyPage({ client, instanceTag: 'fixture' });
const broker = new Broker({ store, proxyPage: (...args) => page.request(...args), businesses: {
demo: { id: 'demo', human: 'owner', roles: { coder: { authority: { withinRole: [], crossRole: [] } } }, arbiters: { technical: 'coder', delivery: 'coder' } },
} });
const cap = broker.bindHuman({ business: 'demo', human: 'owner', via: 'cli', outsideAgent: true });
stage = 'broker-bound'; observe();
const call = async (verb, args = {}) => { const answer = await broker.request(cap, { verb, args }); answers.push(answer); return answer; };
stage = 'initial-accounts'; observe();
// Diagnostic-only (sage-4448/4452, mos-1683): one direct empty-provider
// read, types/counts only. Never print field names, values or error text.
const receiptCount = receipts.length;
try {
const groups = await client.getUpstreamGroups();
const isArray = Array.isArray(groups);
console.log('P4 empty-provider diagnostic ' + JSON.stringify({
httpStatus: receipts.length === receiptCount + 1 ? receipts.at(-1).status : null,
type: groups === null ? 'null' : typeof groups, isArray,
count: isArray ? groups.length : groups !== null && typeof groups === 'object' ? Object.keys(groups).length : 0,
}));
} catch (error) {
console.log('P4 empty-provider diagnostic ' + JSON.stringify({
httpStatus: receipts.length === receiptCount + 1 ? receipts.at(-1).status : null,
code: clientErrorCodes.includes(error.code) ? error.code : 'proxy-client-error',
}));
}
assert.deepEqual((await call('proxy.accounts')).accounts, []);
console.log('proxy.accounts initial empty; GET /credentials + GET /config/api-keys/claude');
for (const provider of ['claude', 'codex']) {
const login = await call('proxy.login.start', { provider });
assert.equal(typeof login.url, 'string'); assert.equal(typeof login.state, 'string');
console.log('proxy.login.start ' + provider + ' GET /oauth/auth-url; fields=url,state only');
const redirect = provider === 'claude' ? 'http://localhost:54545/callback' : 'http://localhost:1455/auth/callback';
const submitted = await call('proxy.login.submit', { redirect_url: redirect + '?state=' + encodeURIComponent(login.state) + '&code=p4-fake-code' });
assert.notEqual(submitted.status, 'ok');
const status = await call('proxy.login.status', { state: login.state });
assert.notEqual(status.status, 'ok');
console.log('proxy.login.submit POST /oauth/callback; fake code never ok; GET /oauth/status=' + status.status);
if (status.status === 'wait') {
assert.equal((await call('proxy.login.cancel', { state: login.state })).status, 'cancelled');
console.log('proxy.login.cancel DELETE /oauth/session confirmed');
}
}
await call('proxy.apikey.add', { provider: 'z.ai', key: canary }); await pause(200);
const accounts = (await call('proxy.accounts')).accounts;
assert.equal(accounts.length, 1); assert.equal(accounts[0].provider, 'z.ai');
assert.deepEqual(Object.keys(accounts[0]).sort(), ['accountId', 'displayName', 'priority', 'provider', 'status']);
console.log('proxy.apikey.add PUT /config/api-keys/claude; account fields=accountId,provider,displayName,status,priority; id from auth_index');
await call('proxy.priority.set', { accountId: accounts[0].accountId, priority: 7 });
assert.equal((await call('proxy.accounts')).accounts[0].priority, 7);
console.log('proxy.priority.set API-key PUT /config/api-keys/claude; priority read-back=7');
const keys = await call('proxy.keys');
assert.equal(keys.keys.length, 1); assert.equal(keys.keys[0].management, 'sentinel'); assert.match(keys.keys[0].keyId, /^[a-f0-9]{12}$/);
console.log('proxy.keys GET /config/access/api-keys; fields=keyId,management,agent,issuedAt,state; sentinel labelled; values absent');
// Fixture-only upload exercises the OAuth priority API relied on by the page.
const uploaded = await fetch(`http://127.0.0.1:${port}/v8/management/credentials?name=p4-fixture.json`, {
method: 'POST', headers: { Authorization: `Bearer ${management}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ type: 'claude', access_token: 'p4-access', refresh_token: 'p4-refresh', expired: '2099-01-01T00:00:00Z' }),
signal: AbortSignal.timeout(5000), redirect: 'error',
});
assert.equal(uploaded.status, 200); await uploaded.body?.cancel(); await pause(200);
const oauth = (await call('proxy.accounts')).accounts.find(a => a.provider === 'claude');
assert.ok(oauth);
await call('proxy.priority.set', { accountId: oauth.accountId, priority: 8 });
assert.equal((await call('proxy.accounts')).accounts.find(a => a.accountId === oauth.accountId).priority, 8);
console.log('proxy.priority.set OAuth PATCH /credentials/fields body={name,priority}; priority read-back=8');
for (const value of [canary, management, 'p4-access', 'p4-refresh', 'p4-fake-code']) {
assert.equal(JSON.stringify(receipts).includes(value), false, 'secret absent from receipts');
assert.equal(JSON.stringify(store.all('SELECT body FROM events')).includes(value), false, 'secret absent from bus events');
assert.equal(JSON.stringify(answers).includes(value), false, 'credential/code absent from bus replies');
}
console.log('PASS offline native-page bus contract and secret-free receipts');
} catch (error) {
// Never print assertion actual/expected values or a raw upstream exception.
observe();
const errorClass = ['Error', 'AssertionError', 'ProxyError', 'BusError', 'TypeError', 'RangeError'].includes(error.name) ? error.name : 'Error';
console.error('P4 upgrade FAILED ' + JSON.stringify({ stage, errorClass,
code: errorCodes.includes(error.code) ? error.code : 'acceptance-failed' }));
process.exitCode = 1;
} finally {
store?.close(); child.kill('SIGTERM');
await Promise.race([new Promise(r => child.once('exit', r)), pause(3000).then(() => child.kill('SIGKILL'))]);
}
+13
View File
@@ -0,0 +1,13 @@
#!/usr/bin/env bash
# P4 PIN upgrade acceptance; outside scripts/test-*.sh, requires Sage's slot.
set -euo pipefail
HERE=$(cd "$(dirname "$0")" && pwd)
BINARY=${1:?P1 verified fetched executable required}
export TMPDIR=$(mktemp -d /mnt/storage/scratch/tmp/XXXXXX)
trap 'rm -rf -- "$TMPDIR"' EXIT
timeout -k 10 120 nice -n $((19 - $(nice))) unshare -rn bash -c '
set -e
ip link set lo up
export P4_UPGRADE_ISOLATED=yes
exec node "$1/acceptance.mjs" "$TMPDIR" "$2"
' bash "$HERE" "$BINARY"
@@ -0,0 +1,2 @@
2026-10-25T06:42:22Z
01:42:22 up 11 days, 17:02, 2 users, load average: 5.98, 15.98, 16.44
@@ -0,0 +1,2 @@
2026-10-25T06:42:18Z
01:42:18 up 11 days, 17:02, 2 users, load average: 5.98, 15.98, 16.44
@@ -0,0 +1,9 @@
P4 offline upgrade version=8.0.42 nice=19
P4 diagnostic {"stage":"binary-start","nodePriority":19,"childPriority":19,"lastClientErrorCode":null,"nodeSchedulingPolicy":0,"childSchedulingPolicy":0,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"management-ready","nodePriority":19,"childPriority":19,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":0,"childSchedulingPolicy":0,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"store-open","nodePriority":19,"childPriority":19,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":0,"childSchedulingPolicy":0,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"broker-bound","nodePriority":19,"childPriority":19,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":0,"childSchedulingPolicy":0,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"initial-accounts","nodePriority":19,"childPriority":19,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":0,"childSchedulingPolicy":0,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"initial-accounts","nodePriority":16,"childPriority":19,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":0,"childExitCode":null,"childSignal":null}
P4 upgrade FAILED {"stage":"initial-accounts","errorClass":"Error","code":"proxy-down"}
P4 diagnostic {"stage":"initial-accounts","nodePriority":16,"childPriority":null,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":null,"childExitCode":0,"childSignal":null}
@@ -0,0 +1,19 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/L2p5A3
✔ accounts have exactly the allowlisted public fields, id from credential identifier (22.174496ms)
✔ token-like data in every upstream field never reaches public accounts (4.314601ms)
✔ API key account is derived from proxy auth_index, never api-key, and can set priority (9.723941ms)
✔ OAuth priority uses top-level name/priority and confirms it through list (3.608642ms)
✔ priority-unconfirmed: accepted API-key write with unchanged read-back refuses (3.746827ms)
✔ priority-write-refused: OAuth PATCH status 201 (2.247959ms)
✔ priority-write-refused: OAuth PATCH status 400 (2.965091ms)
✔ priority-invalid: unknown account refuses before any write (1.743249ms)
✔ proxy-down: a closed management listener refuses once (1.421441ms)
✔ client keys return ids, sentinel/foreign labels and only scoped record metadata (2.327823ms)
ℹ tests 10
ℹ suites 0
ℹ pass 10
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 143.18039
@@ -0,0 +1,2 @@
2026-10-25T06:42:07Z
01:42:07 up 11 days, 17:01, 2 users, load average: 6.53, 16.42, 16.59
@@ -0,0 +1,2 @@
2026-10-25T06:42:07Z
01:42:07 up 11 days, 17:01, 2 users, load average: 6.66, 16.61, 16.65
@@ -0,0 +1,26 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/TEAh1u
✔ proxy.login.start: provider-not-allowed (27.220361ms)
✔ proxy.apikey.add: provider-not-allowed (0.344999ms)
✔ apikey-invalid empty (0.294884ms)
✔ apikey-invalid too long (0.274ms)
✔ apikey-invalid charset (0.30855ms)
✔ callback-url-invalid not URL (1.222458ms)
✔ callback-url-invalid oversize (0.413224ms)
✔ callback-url-invalid repeated state (0.285131ms)
✔ login-state-unknown callback never reaches proxy (0.345734ms)
✔ login state is scoped to the human and business (0.467282ms)
✔ accepted callback wait is pending; only a status ok completes and retires state (0.843249ms)
✔ expiry reports login-timeout once with no management call and retires state (0.267807ms)
✔ cancel calls DELETE and retires state (0.258213ms)
✔ upstream OAuth error body never crosses bus response (0.231392ms)
✔ priority-invalid {"accountId":"bad","priority":1} (0.201431ms)
✔ priority-invalid {"accountId":"aaaaaaaaaaaa","priority":1.5} (0.174276ms)
✔ priority-invalid {"accountId":"aaaaaaaaaaaa","priority":1001} (0.170986ms)
ℹ tests 17
ℹ suites 0
ℹ pass 17
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 106.766018
@@ -0,0 +1,2 @@
2026-10-25T06:42:07Z
01:42:07 up 11 days, 17:01, 2 users, load average: 6.66, 16.61, 16.65
@@ -0,0 +1,2 @@
2026-10-25T06:42:07Z
01:42:07 up 11 days, 17:01, 2 users, load average: 6.66, 16.61, 16.65
@@ -0,0 +1,50 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/coQR8v
✔ proxy.accounts: owner calls page once with business/human scope (19.314895ms)
✔ proxy.accounts: tester human-required (14.382028ms)
✔ proxy.accounts: agent human-required (13.366875ms)
✔ proxy.accounts: user human-required (12.734936ms)
✔ proxy.accounts: not-configured (13.206913ms)
✔ proxy.login.start: owner calls page once with business/human scope (12.601593ms)
✔ proxy.login.start: tester human-required (12.793022ms)
✔ proxy.login.start: agent human-required (12.576573ms)
✔ proxy.login.start: user human-required (13.04681ms)
✔ proxy.login.start: not-configured (13.419448ms)
✔ proxy.login.submit: owner calls page once with business/human scope (12.695382ms)
✔ proxy.login.submit: tester human-required (13.507149ms)
✔ proxy.login.submit: agent human-required (13.188966ms)
✔ proxy.login.submit: user human-required (13.722535ms)
✔ proxy.login.submit: not-configured (12.60293ms)
✔ proxy.login.status: owner calls page once with business/human scope (12.159557ms)
✔ proxy.login.status: tester human-required (12.884978ms)
✔ proxy.login.status: agent human-required (13.227723ms)
✔ proxy.login.status: user human-required (13.638448ms)
✔ proxy.login.status: not-configured (13.288314ms)
✔ proxy.login.cancel: owner calls page once with business/human scope (13.68684ms)
✔ proxy.login.cancel: tester human-required (14.477894ms)
✔ proxy.login.cancel: agent human-required (18.618454ms)
✔ proxy.login.cancel: user human-required (15.764118ms)
✔ proxy.login.cancel: not-configured (14.155249ms)
✔ proxy.apikey.add: owner calls page once with business/human scope (13.346653ms)
✔ proxy.apikey.add: tester human-required (14.275591ms)
✔ proxy.apikey.add: agent human-required (15.041527ms)
✔ proxy.apikey.add: user human-required (13.715987ms)
✔ proxy.apikey.add: not-configured (13.608844ms)
✔ proxy.priority.set: owner calls page once with business/human scope (12.499478ms)
✔ proxy.priority.set: tester human-required (14.103153ms)
✔ proxy.priority.set: agent human-required (14.57306ms)
✔ proxy.priority.set: user human-required (14.02396ms)
✔ proxy.priority.set: not-configured (13.77083ms)
✔ proxy.keys: owner calls page once with business/human scope (11.740894ms)
✔ proxy.keys: tester human-required (12.726783ms)
✔ proxy.keys: agent human-required (14.12361ms)
✔ proxy.keys: user human-required (13.283755ms)
✔ proxy.keys: not-configured (12.67668ms)
✔ API-key canary never enters broker events or unknown error output (13.619581ms)
ℹ tests 41
ℹ suites 0
ℹ pass 41
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 696.597349
@@ -0,0 +1,2 @@
2026-10-25T06:42:07Z
01:42:07 up 11 days, 17:01, 2 users, load average: 6.66, 16.61, 16.65
@@ -0,0 +1,2 @@
2026-10-25T06:42:06Z
01:42:06 up 11 days, 17:01, 2 users, load average: 6.66, 16.61, 16.65
@@ -0,0 +1,12 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/RE2vwS
✔ OAuth management calls keep URL and state out of receipts (19.749276ms)
✔ upstream key goes only in request body and upstream refusal body is discarded (4.186524ms)
✔ redirected management calls are not followed or retried (2.121196ms)
ℹ tests 3
ℹ suites 0
ℹ pass 3
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 98.033185
@@ -0,0 +1,2 @@
2026-10-25T06:42:06Z
01:42:06 up 11 days, 17:01, 2 users, load average: 6.66, 16.61, 16.65
@@ -0,0 +1,2 @@
2026-10-25T06:42:06Z
01:42:06 up 11 days, 17:01, 2 users, load average: 6.66, 16.61, 16.65
@@ -0,0 +1,10 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/UVjb2T
✔ Console production module graph cannot import the model-proxy client (70.585338ms)
ℹ tests 1
ℹ suites 0
ℹ pass 1
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 137.462924
@@ -0,0 +1,2 @@
2026-10-25T06:42:12Z
01:42:12 up 11 days, 17:02, 2 users, load average: 6.53, 16.42, 16.59
@@ -0,0 +1,2 @@
2026-10-25T06:42:11Z
01:42:11 up 11 days, 17:02, 2 users, load average: 6.53, 16.42, 16.59
@@ -0,0 +1,12 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/WLROJU
✔ proxy browser clears write-only key immediately, sends once and renders data as text (603.091893ms)
✔ proxy browser OAuth opens safely, callback wait stays pending, status ok completes (2601.033669ms)
✔ proxy browser read-only disables account changes (550.580882ms)
ℹ tests 3
ℹ suites 0
ℹ pass 3
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 3846.295222
@@ -0,0 +1,2 @@
2026-10-25T06:42:11Z
01:42:11 up 11 days, 17:02, 2 users, load average: 6.53, 16.42, 16.59
@@ -0,0 +1,2 @@
2026-10-25T06:42:08Z
01:42:08 up 11 days, 17:01, 2 users, load average: 6.53, 16.42, 16.59
@@ -0,0 +1,11 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/kmRLQ1
✔ API-key canary reaches fake once and zero responses/logs/receipts/store files (51.811486ms)
✔ OAuth URLs, state and code stay out of broker records and management receipts (19.046885ms)
ℹ tests 2
ℹ suites 0
ℹ pass 2
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 240.643186
@@ -0,0 +1,2 @@
2026-10-25T06:42:08Z
01:42:08 up 11 days, 17:01, 2 users, load average: 6.53, 16.42, 16.59
@@ -0,0 +1,2 @@
2026-10-25T06:42:07Z
01:42:07 up 11 days, 17:01, 2 users, load average: 6.53, 16.42, 16.59
@@ -0,0 +1,20 @@
nice=19 TMPDIR=/mnt/storage/scratch/tmp/X0Vp78
✔ owner proxy routes each make exactly one allowlisted call (27.305714ms)
✔ proxy write refuses signed-out (2.96232ms)
✔ proxy write refuses loopback (1.79702ms)
✔ proxy write refuses cross-origin (1.340864ms)
✔ proxy write refuses missing Fetch Metadata (1.47209ms)
✔ all proxy writes are read-only without --send (3.481474ms)
✔ granted user never reaches owner page or any proxy route (4.998721ms)
✔ native page offers write-only key input and no panel script (2.07878ms)
✔ Console caller rejects every non-proxy verb (0.837371ms)
✔ tester socket refuses proxy page, reads and writes before any owner call (7.459873ms)
✔ malformed API-key JSON never appears in errors or logs (1.621405ms)
ℹ tests 11
ℹ suites 0
ℹ pass 11
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 221.712154
@@ -0,0 +1,2 @@
2026-10-25T06:42:07Z
01:42:07 up 11 days, 17:01, 2 users, load average: 6.53, 16.42, 16.59
@@ -0,0 +1,2 @@
2026-10-25T06:42:07Z
01:42:07 up 11 days, 17:01, 2 users, load average: 6.53, 16.42, 16.59
@@ -0,0 +1,6 @@
P4 offline upgrade version=8.0.42 nice=16
P4 diagnostic {"stage":"binary-start","nodePriority":16,"childPriority":16,"lastClientErrorCode":null,"nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"management-ready","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"store-open","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 upgrade FAILED {"stage":"store-open","errorClass":"Error","code":"acceptance-failed"}
P4 diagnostic {"stage":"store-open","nodePriority":16,"childPriority":null,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":null,"childExitCode":0,"childSignal":null}
@@ -0,0 +1 @@
01:14:23 up 11 days, 16:34, 2 users, load average: 3.15, 5.41, 9.24
@@ -0,0 +1 @@
01:14:19 up 11 days, 16:34, 2 users, load average: 2.90, 5.40, 9.26
@@ -0,0 +1,2 @@
2026-10-25T07:32:30Z
02:32:30 up 11 days, 17:52, 2 users, load average: 51.91, 45.30, 29.60
@@ -0,0 +1,2 @@
2026-10-25T07:32:25Z
02:32:25 up 11 days, 17:52, 2 users, load average: 52.34, 45.27, 29.51
@@ -0,0 +1,10 @@
P4 offline upgrade version=8.0.42 nice=16
P4 diagnostic {"stage":"binary-start","nodePriority":16,"childPriority":16,"lastClientErrorCode":null,"nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"management-ready","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"store-open","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"broker-bound","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 diagnostic {"stage":"initial-accounts","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 empty-provider diagnostic {"httpStatus":404,"code":"proxy-client-refused"}
P4 diagnostic {"stage":"initial-accounts","nodePriority":16,"childPriority":16,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":5,"childExitCode":null,"childSignal":null}
P4 upgrade FAILED {"stage":"initial-accounts","errorClass":"Error","code":"proxy-down"}
P4 diagnostic {"stage":"initial-accounts","nodePriority":16,"childPriority":null,"lastClientErrorCode":"proxy-client-down","nodeSchedulingPolicy":5,"childSchedulingPolicy":null,"childExitCode":0,"childSignal":null}
@@ -0,0 +1,8 @@
ed5dfcda6db77921f90f1eb587fb0044d6472fb613ecaa98445ed42bc04d5d46 packages/model-proxy/tests/empty-provider.test.mjs
c55cc0bb47cd7716a2c31c665cd2dd426e2c54ab7b629637bdc12089dfeb40ce packages/bus/tests/proxy-page-empty-provider.test.mjs
01c18d8d09dac72bed45ce302a88cea449ed22ffde374529cf784bad38adbd72 packages/bus/tests/proxy-page-fixture.mjs
aa73c4cd454742f7745900e8481f7425341ed7d236b104589790ed254c8bd69f packages/model-proxy/src/client.mjs
14acdb4d3fdaabad508eec7378740b13c175d4bdd0c6e707a673138eff82365b packages/bus/src/proxy-page.mjs
b19292cad28bd19427fac932c6150429968e184f4a6f000d948919e76908eb05 agents/poe/work/queue-330/proposed-empty-provider.patch
ea7584f8935251baa9c32bf675343e8c8cbe19a45c4e7dc48675e14b4409bb1c agents/poe/work/queue-330/empty-provider-prepared-imports.json
5d227ae19d600c2fb0e375673045705c4f5bcc00311493a577108caddb38704a agents/poe/work/queue-330/empty-provider-red-run-list.txt
@@ -0,0 +1,34 @@
{
"packages/model-proxy/tests/empty-provider.test.mjs": {
"staticImports": [
"node:test",
"node:assert/strict",
"node:http",
"packages/model-proxy/src/client.mjs"
],
"existingParsedClosureRoots": [
"packages/model-proxy/src/client.mjs"
]
},
"packages/bus/tests/proxy-page-empty-provider.test.mjs": {
"staticImports": [
"node:test",
"node:assert/strict",
"packages/bus/tests/proxy-page-fixture.mjs"
],
"existingParsedClosureRoots": [
"packages/bus/tests/proxy-page-fixture.mjs"
]
},
"packages/bus/tests/proxy-page-fixture.mjs": {
"staticImports": [
"node:http",
"packages/model-proxy/src/client.mjs",
"packages/bus/src/proxy-page.mjs"
],
"existingParsedClosureRoots": [
"packages/model-proxy/src/client.mjs",
"packages/bus/src/proxy-page.mjs"
]
}
}
@@ -0,0 +1,2 @@
packages/model-proxy/tests/empty-provider.test.mjs
packages/bus/tests/proxy-page-empty-provider.test.mjs
+2
View File
@@ -0,0 +1,2 @@
fetch nice 19
{"dir":"/mnt/storage/scratch/tmp/76TDtz/download/opt/cliproxyapi/8.0.42","binary":"/mnt/storage/scratch/tmp/76TDtz/download/opt/cliproxyapi/8.0.42/cli-proxy-api","panel":"/mnt/storage/scratch/tmp/76TDtz/download/opt/cliproxyapi/8.0.42/static/management.html"}
@@ -0,0 +1 @@
/mnt/storage/scratch/tmp/76TDtz
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,17 @@
import { build } from '../../../../packages/webui/node_modules/esbuild/lib/main.js';
import { writeFileSync } from 'node:fs';
const entries = [
'packages/model-proxy/tests/page-client.test.mjs',
'packages/bus/tests/proxy-page.test.mjs',
'packages/bus/tests/proxy-page-state.test.mjs',
'packages/bus/tests/proxy-page-accounts.test.mjs',
'packages/webui/tests/proxy-page.test.mjs',
'packages/webui/tests/proxy-canary.test.mjs',
'packages/webui/tests/proxy-browser.test.mjs',
'packages/webui/tests/proxy-architecture.test.mjs',
];
const result = await build({ entryPoints: entries, bundle: true, platform: 'node', format: 'esm', splitting: true,
packages: 'external', write: false, outdir: '/unused-p4-focused', metafile: true, logLevel: 'silent' });
writeFileSync(new URL('./focused-import-graph.json', import.meta.url), JSON.stringify(result.metafile.inputs, null, 2) + '\n');
writeFileSync(new URL('./focused-run-list.txt', import.meta.url), entries.join('\n') + '\n');
console.log('Static parsed inputs=' + Object.keys(result.metafile.inputs).length + ' test entries=' + entries.length);
Loaded 100 of 196 files, more files were not shown because too many files have changed in this diff. Show more