Compare commits
15
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d9a564e6d2 | ||
|
|
a45c6c9ce5 | ||
|
|
b47ee2c0ef | ||
|
|
e7438743ff | ||
|
|
c93df1608a | ||
|
|
f2986b9ead | ||
|
|
3df440d076 | ||
|
|
1aac8bcd7a | ||
|
|
69811540ce | ||
|
|
9e94575c5e | ||
|
|
a5251007bd | ||
|
|
4a2745a9da | ||
|
|
542b970d25 | ||
|
|
48c7c3283a | ||
|
|
40dcbabcbb |
No files matched your search
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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}
|
||||
+19
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+12
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+17
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+12
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+10
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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}
|
||||
+26
@@ -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'
|
||||
}
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+35
@@ -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'
|
||||
}
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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'))]);
|
||||
}
|
||||
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
+2
@@ -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
|
||||
@@ -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
Reference in new issue
Block a user