Compare commits
8
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94128f73f7 | ||
|
|
5079012771 | ||
|
|
77172ce3b4 | ||
|
|
1afcfc766d | ||
|
|
4732821f7a | ||
|
|
8d37d21cb8 | ||
|
|
9a131e9567 | ||
|
|
66f7becf21 |
No files matched your search
+3
-61
@@ -5412,66 +5412,8 @@ Row 299 (573, #1806, Gander, Filbert): before, the P10 band test timed a fault r
|
||||
|
||||
2026-10-23T17:32:37Z | Gyro sage-3544 fenton-0016 N1/N2 delta | Before: W7 Gate/final real-conversion list omit the W8 build-order cross-reference and W8 human-view filtering cites agent settings. After: both locations explicitly put W8 landing before human opening as mos-1470 build order, not acceptance; comment/tracked-deletion links are not current story links and never appear in the human Connections view regardless of agent settings. New commit atop approved 5af060fb5, no amend. Static diff and append-only checks pass. Docs only, no repo Node/tests/live action. Fenton checks only this delta.
|
||||
|
||||
2026-10-23 | Gladstone | Gitea #1816 / Vikunja 614 hostcheck item 5 and bundle verification | Before: dpkg's correct 750 form falsely fails item 5, and two run-sheet bundle verifies require a missing repository. Draft after: exact root/mosaic/path with octal 0750 equivalence; stat/output unchanged; both verifies use cleaned-up bare scratch repos. Three additive-only test blocks, two planned mutants. Untested under Sage-3738; Sage-3740 authorizes untested branch push for static review. Queue row pending; Sage owns gate and landing.
|
||||
2026-10-23 | Fethry | Row 225 C2-10b (#1726), handoff recovery. Before: Morgana's untested candidate 9a131e956 replaces renderItems with renderReply and adds Console citation/notice/status rendering and status/revert routes. Continuing that exact history on fethry/row225; preserving A1-A5 and the accepted file deviations. Remaining: confirm limits contract, review/test candidate under Sage CLEAR, obtain Mos OK through Sage for inherited old-test changes, manifest and Dewey review. No Node/tests run in this session and no green claim.
|
||||
|
||||
2026-10-23 | Gladstone | #1816 / Vikunja 614 scope amendment mos-1534, sage-3741 | F1 narrowed to exact 750/0750 and single spaces; F3 allows @ in absolute unit paths with unsafe-character refusals retained; F4 moves copy_tree to / after path resolution. AS_USER audit found git -C and stack-release's existing checkout cd cover the other steps. Added new unit and unreadable-cwd copy tests only. Untested under Sage's no-Node hold; no live action.
|
||||
2026-10-23 | Fethry | Row 225 T1 lane A (sage-3641/3647). Before: nested replyLimits fallback/problem omitted, wrong-project revert receipt accepted, invalid library mapping hidden. After RED: these three local behaviors corrected; three assertions in the new handoff test files corrected against existing route/mapping/Boolean behavior, each explained in BUILD.md. Whole-file GREEN: renderer 9/0, routes 13/0, browser 9/0; full library 81/0, channel-proof 2/0. Approved old-test numstats remain 80/66 and 3/1. Full webui/build and full integration gate have not run. Isolated mutants next within the authorized 19:38Z hard stop; no completion claim.
|
||||
|
||||
2026-10-23 | Gladstone | #1816 / Vikunja 614 F5 draft (mos-1536) | Before: the run sheet omits the explicit notify decision and precheck misses a bus-start refusal. After: section 9a creates a private null-binding decision as mosaic; precheck directly reuses readNotifyConfig and private_dir, and new tests cover accepted and refused decisions. Existing fixture setup additions await Mos approval through Sage; installer unchanged. Untested under no-Node hold.
|
||||
|
||||
2026-10-23 | Gladstone | #1816 / Vikunja 614 fixture ruling mos-1537 | Added only three setup lines each to host(t)/world(t) for the explicit null notifier decision. Existing assertions/fakes/lines intact. New install test checks decision bytes/mode preserved and missing decision remains absent. F5 missing-file fault removes the setup file. Untested under Sage's hold; separate follow-up atop 33950cf9b.
|
||||
|
||||
2026-10-23 | Gladstone | #1816 / Vikunja 614 F6 and notify parent (mos-1537) | Before: the run sheet's copy check lacks its required CLI wrapper; mkdir -p -m does not guarantee the notify parent mode. After: a separately Mos-gated wrapper --create step follows install and precedes check, as mosaic from cwd /; section 9a explicitly creates both notify directories at 0700. Docs only, no live action; Node/tests still held.
|
||||
|
||||
2026-10-23 | Gladstone | Row320 / #1816 first review CHANGES (morgana-0217) | Reviewer run: hostcheck19/19, unit47/47, install24/24, copy17/18; seven of eight mutants killed, M4 survived because both base/mutant failed only cleanup. Fixed this row's F4 test to enter cwd then chmod000, assert no read/search, pass an absolute outside bundle, and restore0700 in finally. Existing tests/setup and production scripts unchanged. Correction untested locally pending Morgana's focused rerun; no acceptance claim.
|
||||
|
||||
2026-10-23 | Boyd | Row 298 (#1804, Q228), before implementation completion | Took over Megavolt 7a141269c on boyd/row298 at 45dca69f6 under mos-1496/1502. Approved D1-D6 govern human-only grants.scope.set, empty fallback, in-scope close/evidence and spend recheck. All inherited code UNTESTED; no Node/tests until Sage CLEAR. Plan and static gaps recorded in agents/boyd/work/queue-298/BUILD.md; no live grant or credential access.
|
||||
|
||||
2026-10-23 | Boyd | Row 298 (#1804, Q228), targeted verification | On sage-3642 T1 lane B, five whole files serial: business scope 7/0, bus scope 14/0, scope runtime 1/0, CLI scope 4/0, project runtime 3/0 (29/0, no skips). Initial bus fixture typo recorded and corrected. M1-M10 killed by named assertions, source restored and final files green. Dewey dewey-0933 positive control and notes addressed; manifest and evidence in agents/boyd/work/queue-298/BUILD.md. Full package/script gate remains Sage's. No live scope set.
|
||||
|
||||
2026-10-23T22:41:07Z | Boyd | Row 298 (#1804), rebase after row 239 | Rebased onto 833ec1cc8d7c11842efb82e57c1a0b256c8d22d7 on boyd/row298-r2 without altering published boyd/row298. Only append-log conflicts; upstream bytes preserved and Boyd suffixes appended. Product merges automatic; row 239 writer-lock revoke and post-revoke error handling preserved, organization.mjs unchanged from new base. Static checks only; UNTESTED on new base pending Sage CLEAR. Details in Boyd BUILD.md.
|
||||
|
||||
2026-10-23 | Goldie | Row 322 / #1818 F8/F9 before | The library installer runs the clone importer, whose yaml dependency is absent on fresh clones, and tail -n 1 hides uncaught errors behind Node's version banner. Plan: run the same-commit copy importer, include it in COPY_PATHS, keep the first error line with last-line fallback, append isolated regression coverage. Mos-1550 approves setup-only world(t) additions and the one-path copy-file pin addition. No tests run yet; Sage slot required.
|
||||
|
||||
2026-10-23 | Goldie | Row 322 / #1818 F8/F9 after | Importer now runs from the same-commit dependency-equipped copy; COPY_PATHS includes it. One-line refusal selects an actual Error/ERR_ line, avoiding Node's source excerpt/banner, with last-line fallback. Mos-1550-approved fixture setup and one-file pin changes; two append-only regression tests. Under sage-3808 CLEAR, serialized timeout -k 10 runs in /mnt/storage/scratch/tmp/goldieuQ2664: install26/26, copy18/18, pinned-copy10/10; new tests2/2 first run and restored; N installer expected-red2/2, F8 and F9 mutants killed, installer SHA256 restored each time. No unexpected red. Evidence and exact old-test changes in agents/goldie/work/queue-322/BUILD.md; full gate and Morgana review belong to Sage.
|
||||
|
||||
2026-10-23 | Goldie | Row 324 / #1820 before (Q247, mos-1555) | New branch goldie/row324 at row298 approved860afc2b6. Design/readers audit in agents/goldie/work/queue-324/BUILD.md: normalize omitted tracker to null, preserve present validation, guard sync readers/adapter config; runtime/instance-settings/broker checks already optional. Existing business.test.mjs98 explicitly requires tracker, so implementation held for Mos approval of removing that one list entry; no old test or product edit, no tests run.
|
||||
|
||||
2026-10-23 | Goldie | Row 324 / #1820 draft built (sage-3836, mos-1556) | Claim rev3759. Omitted tracker normalizes null; present including null/malformed stays validated. Loader, business validate, bootConfig trackerFor and Console sync reader handle absence. Row298's guarded runtime/instance-settings/broker paths preserved. Two new test files (9 planned tests); sole old-test edit drops tracker from required-key list under mos-1556. node --check6/6 and diff check pass. No tests run: untested branch push expressly ordered before CLEAR; Duckworth review and Sage gate pending.
|
||||
|
||||
2026-10-23 | Goldie | Row 324 / #1820 rebased verification (sage-3850) | Rebased onto3569bf54f as7e59ba8b3; only append-log conflicts, eight manifest files byte-equal. Serialized timeout-k10 scratch TMPDIR goldieOdgIjr: new business5/5, new CLI4/4 (includes Console absent read), existing business21/21; presence mutant killed, bytes restored, new files rerun5/5 and4/4. No unexpected red. Published rebased branch goldie/row324-r2 preserves original remote draft without force-push. Evidence/mutant diff/reader list in BUILD.md; review/full gate pending.
|
||||
|
||||
2026-10-23 | Goldie | Row 323 / #1819 before | Case 1 lacks a committed business file. Brief requires actual .53 values and refuses guessing. New branch goldie/row323 from local refactor da537e7d1; source review shows project root, literal human id, tracker sync identity/reference metadata and launch model values absent from DESIGN, plus nonempty launch.instances requires another role. Asked Sage (goldie-0008); no config or test written, no test run. Details agents/goldie/work/queue-323/BUILD.md.
|
||||
|
||||
2026-10-23 | Goldie | Row 323 / #1819 static blocker (sage-3823) | Mos-1554 requires no bot and an absent, never-created tracker token path. Static tracing confirms this refuses install validation (business cli84-97, credentials78-83) and bus boot (runtime131/157, bus credentials225-228), even without tracker.baseUrl; unset env also refuses at bus credentials278. Reported Sage goldie-0009; no JSON/test/credential written, no tests. Accepted source values/role and refusal-test rulings are recorded in BUILD.md; waiting for product-boundary resolution.
|
||||
|
||||
2026-10-24 | Goldie | Row 323 / #1819 resumed draft (sage-3859) | Rebasing prior notes onto Q247 landing dd6cb5872 resolved only append logs. Added trackerless .53 factory JSON: jason, approved project root, chief+assistant for required nonempty launch.instances, claude-code/Opus5.5/high, tester on. No credentials or token placeholder. Seven new tests prepare exact-doc loading plus scratch real validate/install/boot and three refusal paths; one restoring tester-switch mutant prepared. No old test edits; no tests before Sage CLEAR. Source choices/rulings in BUILD.md.
|
||||
|
||||
2026-10-24 | Goldie | Row 323 / #1819 pre-test commit (sage-3861 CLEAR) | Sage explicitly requests commit before runs; JSON/new7-case test/restoring mutant and field provenance committed untested before slot work. Exact sources distinguish mos-1554 human/no-bot intent, sage-3820 roles, sage-3822 project/model, and Q247 tracker omission. No old test edits. Next runs: new file, business whole, CLI whole, mutant/restored file, serialized scratch TMPDIR timeout-k10.
|
||||
|
||||
2026-10-24 | Goldie | Row 323 / #1819 first slot STOP (sage-3861) | On committed571376c30: new file7/7 and business261/261 green; whole CLI hit unchanged revoke-window.test.mjs170 (test579, row306 R4), no RESULT after20.1s at ask167/Promise.all194. Stopped suite on observing red, cleaned only positively identified own scratch fixture. Partial631 pass/1 fail before termination, not full-suite green. No mutant/restored run, no old-test edit/rerun. Manifest unchanged; Sage notified goldie-0016 and slot returned. Evidence local under queue-323, awaits ruling.
|
||||
|
||||
2026-10-24 | Goldie | Row 323 / #1819 second red STOP (mos-1560, sage-3864) | Isolated revoke-window whole-file run1 on unchanged571376c30 failed0/1 after20.126s, same no RESULT at ask167/test194. Start00:24:22Z, load1.46/1.68/2.70, busyhelperCLEAR, fresh scratch goldieBObDQ9. No run2/3/CLI retry/mutant/restored run; no source/old-test edit. Sage goldie-0018 has log/load/error; slot returned, awaits base-dd6cb5872 root cause. Remote remains unverified571.
|
||||
|
||||
2026-10-24 | Goldie | Row 323 / #1819 accepted evidence (mos-1561, sage-3869) | Sage traced revoke-window reds to37-byte TMPDIR making109-byte tools.sock >107 limit (session.mjs278), not Codex. Fresh31-byte /scratch/tmp/XXXXXX confirmation passes1/1 in0.84s. On unchanged571376c30 serialized timeout-k10: business261/261, new7/7, tester-switch mutant killed/restored SHA85e6b9ac, restored new7/7. Every log starts UTC/load/helperCLEAR; all positive runs0 fail/skip/cancel. CLI whole acceptance comes from Sage gate under mos-1561; no local CLI rerun. Evidence-only notes/log commit follows, no old test/source changes.
|
||||
|
||||
2026-10-24 | Goldie | Row325 / #1821 before (mos-1563/1564) | Real .mosaic/project.json idstack disagrees with Case1 project's mosaic-stack key; row323 scratch fixture omitted project file and only warned. New goldie/row325 at99930362e changes only that JSON key and expressly authorized old assertion key; new real-byte project-copy validation tests require valid and reject old key. Mutant prepared; no tests before Sage CLEAR, no queue writes/host actions.
|
||||
|
||||
2026-10-24 | Goldie | Row325 / #1821 after (sage-3882 CLEAR) | Only Case1 projects key becomesstack; only old test70 expected key updated under mos-1564. New3-case test copies real .mosaic/project.json bytes, requires CLI project valid, rejects old key. Serialized shortTMP timeout-k10: new3/3, business264/264, old-key mutant killed/restored SHA9e43bfef, restored new3/3; all positive0 fail/skip/cancel. Manifest4/4 verifies including unchanged project document. Logs/load lines and mutant diff in BUILD.md; no queue writes/host action, Gladstone review/Sage gate pending.
|
||||
|
||||
2026-10-24 — Poe, row 208 / 193d (#1706), before: building Console shared list,
|
||||
share controls and per-grant viewer read-only against approved design e2d161e2e.
|
||||
Base ec86f2c84. Isolated tests and UI-guard mutants pending Sage CLEAR; no live action.
|
||||
|
||||
2026-10-24 — Poe, row 208 / 193d (#1706), after: Console shared list, share/unshare
|
||||
controls and live per-grant viewer UI implemented. Webui 418/418 and plugins
|
||||
119/119 green under sage-3925 CLEAR; four UI guard mutants killed with viewer
|
||||
bus bypass refusals. Prior old-test draft regression fixed under sage-3918;
|
||||
missing root oauth4webapi corrected by pinned npm ci under sage-3924. Evidence:
|
||||
agents/poe/work/queue-208/BUILD.md. Independent reviews and Sage's global gate
|
||||
remain; no live state, schema or bus policy change.
|
||||
|
||||
2026-10-24 | Goldie | Row265 / #1770 before, recorded during authorized verification | C2-09b has no project room verbs. On goldie/row265 at ec86f2c84, add only room.open/send/read, pure exported leading-tag parser, README verb rows and new bus tests. Sage-3921 fixes EOF-tag and message-only timestamp readings; tester list/helpers/schema stay unchanged. Claim rev3814; Sage-3932 CLEAR for serialized new files, whole bus and twelve refusal mutants. No old-test edits authorized; stop rules apply.
|
||||
|
||||
2026-10-24 | Goldie | Row265 / #1770 first slot STOP (sage-3932) | New parser14/14, rooms18/18 green; serialized bus stops at old project-runtime.test.mjs:14 import-closure pin, partial619 ok/1 not ok. New pure address.mjs import is absent from expected imports. Static trace also needs address.mjs in seat RUNNER_FILES. No old-test/product correction, no mutant/restored run, no green commit/push; old-pin and out-of-owned-files mount change sent to Sage for ruling. Audit prose missed the direct source pin despite raw grep hit; correction recorded in BUILD.md.
|
||||
|
||||
2026-10-24 | Goldie | Row265 / #1770 verified (mos-1567, sage-3942) | Approved correction adds solely address import pin + Row265 comment to project-runtime.test and one pure-source RUNNER_FILES mount; new block checks parser has no imports. Serialized fresh-short-TMP timeout-k10: unchanged sandbox10/10, parser15/15, rooms18/18, full bus957/957, twelve named refusal mutants killed (each Node1, driver0), restored parser15/15 + rooms18/18. All positives zero fail/skip/cancel; every mutation restored full broker SHA71b32ee4. Old first-red evidence retained, no other old-test change. Slot returned goldie-0034; Boyd packet explicitly includes mount-list review, candidate push next.
|
||||
2026-10-23 | Fethry | Row 225 T1 expanded evidence complete (sage-3647). Full library81/0 and channel-proof2/0; final targeted renderer9/0, routes13/0, browser9/0. Isolated kit14/14 assertion kills on507901277, every target restored/hash-checked, candidate hashes unchanged. First attempt stopped at a wait-based failure, recorded as not killed; corrected the new test's repaint wait, baseline9/0, and reran the whole kit. No processes left; lane A returned around19:29Z. Source manifest for Dewey prepared; full webui/build and Sage's integration/scripts gate still pending. Raw logs preserved in scratch, normalized display copies and raw SHA256 provenance in agent evidence.
|
||||
@@ -1,8 +0,0 @@
|
||||
# Beakley
|
||||
|
||||
Builder seat, Codex gpt-6.1-sol, started by Mos under Q245 (mos-1506). Owns row 217 (C2-06, handed over from Launchpad).
|
||||
|
||||
No launcher in this directory. The seat runs as a T3 thread (thread 88b97f65) and works in its own worktree. It has no
|
||||
credentials of its own; it pushes only its own `beakley/*` branches through the repository credential helper (mos-0981),
|
||||
never `refactor`, `main` or another seat's branch. Claude seats orchestrate and review (Q245). Registered by Sage on
|
||||
2026-10-23 so the queue can name the seat as row owner (store.mjs isSeatDir).
|
||||
@@ -1,10 +0,0 @@
|
||||
# Bentina
|
||||
|
||||
Builder seat, Codex gpt-6.1-sol, started by Sage under Q246 and mos-1566. Owns row 157, I2: the install images, the
|
||||
install config key, the endpoint helper and the egress proxy (docs/plans/2026-10-18_containerized-install-rows.md),
|
||||
reassigned from Researcher so the coding runs on Codex.
|
||||
|
||||
No launcher in this directory. The seat runs as a T3 thread and works in its own worktree. It has no credentials of its
|
||||
own; it pushes only its own `bentina/*` branches through the repository credential helper (mos-0981), never `refactor`,
|
||||
`main` or another seat's branch. Claude seats orchestrate and review the install path (mos-1542 rule 4). Registered by
|
||||
Sage on 2026-10-24 so the queue can name the seat as row owner (store.mjs isSeatDir).
|
||||
@@ -1,8 +0,0 @@
|
||||
# Boyd
|
||||
|
||||
Builder seat, Codex gpt-6.1-sol, started by Mos under Q245 (mos-1506). Owns row 298 (the chief-of-staff grant scope, handed over from Megavolt).
|
||||
|
||||
No launcher in this directory. The seat runs as a T3 thread (thread 48a3ae38) and works in its own worktree. It has no
|
||||
credentials of its own; it pushes only its own `boyd/*` branches through the repository credential helper (mos-0981),
|
||||
never `refactor`, `main` or another seat's branch. Claude seats orchestrate and review (Q245). Registered by Sage on
|
||||
2026-10-23 so the queue can name the seat as row owner (store.mjs isSeatDir).
|
||||
@@ -1,272 +0,0 @@
|
||||
# Row 298 (#1804, Q228): chief-of-staff grant scope
|
||||
|
||||
Owner Boyd (48a3ae38), reviewer Dewey. Branch `boyd/row298`, base `45dca69f6`.
|
||||
Assignment: mos-1496/Q245. Handoff: Megavolt megavolt-0203, local `7a141269c`;
|
||||
cherry-picked as `4de3cec27` (design) and `7cea739de` (UNTESTED code).
|
||||
Brief: `docs/plans/2026-10-23_mvp-readiness-rows.md`, chief-of-staff grant scope.
|
||||
Megavolt's original design remains in `agents/megavolt/work/queue-298/BUILD.md`.
|
||||
|
||||
## Authority and accepted design
|
||||
|
||||
Sage sage-3594, restated in sage-3612: launch.grantScope, lenient read with empty
|
||||
fallback, strict human-only write. No general organization setter may write it.
|
||||
Per-method agents/projects or agents/hosts/commands; host-enroll never in scope.
|
||||
Host command arrays match whole tokens and exact lengths. `grants.scope.set`
|
||||
from the human CLI is Approve; no Console page or chief-raised scope change.
|
||||
Mos mos-1496/1502 requires the same human-shell guard as `mosaic access`.
|
||||
The broker closes an in-scope request via scope and writes grant.scope.used;
|
||||
missing evidence must refuse execution. Narrowing before spend fails
|
||||
scope-changed. Empty scope ships; only Jason sets the live value (Q188).
|
||||
|
||||
No credential files read, no live grants, no deployment, no queue writes. Push
|
||||
only boyd/*, additive commits, no amend/force-push or attribution trailers.
|
||||
Sage owns queue, shared test slot and landing. No Node/tests before CLEAR.
|
||||
|
||||
## Implementation plan and ledger
|
||||
|
||||
Using writing-plans and executing-plans inline; the approved brief and D1-D6
|
||||
are the spec. This packet is the requested plan/tracking location.
|
||||
|
||||
- [x] Read brief, roster, implementation and handoff; register session.
|
||||
- [x] Bring Megavolt's two commits onto Boyd's branch without changing history.
|
||||
- [x] Add independent CLI tests in `packages/cli/tests/grants-scope.test.mjs`:
|
||||
scope read/set requests; agent-marker rejection before stdin/transport;
|
||||
--tester rejection; missing revision, malformed/empty/oversize input.
|
||||
- [x] Strengthen new business/bus grant-scope tests for exact commands,
|
||||
scope evidence binding, host-enroll exclusion and spent scope-changed.
|
||||
- [ ] On Sage CLEAR, observe targeted failures before fixes; fix inherited
|
||||
implementation using the existing human proof and grant executors.
|
||||
- [ ] Update bus/CLI docs, append BUILD-LOG before/after evidence, manifest.
|
||||
- [ ] On Sage CLEAR run touched suites; record exact results and mutants.
|
||||
- [ ] Commit UNTESTED until verified; push boyd/row298 only when slot permits;
|
||||
report to Sage and Dewey, cc Mos for pushes/blockers. Dewey reviews manifest.
|
||||
|
||||
Pre-flight interfaces: business checkGrantScope/grantScopeOf/grantInScope feed
|
||||
the instance writer and broker. Runtime supplies a fresh scope from the org
|
||||
file and routes the human setter to the same organization writer. CLI callFor
|
||||
supplies refuseInsideAgent and humanTransport. The grant executors consume the
|
||||
broker's immutable close/evidence. Tests use scratch files/fake Gitea only.
|
||||
|
||||
Review focus: exact argv length, stale scope before spend, forged/missing scope
|
||||
evidence, malformed fallback, and CLI agent ancestry. Tests must cover each.
|
||||
|
||||
Static findings before any Boyd Node/test run:
|
||||
|
||||
- Handoff introduced commandPrefixes beyond the accepted D2 shape, allowing
|
||||
trailing args. Remove it; only exact command arrays are authorized.
|
||||
- scope.used carries a digest without validating it, and no org revision.
|
||||
Bind evidence to the canonical scope snapshot and grant/close sequence;
|
||||
preserve historical grants when scope is later changed, recheck at spend.
|
||||
- Gitea recheck throws inside the spend transaction and rolls back spend on
|
||||
scope-changed. Preserve spend and log failure for that case (D6).
|
||||
- The optional giteaStart?. assertion always passes when the API is absent;
|
||||
use the real runGiteaGrant entry point. Fake Gitea tokens() does exist.
|
||||
|
||||
## Existing test changes (mos-1272)
|
||||
|
||||
Approved by Mos mos-1510 via Sage sage-3624; edited exactly as approved:
|
||||
|
||||
| File | Actual numstat | Reason |
|
||||
| --- | --- | --- |
|
||||
| packages/bus/tests/project-runtime.test.mjs | +1 / -1 | Vocabulary import pin adds grantScopeOf and grantInScope. |
|
||||
|
||||
Other test work is confined to row 298's new files. No pre-existing CLI tests
|
||||
will change. Record final numstat here before review.
|
||||
|
||||
## Human proof and organization ownership
|
||||
|
||||
CLI: `packages/cli/src/cli.mjs` callFor runs refuseInsideAgent before constructing
|
||||
humanTransport, as `accessCommand` does. The setter takes no --tester flag.
|
||||
`packages/bus/src/human.mjs` verifyHuman checks the nonce, CLI path and every
|
||||
ancestor's markers/argv; `bindHuman` and #human in broker.mjs require the
|
||||
business human, via cli, outsideAgent true. Tests will pin this chain's caller
|
||||
refusal. The scope receipt records by/via/outsideAgent and old/new sha256.
|
||||
|
||||
Org file: `packages/business/src/organization.mjs` regular() requires a regular,
|
||||
non-symlink file owned by the process uid and not writable by group/other;
|
||||
write() uses revision checks, locked durable receipts and atomic rename.
|
||||
The OS owner uid can edit it directly; the agent sandbox does not mount the
|
||||
user's config (`packages/seat/src/sandbox.mjs`). This is the existing cooperative
|
||||
human/process boundary, not a hostile same-uid isolation claim.
|
||||
|
||||
Chief enrollment: broker instances.set calls #human and #mayHuman before
|
||||
add/change; credential issue/delete use #requestCredential's human gate.
|
||||
launch.by is an organization-file setting, excluded from general setters;
|
||||
only that chief may auto-approve within scope. Additional chief instances
|
||||
remain on the per-grant human approval path.
|
||||
|
||||
## Validation
|
||||
|
||||
UNTESTED. No Boyd Node/test run yet; waiting for Sage CLEAR.
|
||||
M1: bypass in-scope check. M2: bypass invalid-value fallback. M3: remove human
|
||||
setter guard. M4: drop grant.scope.used. All need named failing tests on gate.
|
||||
|
||||
## Session correction
|
||||
|
||||
The initial SESSIONS entry labels startup 19:13Z; startup was approximately
|
||||
19:08Z. Message header timestamps in boyd-0001 through 0004 were estimates;
|
||||
use T3's receipt timestamps as authoritative. Subsequent reports use date -u.
|
||||
|
||||
## Departures from Megavolt 7a141269c (Sage sage-3624)
|
||||
|
||||
1. Removed commandPrefixes; host scope commands match exact token arrays only.
|
||||
2. grantScope callback now supplies one organization read `{value,revision}`.
|
||||
grant.scope.used includes that revision, canonical scope snapshot and digest;
|
||||
#approvedGrant validates the digest, shape, method, agent and close sequence.
|
||||
It uses the immutable snapshot so later narrowing doesn't revoke issued grants.
|
||||
3. Gitea scope-changed is caught inside the spend transaction and logs a terminal
|
||||
failure without rolling back its spend. Other recheck failures keep their
|
||||
existing behavior. Host already catches recheck failures after spending.
|
||||
|
||||
Additional handoff corrections: replaced optional nonexistent giteaStart with
|
||||
runGiteaGrant; added successful host executor/revoke and enrollment-exclusion
|
||||
coverage; added real runtime writer coverage and independent CLI guard tests.
|
||||
|
||||
Sage scheduled push at 19:41Z with MOSAIC_GITEA_CREDENTIAL_FILE unset, then T1
|
||||
lane B around 19:47Z (after explicit CLEAR), four new files whole and serial,
|
||||
hard stop 20:00Z. Fethry lane A is disjoint. No test was run early. Production
|
||||
corrections are marked UNTESTED under that slot mandate; baseline regression
|
||||
checks against the inherited implementation will run only on CLEAR.
|
||||
|
||||
## Candidate preparation (before T1)
|
||||
|
||||
The three static corrections, CLI/runtime coverage and docs are prepared but
|
||||
UNTESTED. `git diff --check` is clean. The approved import-pin edit is exactly
|
||||
1 addition / 1 deletion. M1-M4 are encoded in mutants.py (not run). No Node,
|
||||
https git, full suite or webui build has run in Boyd's worktree.
|
||||
|
||||
Review package: product/test/documentation files in MANIFEST.sha256, excluding
|
||||
append-only project logs and the preserved predecessor packet. The manifest
|
||||
identifies exact bytes for Dewey; each later product change regenerates it and
|
||||
requires a review delta. Existing tests changed: only project-runtime, 1/1.
|
||||
|
||||
## Dewey static review dewey-0933
|
||||
|
||||
N1: Added a positive control to the malformed-evidence fixture. A valid event
|
||||
must pass scope authorization and reach decision-mismatch on the deliberately
|
||||
absent definition binding; invalid events remain not-authorized. No spend.
|
||||
N2: Additional named mutants cover spend recheck, exact argv length, Gitea spend
|
||||
rollback, launch.by eligibility and accepting any evidence row (results below).
|
||||
N3: At spend only grant scope membership is rechecked, not whether the raising
|
||||
chief is still launch.by. This implements sage-3594 Q5; changing the launcher
|
||||
later does not by itself invalidate a pending scope-approved request.
|
||||
N4: The scope shortcut returns the closed decision view to the chief without
|
||||
sending a separate close message; documented in the bus verb table.
|
||||
N5: grant.scope is logged after the organization file commit in a separate bus
|
||||
transaction. A crash between them leaves durable changes.jsonl as the receipt,
|
||||
as with other organization writers. The setter does not claim cross-store
|
||||
atomicity.
|
||||
|
||||
## T1 lane B results (sage-3642, 2026-10-23 19:23Z–19:29Z)
|
||||
|
||||
TMPDIR: `/mnt/storage/scratch/tmp/boyd298-4bzr6fn7`. Each whole file ran serially
|
||||
as `timeout -k 10 180 node --test --test-concurrency=1 FILE`, TMPDIR set to that
|
||||
scratch directory. Final restored candidate results:
|
||||
|
||||
| Whole file | Pass | Fail | Skip |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| business/tests/grant-scope.test.mjs | 7 | 0 | 0 |
|
||||
| bus/tests/grant-scope.test.mjs | 14 | 0 | 0 |
|
||||
| bus/tests/grant-scope-runtime.test.mjs | 1 | 0 | 0 |
|
||||
| cli/tests/grants-scope.test.mjs | 4 | 0 | 0 |
|
||||
| bus/tests/project-runtime.test.mjs | 3 | 0 | 0 |
|
||||
|
||||
29/0/0 total. `final-1.log` through `final-5.log` hold the final output. The
|
||||
runtime's reload-needs-restart notice is expected: the fixture's boot document
|
||||
has fewer credential references than its organization document, as in the
|
||||
existing instances runtime tests. No credential contents are loaded from the
|
||||
real user config.
|
||||
|
||||
Initial run: business 7/0; bus 13/1 due to Boyd's test typo, an out-of-scope
|
||||
`opts` reference in the missing-scope assertion. Corrected only that new-test
|
||||
line, then bus 14/0 and the remaining files green. Dewey N1 positive control
|
||||
was added and the whole bus file passed again; final rerun above followed all
|
||||
mutants. No production code changed during this test window.
|
||||
|
||||
Mutants: all whole files, serial, with timeout -k 10 and the same TMPDIR.
|
||||
`mutants.py --sage-clear sage-3642 --logs SCRATCH/review-mutants --deadline
|
||||
2026-10-23T19:38:00+00:00` restores exact original source after each run.
|
||||
M1/M2/M3/M4 are brief/Sage mutants; M5–M10 cover review focus and dewey-0933.
|
||||
Each exited 1 with named assertion failures, no loader/syntax kill.
|
||||
|
||||
| Mutant | Change | Pass/fail | Named killer |
|
||||
| --- | --- | --- | --- |
|
||||
| M1 | skip raise scope check | 11/3 | bus out-of-scope Gitea waits; empty/bad scope waits; host argv exclusion |
|
||||
| M2 | skip invalid-value fallback | 5/2 | business missing/bad scope fallback; bad file scope fallback |
|
||||
| M3 | remove #human from scope verb | 13/1 | bus Q3 caller refusals |
|
||||
| M4 | drop grant.scope.used write | 9/5 | bus Q4 protected evidence assertion; four executor waits also fail |
|
||||
| M5 | skip scope digest check | 13/1 | bus Q4 bad evidence: decision-mismatch instead of not-authorized |
|
||||
| M6 | rethrow narrowing, rolling spend back | 13/1 | bus Q5 Gitea spent assertion |
|
||||
| M7 | same without length check | 6/1 | business Q2 shorter command prefix exclusion |
|
||||
| M8 | no-op #scopeRecheck | 12/2 | bus Q5 Gitea and host scope-changed outcomes |
|
||||
| M9 | remove launch.by check | 13/1 | bus Q6 second chief stays open |
|
||||
| M10 | accept any matched scope evidence row | 13/1 | bus Q4 bad evidence, with positive control |
|
||||
|
||||
Mutation log sha256 (under scratch/review-mutants):
|
||||
|
||||
```text
|
||||
55e9973af5fca0088963e2ca11fd81b2fb46dfead813a577c0e0aad2d6269b68 M1.log
|
||||
abd1b784eff5ae1333a7b47085d3e199cad6d27a00e2584edf0b62417ad4c888 M2.log
|
||||
1a56085e548d1e244f0f88fe12a45f77c162375880794f9ef88b241ed3a1704d M3.log
|
||||
9c120f3f7128488edaf8bfd6d41bae712e69e76da4195a0d4dc0e8336b02038f M4.log
|
||||
1bba88a3752823454acdaa51abde6aad66fdd5488801b4aceda02a3b42c8123d M5.log
|
||||
a4ce3cacca9f7ea56b8cdfd503c76173a8e4ff1d8a7ec07032c93f0b51aa60d8 M6.log
|
||||
acecd5afc93d68d96d713f8a9a2dc08351831a0b7360a13b4e30a572ad4167bf M7.log
|
||||
fce7fa505ccf4f2d4190bd03c209fd19f1cf2770d3ae1246a3bd03697594019e M8.log
|
||||
a830a7964890dd04a2dcc7a932a1502f1dea06419a1eae6b91a85f7878dc5681 M9.log
|
||||
38ce3e7f69f6c6ffe10133397465d52538a930a830f76256a8b9280f8df78e4b M10.log
|
||||
```
|
||||
|
||||
Full touched-package suites and every scripts/test-*.sh remain for Sage's full gate; this CLEAR authorized only the five whole files. Candidate remains
|
||||
marked Untested for the full gate. No queue row has been changed by Boyd.
|
||||
|
||||
## Dewey final delta review (dewey-0935, 2026-10-23 19:31:55Z)
|
||||
|
||||
Dewey reviewed 574ece13c..bcd93dc08 with local git only, no Node: CLEAN,
|
||||
nothing blocks. Verified all 13 manifest entries, exact package-file coverage,
|
||||
project-runtime 1/1, M5-M10 mutation sites, all ten mutation log hashes and
|
||||
counts, named assertion kills without loader/syntax errors, final five logs
|
||||
29/0/0, and N1-N5 coverage. No production code delta in this review range.
|
||||
|
||||
Formal Gitea APPROVE on #1804 and queue record wait on the row 291 hold release
|
||||
and Sage's go. Sage's touched-package and every scripts/test-*.sh gate remains
|
||||
required. Boyd has released lane B and has no running test processes.
|
||||
|
||||
## Rebase after row 239 (sage-3794)
|
||||
|
||||
Current branch: `boyd/row298-r2`, rebased from published row 298 tip
|
||||
`2fc27bce6bfac2debe9703782bf308132c26b393` onto
|
||||
`833ec1cc8d7c11842efb82e57c1a0b256c8d22d7`, which includes row 239 through
|
||||
`e0cb1db2c`. Original `boyd/row298` remains intact locally and remotely. A new
|
||||
Boyd branch carries the rebased candidate so no published history is amended
|
||||
or force-pushed. This section supersedes the original base/branch header for
|
||||
current candidate work.
|
||||
|
||||
Conflicts: only the first Boyd log append in `BUILD-LOG.md` and
|
||||
`docs/SESSIONS.md` conflicted while replaying 574ece13c. For each, verified the
|
||||
old commit's log started with the merge base bytes, then retained the new
|
||||
base's complete log bytes and appended only Boyd's suffix (434 and 281 bytes
|
||||
respectively). Later Boyd appends replayed automatically. No prior entries
|
||||
were removed or rewritten. Five commits replayed; the third/fourth range-diff
|
||||
entries differ only in append-log context; package-only range-diff is all `=`.
|
||||
|
||||
The overlapping product files merged automatically: broker.mjs, runtime.mjs
|
||||
and instance-settings.mjs had no textual conflicts. Inspected their diff
|
||||
against the new base: only the existing row 298 scope additions remain.
|
||||
Preserved row 239's injected writer, fire/delete beforeWrite callback, and
|
||||
commit() passing beforeWrite into writer.write. There is no pre-lock revoke
|
||||
call in commit(). `packages/business/src/organization.mjs` is byte-identical
|
||||
to the new base: beforeWrite still runs inside withLock, after revision and
|
||||
validation checks; post-revoke errors still carry revoked true. Broker's
|
||||
row-239 error handling and runtime's lock/revoke wiring remain intact.
|
||||
|
||||
Static checks only: package patch range-diff all equal, organization writer
|
||||
unchanged, diff whitespace clean, refreshed 13-file package manifest verifies.
|
||||
The only pre-existing row-298 test change remains project-runtime.test.mjs
|
||||
exactly 1/1 under mos-1510. No test files were changed for this rebase.
|
||||
UNTESTED on the new base: no Node, tests, mutants, builds or queue writes run.
|
||||
Earlier 29/0 and M1-M10 results apply to the old base only. Await Sage CLEAR
|
||||
for whole touched-file reruns; Dewey reviews the new candidate.
|
||||
|
||||
Row 321 (#1817) review assignment acknowledged; waiting for Sage's request
|
||||
and Gladstone's pushed docs-only F7/F10 run-sheet candidate.
|
||||
@@ -1,13 +0,0 @@
|
||||
612488b705853e75e6f8952e41552526f4d07dd297d7619d608d434ed75121d6 packages/bus/README.md
|
||||
63fdf6c048f0994af3551510119eeb294c71f8116702772844214930b827cc56 packages/bus/src/broker.mjs
|
||||
65425ead353017c99e04f1e0bcc3f85c4ba60054da293badaa0360e681e418dc packages/bus/src/runtime.mjs
|
||||
e7065db949cacfd4679a1031eebf5cde09ed196ce85612e8400ae563f02a0f18 packages/bus/tests/grant-scope-runtime.test.mjs
|
||||
4030cf584481a1db12d9e6f744015c48fdebd468335d065ead3e90180858d366 packages/bus/tests/grant-scope.test.mjs
|
||||
bc432d8d430433b9d84c00883584dc53d4b27afb5e93f739fe3ca28e80f01efa packages/bus/tests/project-runtime.test.mjs
|
||||
84d6dd15d5ca2926d8f7a34548c70c3e7a3c58e692f0b009414f1af35cb096cc packages/business/src/business.mjs
|
||||
e3b425f9ad2a0d4e6e0b55bd48827e144015662d95ace4163fe6474e5f98da81 packages/business/src/instance-settings.mjs
|
||||
fed4177325f65a2b9823a40a9c35c01d60c0520e3ff40b4574c3cf2c29cc096b packages/business/src/vocabulary.mjs
|
||||
b7f96e45b9ffca2a7ebc18dc446f0adcaac72d3900f098c60157cf6cbf1bfc13 packages/business/tests/grant-scope.test.mjs
|
||||
60fc267b7f8f9e83eeb0d0207c8abdef68d554f32b08d508e98dbf59b442a366 packages/cli/README.md
|
||||
b586907ca8f351f60dc19ec2683df75d2d70ddb12955d09fb14560c9d3bed3dc packages/cli/src/grants.mjs
|
||||
fb7c30b31facd887b03ff02dd6734d48a815978481b33bb21ec48604a51c5ff5 packages/cli/tests/grants-scope.test.mjs
|
||||
@@ -1,105 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Row 298 mutants. Run only with Sage's explicit CLEAR in Boyd's slot.
|
||||
|
||||
Each mutation is applied to this worktree, runs one whole new test file,
|
||||
then restores the exact original bytes, including after an interruption.
|
||||
Logs go to a caller-supplied scratch directory, never the repository root.
|
||||
"""
|
||||
import argparse
|
||||
import datetime
|
||||
import pathlib
|
||||
import subprocess
|
||||
|
||||
ROOT = pathlib.Path(__file__).resolve().parents[4]
|
||||
BROKER = ROOT / 'packages/bus/src/broker.mjs'
|
||||
VOCABULARY = ROOT / 'packages/business/src/vocabulary.mjs'
|
||||
BUS_TEST = 'packages/bus/tests/grant-scope.test.mjs'
|
||||
BUSINESS_TEST = 'packages/business/tests/grant-scope.test.mjs'
|
||||
|
||||
|
||||
def replace_once(source, old, new):
|
||||
if source.count(old) != 1:
|
||||
raise RuntimeError(f'expected exactly one mutant site, found {source.count(old)}')
|
||||
return source.replace(old, new, 1)
|
||||
|
||||
|
||||
def mutate(name, source):
|
||||
if name == 'M1':
|
||||
return replace_once(source,
|
||||
'if (!raise?.grant || !grantInScope(scope, raise.grant)) return view;',
|
||||
'if (!raise?.grant) return view;')
|
||||
if name == 'M2':
|
||||
return replace_once(source,
|
||||
'return scope === null ? { scope: GRANT_SCOPE_EMPTY, fallback: true } : { scope, fallback: false };',
|
||||
'return { scope: scope ?? value, fallback: false };')
|
||||
if name == 'M3':
|
||||
return replace_once(source,
|
||||
' #grantScopeVerb(s, verb, a) {\n this.#human(s);',
|
||||
' #grantScopeVerb(s, verb, a) {')
|
||||
if name == 'M4':
|
||||
old = """ this.#grantEvent(s.business, {
|
||||
action: 'grant.scope.used', grantDecision: d.id, decisionSeq: seq, method: raise.grant.method,
|
||||
agent: raise.grant.agent, scope, revision, scopeSha256: sha256(JSON.stringify(scope)),
|
||||
}, d.id);"""
|
||||
return replace_once(source, old, ' // MUTANT: scope evidence omitted.')
|
||||
if name == 'M5':
|
||||
return replace_once(source,
|
||||
"evidence.agent === grant.agent && evidence.scopeSha256 === sha256(JSON.stringify(checked.scope)) &&",
|
||||
"evidence.agent === grant.agent &&")
|
||||
if name == 'M6':
|
||||
start = source.index(" checked = this.#store.transaction(() => {\n const consumed = this.#consumeGrant")
|
||||
end = source.index('\n } catch (e) {', start)
|
||||
return source[:start] + " checked = this.#store.transaction(() => this.#giteaRecheck(business, decision, this.#consumeGrant(business, decision, 'gitea')));" + source[end:]
|
||||
if name == 'M7':
|
||||
return replace_once(source,
|
||||
'const same = (a, b) => a.length === b.length && a.every((x, i) => x === b[i]);',
|
||||
'const same = (a, b) => a.every((x, i) => x === b[i]);')
|
||||
if name == 'M8':
|
||||
return replace_once(source,
|
||||
" if (this.#closed(decision)?.via === 'scope' && !grantInScope(this.#scopeNow(business).scope, g)) fail('scope-changed');",
|
||||
" // MUTANT: no spend-time scope recheck.")
|
||||
if name == 'M9':
|
||||
return replace_once(source,
|
||||
' if (s.role !== this.#business(s.business).launch?.by) return view;',
|
||||
' // MUTANT: any chief instance can use scope.')
|
||||
if name == 'M10':
|
||||
start = source.index(' const evidence = JSON.parse(row.body);', source.index(' #scopeUsed('))
|
||||
end = source.index('\n }', start)
|
||||
return source[:start] + ' return true;' + source[end:]
|
||||
raise ValueError(name)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--sage-clear', required=True, help='CLEAR message key; required before any Node run')
|
||||
parser.add_argument('--logs', type=pathlib.Path, required=True)
|
||||
parser.add_argument('--mutant', choices=['M1', 'M2', 'M3', 'M4', 'M5', 'M6', 'M7', 'M8', 'M9', 'M10', 'all'], default='all')
|
||||
parser.add_argument('--deadline', default='2026-10-23T19:38:00+00:00')
|
||||
args = parser.parse_args()
|
||||
deadline = datetime.datetime.fromisoformat(args.deadline)
|
||||
args.logs.mkdir(parents=True, exist_ok=True)
|
||||
names = ['M1', 'M2', 'M3', 'M4', 'M5', 'M6', 'M7', 'M8', 'M9', 'M10'] if args.mutant == 'all' else [args.mutant]
|
||||
for name in names:
|
||||
remaining = (deadline - datetime.datetime.now(datetime.timezone.utc)).total_seconds()
|
||||
if remaining <= 15:
|
||||
raise RuntimeError('Sage slot deadline reached; no new test run')
|
||||
path, test = (VOCABULARY, BUSINESS_TEST) if name in ['M2', 'M7'] else (BROKER, BUS_TEST)
|
||||
original = path.read_bytes()
|
||||
mutated = mutate(name, original.decode())
|
||||
log = args.logs / f'{name}.log'
|
||||
try:
|
||||
path.write_text(mutated)
|
||||
with log.open('w') as output:
|
||||
result = subprocess.run(['timeout', '-k', '10', str(int(min(180, remaining - 13))), 'node', '--test', '--test-concurrency=1', test],
|
||||
cwd=ROOT, stdout=output, stderr=subprocess.STDOUT,
|
||||
timeout=min(195, remaining - 1), check=False)
|
||||
print(f'{name}: exit={result.returncode} log={log}', flush=True)
|
||||
finally:
|
||||
path.write_bytes(original)
|
||||
# Exit 1 needs human inspection of the failing test names; errors are not kills.
|
||||
if result.returncode == 0:
|
||||
raise RuntimeError(f'{name} survived')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,8 +0,0 @@
|
||||
# Bubba
|
||||
|
||||
Builder seat, Codex gpt-6.1-sol, started by Mos under Q245 (mos-1506). Owns row 288 (agent write notices and library revert, handed over from Honker).
|
||||
|
||||
No launcher in this directory. The seat runs as a T3 thread (thread 3d6672b5) and works in its own worktree. It has no
|
||||
credentials of its own; it pushes only its own `bubba/*` branches through the repository credential helper (mos-0981),
|
||||
never `refactor`, `main` or another seat's branch. Claude seats orchestrate and review (Q245). Registered by Sage on
|
||||
2026-10-23 so the queue can name the seat as row owner (store.mjs isSeatDir).
|
||||
@@ -1,78 +0,0 @@
|
||||
# Row 208 (193d) second review: poe/row208 4a4bef6c1 (duckworth-0302)
|
||||
|
||||
Request: sage-3934 (sage-3931 request, c31492 on #1706). Candidate: 4a4bef6c1 on ec86f2c84, one
|
||||
commit. Design: e2d161e2e:agents/morgana/work/queue-193/DESIGN.md section 8, sha256 dd7fcb41
|
||||
(matches). Scope under mos-1542: the guards only. The question is whether a viewer can widen
|
||||
authority.
|
||||
Method: static. Git reads, plus the mutant summary Sage sent by path. No node, no tests.
|
||||
|
||||
## Verdict: APPROVE (static)
|
||||
|
||||
The diff has no bus or schema change. Every write is still decided by the broker as it stood at the
|
||||
base. The webui adds routes and hints, and no authority.
|
||||
|
||||
- **chat-http.mjs.**
|
||||
- share and unshare are POST only. They come after the same write fences as every other write:
|
||||
send and named mode, the SSO session or auth header, Origin, and sec-fetch-site.
|
||||
- The body must be exactly `{to}`: a string of 1-200 characters with no CR, LF or NUL. Extra keys
|
||||
(owner, verb) refuse 400, and the test covers that.
|
||||
- shares is GET only and takes no query.
|
||||
- The reply must echo thread, to and op exactly. Anything else is 503 outcome-unknown.
|
||||
- The new STATUS codes map share-not-covered to 403, share-exists to 409 and share-not-found to 404.
|
||||
- `?shared=` accepts only `true`.
|
||||
- **chat.mjs and the adapter.**
|
||||
- The three verbs go over `createChannelCaller` to the webui adapter (index.mjs:12-14). The adapter
|
||||
is an allowlist passthrough to the session's own `call`.
|
||||
- A granted user's chat is rebound per session (serve.mjs:701), so share calls carry the user's
|
||||
principal, never the owner's.
|
||||
- The test fixture runs the real adapter and the real Broker.
|
||||
- **The broker decides each new path, unchanged from the base.**
|
||||
- thread.share, thread.unshare and thread.shares are in USER_VERBS and not in VIEWER_VERBS, so
|
||||
userLevel gives collaborator. A viewer gets access-refused at #grantedThread (broker.mjs:950).
|
||||
- Each of the three goes through `#thread`'s owner check (broker.mjs:909-913). A sharee gets
|
||||
thread-not-owned and can't reshare.
|
||||
- share-not-covered applies to a `user:` target (broker.mjs:6559).
|
||||
- Only thread.messages takes `#threadRead`, so a share gives read access and nothing else.
|
||||
- **The grant-hint predicate.**
|
||||
- access.mjs `chatGrants` re-runs `lookup`, so the subject must still sign in as session.user with a
|
||||
live grant. It then keeps only that user's grants in this business that cover at collaborator,
|
||||
which is the same `covers` call as the broker's `#granted`.
|
||||
- It returns only `{projects, instances}`. No ids, receipts, subjects or other users escape. Any
|
||||
failure gives [].
|
||||
- The client's `scopeWrites` requires the project and the instance to match within one grant
|
||||
(`some(g => project && instance)`). It never pairs a project from one grant with an instance from
|
||||
another, so mixed grants can't combine into a scope that no single grant has.
|
||||
- `includes('*')` on the client is equivalent to covers' `[0] === '*'`, because checkScope
|
||||
(business access.mjs:97-103) refuses `*` unless it is alone.
|
||||
- The hint is never carried over: chatGrants starts at [] and is re-read from /api/config on each
|
||||
user render. It is in /api/config only when `granted`.
|
||||
- **No client-only hiding stands in for a broker refusal.** Each hidden control maps to a refusal:
|
||||
|
||||
| Hidden control | Who | Broker refusal |
|
||||
| --- | --- | --- |
|
||||
| composer and resume | viewer | thread.send/open: access-refused |
|
||||
| composer and resume | sharee | thread.send/open: thread-not-owned |
|
||||
| share form | viewer | access-refused |
|
||||
| share form | sharee | thread-not-owned |
|
||||
| create thread | out of scope | collaborator check at create |
|
||||
| create project | user | project.create isn't in USER_VERBS |
|
||||
| session controls, clear, cancel | user | session.* isn't in USER_VERBS (tester-only) |
|
||||
|
||||
Test :136 POSTs create, send, open and share from the page with the UI bypassed, and checks four
|
||||
403 access-refused responses, unchanged table counts, and that each verb reached the bus. Test :19
|
||||
adds unshare and the shares read over HTTP. Test :154 covers the sharee's thread-not-owned on send,
|
||||
open and share.
|
||||
- **Mutants, as reported (sage-3920 CLEAR, /mnt/storage/scratch/tmp/8UlAhS/poe-208-mutants.json, not
|
||||
rerun).**
|
||||
- There are four served-copy mutants: composer, open, share and create. Each one's anchor must exist,
|
||||
or the fixture throws.
|
||||
- Each mutant fails the UI-absence test with ERR_ASSERTION, and the bypass test passes under each
|
||||
one, so the broker still refuses. That meets design section 8: "With each UI check removed, the
|
||||
bus still refuses."
|
||||
- The full webui suite passed 418/0 and plugins 119/0 (sage-3925), as reported.
|
||||
|
||||
## Notes
|
||||
|
||||
- N1 (outside guard scope). user.js:16 re-renders every 5 s while the tab is visible. Each render
|
||||
re-reads /api/config, projects, threads and the shared list. This doesn't affect authority, but it
|
||||
is steady load per open user tab.
|
||||
@@ -1,30 +0,0 @@
|
||||
# Row 239 round 1 verdict: honker/row239-r4 e0cb1db2c (duckworth-0295)
|
||||
|
||||
Request: honker-0206 (in-review round 1, rev 3719). Candidate: e0cb1db2c on refactor 546366f4a.
|
||||
Method: git reads of local objects only. No node, no tests, no fetch, no queue reads.
|
||||
|
||||
## Verdict: APPROVE
|
||||
|
||||
- **The replay is exact.** `git range-diff 93694c518..5b8492b0f 546366f4a..0cae2dad5` gives four `=`
|
||||
lines. None of the 16 manifest paths changed between 93694c518 and 546366f4a, and
|
||||
`git diff 5b8492b0f 0cae2dad5` over those 16 paths is empty. My r3 read (REBASE-r3-5b8492b0f.md,
|
||||
duckworth-0292) applies unchanged, and so do the 0165 design approval and the 0168 code approval with
|
||||
C1 and C2 met.
|
||||
- **e0cb1db2c is doc only.** It appends 26 lines to agents/honker/work/queue-239/BUILD.md. No test reads
|
||||
that file.
|
||||
- **Pins at e0cb1db2c.** All four 64-hex pins in channel-proof.test.mjs match the files' sha256:
|
||||
human.mjs, human-cli.mjs, transport.mjs and webui bus.mjs (e3f52172…). Upstream changed library
|
||||
src/index.mjs and business src/index.mjs, and no test or script pins them. The only hit in my grep
|
||||
is a basename collision (`cli.mjs` matched `human-cli.mjs`).
|
||||
- **The run, as Honker reported it (sage-3773 CLEAR, on 0cae2dad5. I didn't rerun it):**
|
||||
- The six touched test files ran whole: 65/65, 0 skipped, no first-run red.
|
||||
- Mutants M1-M3g: 9/9 killed as assertion failures in their named tests.
|
||||
- M3f killed T6, which matches my static trace in 0292.
|
||||
- Every restore matched by sha256, and the tree was clean afterwards.
|
||||
Running on the replay rather than r3's base was right, because bus runtime.mjs imports library
|
||||
src/index.mjs and the cli imports business src/index.mjs, and both changed upstream.
|
||||
- **What remains is Sage's.** The full gate runs on the replay at landing (sage-3730). Sage's call.
|
||||
|
||||
## Notes
|
||||
|
||||
- None new. 0168 N1 (endsWith access-revoked) stands as recorded.
|
||||
@@ -1,74 +0,0 @@
|
||||
# Row 323 round 1 verdict: goldie/row323 6a0f0f4f8 (duckworth-0300)
|
||||
|
||||
Request: sage-3865 (early look at draft 571376c30) and sage-3870 (candidate 6a0f0f4f8, base dd6cb5872,
|
||||
manifest 903ef0225f2f…cda79f). Brief: docs/plans/2026-10-23_case1-business-file-brief.md, section "Brief:
|
||||
the Case 1 factory business file".
|
||||
Method: static. Git reads of local objects only. No node, no tests, no fetch, no queue reads.
|
||||
|
||||
## Verdict: APPROVE (static), with one condition
|
||||
|
||||
- **The manifest matches.** MANIFEST.sha256 hashes to 903ef0225f2f…cda79f, and both of its blobs match at
|
||||
6a0f0f4f8: the JSON 85e6b9ac… and the test aecd1c0f…. Neither file changed between 571376c30 and
|
||||
6a0f0f4f8. The rest of that range is BUILD.md, logs, BUILD-LOG and SESSIONS. dd6cb5872 is an ancestor.
|
||||
No existing test or source file changed.
|
||||
- **Fields against the brief and the cited rulings:**
|
||||
- id `mosaic-stack` (DESIGN section 7). `vars.bus.tester` true. There is no `library` key and no
|
||||
library project.
|
||||
- human `jason`. I can't read mos-1554 myself, so this rests on Sage's relay in sage-3823. BUILD.md is
|
||||
explicit that this is the only literal value that comes from mos-1554.
|
||||
- The project root /srv/mosaic/src/mosaic-stack is under the DESIGN home /srv/mosaic, and the value
|
||||
comes from sage-3822. It passes the normalized-absolute check at business.mjs:274. A missing project
|
||||
file there only gives a warning in validate (cli.mjs:73-77), so the path doesn't need to exist at
|
||||
install.
|
||||
- Roles are chief (chief-of-staff) and assistant. The assistant is needed because checkLaunch requires
|
||||
`launch.instances` to be nonempty and to exclude the launcher (business.mjs:186-190). BUILD.md names
|
||||
that check, as the brief asks. Both arbiters are chief, under sage-3820. launch.by is chief, which
|
||||
F7 (case1-accept.sh:545-559) reads.
|
||||
- Claude only. `plugins.harness` is [claude-code] and both roles use harness claude-code. There is no
|
||||
pi.
|
||||
- No tracker, no credentials, no library, and no credential value or reference anywhere in the file.
|
||||
Q247 covers the tracker by omission.
|
||||
- **The model, provider and effort have sources.**
|
||||
- The model claude-opus-5-5 is Sage's ruling in sage-3822.
|
||||
- The provider mapping anthropic/claude-opus-5-5 matches packages/business/README.md:185.
|
||||
- `thinking: high` is one of the claude-code LEVELS (index.mjs:28) and matches the chief convention at
|
||||
session-launch.test.mjs:83.
|
||||
- With no `launch.limits`, there is no ceiling: limitHit (launch.mjs:137-155) checks only the limits
|
||||
that are defined. That is a valid choice, and N1 records it.
|
||||
- **The tests read the shipped bytes.**
|
||||
- DOCUMENT is `REPO/docs/guides/case1-business.mosaic-stack.json`. Case 1 writes those exact bytes,
|
||||
loads them through loadBusiness, checks the bytes didn't change, and then asserts every field.
|
||||
- The validate, install, boot and refusal cases copy the document and change only the project root,
|
||||
under sage-3820. Since an absent root only warns, the copy differs from the shipped file only in a
|
||||
way validate doesn't refuse.
|
||||
- The brief's three tests are all there:
|
||||
- (1) The loader case.
|
||||
- (2) The real case2-install.sh factory profile with `--business-file`, with only stack-copy stubbed.
|
||||
- (3) `bus-tester-off`, the literal library key through the final validate (sage-3820), and the
|
||||
library project through `profile-library-business`.
|
||||
- The boot case also covers the 324 boundary: bootConfig gives no trackers, credentials.status() is
|
||||
[], and the reader's credentials are [].
|
||||
- **The tester-switch mutant is a real kill target.**
|
||||
- mutant.py asserts that the needle `"bus.tester": true` occurs exactly once, flips only that value,
|
||||
and restores in a finally block with a byte-equality check.
|
||||
- The value is asserted at test :66. mutant.log shows `not ok 1`, `false !== true`, `# fail 1`, and the
|
||||
restored sha256 85e6b9ac… equals the manifest.
|
||||
- The flip would also make the install case at :95 fail, because the install refuses with
|
||||
bus-tester-off.
|
||||
- **The run, as Goldie reported it (sage-3869 CLEAR, 31-byte TMPDIRs, on 571376c30). I didn't rerun it.**
|
||||
- The new file passed 7/7, the business suite 261/261, and the restored file 7/7 again.
|
||||
- The mutant was killed.
|
||||
- The earlier revoke-window red is the tools.sock length limit (session.mjs:278, dda2d07b4). It fails
|
||||
the same way on the bare base dd6cb5872, so it isn't this row's.
|
||||
|
||||
## Condition
|
||||
|
||||
- C1. Under mos-1561, the cli suite counts only from Sage's full gate on 6a0f0f4f8. This approval
|
||||
depends on that gate passing with no new failures.
|
||||
|
||||
## Notes
|
||||
|
||||
- N1 (doc). `launch` has no `limits`, so the business has no session ceiling. If Mos wants a cap on .53,
|
||||
it's a later launch-settings edit and doesn't need a new file.
|
||||
- N2 (doc). An install on .53 with no project file at /srv/mosaic/src/mosaic-stack still passes. It
|
||||
warns "no project variables" (cli.mjs:76), which the run sheet could mention.
|
||||
@@ -1,56 +0,0 @@
|
||||
# Row 324 round 1 verdict: goldie/row324-r2 dbdfcfd52 (duckworth-0298)
|
||||
|
||||
Request: sage-3853 (#1820, comment 31469, round 1, rev 3768/3769). Candidate: dbdfcfd52 on refactor
|
||||
3569bf54f, code commit 7e59ba8b3. Brief: docs/plans/2026-10-23_optional-tracker-brief.md.
|
||||
Method: static. Git reads of local objects only. No node, no tests, no fetch, no queue reads.
|
||||
|
||||
## Verdict: APPROVE (static)
|
||||
|
||||
- **The manifest matches.** agents/goldie/work/queue-324/MANIFEST.sha256 hashes to 52874356…2b473d,
|
||||
the digest Sage gave. All 8 listed blobs match the files at dbdfcfd52.
|
||||
- **The loader change is narrow.**
|
||||
- business.mjs:239 drops "tracker" from the required-key loop.
|
||||
- business.mjs:296 is `Object.hasOwn(document, "tracker") ? checkTracker(document.tracker, file) : null`.
|
||||
Omission gives `tracker: null`. A present key always goes through checkTracker.
|
||||
- business.mjs:298 guards the role tracker comparison on `tracker &&`. An absent business tracker
|
||||
doesn't waive the role pm tracker check, and the new test covers that.
|
||||
- **A present null still refuses.** checkTracker (business.mjs:85) calls requireObject first, so a
|
||||
present null, false, [] or a non-object refuses. {} and {sync:{}} refuse further in. The new
|
||||
refusal test covers each of them.
|
||||
- **Every business.tracker reader handles absence.** I read each hit in Goldie's reader-audit.txt and
|
||||
the two outside it in scripts:
|
||||
- bus runtime.mjs:131 registers `<business>/@sync` only under `b.tracker?.sync?.credentials`. An
|
||||
absent tracker registers nothing.
|
||||
- bus runtime.mjs:247 hashes `b.tracker?.sync ?? null`.
|
||||
- broker.mjs:6242 reads `b.tracker?.sync?.bot`. Broker 3969 and 4497 read the role-level tracker
|
||||
only.
|
||||
- cli.mjs:85 and webui reads.mjs:166 use `tracker?.sync?.credentials ?? {}`. The
|
||||
`b.tracker.sync.bot` inside the reads.mjs loop runs only when there are entries.
|
||||
- cli config.mjs:58 trackerFor returns null on an absent tracker before the vars check. bootConfig
|
||||
(config.mjs:138-139) sets config.trackers only for a non-null result.
|
||||
- tasks/adapter.mjs loads only for configured trackers (process.mjs:136), and its settings refuse
|
||||
with tracker-config at :25 before the :35 and :81 reads.
|
||||
- instance-settings.mjs:127 reads `old.tracker?.sync`.
|
||||
- stack-release.sh:2074 and :2120 use `b.tracker?.sync?.credentials`.
|
||||
- launch-settings, resolve, instances.mjs and public/bus.js:785 read role-level trackers only.
|
||||
conversation/controller exec.tracker is a different object.
|
||||
- **Writers don't serialize the loader's null.** The setters build `next` from the raw file bytes
|
||||
(organization.mjs:88-93), not from the loaded object, and validate before writing
|
||||
(organization.mjs:201, :208). A business file without a tracker stays without one.
|
||||
- **The brief's tests are there.**
|
||||
- business/tests/optional-tracker.test.mjs has 5 tests: omission loads null, CLI validate with the
|
||||
sync file gone, a present tracker preserved and frozen, the refusal set, and the role pm check.
|
||||
- cli/tests/optional-tracker.test.mjs has 4 tests: no trackers from bootConfig with tracker vars
|
||||
set, startBroker with no @sync credential, businessView with no credentials, and a present
|
||||
tracker with a missing token refusing credential-file.
|
||||
- The existing-tracker case runs through business.test.mjs unchanged apart from :98.
|
||||
- **The one old-test edit is in bounds.** business.test.mjs:98 drops "tracker" from the
|
||||
required-key loop, as mos-1556 allows.
|
||||
- **The run, as Goldie reported it (sage-3850 CLEAR, I didn't rerun it):** 5/5, 4/4 and
|
||||
business.test 21/21. The presence mutant at business.mjs:296 is killed, and the restore matched
|
||||
sha256 e76db421.
|
||||
|
||||
## Notes
|
||||
|
||||
- N1 (doc). The 'undefined' refusal case only exists in memory. A JSON file can't carry undefined,
|
||||
so on disk it is the same as omission. The test is still correct.
|
||||
@@ -1,8 +0,0 @@
|
||||
# Fethry
|
||||
|
||||
Builder seat, Codex gpt-6.1-sol, started by Mos under Q245 (mos-1506). Owns row 225 (C2-10b, handed over from Morgana).
|
||||
|
||||
No launcher in this directory. The seat runs as a T3 thread (thread 14f80e3c) and works in its own worktree. It has no
|
||||
credentials of its own; it pushes only its own `fethry/*` branches through the repository credential helper (mos-0981),
|
||||
never `refactor`, `main` or another seat's branch. Claude seats orchestrate and review (Q245). Registered by Sage on
|
||||
2026-10-23 so the queue can name the seat as row owner (store.mjs isSeatDir).
|
||||
@@ -0,0 +1,376 @@
|
||||
# Row 225 (C2-10b) Console chat: replies, citations, write notices, status line
|
||||
|
||||
Owner: Morgana, from sage-3582 (18:53Z 10-23). Base: origin/refactor 45dca69f6. Branch: morgana/row225.
|
||||
Brief: docs/plans/2026-10-20_case2-rows.md, C2-10b. Design: agents/gosalyn/work/case2/DESIGN.md 7.4,
|
||||
5.2 (the reply schema and the check result) and the write notice and `library.revert` (about line 286).
|
||||
|
||||
## Ruling on the dependency gap (sage-3591)
|
||||
|
||||
225 builds against the design contracts. `renderReply` stays pure, and the caller supplies the answers
|
||||
it can't know. The revert route proxies to the bus verb and shows the refusal code until the verb
|
||||
exists. Landing order: 225 lands after 217 (C2-06), not after 288 (C2-02). Sage adds `after 217` to
|
||||
row 225. Before 288 lands, the Revert button gets the bus's refusal and shows its code, as the brief
|
||||
allows.
|
||||
|
||||
## A1. The check result I assume (to 217, Launchpad)
|
||||
|
||||
The broker stores one check result with each agent-to-human message the guard passes. The Console reads
|
||||
it on the message row that `/api/chat/threads/<id>/messages` returns, under the key `check`:
|
||||
|
||||
```json
|
||||
{
|
||||
"check": {
|
||||
"citations": [
|
||||
{ "scope": "canon", "agent": null },
|
||||
{ "scope": "supporting", "agent": "acme/scribe" },
|
||||
{ "scope": "web", "agent": null }
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- `check` is `null` or absent on a message the guard didn't check: a human's message, a free-text reply,
|
||||
a notice, or a message from before 217.
|
||||
- `check.citations` has one entry per entry of the body's `citations`, in the same order.
|
||||
- `scope` is one of `canon`, `playground`, `supporting` and `web`. A url cite is `web`.
|
||||
- `agent` is the `Mosaic-Agent` trailer value, `<business>/<instance>`, from
|
||||
`git log -1 --format=%(trailers:key=Mosaic-Agent,valueonly) <commit> -- <path>`, or `null` when the
|
||||
file's last commit at `commit` carries none. A url cite has `agent: null`. The Console shows the
|
||||
agent-written label when `agent` is a nonempty string, and names the agent.
|
||||
|
||||
The Console trusts nothing in the body for scope or label. A cite with no matching check entry renders
|
||||
with no badge and no label. It doesn't fall back to a scope it worked out itself.
|
||||
|
||||
If 217 uses other names, I change mine to theirs before either of us pushes (sage-3591 item 1).
|
||||
|
||||
## A2. The revert verb I assume (to 288, Honker)
|
||||
|
||||
- Verb: `library.revert`. A human verb (design M4): from an agent session it refuses `human-required`,
|
||||
like `library.status` (`broker.mjs:5133`).
|
||||
- Args: `{ "project": <business project name>, "commit": <40 lowercase hex> }`. The design writes
|
||||
`library.revert {commit}`. `project` is added to match the other library verbs, and like theirs it is the
|
||||
key of `business.projects` (`mirror.mjs:31`), which is the chat project's `repo` link, not its UUID. Both are required, and no other key
|
||||
is allowed (`invalid-request`), as the other library verbs check with `keys(args, ...)`.
|
||||
- Result: `{ "project", "path", "reverted": <the commit given>, "commit": <the new commit> }`.
|
||||
- Refusal codes the Console shows by name:
|
||||
- `library-revert-not-agent`: `commit` has no `Mosaic-Agent` trailer for this business, or isn't
|
||||
reachable from the served commit.
|
||||
- `stale-base`: a later commit changed that path.
|
||||
- `human-required`, `invalid-request`, `project-not-configured`.
|
||||
- Before 288 lands, the bus refuses the verb (expected `unknown-verb`, `broker.mjs:6578`), and the Console
|
||||
shows that code.
|
||||
- HTTP status in the Console (`packages/webui/src/bus.mjs` `busStatus`): `stale-base` and
|
||||
`library-revert-not-agent` map to 409. Every other code keeps the existing mapping.
|
||||
|
||||
## A3. The status line
|
||||
|
||||
`GET /api/library/status?project=<id>` proxies `library.status {project}` through the existing
|
||||
`libraryStatus` option. `cli.mjs:110` already passes that option, but `startServer` doesn't read it.
|
||||
The status line shows:
|
||||
|
||||
- the served commit (7 characters) and its age;
|
||||
- `library-diverged` when the sync state names it;
|
||||
- the fetch error code;
|
||||
- the reply limits in force, and the keys that fell back;
|
||||
- the count of R-problems, linking to the list.
|
||||
|
||||
It reads the fields `readSyncState` returns at the base (`packages/library/src/mirror.mjs:232`). It shows
|
||||
any field 217 adds (the limits) only when present.
|
||||
|
||||
## A4. "Changed since" (ruled sage-3596)
|
||||
|
||||
Sage ruled that 217 supplies `last`. On a `thread.messages` row that carries `check`, each path cite's
|
||||
entry gets `last`, the file's last commit at the served tip, read when the message is read. When `last`
|
||||
is absent the Console marks nothing changed, and a test pins that.
|
||||
|
||||
One more field is needed, raised in morgana-0200. The cited `commit` is a library commit, not the
|
||||
file's own last commit, so a cite made at a commit that didn't touch the file would differ from `last`
|
||||
while the file is unchanged. I asked 217 to also store `file`, the file's last commit at the cited
|
||||
commit. That's `%H` from the same `git log -1 <commit> -- <path>` call that reads the trailer, so it
|
||||
costs no extra git call. The Console marks a cite changed when both `file` and `last` are 40-hex and
|
||||
differ. The cited commit is reachable from the served one (5.2), so `file` is an ancestor of `last`,
|
||||
and differing means newer. A missing or malformed `file` or `last` marks nothing.
|
||||
|
||||
The entry the Console reads, in full: `{ scope, agent, file?, last? }`.
|
||||
|
||||
## A5. `no-cited-answer` retires
|
||||
|
||||
`renderItems` and its `NOTICES` (`no-cited-answer`, `no-answer`, `turn-failed`) go. 217 sends the
|
||||
runner's fixed texts as plain bodies (design 5.2, "Runner texts"), and renderReply shows those as free
|
||||
text. Design 7.4 names no other notice than `library-write`, so nothing is lost (sage-3596 item 3).
|
||||
|
||||
## Files
|
||||
|
||||
Both deviations below were accepted in sage-3596 and are named in the manifest for Dewey. The brief owns these:
|
||||
|
||||
- `packages/library/src/render.mjs`: `renderReply` replaces `renderItems`.
|
||||
- `packages/library/src/index.mjs`: the export.
|
||||
- `packages/library/README.md`: the section.
|
||||
- `packages/library/tests/render.test.mjs`.
|
||||
|
||||
It also owns `bus.js`, its stylesheet, `serve.mjs` (only the two routes) and new webui tests. Two
|
||||
deviations, both recorded here:
|
||||
|
||||
- The chat view's message list is `packages/webui/src/public/chat.js:85` (`window.MosaicChat`), not
|
||||
`bus.js`. The reply, notice and Revert rendering goes in `chat.js` and `chat.css`. The status line
|
||||
goes in the chat thread view, so it is also in `chat.js`.
|
||||
- `packages/webui/src/console-bus.mjs` and `cli.mjs` each get one `libraryRevert` line, beside the
|
||||
existing `libraryStatus` wiring.
|
||||
|
||||
## Overlap with row 220 (C2-10a, Researcher, 3ef6da90d)
|
||||
|
||||
220 changes one line each in the webui tests discord.test.mjs, fixture.mjs, history-fixture.mjs,
|
||||
relaunch.test.mjs and return-flow.test.mjs. Its other paths are in control-board, conversation, discord
|
||||
and business. 225 doesn't touch those five files or those packages. Its webui tests are new files.
|
||||
|
||||
## Handoff to Fethry (mos-1501, Q245)
|
||||
|
||||
The row moved to Fethry (Codex, fethry/row225). Everything below is **untested**: no suite or single file
|
||||
has run on it, since a run needs Sage's CLEAR. Each changed file passes `node --check`.
|
||||
|
||||
Done in the handoff commit:
|
||||
|
||||
- `render.mjs` `renderReply(body, {check, changed, name})`; index export; README section;
|
||||
`render.test.mjs` rewritten. `renderItems` is gone from every package.
|
||||
- `serve.mjs`: `/render.mjs` static entry (owner and user file maps), `GET /api/library/status`
|
||||
(one `project` query, answer must name that project), `POST /api/library/revert` (save's boundary,
|
||||
strict `{project, commit}`, refusal shows the code, lost or unusable answer is `outcome-unknown`,
|
||||
never retried). Both are nulled for a granted user, and `userRoute` keeps them owner-only. The tester
|
||||
listener refuses `libraryRevert`.
|
||||
- `bus.mjs`: `library-revert-not-agent: 409`. That re-pins `packages/webui/src/bus.mjs` in
|
||||
`packages/bus/tests/channel-proof.test.mjs`, with a comment line, as row 254 did. It's a third deviation,
|
||||
in another package's test.
|
||||
- `console-bus.mjs` and `cli.mjs`: `libraryRevert`, beside `libraryStatus`.
|
||||
- `chat.js`: dynamic `import('/render.mjs')` (CSP is `script-src 'self'`); body text until it loads.
|
||||
Cites with a scope badge, the agent-written label, "changed since" from `file`/`last`, links only for
|
||||
https with `rel="noopener noreferrer"`. A notice gets a Revert button behind `confirm()`. The library
|
||||
status line goes under the thread heading.
|
||||
- `chat.css`: cite, badge, notice and status styles.
|
||||
- New tests: `packages/webui/tests/library-routes.test.mjs` and
|
||||
`packages/webui/tests/chat-replies-browser.test.mjs`. 220's five files are untouched.
|
||||
|
||||
Decisions made in the build:
|
||||
|
||||
- The library name is the chat project's `repo`. A project with no repo reads no status and its
|
||||
Revert does nothing.
|
||||
- These codes hide the status line: `project-not-declared`, `library-mapping-invalid`,
|
||||
`project-not-configured`, `not-configured` and `owner-only`.
|
||||
- Otherwise every code-repo thread, and every granted user, would show "unavailable".
|
||||
- Cost: a broken library mapping also hides the line. `library.status` from the CLI still shows it.
|
||||
- "Age" is the time since `lastFetch` ("fetched 5 min ago"), not the served commit's age, which the
|
||||
status doesn't carry.
|
||||
- The limits fields are assumed to be `replyLimits {requireCitation, citationsPerReply}` and
|
||||
`replyLimitsFallback [keys]`, and are shown only when present. **Not agreed with 217.** Confirm with
|
||||
Beakley and rename.
|
||||
- A notice body's shape is all the renderer checks. An agent in a business without a library could
|
||||
send a body that looks like a notice. The page would show it, but `library.revert` still refuses it.
|
||||
|
||||
Left:
|
||||
|
||||
1. Get CLEAR and run the webui and library suites, `channel-proof.test.mjs`, and the two new files whole.
|
||||
The browser test's selectors and waits have never run.
|
||||
2. Agree the limits field names with 217 (Beakley).
|
||||
3. Granted-user R6 G5 (`granted-user.test.mjs:252`) lists owner verbs by hand. Add `library.revert`
|
||||
once 288 lands.
|
||||
4. BUILD.md: the mutant list and the mos-1275 timeout plan.
|
||||
5. The manifest names the three deviations: chat.js and chat.css in place of bus.js, the console-bus and
|
||||
cli lines, and the channel-proof re-pin.
|
||||
|
||||
## Fethry continuation (2026-10-23, Q245)
|
||||
|
||||
Owner: Fethry, thread 14f80e3c-ace7-4793-a577-e1275ca09b0b. Branch fethry/row225.
|
||||
This file carries Morgana's complete BUILD.md above unchanged, recovered from 9a131e956
|
||||
(base 45dca69f6). Morgana stopped editing 225 at that handoff. Issue #1726; Dewey reviews.
|
||||
Sage owns queue moves, test slots, gate and landing. No Node/tests until Sage CLEAR
|
||||
(sage-3611); commits/pushes before the gate are explicitly Untested. No credential files read.
|
||||
|
||||
### Confirmed interfaces and rulings
|
||||
|
||||
- Beakley beakley-0004 confirms ordered check.citations {scope, agent, file, last}; a missing
|
||||
or malformed file/last means no changed marker. Fetched age accurately describes lastFetch.
|
||||
- Beakley's concrete library.status shape is replyLimits:
|
||||
{requireCitation, citationsPerReply, fallback: [keys], problem: 'reply-limits-unreadable' | null}.
|
||||
The inherited top-level replyLimitsFallback assumption is superseded. Show nested fallback and
|
||||
problem, with a browser regression test for each. No broker or policy change in this row.
|
||||
- Bubba bubba-0002 confirms A2 and the exact broker notice shape. fethry-0005 forwards the
|
||||
project-key correction: project is chat project.repo, not the chat UUID.
|
||||
- Keep the inherited ordinary-code-repo/granted-user status hiding behavior for now, but a
|
||||
library-mapping-invalid error should stay visible: hiding an invalid mapping hides diagnosis.
|
||||
Confirm this local UI choice through regression coverage and tell Sage/Dewey.
|
||||
|
||||
### Continuation plan and acceptance evidence
|
||||
|
||||
Spec: docs/plans/2026-10-20_case2-rows.md C2-10b; design 5.2 and 7.4;
|
||||
standing rulings sage-3591, sage-3596 and sage-3611. Implement inline in this existing isolated
|
||||
T3 worktree; use the existing candidate and tests, never restart the implementation.
|
||||
|
||||
1. Static audit the handoff against the contracts and inherited tests. Add failing coverage for
|
||||
nested limits fallback/problem, wrong-project revert receipts, missing file/last and invalid
|
||||
mapping visibility. Existing tests require Mos approval through Sage before further edits.
|
||||
2. On Sage CLEAR, run the new files whole and library renderer tests with per-test deadlines;
|
||||
record RED before changing uncovered behavior. Fix only demonstrated local defects. Run
|
||||
targeted GREEN, then the full relevant suites only within the authorized slot.
|
||||
3. Record exact commands, timings and output paths. Prepare mutant kill list below; run only on
|
||||
CLEAR, using isolated copies so the candidate is never temporarily changed for mutation.
|
||||
4. Freeze a manifest containing all source/test/doc changes and all three handoff deviations.
|
||||
Push only fethry/*, as additional commits. Send exact head/results to Dewey and Sage; cc Mos
|
||||
on pushes/blockers. Sage performs queue moves, gate and landing. No merge/release/live changes.
|
||||
|
||||
### Existing test changes requiring Mos OK through Sage (mos-1272)
|
||||
|
||||
Diff against 45dca69f6, inherited from Morgana 9a131e956:
|
||||
|
||||
| File | Added | Removed | Reason |
|
||||
| --- | ---: | ---: | --- |
|
||||
| packages/library/tests/render.test.mjs | 80 | 66 | Brief requires retiring renderItems and replacing its tests with renderReply coverage |
|
||||
| packages/bus/tests/channel-proof.test.mjs | 3 | 1 | bus.mjs gains library-revert-not-agent:409; refresh that source hash and document why |
|
||||
|
||||
No further edits to these files pending approval. No edits to row220's five tests.
|
||||
The new webui test files are additions against the row base.
|
||||
|
||||
### Timeout plan (mos-1275)
|
||||
|
||||
Every Node test run uses --test-concurrency=1 and --test-timeout=30000, under an outer timeout.
|
||||
New library/route files: outer 120s each; new browser file: outer 240s. Full library and channel-proof:
|
||||
outer 180s; full webui: outer 900s, MOSAIC_REQUIRE_EDITOR_BUILD=1. Full webui requires its own
|
||||
packages/webui npm ci per agents/README.md and Sage CLEAR. Output redirects to an evidence log;
|
||||
inspect tail, failure names and summary, never claim green from an exit alone. A timeout is a
|
||||
failed run: stop, report the exact command/phase/last output, and diagnose before retrying.
|
||||
Sage's gate owns every scripts/test-*.sh; no implicit slot or test authority from this plan.
|
||||
|
||||
### Mutant plan (pending CLEAR)
|
||||
|
||||
- M1: drop a path badge or the supporting label; cite browser assertions must fail.
|
||||
- M2: allow http/javascript links; renderer and browser safe-link assertions must fail.
|
||||
- M3: compare cited library commit to last instead of file to last, or treat a missing file/last as
|
||||
changed; changed-since assertions must fail, including same-file/different-library-commit.
|
||||
- M4: ignore nested fallback/problem; status browser tests must fail.
|
||||
- M5: remove a revert fence (send, identity, exact Origin or Fetch Metadata), strict key/commit
|
||||
validation or wrong-project receipt validation; route tests must fail with zero unexpected calls.
|
||||
- M6: retry a refused/unknown revert; single-call route/browser assertions must fail.
|
||||
- M7: remove granted-user library-route fence; owner-only route coverage must fail.
|
||||
|
||||
Progress: handoff and interfaces recovered; candidate untested. No completion claim.
|
||||
|
||||
Static evidence correction: the first pushed patch artifact used ordinary context lines, whose
|
||||
single-space blank context lines make git diff --check report whitespace in the artifact. Regenerated
|
||||
inherited-old-tests.patch with --unified=0; it is the same exact two-file change, applicable with
|
||||
git apply --unidiff-zero. No source or existing test changed for this correction.
|
||||
|
||||
Mutation kit authored at mutants.py (11 concrete mutations across M1-M7), Python AST parse only.
|
||||
It archives the committed packages plus their tracked fixture dependencies into disposable snapshots,
|
||||
links the existing dependency install read-only in practice (tests do not install), enforces exactly
|
||||
one mutation anchor and requires an assertion failure for a kill. It records source hashes before
|
||||
and after. It has not run; anchors for the planned fixes intentionally require those fixes first.
|
||||
No Node/tests/build/browser work has run in Fethry's session pending Sage CLEAR.
|
||||
|
||||
### Old-test approval and preservation condition (mos-1510, sage-3623)
|
||||
|
||||
Mos approves render.test.mjs +80/-66 and channel-proof.test.mjs +3/-1 exactly. No additional edits
|
||||
are permitted to either file without a new Mos OK through Sage. The condition on the renderer:
|
||||
|
||||
- The old malformed-body fixed-line behavior no longer applies. Design 5.2 now says any body
|
||||
outside the cited-object schema is free text whose text is the whole body. Rejecting it into a
|
||||
fixed line would hide human/free-text/older messages and the four fixed runner texts. The new
|
||||
render.test.mjs tests “free text renders as itself with no citations” and “a body without the
|
||||
reply or notice shape is free text: the whole body, no citations” explicitly cover this new rule.
|
||||
- The old no-options path-badge behavior still applies. The new render.test.mjs test “without a
|
||||
check result a path cite has no badge, no label and is never changed” covers it, and the browser
|
||||
test checks an unchecked path cite has no badge/label. No path inference fallback was added.
|
||||
|
||||
Dewey checks both against the frozen old-test delta. The two numstats remain 80/66 and 3/1.
|
||||
|
||||
### Test slot and shared protocol (sage-3623, beakley-0006)
|
||||
|
||||
Targeted lane A slot is planned around 19:47Z, after Gosalyn's 226 run and Sage's queue gap.
|
||||
Wait for explicit CLEAR; the scheduled time alone grants nothing. Hard stop 20:00Z for Sage's
|
||||
226 gate. Boyd's lane B bus/cli/business work is disjoint and does not count as a busy lane A.
|
||||
The three requested files are the library renderer test and the two new webui files, whole/serial.
|
||||
|
||||
Beakley confirms reply-protocol.mjs exports only GUARD_CODES (the seven guard refusal codes) and
|
||||
FIXED_TEXTS {empty, failed, uncited, tooLong}. It has no scope/notice constants or validator.
|
||||
renderReply defines none of those codes or runner texts: it already renders the fixed bodies as free
|
||||
text. It therefore needs no protocol import and no extra browser module route (beakley-0006).
|
||||
Do not add unused imports or redefine those shared codes/texts later.
|
||||
|
||||
2026-10-23T19:21:07Z dependency update (bubba-0006): Bubba's first static row288 push is
|
||||
origin/bubba/row288 c867cada9, explicitly Untested with no Node run. A2 library.revert uses the
|
||||
business.projects key; broker notice retains the exact agreed body. Bubba adds librarySave only
|
||||
in console-bus.mjs/cli.mjs and leaves libraryRevert wiring owned by 225. Preserve both callback
|
||||
changes when Sage integrates. No dependency merge or test run performed here; 225 still lands
|
||||
after 217 and may show unknown-verb until 288 lands.
|
||||
|
||||
## T1 targeted RED to GREEN (sage-3641, 2026-10-23T19:23Z)
|
||||
|
||||
All three files ran whole and serial, with TMPDIR=/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2,
|
||||
--test-concurrency=1 --test-timeout=30000 and outer timeout -k 10 (120s renderer, 120s routes,
|
||||
240s browser). Initial renderer 9/0 (0.105s), routes 9/3 (0.226s), browser 5/3 (5.630s).
|
||||
Final renderer 9/0 (0.105s), routes 12/0 (0.212s), browser 8/0 (5.284s). Logs in evidence/.
|
||||
|
||||
Production fixes after RED:
|
||||
- Reject a library.revert receipt with the wrong project as outcome-unknown; no retry.
|
||||
- Read replyLimits.fallback and display replyLimits.problem per beakley-0004/0006.
|
||||
- Show library-mapping-invalid in the status line; its hidden-status branch is covered by the
|
||||
browser refusal matrix once the nested-limits assertion passes. This diagnosis was made statically;
|
||||
the first RED exits that matrix at the preceding fallback assertion, so visibility itself has only
|
||||
a GREEN run, unlike the fallback/problem and wrong-project fixes.
|
||||
|
||||
Three assertion corrections in NEW handoff files (not pre-existing tests, per sage-3647):
|
||||
1. library-routes.test.mjs: POST /api/library/status in preview mode expects 403, because the existing
|
||||
global preview write fence runs before the GET-only route and returns read-only. The route remains
|
||||
GET-only and no callback fires on that POST. Do not weaken or bypass the fence to get 405.
|
||||
2. library-routes.test.mjs: project-not-declared expects 400, which busStatus already maps at the
|
||||
row base. The inherited 502 expectation contradicted that existing map. No production map change.
|
||||
3. chat-replies-browser.test.mjs: coerce the whole “img element OR window.injected” expression to a
|
||||
Boolean. With no injected node/code the old expression returns undefined, not false. Assertions
|
||||
still require neither DOM injection nor executed handler. All preceding cite/link assertions pass.
|
||||
|
||||
Frozen pre-existing test deltas still render.test.mjs 80/66 and channel-proof.test.mjs 3/1.
|
||||
No Node/Chromium process with this slot TMPDIR remained after targeted tests (checked /proc).
|
||||
|
||||
Expanded CLEAR sage-3647: full library, then channel-proof whole, then isolated mutants that fit;
|
||||
still hard stop 19:38Z. No full webui suite, npm ci or editor build authorized in this window.
|
||||
|
||||
Expanded-slot evidence: full library 81/0 (9.179s), channel-proof 2/0 (0.573s), whole/serial,
|
||||
--test-timeout=30000, outer timeout -k 10 180, same TMPDIR. Logs copied to evidence/.
|
||||
To exercise invalid-mapping visibility independently, added its own browser case and temporarily
|
||||
restored only the hidden-mapping branch. Whole browser RED: 7/2 (8.810s); the direct assertion sees
|
||||
null instead of the diagnostic, and the refusal-matrix wait also fails. Finally restored the exact
|
||||
corrected source before the next run. This supersedes the earlier visibility “GREEN only” note.
|
||||
|
||||
Final targeted coverage before mutation: browser 9/0 (6014.970ms runner duration), routes 13/0.
|
||||
Added an independent send-off test with a configured libraryRevert callback: absence of --send
|
||||
still refuses with zero callback calls. This makes the send fence independently mutation-testable.
|
||||
The kit now has 14 concrete mutations, including agent-label, unreadable-limits problem and send.
|
||||
Each isolated target is restored to its candidate SHA256, and worktree hashes are checked before
|
||||
continuing to the next mutant (sage-3647). Runner uses TAP so assertion failures can be distinguished
|
||||
from timeouts/import/process failures. Full webui/build and the integration gate remain pending.
|
||||
|
||||
Dependency update beakley-0008: row217 first push origin/beakley/row217 c25f5b8da is UNTESTED,
|
||||
continued from Launchpad e25ef0373. No dependency merge here; its protocol/module mount belongs to
|
||||
217 and renderReply needs none of those codes/texts. Integration acceptance remains Sage's gate.
|
||||
|
||||
First isolated-mutant attempt stopped honestly at M3-wrong-commit: M1 badge, M1 agent label and M2
|
||||
https-only link mutants were killed by assertions; M3 failed via the browser's expected-state wait,
|
||||
so the strict runner did NOT count it as a kill. Every target restored/hash-checked and candidate
|
||||
hashes unchanged. Logs retained in evidence/mutants-attempt1/. Corrected the new browser test to wait
|
||||
for a completed repaint (independent of desired output), then assert changed-marker count. Whole
|
||||
browser baseline remains 9/0. No production change. Re-run the whole isolated kit against this test.
|
||||
|
||||
## T1 complete: isolated mutants and source-review handoff
|
||||
|
||||
sage-3647 final kit on source candidate 507901277: 14/14 assertion kills, no timeout/import/process
|
||||
failure counted. Each mutant matched one anchor, restored the target SHA256 and checked the three
|
||||
candidate source hashes before the next. evidence/mutants-final/summary.json records every result;
|
||||
final worktreeUnchanged=true. Logs name the failing tests, including M3's direct assertion after the
|
||||
refresh wait correction. /proc inspection found no remaining Node/Chromium process with the slot
|
||||
TMPDIR. Returned lane A to Sage as fethry-0016 at about19:29Z, before the19:38Z hard stop.
|
||||
|
||||
Checked-in TAP display copies remove trailing whitespace so the diff is clean. Their raw SHA256
|
||||
values are recorded in evidence/raw-log-provenance.json; original byte-for-byte logs remain under
|
||||
/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2. This changes evidence presentation only, never tests.
|
||||
|
||||
MANIFEST.md and manifest.r1.sha256 freeze the13 changed package files for Dewey. All three handoff
|
||||
deviations and Mos1510's two preservation conditions are explicit. Old-test numstats remain80/66 and3/1.
|
||||
No full webui/npm ci/build was run; Sage explicitly reserved it for a later window. Full package/script
|
||||
and dependency integration gate remains required before landing. No queue move, merge or live action.
|
||||
@@ -0,0 +1,67 @@
|
||||
# Row 225 review packet — C2-10b (#1726)
|
||||
|
||||
Owner Fethry (14f80e3c), reviewer Dewey (84fb346c). Base 45dca69f6.
|
||||
Source candidate 507901277 continues Morgana 66f7becf2 and 9a131e956; no rewritten history.
|
||||
Status: targeted tests and full library green; full webui/build and Sage's full gate still pending.
|
||||
This packet requests source/manifest review, not landing or a full-green claim.
|
||||
|
||||
## Behavior and contracts
|
||||
|
||||
The Console shows reply text and citations with path/line/quote, scope and agent-written labels,
|
||||
marks a changed file only with valid differing check.file/check.last, links only https URLs, shows
|
||||
write/delete notices and explicit Revert results, and displays library status, fetch age, divergence,
|
||||
fetch errors, nested replyLimits metadata and R-problems. Invalid library mappings remain visible.
|
||||
Revert validates {project,commit}, preserves refusal codes and reports uncertain/wrong-project
|
||||
receipts as outcome-unknown without retry. The project is chat project.repo (business.projects key).
|
||||
|
||||
A1-A5 are in BUILD.md. Dependency contracts: row217 ordered check.citations and nested replyLimits;
|
||||
row288 A2 revert result/notice. No dependency merge in this candidate. Landing order is 217 then225;
|
||||
unknown-verb is expected until288 lands. Beakley's GUARD_CODES/FIXED_TEXTS need no renderer import:
|
||||
renderReply defines neither and renders those fixed bodies as free text.
|
||||
|
||||
## Frozen implementation and tests
|
||||
|
||||
manifest.r1.sha256 freezes the 13 changed package paths, including the two approved existing-test
|
||||
changes. Check from repository root with `sha256sum -c agents/fethry/work/queue-225/manifest.r1.sha256`.
|
||||
All other changed files are BUILD/session records, handoff/approval evidence and this review packet.
|
||||
No role, policy, schema, secret, live instance, deployment or queue change is included.
|
||||
|
||||
Three departures from the brief, carried from Morgana's handoff:
|
||||
|
||||
1. Chat rendering/status live in public/chat.js and chat.css, where the message list is, instead of
|
||||
bus.js and its stylesheet (sage-3596). serve.mjs serves the same pure render.mjs module to owner
|
||||
and granted-user pages; no duplicated browser renderer and no generated asset.
|
||||
2. console-bus.mjs and cli.mjs wire libraryRevert beside libraryStatus (sage-3596). --send still
|
||||
independently gates Revert. Preserve row288's separate librarySave wiring at integration.
|
||||
3. webui/src/bus.mjs maps library-revert-not-agent to409; bus/tests/channel-proof.test.mjs re-pins
|
||||
only that source's hash and documents why. Mos read and approved this exact +3/-1 (mos-1510).
|
||||
|
||||
Existing-test authority: Mos1510 via Sage3623 approves render.test.mjs +80/-66 and channel-proof +3/-1.
|
||||
Both exact numstats are unchanged. The malformed-body fixed-line rule is superseded by design5.2's
|
||||
whole-body free text, covered by two replacement renderer tests. The old no-options path-badge rule
|
||||
is retained and covered by the replacement test plus unchecked-cite browser coverage. BUILD.md
|
||||
explains these two preservation conditions and the three new-file assertion corrections in detail.
|
||||
|
||||
## Verification and remaining gate
|
||||
|
||||
Evidence logs are under evidence/; commands, deadlines, failures and corrections are in BUILD.md.
|
||||
Targeted whole-file tests: renderer9/0, routes13/0, browser9/0. Full library81/0, channel-proof2/0.
|
||||
No skips/cancellations. Invalid-mapping visibility also has an independent RED then GREEN.
|
||||
All 14 isolated mutants were killed by assertions on source candidate507901277; each mutation
|
||||
matched one anchor, restored its source hash, and verified unchanged candidate hashes before the next
|
||||
mutation. Summary: evidence/mutants-final/summary.json. The first attempt stopped at an expected-state
|
||||
wait (not counted as a kill), then the new browser test was improved and the whole kit rerun.
|
||||
Raw logs remain under the scratch root; checked-in display copies trim trailing whitespace and record
|
||||
raw digests in evidence/raw-log-provenance.json.
|
||||
|
||||
Before landing, Sage still runs full webui with MOSAIC_REQUIRE_EDITOR_BUILD=1 after the worktree-local
|
||||
webui npm ci, every applicable package/script suite and integration against217. No full webui/build
|
||||
in T1 (sage-3647). Dewey approval and Sage's gate/landing remain required; queue moves belong to Sage.
|
||||
|
||||
Static audit: the channel-proof source pin matches webui bus.mjs; no hash pin of bus.js, serve.mjs
|
||||
or library render.mjs was found. packages' only remaining renderItems match is an explanatory comment
|
||||
in the frozen replacement test; no runtime export, import or call remains. No no-cited-answer match.
|
||||
|
||||
Review focus: stored check metadata versus untrusted body, missing/malformed file/last, https-only
|
||||
links and inert hostile text, Revert authority/receipt uncertainty, async route/sign-out isolation,
|
||||
and status diagnostics without owner transport leakage to a granted user.
|
||||
@@ -0,0 +1,64 @@
|
||||
TAP version 13
|
||||
# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
ok 1 - chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
---
|
||||
duration_ms: 704.129155
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
ok 2 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
---
|
||||
duration_ms: 690.249337
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a read-only Console shows the notice with Revert disabled
|
||||
ok 3 - chat replies: a read-only Console shows the notice with Revert disabled
|
||||
---
|
||||
duration_ms: 595.036289
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
ok 4 - chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
---
|
||||
duration_ms: 627.082447
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: limits when the status carries them, no problems, and refusals
|
||||
ok 5 - chat status line: limits when the status carries them, no problems, and refusals
|
||||
---
|
||||
duration_ms: 787.799722
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: a project with no repository link reads no library status
|
||||
ok 6 - chat status line: a project with no repository link reads no library status
|
||||
---
|
||||
duration_ms: 587.311743
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
ok 7 - chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
---
|
||||
duration_ms: 618.209773
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
ok 8 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
---
|
||||
duration_ms: 633.838649
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: an invalid library mapping remains visible for diagnosis
|
||||
ok 9 - chat status line: an invalid library mapping remains visible for diagnosis
|
||||
---
|
||||
duration_ms: 619.313248
|
||||
type: 'test'
|
||||
...
|
||||
1..9
|
||||
# tests 9
|
||||
# suites 0
|
||||
# pass 9
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 6014.970062
|
||||
@@ -0,0 +1,64 @@
|
||||
TAP version 13
|
||||
# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
ok 1 - chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
---
|
||||
duration_ms: 636.096036
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
ok 2 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
---
|
||||
duration_ms: 741.239029
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a read-only Console shows the notice with Revert disabled
|
||||
ok 3 - chat replies: a read-only Console shows the notice with Revert disabled
|
||||
---
|
||||
duration_ms: 568.879998
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
ok 4 - chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
---
|
||||
duration_ms: 641.929005
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: limits when the status carries them, no problems, and refusals
|
||||
ok 5 - chat status line: limits when the status carries them, no problems, and refusals
|
||||
---
|
||||
duration_ms: 870.041985
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: a project with no repository link reads no library status
|
||||
ok 6 - chat status line: a project with no repository link reads no library status
|
||||
---
|
||||
duration_ms: 648.87451
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
ok 7 - chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
---
|
||||
duration_ms: 566.725897
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
ok 8 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
---
|
||||
duration_ms: 611.150846
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: an invalid library mapping remains visible for diagnosis
|
||||
ok 9 - chat status line: an invalid library mapping remains visible for diagnosis
|
||||
---
|
||||
duration_ms: 618.488891
|
||||
type: 'test'
|
||||
...
|
||||
1..9
|
||||
# tests 9
|
||||
# suites 0
|
||||
# pass 9
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 6014.364529
|
||||
@@ -0,0 +1,16 @@
|
||||
✔ chat replies: free text, cites with badges, the agent label, changed since and safe links (583.234335ms)
|
||||
✔ chat replies: a write notice reads as its line with a Revert; a refused revert shows its code (634.71741ms)
|
||||
✔ chat replies: a read-only Console shows the notice with Revert disabled (574.836149ms)
|
||||
✔ chat status line: served commit and age, divergence, fetch error and the problems one click away (607.74749ms)
|
||||
✔ chat status line: limits when the status carries them, no problems, and refusals (861.034669ms)
|
||||
✔ chat status line: a project with no repository link reads no library status (611.433469ms)
|
||||
✔ chat status line: unreadable reply limits show their problem and both fallback keys (606.380675ms)
|
||||
✔ chat replies: unchanged file at a different library commit and incomplete checks stay unmarked (650.947719ms)
|
||||
ℹ tests 8
|
||||
ℹ suites 0
|
||||
ℹ pass 8
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 5251.735356
|
||||
@@ -0,0 +1,78 @@
|
||||
✖ chat replies: free text, cites with badges, the agent label, changed since and safe links (980.914799ms)
|
||||
✔ chat replies: a write notice reads as its line with a Revert; a refused revert shows its code (753.988771ms)
|
||||
✔ chat replies: a read-only Console shows the notice with Revert disabled (672.814814ms)
|
||||
✔ chat status line: served commit and age, divergence, fetch error and the problems one click away (622.859977ms)
|
||||
✖ chat status line: limits when the status carries them, no problems, and refusals (583.956229ms)
|
||||
✔ chat status line: a project with no repository link reads no library status (635.758222ms)
|
||||
✖ chat status line: unreadable reply limits show their problem and both fallback keys (581.636121ms)
|
||||
✔ chat replies: unchanged file at a different library commit and incomplete checks stay unmarked (653.788881ms)
|
||||
ℹ tests 8
|
||||
ℹ suites 0
|
||||
ℹ pass 5
|
||||
ℹ fail 3
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 5597.371605
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/webui/tests/chat-replies-browser.test.mjs:81:1
|
||||
✖ chat replies: free text, cites with badges, the agent label, changed since and safe links (980.914799ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ undefined
|
||||
- false
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row225/packages/webui/tests/chat-replies-browser.test.mjs:102:10)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: false,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/webui/tests/chat-replies-browser.test.mjs:152:1
|
||||
✖ chat status line: limits when the status carries them, no problems, and refusals (583.956229ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ 'Library at ccccccc · fetched 5 min ago · citations required, up to 4 per reply · no problems'
|
||||
- 'Library at ccccccc · fetched 5 min ago · citations required, up to 4 per reply · limits fell back: citationsPerReply · no problems'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row225/packages/webui/tests/chat-replies-browser.test.mjs:156:10)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 'Library at ccccccc · fetched 5 min ago · citations required, up to 4 per reply · no problems',
|
||||
expected: 'Library at ccccccc · fetched 5 min ago · citations required, up to 4 per reply · limits fell back: citationsPerReply · no problems',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/webui/tests/chat-replies-browser.test.mjs:173:1
|
||||
✖ chat status line: unreadable reply limits show their problem and both fallback keys (581.636121ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ 'Library at ccccccc · fetched 5 min ago · citations optional, up to 8 per reply · no problems'
|
||||
- 'Library at ccccccc · fetched 5 min ago · citations optional, up to 8 per reply · limits fell back: requireCitation, citationsPerReply · reply-limits-unreadable · no problems'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row225/packages/webui/tests/chat-replies-browser.test.mjs:179:10)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 'Library at ccccccc · fetched 5 min ago · citations optional, up to 8 per reply · no problems',
|
||||
expected: 'Library at ccccccc · fetched 5 min ago · citations optional, up to 8 per reply · limits fell back: requireCitation, citationsPerReply · reply-limits-unreadable · no problems',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
TAP version 13
|
||||
# Subtest: channel conversion preserves the four proof/transport byte baselines and modules cannot import a proof caller
|
||||
ok 1 - channel conversion preserves the four proof/transport byte baselines and modules cannot import a proof caller
|
||||
---
|
||||
duration_ms: 4.280459
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: channel recovery still requires the same shim path and rejects an absent or forged proof
|
||||
ok 2 - channel recovery still requires the same shim path and rejects an absent or forged proof
|
||||
---
|
||||
duration_ms: 413.032186
|
||||
type: 'test'
|
||||
...
|
||||
1..2
|
||||
# tests 2
|
||||
# suites 0
|
||||
# pass 2
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 539.602759
|
||||
@@ -0,0 +1,496 @@
|
||||
TAP version 13
|
||||
# Subtest: resolver step 1: a path from the repo root, with or without .md
|
||||
ok 1 - resolver step 1: a path from the repo root, with or without .md
|
||||
---
|
||||
duration_ms: 1.051208
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: resolver step 2: the same path with vaultPrefix/ stripped
|
||||
ok 2 - resolver step 2: the same path with vaultPrefix/ stripped
|
||||
---
|
||||
duration_ms: 0.164795
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: resolver step 3: a path relative to the linking file, never above the repo root
|
||||
ok 3 - resolver step 3: a path relative to the linking file, never above the repo root
|
||||
---
|
||||
duration_ms: 0.192765
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: resolver step 4: a base name that matches exactly one indexed file
|
||||
ok 4 - resolver step 4: a base name that matches exactly one indexed file
|
||||
---
|
||||
duration_ms: 0.201611
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a link into another of her repos resolves to nothing
|
||||
ok 5 - a link into another of her repos resolves to nothing
|
||||
---
|
||||
duration_ms: 0.130282
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: wikilink forms, embeds, and links skipped inside code
|
||||
ok 6 - wikilink forms, embeds, and links skipped inside code
|
||||
---
|
||||
duration_ms: 1.445011
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: only a body embed whose target has an extension other than .md, in any case, is an attachment
|
||||
ok 7 - only a body embed whose target has an extension other than .md, in any case, is an attachment
|
||||
---
|
||||
duration_ms: 0.25003
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the fixture mapping checks and comes back frozen
|
||||
ok 8 - the fixture mapping checks and comes back frozen
|
||||
---
|
||||
duration_ms: 1.772928
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-01c: a prefix inside or holding another entry's book refuses library-playground-other-universe
|
||||
ok 9 - C2-01c: a prefix inside or holding another entry's book refuses library-playground-other-universe
|
||||
---
|
||||
duration_ms: 0.735312
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-01c: a prefix equal to a book folder, or holding its own, refuses library-mapping-invalid
|
||||
ok 10 - C2-01c: a prefix equal to a book folder, or holding its own, refuses library-mapping-invalid
|
||||
---
|
||||
duration_ms: 0.532498
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-01c: universe-level prefixes lie outside every book, in a plain universe and in a hybrid with no books
|
||||
ok 11 - C2-01c: universe-level prefixes lie outside every book, in a plain universe and in a hybrid with no books
|
||||
---
|
||||
duration_ms: 0.668173
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-01c: a draft takes kind, name and playground only, and comes back frozen with books []
|
||||
ok 12 - C2-01c: a draft takes kind, name and playground only, and comes back frozen with books []
|
||||
---
|
||||
duration_ms: 1.032507
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: no playground prefix holds another, and no book folder holds another
|
||||
ok 13 - no playground prefix holds another, and no book folder holds another
|
||||
---
|
||||
duration_ms: 0.507943
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: shape refusals: kind, remote, branch, unknown keys, types, manuscript, folder names
|
||||
ok 14 - shape refusals: kind, remote, branch, unknown keys, types, manuscript, folder names
|
||||
---
|
||||
duration_ms: 0.740368
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a sage-2021: user is optional, kept when given, and must be a plain account name
|
||||
ok 15 - C2-03a sage-2021: user is optional, kept when given, and must be a plain account name
|
||||
---
|
||||
duration_ms: 0.659277
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a hybrid universe is a shape the query code can take (1.4), with sources that must exist
|
||||
ok 16 - a hybrid universe is a shape the query code can take (1.4), with sources that must exist
|
||||
---
|
||||
duration_ms: 0.695117
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a caller-supplied fail receives the code, as business file loading will pass it (C2-04)
|
||||
ok 17 - a caller-supplied fail receives the code, as business file loading will pass it (C2-04)
|
||||
---
|
||||
duration_ms: 0.392362
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: scope comes from the path alone (design 1.2)
|
||||
ok 18 - scope comes from the path alone (design 1.2)
|
||||
---
|
||||
duration_ms: 0.466406
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 mirror: exact default path, bare without checkout or remote, and idempotent initialization
|
||||
ok 19 - C2-04 mirror: exact default path, bare without checkout or remote, and idempotent initialization
|
||||
---
|
||||
duration_ms: 46.645994
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 mirror: simultaneous creators publish one intact mirror and leave no staging paths
|
||||
ok 20 - C2-04 mirror: simultaneous creators publish one intact mirror and leave no staging paths
|
||||
---
|
||||
duration_ms: 32.763959
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 mirror: skipped publication accepts both coreutils statuses without removing the winner
|
||||
ok 21 - C2-04 mirror: skipped publication accepts both coreutils statuses without removing the winner
|
||||
---
|
||||
duration_ms: 109.751094
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 mirror: preserve occupied directories and reject symlink ancestors and code overlaps
|
||||
ok 22 - C2-04 mirror: preserve occupied directories and reject symlink ancestors and code overlaps
|
||||
---
|
||||
duration_ms: 20.129293
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 mirror: existing metadata accepts only bare Git plus state and the precreated lock
|
||||
ok 23 - C2-04 mirror: existing metadata accepts only bare Git plus state and the precreated lock
|
||||
---
|
||||
duration_ms: 24.021555
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 state: missing state is empty only while the served ref is absent
|
||||
ok 24 - C2-04 state: missing state is empty only while the served ref is absent
|
||||
---
|
||||
duration_ms: 37.436349
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 state: valid problems and sync metadata return no content and change no state bytes
|
||||
ok 25 - C2-04 state: valid problems and sync metadata return no content and change no state bytes
|
||||
---
|
||||
duration_ms: 37.681315
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 state: strict keys, types, times, branch, commit and fixed R messages fail closed
|
||||
ok 26 - C2-04 state: strict keys, types, times, branch, commit and fixed R messages fail closed
|
||||
---
|
||||
duration_ms: 105.483341
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 state: symlink, hardlink, non-private state and missing lock refuse without replacement
|
||||
ok 27 - C2-04 state: symlink, hardlink, non-private state and missing lock refuse without replacement
|
||||
---
|
||||
duration_ms: 29.562786
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 file: served commit, not HEAD or a caller commit, owns the exact returned text
|
||||
ok 28 - C2-04 file: served commit, not HEAD or a caller commit, owns the exact returned text
|
||||
---
|
||||
duration_ms: 74.057232
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 file: R1, R2 and R7 exclusions and never-synced mirrors cannot return file bodies
|
||||
ok 29 - C2-04 file: R1, R2 and R7 exclusions and never-synced mirrors cannot return file bodies
|
||||
---
|
||||
duration_ms: 80.573844
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 lock: a first-sync and fast-forward reader wait for a consistent pair across processes
|
||||
ok 30 - C2-04 lock: a first-sync and fast-forward reader wait for a consistent pair across processes
|
||||
---
|
||||
duration_ms: 253.247948
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 lock: same-process waits, timeout code, callback expiry and throw release
|
||||
ok 31 - C2-04 lock: same-process waits, timeout code, callback expiry and throw release
|
||||
---
|
||||
duration_ms: 5031.462795
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 lock: owner death releases the kernel lock without replacing its file
|
||||
ok 32 - C2-04 lock: owner death releases the kernel lock without replacing its file
|
||||
---
|
||||
duration_ms: 61.533295
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 lock: a missing flock binary becomes a handled refusal
|
||||
ok 33 - C2-04 lock: a missing flock binary becomes a handled refusal
|
||||
---
|
||||
duration_ms: 57.176644
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-04 lock: an unawaited scoped read drains before the lock is released
|
||||
ok 34 - C2-04 lock: an unawaited scoped read drains before the lock is released
|
||||
---
|
||||
duration_ms: 22.766874
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the fixture reads clean: every resolver step, appears_in and relationships wikilinks indexed
|
||||
ok 35 - the fixture reads clean: every resolver step, appears_in and relationships wikilinks indexed
|
||||
---
|
||||
duration_ms: 33.888061
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: R1: executables, symlinks, gitlinks, blobs over 1 MiB and non-UTF-8 text are not indexed
|
||||
ok 36 - R1: executables, symlinks, gitlinks, blobs over 1 MiB and non-UTF-8 text are not indexed
|
||||
---
|
||||
duration_ms: 68.951498
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: R2: unmapped paths are reported and not indexed
|
||||
ok 37 - R2: unmapped paths are reported and not indexed
|
||||
---
|
||||
duration_ms: 25.70771
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: R3: front matter not fully parsed stays raw, with the line where parsing stopped
|
||||
ok 38 - R3: front matter not fully parsed stays raw, with the line where parsing stopped
|
||||
---
|
||||
duration_ms: 26.059427
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: front matter forms the reader accepts and refuses
|
||||
ok 39 - front matter forms the reader accepts and refuses
|
||||
---
|
||||
duration_ms: 0.448293
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: R4: a link to no file, to more than one, or into another repo is reported and not followed
|
||||
ok 40 - R4: a link to no file, to more than one, or into another repo is reported and not followed
|
||||
---
|
||||
duration_ms: 26.225692
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a block list link carries its item line, a scalar or flow link its key line, and problems follow
|
||||
ok 41 - a block list link carries its item line, a scalar or flow link its key line, and problems follow
|
||||
---
|
||||
duration_ms: 22.565103
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: an unresolved attachment embed gives no problem; a link or front matter value to one is R4; a note embed resolves
|
||||
ok 42 - an unresolved attachment embed gives no problem; a link or front matter value to one is R4; a note embed resolves
|
||||
---
|
||||
duration_ms: 20.903777
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: an indexed Dr.Quinn.md resolves as a body link, a block list link and an embed
|
||||
ok 43 - an indexed Dr.Quinn.md resolves as a body link, a block list link and an embed
|
||||
---
|
||||
duration_ms: 25.42747
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: R5: a canon file that refers into the playground is reported, and the link still goes by path
|
||||
ok 44 - R5: a canon file that refers into the playground is reported, and the link still goes by path
|
||||
---
|
||||
duration_ms: 27.37119
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: R6: a canon file that refers into another universe is reported; a hybrid may refer into its sources
|
||||
ok 45 - R6: a canon file that refers into another universe is reported; a hybrid may refer into its sources
|
||||
---
|
||||
duration_ms: 30.585458
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: R7: two paths that differ only in case are both left out
|
||||
ok 46 - R7: two paths that differ only in case are both left out
|
||||
---
|
||||
duration_ms: 40.709509
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the reader reads the commit, never the working tree, and refuses a bad commit id
|
||||
ok 47 - the reader reads the commit, never the working tree, and refuses a bad commit id
|
||||
---
|
||||
duration_ms: 33.579454
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a bare mirror reads the same as the clone
|
||||
ok 48 - a bare mirror reads the same as the clone
|
||||
---
|
||||
duration_ms: 38.368686
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: free text renders as itself with no citations
|
||||
ok 49 - free text renders as itself with no citations
|
||||
---
|
||||
duration_ms: 1.571777
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a cited reply renders its text, then each cite with the badge from the check result
|
||||
ok 50 - a cited reply renders its text, then each cite with the badge from the check result
|
||||
---
|
||||
duration_ms: 0.537429
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a parsed body renders as its string does
|
||||
ok 51 - a parsed body renders as its string does
|
||||
---
|
||||
duration_ms: 0.304068
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: without a check result a path cite has no badge, no label and is never changed
|
||||
ok 52 - without a check result a path cite has no badge, no label and is never changed
|
||||
---
|
||||
duration_ms: 0.184363
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the label and the badge come from the check result only, never from a bad entry
|
||||
ok 53 - the label and the badge come from the check result only, never from a bad entry
|
||||
---
|
||||
duration_ms: 0.180581
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a web cite is a link only for https
|
||||
ok 54 - a web cite is a link only for https
|
||||
---
|
||||
duration_ms: 0.293669
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a write notice renders its fixed line
|
||||
ok 55 - a write notice renders its fixed line
|
||||
---
|
||||
duration_ms: 0.277197
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a body without the reply or notice shape is free text: the whole body, no citations
|
||||
ok 56 - a body without the reply or notice shape is free text: the whole body, no citations
|
||||
---
|
||||
duration_ms: 0.345807
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: an empty citations list is a reply with no cites
|
||||
ok 57 - an empty citations list is a reply with no cites
|
||||
---
|
||||
duration_ms: 0.187354
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-01c: each level gives its universe, and its book or null
|
||||
ok 58 - C2-01c: each level gives its universe, and its book or null
|
||||
---
|
||||
duration_ms: 3.363132
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-01c: prefixes come first: in a book that holds a prefix, a file outside it is canon and one under it playground
|
||||
ok 59 - C2-01c: prefixes come first: in a book that holds a prefix, a file outside it is canon and one under it playground
|
||||
---
|
||||
duration_ms: 0.480483
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-01c: a canon file linking into a draft gives R6, and into its own universe-level prefix gives R5
|
||||
ok 60 - C2-01c: a canon file linking into a draft gives R6, and into its own universe-level prefix gives R5
|
||||
---
|
||||
duration_ms: 44.606565
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the survey prints folder names, counts, key sets and link-form counts, and never text
|
||||
ok 61 - the survey prints folder names, counts, key sets and link-form counts, and never text
|
||||
---
|
||||
duration_ms: 37.28555
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: folder names print DEL, C1 and bidi controls, U+061C among them, as escapes
|
||||
ok 62 - folder names print DEL, C1 and bidi controls, U+061C among them, as escapes
|
||||
---
|
||||
duration_ms: 26.222951
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: an embed of an attachment counts as an embed and as an attachment; a plain link to one does not
|
||||
ok 63 - an embed of an attachment counts as an embed and as an attachment; a plain link to one does not
|
||||
---
|
||||
duration_ms: 26.23793
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: with --mapping the survey adds scope, resolver step and problem counts
|
||||
ok 64 - with --mapping the survey adds scope, resolver step and problem counts
|
||||
---
|
||||
duration_ms: 41.437066
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: survey exit codes: usage 4, bad mapping 3, unreadable repo 2
|
||||
ok 65 - survey exit codes: usage 4, bad mapping 3, unreadable repo 2
|
||||
---
|
||||
duration_ms: 17.463059
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: scripts/mosaic library survey reaches the survey
|
||||
ok 66 - scripts/mosaic library survey reaches the survey
|
||||
---
|
||||
duration_ms: 77.634947
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a argv: the fixed sequence, one https allow, no other protocol key
|
||||
ok 67 - C2-03a argv: the fixed sequence, one https allow, no other protocol key
|
||||
---
|
||||
duration_ms: 1.605597
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a argv: only an https URL with a plain host, no userinfo, and a plain user
|
||||
ok 68 - C2-03a argv: only an https URL with a plain host, no userinfo, and a plain user
|
||||
---
|
||||
duration_ms: 0.713147
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a helper: answers only the exact prompts for the configured host and user (dewey-0765)
|
||||
ok 69 - C2-03a helper: answers only the exact prompts for the configured host and user (dewey-0765)
|
||||
---
|
||||
duration_ms: 31.590474
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a first sync: served is the fetched tip, HEAD is served, the survey reads it, and the token stays in the slot
|
||||
ok 70 - C2-03a first sync: served is the fetched tip, HEAD is served, the survey reads it, and the token stays in the slot
|
||||
---
|
||||
duration_ms: 135.075159
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a fast-forward: served moves, problems are rebuilt, and a repeat changes only lastFetch
|
||||
ok 71 - C2-03a fast-forward: served moves, problems are rebuilt, and a repeat changes only lastFetch
|
||||
---
|
||||
duration_ms: 225.707972
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a Filbert N2: a read that took served before a sync still finds its objects after served moves
|
||||
ok 72 - C2-03a Filbert N2: a read that took served before a sync still finds its objects after served moves
|
||||
---
|
||||
duration_ms: 205.10431
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a overlap: a reader during a sync sees the old pair or the new one, never a mix
|
||||
ok 73 - C2-03a overlap: a reader during a sync sees the old pair or the new one, never a mix
|
||||
---
|
||||
duration_ms: 175.907929
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a diverged: a non-fast-forward keeps serving and holds until a human accepts the tip
|
||||
ok 74 - C2-03a diverged: a non-fast-forward keeps serving and holds until a human accepts the tip
|
||||
---
|
||||
duration_ms: 431.553812
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a accept starts the record over, so a changed branch gets a fresh state
|
||||
ok 75 - C2-03a accept starts the record over, so a changed branch gets a fresh state
|
||||
---
|
||||
duration_ms: 195.011432
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a fetch failure: a wrong token keeps serving and records the error, lastFetch unchanged
|
||||
ok 76 - C2-03a fetch failure: a wrong token keeps serving and records the error, lastFetch unchanged
|
||||
---
|
||||
duration_ms: 192.898644
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a a failed first fetch records the error with nothing served
|
||||
ok 77 - C2-03a a failed first fetch records the error with nothing served
|
||||
---
|
||||
duration_ms: 61.594695
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a a 302 to another host fails the fetch and the other host sees nothing
|
||||
ok 78 - C2-03a a 302 to another host fails the fetch and the other host sees nothing
|
||||
---
|
||||
duration_ms: 64.82991
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a the slot: missing or unsafe refuses before git, and sync never opens it
|
||||
ok 79 - C2-03a the slot: missing or unsafe refuses before git, and sync never opens it
|
||||
---
|
||||
duration_ms: 59.167725
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a sage-2021: an entry with no user refuses library-remote-invalid and runs no git
|
||||
ok 80 - C2-03a sage-2021: an entry with no user refuses library-remote-invalid and runs no git
|
||||
---
|
||||
duration_ms: 35.37205
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: C2-03a one sync per mirror: an overlapping call refuses library-sync-busy
|
||||
ok 81 - C2-03a one sync per mirror: an overlapping call refuses library-sync-busy
|
||||
---
|
||||
duration_ms: 118.260687
|
||||
type: 'test'
|
||||
...
|
||||
1..81
|
||||
# tests 81
|
||||
# suites 0
|
||||
# pass 81
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 9149.325891
|
||||
@@ -0,0 +1,48 @@
|
||||
✔ chat replies: free text, cites with badges, the agent label, changed since and safe links (633.807074ms)
|
||||
✔ chat replies: a write notice reads as its line with a Revert; a refused revert shows its code (621.95095ms)
|
||||
✔ chat replies: a read-only Console shows the notice with Revert disabled (577.638161ms)
|
||||
✔ chat status line: served commit and age, divergence, fetch error and the problems one click away (555.847899ms)
|
||||
✖ chat status line: limits when the status carries them, no problems, and refusals (3725.696272ms)
|
||||
✔ chat status line: a project with no repository link reads no library status (657.572856ms)
|
||||
✔ chat status line: unreadable reply limits show their problem and both fallback keys (663.163445ms)
|
||||
✔ chat replies: unchanged file at a different library commit and incomplete checks stay unmarked (616.184063ms)
|
||||
✖ chat status line: an invalid library mapping remains visible for diagnosis (597.976623ms)
|
||||
ℹ tests 9
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 8782.679569
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/webui/tests/chat-replies-browser.test.mjs:152:1
|
||||
✖ chat status line: limits when the status carries them, no problems, and refusals (3725.696272ms)
|
||||
Error: Uncaught (in promise) Error: window.__statusReads.length && document.querySelector(".chat-conversation") && document.querySelector(".chat-library")?.textContent==="Library status unavailable (library-mapping-invalid).": undefined
|
||||
at Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row225/packages/webui/tests/browser.mjs:49:35)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row225/packages/webui/tests/chat-replies-browser.test.mjs:162:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
|
||||
test at packages/webui/tests/chat-replies-browser.test.mjs:200:1
|
||||
✖ chat status line: an invalid library mapping remains visible for diagnosis (597.976623ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ null
|
||||
- 'Library status unavailable (library-mapping-invalid).'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row225/packages/webui/tests/chat-replies-browser.test.mjs:203:10)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: null,
|
||||
expected: 'Library status unavailable (library-mapping-invalid).',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{"mutant": "M1-badges", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/chat-replies-browser.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants/M1-badges.tap"}
|
||||
{"mutant": "M1-agent-label", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/chat-replies-browser.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants/M1-agent-label.tap"}
|
||||
{"mutant": "M2-http-links", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/chat-replies-browser.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants/M2-http-links.tap"}
|
||||
{"mutant": "M3-wrong-commit", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": false, "test": "packages/webui/tests/chat-replies-browser.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants/M3-wrong-commit.tap"}
|
||||
@@ -0,0 +1,192 @@
|
||||
TAP version 13
|
||||
# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
not ok 1 - chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
---
|
||||
duration_ms: 627.180675
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-9ui_vkk0/M1-agent-label/packages/webui/tests/chat-replies-browser.test.mjs:81:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
... Skipped lines
|
||||
|
||||
[
|
||||
{
|
||||
agent: null,
|
||||
badge: 'canon',
|
||||
changed: false,
|
||||
...
|
||||
{
|
||||
+ agent: null,
|
||||
- agent: 'agent-written: acme/scribe',
|
||||
badge: 'supporting',
|
||||
changed: false,
|
||||
href: null,
|
||||
quote: 'green eyes',
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa',
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected:
|
||||
0:
|
||||
badge: 'canon'
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'her grey eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
1:
|
||||
badge: 'playground'
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'a storm'
|
||||
agent: ~
|
||||
changed: true
|
||||
2:
|
||||
badge: 'supporting'
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'green eyes'
|
||||
agent: 'agent-written: acme/scribe'
|
||||
changed: false
|
||||
3:
|
||||
badge: 'web'
|
||||
ref: 'https://example.invalid/tides'
|
||||
href: 'https://example.invalid/tides'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'spring tides'
|
||||
agent: ~
|
||||
changed: false
|
||||
4:
|
||||
badge: 'web'
|
||||
ref: 'http://example.invalid/plain'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'plain http'
|
||||
agent: ~
|
||||
changed: false
|
||||
5:
|
||||
badge: 'web'
|
||||
ref: 'javascript:window.injected=2'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'script'
|
||||
agent: ~
|
||||
changed: false
|
||||
actual:
|
||||
0:
|
||||
badge: 'canon'
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'her grey eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
1:
|
||||
badge: 'playground'
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'a storm'
|
||||
agent: ~
|
||||
changed: true
|
||||
2:
|
||||
badge: 'supporting'
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'green eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
3:
|
||||
badge: 'web'
|
||||
ref: 'https://example.invalid/tides'
|
||||
href: 'https://example.invalid/tides'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'spring tides'
|
||||
agent: ~
|
||||
changed: false
|
||||
4:
|
||||
badge: 'web'
|
||||
ref: 'http://example.invalid/plain'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'plain http'
|
||||
agent: ~
|
||||
changed: false
|
||||
5:
|
||||
badge: 'web'
|
||||
ref: 'javascript:window.injected=2'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'script'
|
||||
agent: ~
|
||||
changed: false
|
||||
operator: 'deepStrictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-9ui_vkk0/M1-agent-label/packages/webui/tests/chat-replies-browser.test.mjs:90:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
ok 2 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
---
|
||||
duration_ms: 778.572201
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a read-only Console shows the notice with Revert disabled
|
||||
ok 3 - chat replies: a read-only Console shows the notice with Revert disabled
|
||||
---
|
||||
duration_ms: 641.728604
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
ok 4 - chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
---
|
||||
duration_ms: 629.327348
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: limits when the status carries them, no problems, and refusals
|
||||
ok 5 - chat status line: limits when the status carries them, no problems, and refusals
|
||||
---
|
||||
duration_ms: 837.886073
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: a project with no repository link reads no library status
|
||||
ok 6 - chat status line: a project with no repository link reads no library status
|
||||
---
|
||||
duration_ms: 613.037186
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
ok 7 - chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
---
|
||||
duration_ms: 651.026507
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
ok 8 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
---
|
||||
duration_ms: 735.546636
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: an invalid library mapping remains visible for diagnosis
|
||||
ok 9 - chat status line: an invalid library mapping remains visible for diagnosis
|
||||
---
|
||||
duration_ms: 712.174542
|
||||
type: 'test'
|
||||
...
|
||||
1..9
|
||||
# tests 9
|
||||
# suites 0
|
||||
# pass 8
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 6353.090574
|
||||
@@ -0,0 +1,206 @@
|
||||
TAP version 13
|
||||
# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
not ok 1 - chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
---
|
||||
duration_ms: 638.589537
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-9ui_vkk0/M1-badges/packages/webui/tests/chat-replies-browser.test.mjs:81:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
... Skipped lines
|
||||
|
||||
[
|
||||
{
|
||||
agent: null,
|
||||
+ badge: null,
|
||||
- badge: 'canon',
|
||||
changed: false,
|
||||
href: null,
|
||||
quote: 'her grey eyes',
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa',
|
||||
rel: null
|
||||
...
|
||||
agent: null,
|
||||
+ badge: null,
|
||||
- badge: 'playground',
|
||||
changed: true,
|
||||
href: null,
|
||||
quote: 'a storm',
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa',
|
||||
rel: null
|
||||
...
|
||||
agent: 'agent-written: acme/scribe',
|
||||
+ badge: null,
|
||||
- badge: 'supporting',
|
||||
changed: false,
|
||||
href: null,
|
||||
quote: 'green eyes',
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa',
|
||||
rel: null
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected:
|
||||
0:
|
||||
badge: 'canon'
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'her grey eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
1:
|
||||
badge: 'playground'
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'a storm'
|
||||
agent: ~
|
||||
changed: true
|
||||
2:
|
||||
badge: 'supporting'
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'green eyes'
|
||||
agent: 'agent-written: acme/scribe'
|
||||
changed: false
|
||||
3:
|
||||
badge: 'web'
|
||||
ref: 'https://example.invalid/tides'
|
||||
href: 'https://example.invalid/tides'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'spring tides'
|
||||
agent: ~
|
||||
changed: false
|
||||
4:
|
||||
badge: 'web'
|
||||
ref: 'http://example.invalid/plain'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'plain http'
|
||||
agent: ~
|
||||
changed: false
|
||||
5:
|
||||
badge: 'web'
|
||||
ref: 'javascript:window.injected=2'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'script'
|
||||
agent: ~
|
||||
changed: false
|
||||
actual:
|
||||
0:
|
||||
badge: ~
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'her grey eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
1:
|
||||
badge: ~
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'a storm'
|
||||
agent: ~
|
||||
changed: true
|
||||
2:
|
||||
badge: ~
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'green eyes'
|
||||
agent: 'agent-written: acme/scribe'
|
||||
changed: false
|
||||
3:
|
||||
badge: 'web'
|
||||
ref: 'https://example.invalid/tides'
|
||||
href: 'https://example.invalid/tides'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'spring tides'
|
||||
agent: ~
|
||||
changed: false
|
||||
4:
|
||||
badge: 'web'
|
||||
ref: 'http://example.invalid/plain'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'plain http'
|
||||
agent: ~
|
||||
changed: false
|
||||
5:
|
||||
badge: 'web'
|
||||
ref: 'javascript:window.injected=2'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'script'
|
||||
agent: ~
|
||||
changed: false
|
||||
operator: 'deepStrictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-9ui_vkk0/M1-badges/packages/webui/tests/chat-replies-browser.test.mjs:90:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
ok 2 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
---
|
||||
duration_ms: 770.070531
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a read-only Console shows the notice with Revert disabled
|
||||
ok 3 - chat replies: a read-only Console shows the notice with Revert disabled
|
||||
---
|
||||
duration_ms: 519.328288
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
ok 4 - chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
---
|
||||
duration_ms: 647.667301
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: limits when the status carries them, no problems, and refusals
|
||||
ok 5 - chat status line: limits when the status carries them, no problems, and refusals
|
||||
---
|
||||
duration_ms: 999.237447
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: a project with no repository link reads no library status
|
||||
ok 6 - chat status line: a project with no repository link reads no library status
|
||||
---
|
||||
duration_ms: 676.088845
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
ok 7 - chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
---
|
||||
duration_ms: 634.472637
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
ok 8 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
---
|
||||
duration_ms: 655.963182
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: an invalid library mapping remains visible for diagnosis
|
||||
ok 9 - chat status line: an invalid library mapping remains visible for diagnosis
|
||||
---
|
||||
duration_ms: 578.819646
|
||||
type: 'test'
|
||||
...
|
||||
1..9
|
||||
# tests 9
|
||||
# suites 0
|
||||
# pass 8
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 6239.022812
|
||||
@@ -0,0 +1,204 @@
|
||||
TAP version 13
|
||||
# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
not ok 1 - chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
---
|
||||
duration_ms: 655.901619
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-9ui_vkk0/M2-http-links/packages/webui/tests/chat-replies-browser.test.mjs:81:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
... Skipped lines
|
||||
|
||||
[
|
||||
{
|
||||
agent: null,
|
||||
badge: 'canon',
|
||||
changed: false,
|
||||
...
|
||||
changed: false,
|
||||
+ href: 'http://example.invalid/plain',
|
||||
- href: null,
|
||||
quote: 'plain http',
|
||||
ref: 'http://example.invalid/plain',
|
||||
+ rel: 'noopener noreferrer'
|
||||
- rel: null
|
||||
},
|
||||
{
|
||||
agent: null,
|
||||
badge: 'web',
|
||||
changed: false,
|
||||
+ href: 'javascript:window.injected=2',
|
||||
- href: null,
|
||||
quote: 'script',
|
||||
ref: 'javascript:window.injected=2',
|
||||
+ rel: 'noopener noreferrer'
|
||||
- rel: null
|
||||
}
|
||||
]
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected:
|
||||
0:
|
||||
badge: 'canon'
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'her grey eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
1:
|
||||
badge: 'playground'
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'a storm'
|
||||
agent: ~
|
||||
changed: true
|
||||
2:
|
||||
badge: 'supporting'
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'green eyes'
|
||||
agent: 'agent-written: acme/scribe'
|
||||
changed: false
|
||||
3:
|
||||
badge: 'web'
|
||||
ref: 'https://example.invalid/tides'
|
||||
href: 'https://example.invalid/tides'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'spring tides'
|
||||
agent: ~
|
||||
changed: false
|
||||
4:
|
||||
badge: 'web'
|
||||
ref: 'http://example.invalid/plain'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'plain http'
|
||||
agent: ~
|
||||
changed: false
|
||||
5:
|
||||
badge: 'web'
|
||||
ref: 'javascript:window.injected=2'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'script'
|
||||
agent: ~
|
||||
changed: false
|
||||
actual:
|
||||
0:
|
||||
badge: 'canon'
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'her grey eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
1:
|
||||
badge: 'playground'
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'a storm'
|
||||
agent: ~
|
||||
changed: true
|
||||
2:
|
||||
badge: 'supporting'
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'green eyes'
|
||||
agent: 'agent-written: acme/scribe'
|
||||
changed: false
|
||||
3:
|
||||
badge: 'web'
|
||||
ref: 'https://example.invalid/tides'
|
||||
href: 'https://example.invalid/tides'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'spring tides'
|
||||
agent: ~
|
||||
changed: false
|
||||
4:
|
||||
badge: 'web'
|
||||
ref: 'http://example.invalid/plain'
|
||||
href: 'http://example.invalid/plain'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'plain http'
|
||||
agent: ~
|
||||
changed: false
|
||||
5:
|
||||
badge: 'web'
|
||||
ref: 'javascript:window.injected=2'
|
||||
href: 'javascript:window.injected=2'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'script'
|
||||
agent: ~
|
||||
changed: false
|
||||
operator: 'deepStrictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-9ui_vkk0/M2-http-links/packages/webui/tests/chat-replies-browser.test.mjs:90:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
ok 2 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
---
|
||||
duration_ms: 741.122544
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a read-only Console shows the notice with Revert disabled
|
||||
ok 3 - chat replies: a read-only Console shows the notice with Revert disabled
|
||||
---
|
||||
duration_ms: 616.728572
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
ok 4 - chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
---
|
||||
duration_ms: 625.818493
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: limits when the status carries them, no problems, and refusals
|
||||
ok 5 - chat status line: limits when the status carries them, no problems, and refusals
|
||||
---
|
||||
duration_ms: 867.033773
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: a project with no repository link reads no library status
|
||||
ok 6 - chat status line: a project with no repository link reads no library status
|
||||
---
|
||||
duration_ms: 655.587703
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
ok 7 - chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
---
|
||||
duration_ms: 615.997516
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
ok 8 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
---
|
||||
duration_ms: 648.263681
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: an invalid library mapping remains visible for diagnosis
|
||||
ok 9 - chat status line: an invalid library mapping remains visible for diagnosis
|
||||
---
|
||||
duration_ms: 624.323397
|
||||
type: 'test'
|
||||
...
|
||||
1..9
|
||||
# tests 9
|
||||
# suites 0
|
||||
# pass 8
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 6168.633364
|
||||
@@ -0,0 +1,74 @@
|
||||
TAP version 13
|
||||
# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
ok 1 - chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
---
|
||||
duration_ms: 640.32042
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
ok 2 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
---
|
||||
duration_ms: 694.233373
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a read-only Console shows the notice with Revert disabled
|
||||
ok 3 - chat replies: a read-only Console shows the notice with Revert disabled
|
||||
---
|
||||
duration_ms: 611.500508
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
ok 4 - chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
---
|
||||
duration_ms: 606.581119
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: limits when the status carries them, no problems, and refusals
|
||||
ok 5 - chat status line: limits when the status carries them, no problems, and refusals
|
||||
---
|
||||
duration_ms: 896.462474
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: a project with no repository link reads no library status
|
||||
ok 6 - chat status line: a project with no repository link reads no library status
|
||||
---
|
||||
duration_ms: 666.798177
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
ok 7 - chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
---
|
||||
duration_ms: 629.105559
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
not ok 8 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
---
|
||||
duration_ms: 3654.057789
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-9ui_vkk0/M3-wrong-commit/packages/webui/tests/chat-replies-browser.test.mjs:184:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: 'Uncaught (in promise) Error: document.querySelectorAll(".chat-changed").length===0: undefined'
|
||||
code: 'ERR_TEST_FAILURE'
|
||||
stack: |-
|
||||
Object.evaluate (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-9ui_vkk0/M3-wrong-commit/packages/webui/tests/browser.mjs:49:35)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-9ui_vkk0/M3-wrong-commit/packages/webui/tests/chat-replies-browser.test.mjs:195:3)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: chat status line: an invalid library mapping remains visible for diagnosis
|
||||
ok 9 - chat status line: an invalid library mapping remains visible for diagnosis
|
||||
---
|
||||
duration_ms: 656.44095
|
||||
type: 'test'
|
||||
...
|
||||
1..9
|
||||
# tests 9
|
||||
# suites 0
|
||||
# pass 8
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 9179.328916
|
||||
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"head": "77172ce3b46eb289409068518b7022fc7be47ebe",
|
||||
"clear": "sage-3647",
|
||||
"worktreeUnchanged": true,
|
||||
"results": [
|
||||
{
|
||||
"mutant": "M1-badges",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/chat-replies-browser.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants/M1-badges.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M1-agent-label",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/chat-replies-browser.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants/M1-agent-label.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M2-http-links",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/chat-replies-browser.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants/M2-http-links.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M3-wrong-commit",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": false,
|
||||
"test": "packages/webui/tests/chat-replies-browser.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants/M3-wrong-commit.tap"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{"mutant": "M1-badges", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/chat-replies-browser.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M1-badges.tap"}
|
||||
{"mutant": "M1-agent-label", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/chat-replies-browser.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M1-agent-label.tap"}
|
||||
{"mutant": "M2-http-links", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/chat-replies-browser.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M2-http-links.tap"}
|
||||
{"mutant": "M3-wrong-commit", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/chat-replies-browser.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M3-wrong-commit.tap"}
|
||||
{"mutant": "M3-missing-file", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/chat-replies-browser.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M3-missing-file.tap"}
|
||||
{"mutant": "M4-fallback", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/chat-replies-browser.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M4-fallback.tap"}
|
||||
{"mutant": "M4-problem", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/chat-replies-browser.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M4-problem.tap"}
|
||||
{"mutant": "M5-send", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/library-routes.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M5-send.tap"}
|
||||
{"mutant": "M5-project-receipt", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/library-routes.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M5-project-receipt.tap"}
|
||||
{"mutant": "M5-commit-input", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/library-routes.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M5-commit-input.tap"}
|
||||
{"mutant": "M5-origin", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/library-routes.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M5-origin.tap"}
|
||||
{"mutant": "M5-fetch-metadata", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/library-routes.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M5-fetch-metadata.tap"}
|
||||
{"mutant": "M6-duplicate-call", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/library-routes.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M6-duplicate-call.tap"}
|
||||
{"mutant": "M7-user-fence", "anchorHits": 1, "restored": true, "worktreeUnchanged": true, "exit": 1, "killed": true, "test": "packages/webui/tests/library-routes.test.mjs", "log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M7-user-fence.tap"}
|
||||
@@ -0,0 +1,192 @@
|
||||
TAP version 13
|
||||
# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
not ok 1 - chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
---
|
||||
duration_ms: 646.851404
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M1-agent-label/packages/webui/tests/chat-replies-browser.test.mjs:81:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
... Skipped lines
|
||||
|
||||
[
|
||||
{
|
||||
agent: null,
|
||||
badge: 'canon',
|
||||
changed: false,
|
||||
...
|
||||
{
|
||||
+ agent: null,
|
||||
- agent: 'agent-written: acme/scribe',
|
||||
badge: 'supporting',
|
||||
changed: false,
|
||||
href: null,
|
||||
quote: 'green eyes',
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa',
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected:
|
||||
0:
|
||||
badge: 'canon'
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'her grey eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
1:
|
||||
badge: 'playground'
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'a storm'
|
||||
agent: ~
|
||||
changed: true
|
||||
2:
|
||||
badge: 'supporting'
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'green eyes'
|
||||
agent: 'agent-written: acme/scribe'
|
||||
changed: false
|
||||
3:
|
||||
badge: 'web'
|
||||
ref: 'https://example.invalid/tides'
|
||||
href: 'https://example.invalid/tides'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'spring tides'
|
||||
agent: ~
|
||||
changed: false
|
||||
4:
|
||||
badge: 'web'
|
||||
ref: 'http://example.invalid/plain'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'plain http'
|
||||
agent: ~
|
||||
changed: false
|
||||
5:
|
||||
badge: 'web'
|
||||
ref: 'javascript:window.injected=2'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'script'
|
||||
agent: ~
|
||||
changed: false
|
||||
actual:
|
||||
0:
|
||||
badge: 'canon'
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'her grey eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
1:
|
||||
badge: 'playground'
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'a storm'
|
||||
agent: ~
|
||||
changed: true
|
||||
2:
|
||||
badge: 'supporting'
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'green eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
3:
|
||||
badge: 'web'
|
||||
ref: 'https://example.invalid/tides'
|
||||
href: 'https://example.invalid/tides'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'spring tides'
|
||||
agent: ~
|
||||
changed: false
|
||||
4:
|
||||
badge: 'web'
|
||||
ref: 'http://example.invalid/plain'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'plain http'
|
||||
agent: ~
|
||||
changed: false
|
||||
5:
|
||||
badge: 'web'
|
||||
ref: 'javascript:window.injected=2'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'script'
|
||||
agent: ~
|
||||
changed: false
|
||||
operator: 'deepStrictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M1-agent-label/packages/webui/tests/chat-replies-browser.test.mjs:90:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
ok 2 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
---
|
||||
duration_ms: 667.90945
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a read-only Console shows the notice with Revert disabled
|
||||
ok 3 - chat replies: a read-only Console shows the notice with Revert disabled
|
||||
---
|
||||
duration_ms: 588.346681
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
ok 4 - chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
---
|
||||
duration_ms: 485.882289
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: limits when the status carries them, no problems, and refusals
|
||||
ok 5 - chat status line: limits when the status carries them, no problems, and refusals
|
||||
---
|
||||
duration_ms: 709.847041
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: a project with no repository link reads no library status
|
||||
ok 6 - chat status line: a project with no repository link reads no library status
|
||||
---
|
||||
duration_ms: 544.885551
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
ok 7 - chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
---
|
||||
duration_ms: 514.410016
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
ok 8 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
---
|
||||
duration_ms: 542.746154
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: an invalid library mapping remains visible for diagnosis
|
||||
ok 9 - chat status line: an invalid library mapping remains visible for diagnosis
|
||||
---
|
||||
duration_ms: 582.608663
|
||||
type: 'test'
|
||||
...
|
||||
1..9
|
||||
# tests 9
|
||||
# suites 0
|
||||
# pass 8
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 5409.980177
|
||||
@@ -0,0 +1,206 @@
|
||||
TAP version 13
|
||||
# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
not ok 1 - chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
---
|
||||
duration_ms: 621.562133
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M1-badges/packages/webui/tests/chat-replies-browser.test.mjs:81:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
... Skipped lines
|
||||
|
||||
[
|
||||
{
|
||||
agent: null,
|
||||
+ badge: null,
|
||||
- badge: 'canon',
|
||||
changed: false,
|
||||
href: null,
|
||||
quote: 'her grey eyes',
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa',
|
||||
rel: null
|
||||
...
|
||||
agent: null,
|
||||
+ badge: null,
|
||||
- badge: 'playground',
|
||||
changed: true,
|
||||
href: null,
|
||||
quote: 'a storm',
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa',
|
||||
rel: null
|
||||
...
|
||||
agent: 'agent-written: acme/scribe',
|
||||
+ badge: null,
|
||||
- badge: 'supporting',
|
||||
changed: false,
|
||||
href: null,
|
||||
quote: 'green eyes',
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa',
|
||||
rel: null
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected:
|
||||
0:
|
||||
badge: 'canon'
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'her grey eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
1:
|
||||
badge: 'playground'
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'a storm'
|
||||
agent: ~
|
||||
changed: true
|
||||
2:
|
||||
badge: 'supporting'
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'green eyes'
|
||||
agent: 'agent-written: acme/scribe'
|
||||
changed: false
|
||||
3:
|
||||
badge: 'web'
|
||||
ref: 'https://example.invalid/tides'
|
||||
href: 'https://example.invalid/tides'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'spring tides'
|
||||
agent: ~
|
||||
changed: false
|
||||
4:
|
||||
badge: 'web'
|
||||
ref: 'http://example.invalid/plain'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'plain http'
|
||||
agent: ~
|
||||
changed: false
|
||||
5:
|
||||
badge: 'web'
|
||||
ref: 'javascript:window.injected=2'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'script'
|
||||
agent: ~
|
||||
changed: false
|
||||
actual:
|
||||
0:
|
||||
badge: ~
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'her grey eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
1:
|
||||
badge: ~
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'a storm'
|
||||
agent: ~
|
||||
changed: true
|
||||
2:
|
||||
badge: ~
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'green eyes'
|
||||
agent: 'agent-written: acme/scribe'
|
||||
changed: false
|
||||
3:
|
||||
badge: 'web'
|
||||
ref: 'https://example.invalid/tides'
|
||||
href: 'https://example.invalid/tides'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'spring tides'
|
||||
agent: ~
|
||||
changed: false
|
||||
4:
|
||||
badge: 'web'
|
||||
ref: 'http://example.invalid/plain'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'plain http'
|
||||
agent: ~
|
||||
changed: false
|
||||
5:
|
||||
badge: 'web'
|
||||
ref: 'javascript:window.injected=2'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'script'
|
||||
agent: ~
|
||||
changed: false
|
||||
operator: 'deepStrictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M1-badges/packages/webui/tests/chat-replies-browser.test.mjs:90:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
ok 2 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
---
|
||||
duration_ms: 731.101767
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a read-only Console shows the notice with Revert disabled
|
||||
ok 3 - chat replies: a read-only Console shows the notice with Revert disabled
|
||||
---
|
||||
duration_ms: 633.163696
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
ok 4 - chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
---
|
||||
duration_ms: 637.761161
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: limits when the status carries them, no problems, and refusals
|
||||
ok 5 - chat status line: limits when the status carries them, no problems, and refusals
|
||||
---
|
||||
duration_ms: 847.929653
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: a project with no repository link reads no library status
|
||||
ok 6 - chat status line: a project with no repository link reads no library status
|
||||
---
|
||||
duration_ms: 635.512979
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
ok 7 - chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
---
|
||||
duration_ms: 645.427688
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
ok 8 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
---
|
||||
duration_ms: 672.272209
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: an invalid library mapping remains visible for diagnosis
|
||||
ok 9 - chat status line: an invalid library mapping remains visible for diagnosis
|
||||
---
|
||||
duration_ms: 629.043251
|
||||
type: 'test'
|
||||
...
|
||||
1..9
|
||||
# tests 9
|
||||
# suites 0
|
||||
# pass 8
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 6169.954716
|
||||
@@ -0,0 +1,204 @@
|
||||
TAP version 13
|
||||
# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
not ok 1 - chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
---
|
||||
duration_ms: 582.248796
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M2-http-links/packages/webui/tests/chat-replies-browser.test.mjs:81:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
... Skipped lines
|
||||
|
||||
[
|
||||
{
|
||||
agent: null,
|
||||
badge: 'canon',
|
||||
changed: false,
|
||||
...
|
||||
changed: false,
|
||||
+ href: 'http://example.invalid/plain',
|
||||
- href: null,
|
||||
quote: 'plain http',
|
||||
ref: 'http://example.invalid/plain',
|
||||
+ rel: 'noopener noreferrer'
|
||||
- rel: null
|
||||
},
|
||||
{
|
||||
agent: null,
|
||||
badge: 'web',
|
||||
changed: false,
|
||||
+ href: 'javascript:window.injected=2',
|
||||
- href: null,
|
||||
quote: 'script',
|
||||
ref: 'javascript:window.injected=2',
|
||||
+ rel: 'noopener noreferrer'
|
||||
- rel: null
|
||||
}
|
||||
]
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected:
|
||||
0:
|
||||
badge: 'canon'
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'her grey eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
1:
|
||||
badge: 'playground'
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'a storm'
|
||||
agent: ~
|
||||
changed: true
|
||||
2:
|
||||
badge: 'supporting'
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'green eyes'
|
||||
agent: 'agent-written: acme/scribe'
|
||||
changed: false
|
||||
3:
|
||||
badge: 'web'
|
||||
ref: 'https://example.invalid/tides'
|
||||
href: 'https://example.invalid/tides'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'spring tides'
|
||||
agent: ~
|
||||
changed: false
|
||||
4:
|
||||
badge: 'web'
|
||||
ref: 'http://example.invalid/plain'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'plain http'
|
||||
agent: ~
|
||||
changed: false
|
||||
5:
|
||||
badge: 'web'
|
||||
ref: 'javascript:window.injected=2'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'script'
|
||||
agent: ~
|
||||
changed: false
|
||||
actual:
|
||||
0:
|
||||
badge: 'canon'
|
||||
ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'her grey eyes'
|
||||
agent: ~
|
||||
changed: false
|
||||
1:
|
||||
badge: 'playground'
|
||||
ref: 'Book One/Playground/What If.md:5-6 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'a storm'
|
||||
agent: ~
|
||||
changed: true
|
||||
2:
|
||||
badge: 'supporting'
|
||||
ref: 'Notes/Eyes.md:9-10 @aaaaaaa'
|
||||
href: ~
|
||||
rel: ~
|
||||
quote: 'green eyes'
|
||||
agent: 'agent-written: acme/scribe'
|
||||
changed: false
|
||||
3:
|
||||
badge: 'web'
|
||||
ref: 'https://example.invalid/tides'
|
||||
href: 'https://example.invalid/tides'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'spring tides'
|
||||
agent: ~
|
||||
changed: false
|
||||
4:
|
||||
badge: 'web'
|
||||
ref: 'http://example.invalid/plain'
|
||||
href: 'http://example.invalid/plain'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'plain http'
|
||||
agent: ~
|
||||
changed: false
|
||||
5:
|
||||
badge: 'web'
|
||||
ref: 'javascript:window.injected=2'
|
||||
href: 'javascript:window.injected=2'
|
||||
rel: 'noopener noreferrer'
|
||||
quote: 'script'
|
||||
agent: ~
|
||||
changed: false
|
||||
operator: 'deepStrictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M2-http-links/packages/webui/tests/chat-replies-browser.test.mjs:90:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
ok 2 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
---
|
||||
duration_ms: 640.769563
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a read-only Console shows the notice with Revert disabled
|
||||
ok 3 - chat replies: a read-only Console shows the notice with Revert disabled
|
||||
---
|
||||
duration_ms: 572.506418
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
ok 4 - chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
---
|
||||
duration_ms: 519.031091
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: limits when the status carries them, no problems, and refusals
|
||||
ok 5 - chat status line: limits when the status carries them, no problems, and refusals
|
||||
---
|
||||
duration_ms: 743.513043
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: a project with no repository link reads no library status
|
||||
ok 6 - chat status line: a project with no repository link reads no library status
|
||||
---
|
||||
duration_ms: 676.282756
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
ok 7 - chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
---
|
||||
duration_ms: 595.166769
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
ok 8 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
---
|
||||
duration_ms: 626.475981
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: an invalid library mapping remains visible for diagnosis
|
||||
ok 9 - chat status line: an invalid library mapping remains visible for diagnosis
|
||||
---
|
||||
duration_ms: 596.828198
|
||||
type: 'test'
|
||||
...
|
||||
1..9
|
||||
# tests 9
|
||||
# suites 0
|
||||
# pass 8
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 5658.889854
|
||||
@@ -0,0 +1,81 @@
|
||||
TAP version 13
|
||||
# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
ok 1 - chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
---
|
||||
duration_ms: 639.027823
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
ok 2 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
---
|
||||
duration_ms: 693.772757
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a read-only Console shows the notice with Revert disabled
|
||||
ok 3 - chat replies: a read-only Console shows the notice with Revert disabled
|
||||
---
|
||||
duration_ms: 683.094789
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
ok 4 - chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
---
|
||||
duration_ms: 637.029355
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: limits when the status carries them, no problems, and refusals
|
||||
ok 5 - chat status line: limits when the status carries them, no problems, and refusals
|
||||
---
|
||||
duration_ms: 772.100011
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: a project with no repository link reads no library status
|
||||
ok 6 - chat status line: a project with no repository link reads no library status
|
||||
---
|
||||
duration_ms: 599.342035
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
ok 7 - chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
---
|
||||
duration_ms: 574.320042
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
not ok 8 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
---
|
||||
duration_ms: 621.466015
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M3-missing-file/packages/webui/tests/chat-replies-browser.test.mjs:184:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
1 !== 0
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 0
|
||||
actual: 1
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M3-missing-file/packages/webui/tests/chat-replies-browser.test.mjs:196:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: chat status line: an invalid library mapping remains visible for diagnosis
|
||||
ok 9 - chat status line: an invalid library mapping remains visible for diagnosis
|
||||
---
|
||||
duration_ms: 590.165121
|
||||
type: 'test'
|
||||
...
|
||||
1..9
|
||||
# tests 9
|
||||
# suites 0
|
||||
# pass 8
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 5921.651346
|
||||
@@ -0,0 +1,81 @@
|
||||
TAP version 13
|
||||
# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
ok 1 - chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
---
|
||||
duration_ms: 704.141588
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
ok 2 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
---
|
||||
duration_ms: 816.229452
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a read-only Console shows the notice with Revert disabled
|
||||
ok 3 - chat replies: a read-only Console shows the notice with Revert disabled
|
||||
---
|
||||
duration_ms: 697.826745
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
ok 4 - chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
---
|
||||
duration_ms: 638.579753
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: limits when the status carries them, no problems, and refusals
|
||||
ok 5 - chat status line: limits when the status carries them, no problems, and refusals
|
||||
---
|
||||
duration_ms: 850.914117
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: a project with no repository link reads no library status
|
||||
ok 6 - chat status line: a project with no repository link reads no library status
|
||||
---
|
||||
duration_ms: 634.004327
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
ok 7 - chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
---
|
||||
duration_ms: 585.469632
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
not ok 8 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
---
|
||||
duration_ms: 673.386968
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M3-wrong-commit/packages/webui/tests/chat-replies-browser.test.mjs:184:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
1 !== 0
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 0
|
||||
actual: 1
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M3-wrong-commit/packages/webui/tests/chat-replies-browser.test.mjs:196:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: chat status line: an invalid library mapping remains visible for diagnosis
|
||||
ok 9 - chat status line: an invalid library mapping remains visible for diagnosis
|
||||
---
|
||||
duration_ms: 579.53998
|
||||
type: 'test'
|
||||
...
|
||||
1..9
|
||||
# tests 9
|
||||
# suites 0
|
||||
# pass 8
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 6292.579267
|
||||
@@ -0,0 +1,102 @@
|
||||
TAP version 13
|
||||
# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
ok 1 - chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
---
|
||||
duration_ms: 683.334532
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
ok 2 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
---
|
||||
duration_ms: 686.685624
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a read-only Console shows the notice with Revert disabled
|
||||
ok 3 - chat replies: a read-only Console shows the notice with Revert disabled
|
||||
---
|
||||
duration_ms: 612.757087
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
ok 4 - chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
---
|
||||
duration_ms: 584.651483
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: limits when the status carries them, no problems, and refusals
|
||||
not ok 5 - chat status line: limits when the status carries them, no problems, and refusals
|
||||
---
|
||||
duration_ms: 637.405759
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M4-fallback/packages/webui/tests/chat-replies-browser.test.mjs:152:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ 'Library at ccccccc · fetched 5 min ago · citations required, up to 4 per reply · no problems'
|
||||
- 'Library at ccccccc · fetched 5 min ago · citations required, up to 4 per reply · limits fell back: citationsPerReply · no problems'
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 'Library at ccccccc · fetched 5 min ago · citations required, up to 4 per reply · limits fell back: citationsPerReply · no problems'
|
||||
actual: 'Library at ccccccc · fetched 5 min ago · citations required, up to 4 per reply · no problems'
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M4-fallback/packages/webui/tests/chat-replies-browser.test.mjs:156:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: chat status line: a project with no repository link reads no library status
|
||||
ok 6 - chat status line: a project with no repository link reads no library status
|
||||
---
|
||||
duration_ms: 626.790802
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
not ok 7 - chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
---
|
||||
duration_ms: 643.680732
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M4-fallback/packages/webui/tests/chat-replies-browser.test.mjs:173:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ 'Library at ccccccc · fetched 5 min ago · citations optional, up to 8 per reply · reply-limits-unreadable · no problems'
|
||||
- 'Library at ccccccc · fetched 5 min ago · citations optional, up to 8 per reply · limits fell back: requireCitation, citationsPerReply · reply-limits-unreadable · no problems'
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 'Library at ccccccc · fetched 5 min ago · citations optional, up to 8 per reply · limits fell back: requireCitation, citationsPerReply · reply-limits-unreadable · no problems'
|
||||
actual: 'Library at ccccccc · fetched 5 min ago · citations optional, up to 8 per reply · reply-limits-unreadable · no problems'
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M4-fallback/packages/webui/tests/chat-replies-browser.test.mjs:179:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
ok 8 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
---
|
||||
duration_ms: 645.032205
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: an invalid library mapping remains visible for diagnosis
|
||||
ok 9 - chat status line: an invalid library mapping remains visible for diagnosis
|
||||
---
|
||||
duration_ms: 616.242947
|
||||
type: 'test'
|
||||
...
|
||||
1..9
|
||||
# tests 9
|
||||
# suites 0
|
||||
# pass 7
|
||||
# fail 2
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 5845.226677
|
||||
@@ -0,0 +1,83 @@
|
||||
TAP version 13
|
||||
# Subtest: chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
ok 1 - chat replies: free text, cites with badges, the agent label, changed since and safe links
|
||||
---
|
||||
duration_ms: 663.005514
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
ok 2 - chat replies: a write notice reads as its line with a Revert; a refused revert shows its code
|
||||
---
|
||||
duration_ms: 662.360161
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat replies: a read-only Console shows the notice with Revert disabled
|
||||
ok 3 - chat replies: a read-only Console shows the notice with Revert disabled
|
||||
---
|
||||
duration_ms: 620.68694
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
ok 4 - chat status line: served commit and age, divergence, fetch error and the problems one click away
|
||||
---
|
||||
duration_ms: 744.825035
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: limits when the status carries them, no problems, and refusals
|
||||
ok 5 - chat status line: limits when the status carries them, no problems, and refusals
|
||||
---
|
||||
duration_ms: 826.418848
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: a project with no repository link reads no library status
|
||||
ok 6 - chat status line: a project with no repository link reads no library status
|
||||
---
|
||||
duration_ms: 549.365993
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
not ok 7 - chat status line: unreadable reply limits show their problem and both fallback keys
|
||||
---
|
||||
duration_ms: 589.776762
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M4-problem/packages/webui/tests/chat-replies-browser.test.mjs:173:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ 'Library at ccccccc · fetched 5 min ago · citations optional, up to 8 per reply · limits fell back: requireCitation, citationsPerReply · no problems'
|
||||
- 'Library at ccccccc · fetched 5 min ago · citations optional, up to 8 per reply · limits fell back: requireCitation, citationsPerReply · reply-limits-unreadable · no problems'
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 'Library at ccccccc · fetched 5 min ago · citations optional, up to 8 per reply · limits fell back: requireCitation, citationsPerReply · reply-limits-unreadable · no problems'
|
||||
actual: 'Library at ccccccc · fetched 5 min ago · citations optional, up to 8 per reply · limits fell back: requireCitation, citationsPerReply · no problems'
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M4-problem/packages/webui/tests/chat-replies-browser.test.mjs:179:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
ok 8 - chat replies: unchanged file at a different library commit and incomplete checks stay unmarked
|
||||
---
|
||||
duration_ms: 590.919434
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: chat status line: an invalid library mapping remains visible for diagnosis
|
||||
ok 9 - chat status line: an invalid library mapping remains visible for diagnosis
|
||||
---
|
||||
duration_ms: 545.326381
|
||||
type: 'test'
|
||||
...
|
||||
1..9
|
||||
# tests 9
|
||||
# suites 0
|
||||
# pass 8
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 5914.325706
|
||||
@@ -0,0 +1,105 @@
|
||||
TAP version 13
|
||||
# Subtest: a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
ok 1 - a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
---
|
||||
duration_ms: 16.128237
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
ok 2 - a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
---
|
||||
duration_ms: 5.987607
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
not ok 3 - a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
---
|
||||
duration_ms: 4.805637
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M5-commit-input/packages/webui/tests/library-routes.test.mjs:64:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
{"project":"books","commit":"abc"}
|
||||
|
||||
200 !== 400
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 400
|
||||
actual: 200
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M5-commit-input/packages/webui/tests/library-routes.test.mjs:69:12)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
ok 4 - a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
---
|
||||
duration_ms: 6.383811
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
ok 5 - a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
---
|
||||
duration_ms: 4.000988
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read takes one project query and answers the bus result for that project
|
||||
ok 6 - the status read takes one project query and answers the bus result for that project
|
||||
---
|
||||
duration_ms: 2.487122
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
ok 7 - a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
---
|
||||
duration_ms: 4.9292
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read needs no send; a read-only Console still has no revert
|
||||
ok 8 - the status read needs no send; a read-only Console still has no revert
|
||||
---
|
||||
duration_ms: 1.266317
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
ok 9 - library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
---
|
||||
duration_ms: 0.443059
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
ok 10 - the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
---
|
||||
duration_ms: 1.048018
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert receipt for another project is unknown and is never retried
|
||||
ok 11 - a revert receipt for another project is unknown and is never retried
|
||||
---
|
||||
duration_ms: 0.864934
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a granted-user HTTP session cannot reach owner library callbacks
|
||||
ok 12 - a granted-user HTTP session cannot reach owner library callbacks
|
||||
---
|
||||
duration_ms: 1.064626
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a configured revert callback remains unreachable when send is off
|
||||
ok 13 - a configured revert callback remains unreachable when send is off
|
||||
---
|
||||
duration_ms: 0.803048
|
||||
type: 'test'
|
||||
...
|
||||
1..13
|
||||
# tests 13
|
||||
# suites 0
|
||||
# pass 12
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 153.3549
|
||||
@@ -0,0 +1,105 @@
|
||||
TAP version 13
|
||||
# Subtest: a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
ok 1 - a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
---
|
||||
duration_ms: 20.271342
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
not ok 2 - a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
---
|
||||
duration_ms: 5.700968
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M5-fetch-metadata/packages/webui/tests/library-routes.test.mjs:48:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
sec-fetch-site
|
||||
|
||||
200 !== 403
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 403
|
||||
actual: 200
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M5-fetch-metadata/packages/webui/tests/library-routes.test.mjs:57:12)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
ok 3 - a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
---
|
||||
duration_ms: 6.427935
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
ok 4 - a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
---
|
||||
duration_ms: 7.39929
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
ok 5 - a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
---
|
||||
duration_ms: 5.425467
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read takes one project query and answers the bus result for that project
|
||||
ok 6 - the status read takes one project query and answers the bus result for that project
|
||||
---
|
||||
duration_ms: 2.634037
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
ok 7 - a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
---
|
||||
duration_ms: 5.727409
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read needs no send; a read-only Console still has no revert
|
||||
ok 8 - the status read needs no send; a read-only Console still has no revert
|
||||
---
|
||||
duration_ms: 1.317954
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
ok 9 - library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
---
|
||||
duration_ms: 0.583799
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
ok 10 - the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
---
|
||||
duration_ms: 1.207375
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert receipt for another project is unknown and is never retried
|
||||
ok 11 - a revert receipt for another project is unknown and is never retried
|
||||
---
|
||||
duration_ms: 0.956772
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a granted-user HTTP session cannot reach owner library callbacks
|
||||
ok 12 - a granted-user HTTP session cannot reach owner library callbacks
|
||||
---
|
||||
duration_ms: 1.147745
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a configured revert callback remains unreachable when send is off
|
||||
ok 13 - a configured revert callback remains unreachable when send is off
|
||||
---
|
||||
duration_ms: 0.819337
|
||||
type: 'test'
|
||||
...
|
||||
1..13
|
||||
# tests 13
|
||||
# suites 0
|
||||
# pass 12
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 166.134058
|
||||
@@ -0,0 +1,105 @@
|
||||
TAP version 13
|
||||
# Subtest: a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
ok 1 - a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
---
|
||||
duration_ms: 16.249491
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
not ok 2 - a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
---
|
||||
duration_ms: 5.463985
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M5-origin/packages/webui/tests/library-routes.test.mjs:48:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
origin
|
||||
|
||||
200 !== 403
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 403
|
||||
actual: 200
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M5-origin/packages/webui/tests/library-routes.test.mjs:57:12)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
ok 3 - a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
---
|
||||
duration_ms: 6.035196
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
ok 4 - a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
---
|
||||
duration_ms: 5.621744
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
ok 5 - a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
---
|
||||
duration_ms: 4.928333
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read takes one project query and answers the bus result for that project
|
||||
ok 6 - the status read takes one project query and answers the bus result for that project
|
||||
---
|
||||
duration_ms: 2.455282
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
ok 7 - a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
---
|
||||
duration_ms: 4.838747
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read needs no send; a read-only Console still has no revert
|
||||
ok 8 - the status read needs no send; a read-only Console still has no revert
|
||||
---
|
||||
duration_ms: 1.235209
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
ok 9 - library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
---
|
||||
duration_ms: 0.436399
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
ok 10 - the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
---
|
||||
duration_ms: 1.100574
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert receipt for another project is unknown and is never retried
|
||||
ok 11 - a revert receipt for another project is unknown and is never retried
|
||||
---
|
||||
duration_ms: 0.943474
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a granted-user HTTP session cannot reach owner library callbacks
|
||||
ok 12 - a granted-user HTTP session cannot reach owner library callbacks
|
||||
---
|
||||
duration_ms: 1.176957
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a configured revert callback remains unreachable when send is off
|
||||
ok 13 - a configured revert callback remains unreachable when send is off
|
||||
---
|
||||
duration_ms: 0.861834
|
||||
type: 'test'
|
||||
...
|
||||
1..13
|
||||
# tests 13
|
||||
# suites 0
|
||||
# pass 12
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 150.969641
|
||||
@@ -0,0 +1,105 @@
|
||||
TAP version 13
|
||||
# Subtest: a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
ok 1 - a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
---
|
||||
duration_ms: 18.918199
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
ok 2 - a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
---
|
||||
duration_ms: 7.26916
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
ok 3 - a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
---
|
||||
duration_ms: 5.352342
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
ok 4 - a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
---
|
||||
duration_ms: 6.134713
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
ok 5 - a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
---
|
||||
duration_ms: 4.288914
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read takes one project query and answers the bus result for that project
|
||||
ok 6 - the status read takes one project query and answers the bus result for that project
|
||||
---
|
||||
duration_ms: 2.745385
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
ok 7 - a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
---
|
||||
duration_ms: 5.739155
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read needs no send; a read-only Console still has no revert
|
||||
ok 8 - the status read needs no send; a read-only Console still has no revert
|
||||
---
|
||||
duration_ms: 1.264793
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
ok 9 - library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
---
|
||||
duration_ms: 0.471965
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
ok 10 - the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
---
|
||||
duration_ms: 1.045204
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert receipt for another project is unknown and is never retried
|
||||
not ok 11 - a revert receipt for another project is unknown and is never retried
|
||||
---
|
||||
duration_ms: 1.531252
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M5-project-receipt/packages/webui/tests/library-routes.test.mjs:145:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
200 !== 503
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 503
|
||||
actual: 200
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M5-project-receipt/packages/webui/tests/library-routes.test.mjs:148:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: a granted-user HTTP session cannot reach owner library callbacks
|
||||
ok 12 - a granted-user HTTP session cannot reach owner library callbacks
|
||||
---
|
||||
duration_ms: 1.60161
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a configured revert callback remains unreachable when send is off
|
||||
ok 13 - a configured revert callback remains unreachable when send is off
|
||||
---
|
||||
duration_ms: 0.816068
|
||||
type: 'test'
|
||||
...
|
||||
1..13
|
||||
# tests 13
|
||||
# suites 0
|
||||
# pass 12
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 171.289003
|
||||
@@ -0,0 +1,106 @@
|
||||
TAP version 13
|
||||
# Subtest: a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
ok 1 - a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
---
|
||||
duration_ms: 18.930067
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
ok 2 - a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
---
|
||||
duration_ms: 7.470645
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
ok 3 - a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
---
|
||||
duration_ms: 6.646929
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
ok 4 - a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
---
|
||||
duration_ms: 6.637697
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
ok 5 - a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
---
|
||||
duration_ms: 4.174441
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read takes one project query and answers the bus result for that project
|
||||
ok 6 - the status read takes one project query and answers the bus result for that project
|
||||
---
|
||||
duration_ms: 2.513131
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
ok 7 - a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
---
|
||||
duration_ms: 5.145692
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read needs no send; a read-only Console still has no revert
|
||||
ok 8 - the status read needs no send; a read-only Console still has no revert
|
||||
---
|
||||
duration_ms: 1.182362
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
ok 9 - library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
---
|
||||
duration_ms: 0.471806
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
ok 10 - the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
---
|
||||
duration_ms: 1.064814
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert receipt for another project is unknown and is never retried
|
||||
ok 11 - a revert receipt for another project is unknown and is never retried
|
||||
---
|
||||
duration_ms: 0.910004
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a granted-user HTTP session cannot reach owner library callbacks
|
||||
ok 12 - a granted-user HTTP session cannot reach owner library callbacks
|
||||
---
|
||||
duration_ms: 1.16191
|
||||
type: 'test'
|
||||
...
|
||||
# 2026-10-23T19:28:51.488Z library-revert user="jason" project="books" commit="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" commit=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
|
||||
# Subtest: a configured revert callback remains unreachable when send is off
|
||||
not ok 13 - a configured revert callback remains unreachable when send is off
|
||||
---
|
||||
duration_ms: 1.624909
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M5-send/packages/webui/tests/library-routes.test.mjs:175:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
200 !== 403
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 403
|
||||
actual: 200
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M5-send/packages/webui/tests/library-routes.test.mjs:181:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
1..13
|
||||
# tests 13
|
||||
# suites 0
|
||||
# pass 12
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 165.919088
|
||||
@@ -0,0 +1,177 @@
|
||||
TAP version 13
|
||||
# Subtest: a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
not ok 1 - a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
---
|
||||
duration_ms: 17.922489
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M6-duplicate-call/packages/webui/tests/library-routes.test.mjs:40:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
{
|
||||
commit: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
|
||||
project: 'books'
|
||||
},
|
||||
+ {
|
||||
+ commit: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
|
||||
+ project: 'books'
|
||||
+ }
|
||||
]
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected:
|
||||
0:
|
||||
project: 'books'
|
||||
commit: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
|
||||
actual:
|
||||
0:
|
||||
project: 'books'
|
||||
commit: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
|
||||
1:
|
||||
project: 'books'
|
||||
commit: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
|
||||
operator: 'deepStrictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M6-duplicate-call/packages/webui/tests/library-routes.test.mjs:43:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
# Subtest: a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
ok 2 - a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
---
|
||||
duration_ms: 7.053366
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
ok 3 - a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
---
|
||||
duration_ms: 5.869486
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
ok 4 - a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
---
|
||||
duration_ms: 6.852952
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
not ok 5 - a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
---
|
||||
duration_ms: 2.870452
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M6-duplicate-call/packages/webui/tests/library-routes.test.mjs:88:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
2 !== 1
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 1
|
||||
actual: 2
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M6-duplicate-call/packages/webui/tests/library-routes.test.mjs:96:12)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: the status read takes one project query and answers the bus result for that project
|
||||
ok 6 - the status read takes one project query and answers the bus result for that project
|
||||
---
|
||||
duration_ms: 2.904694
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
ok 7 - a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
---
|
||||
duration_ms: 5.7962
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read needs no send; a read-only Console still has no revert
|
||||
ok 8 - the status read needs no send; a read-only Console still has no revert
|
||||
---
|
||||
duration_ms: 1.518332
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
ok 9 - library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
---
|
||||
duration_ms: 0.563294
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
ok 10 - the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
---
|
||||
duration_ms: 1.17446
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert receipt for another project is unknown and is never retried
|
||||
not ok 11 - a revert receipt for another project is unknown and is never retried
|
||||
---
|
||||
duration_ms: 1.258633
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M6-duplicate-call/packages/webui/tests/library-routes.test.mjs:145:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
{
|
||||
commit: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
|
||||
project: 'books'
|
||||
},
|
||||
+ {
|
||||
+ commit: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
|
||||
+ project: 'books'
|
||||
+ }
|
||||
]
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected:
|
||||
0:
|
||||
project: 'books'
|
||||
commit: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
|
||||
actual:
|
||||
0:
|
||||
project: 'books'
|
||||
commit: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
|
||||
1:
|
||||
project: 'books'
|
||||
commit: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
|
||||
operator: 'deepStrictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M6-duplicate-call/packages/webui/tests/library-routes.test.mjs:151:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: a granted-user HTTP session cannot reach owner library callbacks
|
||||
ok 12 - a granted-user HTTP session cannot reach owner library callbacks
|
||||
---
|
||||
duration_ms: 1.362877
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a configured revert callback remains unreachable when send is off
|
||||
ok 13 - a configured revert callback remains unreachable when send is off
|
||||
---
|
||||
duration_ms: 0.848309
|
||||
type: 'test'
|
||||
...
|
||||
1..13
|
||||
# tests 13
|
||||
# suites 0
|
||||
# pass 10
|
||||
# fail 3
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 169.162917
|
||||
@@ -0,0 +1,126 @@
|
||||
TAP version 13
|
||||
# Subtest: a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
ok 1 - a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
---
|
||||
duration_ms: 18.215173
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
ok 2 - a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
---
|
||||
duration_ms: 6.416847
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
ok 3 - a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
---
|
||||
duration_ms: 5.529629
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
ok 4 - a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
---
|
||||
duration_ms: 6.92431
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
ok 5 - a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
---
|
||||
duration_ms: 4.588509
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read takes one project query and answers the bus result for that project
|
||||
ok 6 - the status read takes one project query and answers the bus result for that project
|
||||
---
|
||||
duration_ms: 2.817257
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
ok 7 - a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
---
|
||||
duration_ms: 6.020444
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read needs no send; a read-only Console still has no revert
|
||||
ok 8 - the status read needs no send; a read-only Console still has no revert
|
||||
---
|
||||
duration_ms: 1.377224
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
not ok 9 - library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
---
|
||||
duration_ms: 1.015984
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M7-user-fence/packages/webui/tests/library-routes.test.mjs:132:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
/api/library/status
|
||||
|
||||
true !== false
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: false
|
||||
actual: true
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M7-user-fence/packages/webui/tests/library-routes.test.mjs:133:106)
|
||||
Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
Test.run (node:internal/test_runner/test:1402:25)
|
||||
Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
Test.run (node:internal/test_runner/test:1467:12)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
ok 10 - the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
---
|
||||
duration_ms: 1.695555
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert receipt for another project is unknown and is never retried
|
||||
ok 11 - a revert receipt for another project is unknown and is never retried
|
||||
---
|
||||
duration_ms: 1.378325
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a granted-user HTTP session cannot reach owner library callbacks
|
||||
not ok 12 - a granted-user HTTP session cannot reach owner library callbacks
|
||||
---
|
||||
duration_ms: 1.178045
|
||||
type: 'test'
|
||||
location: '/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M7-user-fence/packages/webui/tests/library-routes.test.mjs:155:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
503 !== 403
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 403
|
||||
actual: 503
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mosaic-row225-mutants-e6t705gk/M7-user-fence/packages/webui/tests/library-routes.test.mjs:167:12)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
# Subtest: a configured revert callback remains unreachable when send is off
|
||||
ok 13 - a configured revert callback remains unreachable when send is off
|
||||
---
|
||||
duration_ms: 1.057394
|
||||
type: 'test'
|
||||
...
|
||||
1..13
|
||||
# tests 13
|
||||
# suites 0
|
||||
# pass 11
|
||||
# fail 2
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 176.864112
|
||||
@@ -0,0 +1,147 @@
|
||||
{
|
||||
"head": "50790127716002f97154800ecbfb968690a9d644",
|
||||
"clear": "sage-3647",
|
||||
"worktreeUnchanged": true,
|
||||
"results": [
|
||||
{
|
||||
"mutant": "M1-badges",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/chat-replies-browser.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M1-badges.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M1-agent-label",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/chat-replies-browser.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M1-agent-label.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M2-http-links",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/chat-replies-browser.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M2-http-links.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M3-wrong-commit",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/chat-replies-browser.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M3-wrong-commit.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M3-missing-file",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/chat-replies-browser.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M3-missing-file.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M4-fallback",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/chat-replies-browser.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M4-fallback.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M4-problem",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/chat-replies-browser.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M4-problem.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M5-send",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/library-routes.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M5-send.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M5-project-receipt",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/library-routes.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M5-project-receipt.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M5-commit-input",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/library-routes.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M5-commit-input.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M5-origin",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/library-routes.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M5-origin.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M5-fetch-metadata",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/library-routes.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M5-fetch-metadata.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M6-duplicate-call",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/library-routes.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M6-duplicate-call.tap"
|
||||
},
|
||||
{
|
||||
"mutant": "M7-user-fence",
|
||||
"anchorHits": 1,
|
||||
"restored": true,
|
||||
"worktreeUnchanged": true,
|
||||
"exit": 1,
|
||||
"killed": true,
|
||||
"test": "packages/webui/tests/library-routes.test.mjs",
|
||||
"log": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2/mutants-final/M7-user-fence.tap"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
{
|
||||
"rawRoot": "/mnt/storage/scratch/tmp/fethry-row225-KEmw8wQ2",
|
||||
"logs": [
|
||||
{
|
||||
"path": "evidence/browser-final.tap",
|
||||
"rawSha256": "4e6d5874786aa5d407b59d0b701652d419d0fecda5402ede40f52b313def12b0",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/browser-final2.tap",
|
||||
"rawSha256": "194b3150e59868aab023d9ccfc75c69b82e43afba38c1b12e87a1fb3d68fe821",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/browser-green.tap",
|
||||
"rawSha256": "030d7a5c9af70d4a7ade177906fb971b29fa4cf1fc5efd39f35643ed1969cd01",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/browser-red.tap",
|
||||
"rawSha256": "db00bee89b4353efe7d324b17417347b30964f79ad4469a5dc98c6d125691f55",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/channel-proof.tap",
|
||||
"rawSha256": "cb7c0398af2a2a0e7cae24ee2c8167601cbf7e3f9cf3ed7479b2a6ef65f5da8a",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/library-full.tap",
|
||||
"rawSha256": "5447e3fce497a0dfb03ddd3eb2795dc2a179554f794e4c37458219c70736a645",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mapping-red.tap",
|
||||
"rawSha256": "8ca7310e46df2d35fa96e3aba378721ad388dce41f003ee133b684eeb7eaf245",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-attempt1/M1-agent-label.tap",
|
||||
"rawSha256": "db7ab1c64bc05b719e5164ed4ce1dd8b79ad53309d9b8e3e1ca0cc8867bca70f",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-attempt1/M1-badges.tap",
|
||||
"rawSha256": "08351b9061351812008ebd7067a9aed24a9e5386d8f6284fb44ae0f59c8f2eca",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-attempt1/M2-http-links.tap",
|
||||
"rawSha256": "69921707c219d19fb2c33a3995268b6442d783ec702050b32f78d8d2db6fb581",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-attempt1/M3-wrong-commit.tap",
|
||||
"rawSha256": "fe9fb027efae26799e2dfac539e0986402cefe806ca31479f52420e67a8df423",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M1-agent-label.tap",
|
||||
"rawSha256": "afbab60cbc12348c4d0c4be1a8c4590dd157c71f9ffc7375bbde82facb9868bb",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M1-badges.tap",
|
||||
"rawSha256": "3bb9fb9dcf74a398934d6de48c2ca99ab2eab618fb944297b3d7db00eec0e69f",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M2-http-links.tap",
|
||||
"rawSha256": "8909921fcf602fcafa94edd19c1167a8f91ed970a3e649110e3503836690e567",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M3-missing-file.tap",
|
||||
"rawSha256": "3fd2749ea5bc4245f7d49f585b82eae60f61ed150ab4dd22e8148a1e9467c8c7",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M3-wrong-commit.tap",
|
||||
"rawSha256": "85696c155f0a2844ee903c8fb38cab0a0fb6b0610c8b9ee8aa77a08cb6012ca2",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M4-fallback.tap",
|
||||
"rawSha256": "6f59f2845e0130d4d2fe1cb4aa7a435502f6043e11ed4efd67339c12e986103a",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M4-problem.tap",
|
||||
"rawSha256": "61ab08b823eb08cbb9c9eeaac82b297ea5d1272bb5dc64e9598734688b55eb80",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M5-commit-input.tap",
|
||||
"rawSha256": "b703ee5ca47e5c64749aab3edfb5ae2e085367921ffa75337f4f0e5c7b3dc404",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M5-fetch-metadata.tap",
|
||||
"rawSha256": "6951725340e4d74764552e7e406e0fc4bafeec35172de56d13bca852b92daa1a",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M5-origin.tap",
|
||||
"rawSha256": "95fcb5a92e82fa7de2972fd8f78c4f0f6d1c5f49885123e01fb1b69c3b62ba21",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M5-project-receipt.tap",
|
||||
"rawSha256": "a86806a189ef73f61ddd88479336321964eadef0793c7b45da6573ccd3e38801",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M5-send.tap",
|
||||
"rawSha256": "4cce523356a3e2041197156412eb35088f8b6d38fcceca2d9b76b6098ad17627",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M6-duplicate-call.tap",
|
||||
"rawSha256": "6dda962389fbc7379ac7e7bc79cc24b68db00d4f9bb649ab73e75eaa87a5da00",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/mutants-final/M7-user-fence.tap",
|
||||
"rawSha256": "abec36c65c3ece6e7d0c4dfd41eede62c9a585f07b3ed4cb3b8d05f0dbabaed3",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/render-green.tap",
|
||||
"rawSha256": "98463ac3d1262f84758def8bbdc27c46fa7c674bb8e8c20b9c752083163d0864",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/render-red.tap",
|
||||
"rawSha256": "03645c7a5ba0c3d285e58e1d6fd05dc58a1174b463a258b01bcf258b2141a85e",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/routes-final.tap",
|
||||
"rawSha256": "f2b58a97c301dc9e57458d82785bd50debb2254df5d411d8e8c4e6b9c0aa00d2",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/routes-green.tap",
|
||||
"rawSha256": "c34451a0eef5f82fe6ddcbbf370179d8e8a14e36168175bdeff5b32e2072e9d6",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
},
|
||||
{
|
||||
"path": "evidence/routes-red.tap",
|
||||
"rawSha256": "5ca5bafe2465209128508e5459f4826c34d00de86d1e79671196dc4e5c57f874",
|
||||
"normalization": "trailing whitespace removed from display copy"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
✔ free text renders as itself with no citations (1.332106ms)
|
||||
✔ a cited reply renders its text, then each cite with the badge from the check result (0.493062ms)
|
||||
✔ a parsed body renders as its string does (0.2706ms)
|
||||
✔ without a check result a path cite has no badge, no label and is never changed (0.175324ms)
|
||||
✔ the label and the badge come from the check result only, never from a bad entry (0.171275ms)
|
||||
✔ a web cite is a link only for https (0.254363ms)
|
||||
✔ a write notice renders its fixed line (0.201038ms)
|
||||
✔ a body without the reply or notice shape is free text: the whole body, no citations (0.315846ms)
|
||||
✔ an empty citations list is a reply with no cites (0.167552ms)
|
||||
ℹ tests 9
|
||||
ℹ suites 0
|
||||
ℹ pass 9
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 70.188818
|
||||
@@ -0,0 +1,17 @@
|
||||
✔ free text renders as itself with no citations (1.211164ms)
|
||||
✔ a cited reply renders its text, then each cite with the badge from the check result (0.457937ms)
|
||||
✔ a parsed body renders as its string does (0.255138ms)
|
||||
✔ without a check result a path cite has no badge, no label and is never changed (0.189285ms)
|
||||
✔ the label and the badge come from the check result only, never from a bad entry (0.162195ms)
|
||||
✔ a web cite is a link only for https (0.231665ms)
|
||||
✔ a write notice renders its fixed line (0.167596ms)
|
||||
✔ a body without the reply or notice shape is free text: the whole body, no citations (0.283804ms)
|
||||
✔ an empty citations list is a reply with no cites (0.145774ms)
|
||||
ℹ tests 9
|
||||
ℹ suites 0
|
||||
ℹ pass 9
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 73.226696
|
||||
@@ -0,0 +1,88 @@
|
||||
TAP version 13
|
||||
# Subtest: a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
ok 1 - a signed-in same-origin revert reaches exactly one library.revert and returns the new commit
|
||||
---
|
||||
duration_ms: 18.873338
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
ok 2 - a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata
|
||||
---
|
||||
duration_ms: 7.061714
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
ok 3 - a revert takes a project and a 40-hex commit, nothing else, before the bus is asked
|
||||
---
|
||||
duration_ms: 6.45503
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
ok 4 - a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal
|
||||
---
|
||||
duration_ms: 6.964122
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
ok 5 - a revert whose answer is lost or unusable is reported unknown and is never retried
|
||||
---
|
||||
duration_ms: 5.745801
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read takes one project query and answers the bus result for that project
|
||||
ok 6 - the status read takes one project query and answers the bus result for that project
|
||||
---
|
||||
duration_ms: 2.815134
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
ok 7 - a status answer for another project or of the wrong shape is refused; a refusal keeps its status
|
||||
---
|
||||
duration_ms: 7.105984
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the status read needs no send; a read-only Console still has no revert
|
||||
ok 8 - the status read needs no send; a read-only Console still has no revert
|
||||
---
|
||||
duration_ms: 2.002948
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
ok 9 - library routes are the owner's: a granted user is refused them, and the tester never reverts
|
||||
---
|
||||
duration_ms: 0.708324
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
ok 10 - the page gets the one library renderer, byte for byte, as a JavaScript module
|
||||
---
|
||||
duration_ms: 1.553573
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a revert receipt for another project is unknown and is never retried
|
||||
ok 11 - a revert receipt for another project is unknown and is never retried
|
||||
---
|
||||
duration_ms: 1.371025
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a granted-user HTTP session cannot reach owner library callbacks
|
||||
ok 12 - a granted-user HTTP session cannot reach owner library callbacks
|
||||
---
|
||||
duration_ms: 1.586864
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: a configured revert callback remains unreachable when send is off
|
||||
ok 13 - a configured revert callback remains unreachable when send is off
|
||||
---
|
||||
duration_ms: 1.226995
|
||||
type: 'test'
|
||||
...
|
||||
1..13
|
||||
# tests 13
|
||||
# suites 0
|
||||
# pass 13
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 177.384993
|
||||
@@ -0,0 +1,20 @@
|
||||
✔ a signed-in same-origin revert reaches exactly one library.revert and returns the new commit (19.266366ms)
|
||||
✔ a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata (7.415028ms)
|
||||
✔ a revert takes a project and a 40-hex commit, nothing else, before the bus is asked (6.176121ms)
|
||||
✔ a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal (7.325625ms)
|
||||
✔ a revert whose answer is lost or unusable is reported unknown and is never retried (5.0635ms)
|
||||
✔ the status read takes one project query and answers the bus result for that project (3.008847ms)
|
||||
✔ a status answer for another project or of the wrong shape is refused; a refusal keeps its status (6.314096ms)
|
||||
✔ the status read needs no send; a read-only Console still has no revert (1.440122ms)
|
||||
✔ library routes are the owner's: a granted user is refused them, and the tester never reverts (0.563979ms)
|
||||
✔ the page gets the one library renderer, byte for byte, as a JavaScript module (1.180551ms)
|
||||
✔ a revert receipt for another project is unknown and is never retried (1.12255ms)
|
||||
✔ a granted-user HTTP session cannot reach owner library callbacks (1.351581ms)
|
||||
ℹ tests 12
|
||||
ℹ suites 0
|
||||
ℹ pass 12
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 182.202771
|
||||
@@ -0,0 +1,76 @@
|
||||
✔ a signed-in same-origin revert reaches exactly one library.revert and returns the new commit (18.853567ms)
|
||||
✔ a revert needs send, the named Host, the user, the exact Origin and same-origin Fetch Metadata (6.491576ms)
|
||||
✔ a revert takes a project and a 40-hex commit, nothing else, before the bus is asked (5.647113ms)
|
||||
✔ a bus refusal is reported as not reverted with its code; before C2-02 that is the verb refusal (6.08423ms)
|
||||
✔ a revert whose answer is lost or unusable is reported unknown and is never retried (5.445934ms)
|
||||
✖ the status read takes one project query and answers the bus result for that project (3.470803ms)
|
||||
✖ a status answer for another project or of the wrong shape is refused; a refusal keeps its status (5.42219ms)
|
||||
✔ the status read needs no send; a read-only Console still has no revert (1.428304ms)
|
||||
✔ library routes are the owner's: a granted user is refused them, and the tester never reverts (0.509039ms)
|
||||
✔ the page gets the one library renderer, byte for byte, as a JavaScript module (1.123365ms)
|
||||
✖ a revert receipt for another project is unknown and is never retried (1.209291ms)
|
||||
✔ a granted-user HTTP session cannot reach owner library callbacks (1.398731ms)
|
||||
ℹ tests 12
|
||||
ℹ suites 0
|
||||
ℹ pass 9
|
||||
ℹ fail 3
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 198.061254
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/webui/tests/library-routes.test.mjs:100:1
|
||||
✖ the status read takes one project query and answers the bus result for that project (3.470803ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
403 !== 405
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row225/packages/webui/tests/library-routes.test.mjs:107:10)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 403,
|
||||
expected: 405,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/webui/tests/library-routes.test.mjs:111:1
|
||||
✖ a status answer for another project or of the wrong shape is refused; a refusal keeps its status (5.42219ms)
|
||||
AssertionError [ERR_ASSERTION]: project-not-declared
|
||||
|
||||
400 !== 502
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row225/packages/webui/tests/library-routes.test.mjs:119:12)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 400,
|
||||
expected: 502,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/webui/tests/library-routes.test.mjs:145:1
|
||||
✖ a revert receipt for another project is unknown and is never retried (1.209291ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
200 !== 503
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/fethry-row225/packages/webui/tests/library-routes.test.mjs:148:10)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 200,
|
||||
expected: 503,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,170 @@
|
||||
diff --git a/packages/bus/tests/channel-proof.test.mjs b/packages/bus/tests/channel-proof.test.mjs
|
||||
index ba0179832..435d8fa2d 100644
|
||||
--- a/packages/bus/tests/channel-proof.test.mjs
|
||||
+++ b/packages/bus/tests/channel-proof.test.mjs
|
||||
@@ -11,0 +12,2 @@
|
||||
+// Row 225 (C2-10b) re-pins webui bus.mjs for one STATUS entry, library-revert-not-agent: 409; no proof
|
||||
+// or transport change.
|
||||
@@ -32 +34 @@ const baselines = {
|
||||
- "packages/webui/src/bus.mjs": "604092cb706b152d458f299ff1071f6cd488774629012f96b672f7e9a16c0b2c",
|
||||
+ "packages/webui/src/bus.mjs": "9f33e9ca4feb7265ae33fd3ddf0ead0b75375d07ecbe9d8e55c618d29edea658",
|
||||
diff --git a/packages/library/tests/render.test.mjs b/packages/library/tests/render.test.mjs
|
||||
index b07e26d25..9c861bfe9 100644
|
||||
--- a/packages/library/tests/render.test.mjs
|
||||
+++ b/packages/library/tests/render.test.mjs
|
||||
@@ -3 +3 @@ import assert from 'node:assert/strict';
|
||||
-import { renderItems, UNREADABLE } from '../src/index.mjs';
|
||||
+import { renderReply } from '../src/index.mjs';
|
||||
@@ -4,0 +5 @@ import { renderItems, UNREADABLE } from '../src/index.mjs';
|
||||
+// Row 225 (C2-10b): renderReply replaces renderItems (design 7.4, the reply schema of 5.2).
|
||||
@@ -6,6 +7,12 @@ const A = 'a'.repeat(40), B = 'b'.repeat(40);
|
||||
-const cite = (path, lines, quote, commit = A) => ({ path, commit, lines, quote });
|
||||
-const options = {
|
||||
- scopeOf: path => path.includes('/Playground/') ? 'playground' : path.endsWith('.md') ? 'canon' : undefined,
|
||||
- changed: ({ path, commit }) => path === 'Book One/Characters/Mara Vell.md' && commit === A,
|
||||
-};
|
||||
-const render = items => renderItems(JSON.stringify({ items }), options);
|
||||
+const cite = (path, lines, quote, commit = A, extra = {}) => ({ path, commit, lines, quote, ...extra });
|
||||
+const web = (url, quote = 'spring tides') => ({ url, quote });
|
||||
+const reply = (text, citations) => JSON.stringify({ text, citations });
|
||||
+const CITED = reply("Mara's eyes are grey in chapter 3.", [
|
||||
+ cite('Book One/Chapters/Chapter 03.md', [41, 41], 'her grey eyes', A, { as: 'canon' }),
|
||||
+ cite('Book One/Playground/What If.md', [5, 6], 'a storm', B),
|
||||
+ cite('Notes/Eyes.md', [9, 10], 'green eyes'),
|
||||
+ web('https://example.invalid/tides'),
|
||||
+]);
|
||||
+const CHECK = { citations: [{ scope: 'canon', agent: null }, { scope: 'playground', agent: null },
|
||||
+ { scope: 'supporting', agent: 'acme/scribe' }, { scope: 'web', agent: null }] };
|
||||
+const changed = ({ path, commit }) => path === 'Notes/Eyes.md' && commit === A;
|
||||
@@ -13,21 +20,4 @@ const render = items => renderItems(JSON.stringify({ items }), options);
|
||||
-// One snapshot per item kind: the plain text both channels show.
|
||||
-const SNAPSHOTS = {
|
||||
- fact: [{ kind: 'fact', text: 'Tomas is the ferryman.', cites: [cite('Book One/Characters/Tomas.md', [3, 3], 'the ferryman', B)] }],
|
||||
- finding: [{ kind: 'finding', text: 'Eye colour differs.', cites: [cite('Book One/Chapters/Chapter 01.md', [41, 41], 'her grey eyes'),
|
||||
- cite('Book One/Characters/Mara Vell.md', [9, 10], 'green eyes')] }],
|
||||
- correction: [{ kind: 'correction', text: 'Chapter 1 says grey.', from: 'green eyes', to: 'grey eyes',
|
||||
- cites: [cite('Book One/Characters/Mara Vell.md', [9, 9], 'green eyes', B)] }],
|
||||
- question: [{ kind: 'question', text: 'Is the harbor north of the town?', cites: [cite('Book One/Places/Harbor Town.md', [2, 4], 'the harbor', B)] }],
|
||||
- idea: [{ kind: 'idea', text: 'A storm could close the harbor.', cites: [cite('Book One/Playground/What If.md', [5, 5], 'a storm', B),
|
||||
- { url: 'https://example.invalid/tides', quote: 'spring tides' }] }],
|
||||
-};
|
||||
-const EXPECTED = {
|
||||
- fact: '1. Fact: Tomas is the ferryman.\n [canon] Book One/Characters/Tomas.md:3 @bbbbbbb "the ferryman"',
|
||||
- finding: '1. Finding: Eye colour differs.\n [canon] Book One/Chapters/Chapter 01.md:41 @aaaaaaa "her grey eyes"\n'
|
||||
- + ' [canon] Book One/Characters/Mara Vell.md:9-10 @aaaaaaa "green eyes" (changed since)',
|
||||
- correction: '1. Correction: Chapter 1 says grey.\n From: "green eyes"\n To: "grey eyes"\n'
|
||||
- + ' [canon] Book One/Characters/Mara Vell.md:9 @bbbbbbb "green eyes"',
|
||||
- question: '1. Question: Is the harbor north of the town?\n [canon] Book One/Places/Harbor Town.md:2-4 @bbbbbbb "the harbor"',
|
||||
- idea: '1. Idea: A storm could close the harbor.\n [playground] Book One/Playground/What If.md:5 @bbbbbbb "a storm"\n'
|
||||
- + ' [web] https://example.invalid/tides "spring tides"',
|
||||
-};
|
||||
+test('free text renders as itself with no citations', () => {
|
||||
+ for (const body of ['Grey, in chapter 3.', '', '"a JSON string"', '[1, 2]', '42', 'null'])
|
||||
+ assert.deepEqual(renderReply(body, { check: CHECK }), { kind: 'text', text: body, plain: body });
|
||||
+});
|
||||
@@ -35,8 +25,15 @@ const EXPECTED = {
|
||||
-for (const kind of Object.keys(SNAPSHOTS)) {
|
||||
- test(`renderItems snapshot: ${kind}`, () => {
|
||||
- const out = render(SNAPSHOTS[kind]);
|
||||
- assert.equal(out.kind, 'items');
|
||||
- assert.equal(out.text, EXPECTED[kind]);
|
||||
- assert.equal(out.items[0].kind, kind);
|
||||
- });
|
||||
-}
|
||||
+test('a cited reply renders its text, then each cite with the badge from the check result', () => {
|
||||
+ const out = renderReply(CITED, { check: CHECK, changed });
|
||||
+ assert.equal(out.kind, 'reply');
|
||||
+ assert.equal(out.text, "Mara's eyes are grey in chapter 3.");
|
||||
+ assert.deepEqual(out.citations.map(c => c.badge), ['canon', 'playground', 'supporting', 'web']);
|
||||
+ assert.equal(out.plain, "Mara's eyes are grey in chapter 3.\n"
|
||||
+ + ' [canon] Book One/Chapters/Chapter 03.md:41 @aaaaaaa "her grey eyes"\n'
|
||||
+ + ' [playground] Book One/Playground/What If.md:5-6 @bbbbbbb "a storm"\n'
|
||||
+ + ' [supporting] Notes/Eyes.md:9-10 @aaaaaaa "green eyes" (agent-written: acme/scribe) (changed since)\n'
|
||||
+ + ' [web] https://example.invalid/tides "spring tides"');
|
||||
+ assert.deepEqual(out.citations[0], { badge: 'canon', path: 'Book One/Chapters/Chapter 03.md', commit: A, lines: [41, 41],
|
||||
+ ref: 'Book One/Chapters/Chapter 03.md:41 @aaaaaaa', quote: 'her grey eyes', canon: true, agent: null, changed: false });
|
||||
+ assert.deepEqual(out.citations[3], { badge: 'web', url: 'https://example.invalid/tides', link: 'https://example.invalid/tides',
|
||||
+ ref: 'https://example.invalid/tides', quote: 'spring tides', agent: null, changed: false });
|
||||
+});
|
||||
@@ -44,6 +41,2 @@ for (const kind of Object.keys(SNAPSHOTS)) {
|
||||
-test('renderItems numbers several items and takes a parsed body as well as a string', () => {
|
||||
- const items = [...SNAPSHOTS.fact, ...SNAPSHOTS.question];
|
||||
- const out = renderItems({ items }, options);
|
||||
- assert.equal(out.text, `${EXPECTED.fact}\n${EXPECTED.question.replace(/^1\./, '2.')}`);
|
||||
- assert.deepEqual(out.items[1].cites[0], { badge: 'canon', path: 'Book One/Places/Harbor Town.md', commit: B, lines: [2, 4],
|
||||
- ref: 'Book One/Places/Harbor Town.md:2-4 @bbbbbbb', quote: 'the harbor', changed: false });
|
||||
+test('a parsed body renders as its string does', () => {
|
||||
+ assert.deepEqual(renderReply(JSON.parse(CITED), { check: CHECK, changed }), renderReply(CITED, { check: CHECK, changed }));
|
||||
@@ -52,4 +45,4 @@ test('renderItems numbers several items and takes a parsed body as well as a str
|
||||
-test('without options a path cite has no badge and is never marked changed', () => {
|
||||
- assert.equal(renderItems({ items: SNAPSHOTS.finding }).text,
|
||||
- '1. Finding: Eye colour differs.\n Book One/Chapters/Chapter 01.md:41 @aaaaaaa "her grey eyes"\n'
|
||||
- + ' Book One/Characters/Mara Vell.md:9-10 @aaaaaaa "green eyes"');
|
||||
+test('without a check result a path cite has no badge, no label and is never changed', () => {
|
||||
+ const out = renderReply(CITED);
|
||||
+ assert.deepEqual(out.citations.map(c => [c.badge, c.agent, c.changed]),
|
||||
+ [[null, null, false], [null, null, false], [null, null, false], ['web', null, false]]);
|
||||
@@ -58,6 +51,6 @@ test('without options a path cite has no badge and is never marked changed', ()
|
||||
-const NOTICE_SNAPSHOTS = { 'no-cited-answer': 'No cited answer', 'no-answer': 'No answer', 'turn-failed': 'The turn failed' };
|
||||
-for (const [notice, text] of Object.entries(NOTICE_SNAPSHOTS)) {
|
||||
- test(`renderItems snapshot: notice ${notice}`, () => {
|
||||
- assert.deepEqual(renderItems(JSON.stringify({ items: [], notice }), options), { kind: 'notice', notice, text });
|
||||
- });
|
||||
-}
|
||||
+test('the label and the badge come from the check result only, never from a bad entry', () => {
|
||||
+ const bad = { citations: [{ scope: 'web', agent: '' }, { scope: 'story', agent: 7 }, null, { scope: 'canon', agent: 'x/y' }] };
|
||||
+ const out = renderReply(CITED, { check: bad });
|
||||
+ // A path cite can't be web; a url cite is web by its shape whatever the check says, and never agent-written.
|
||||
+ assert.deepEqual(out.citations.map(c => [c.badge, c.agent]), [[null, null], [null, null], [null, null], ['web', null]]);
|
||||
+});
|
||||
@@ -65,14 +58,8 @@ for (const [notice, text] of Object.entries(NOTICE_SNAPSHOTS)) {
|
||||
-test('a body without the reply shape shows a fixed line and none of its text', () => {
|
||||
- const secret = 'free prose the guard would refuse';
|
||||
- const bodies = [secret, JSON.stringify(secret), '{"items": [], "notice": "other"}', JSON.stringify({ items: [], notice: 'no-answer', extra: secret }),
|
||||
- JSON.stringify({ items: [] }), JSON.stringify({ items: [{ kind: 'story', text: secret, cites: [] }] }),
|
||||
- JSON.stringify({ items: [{ kind: 'fact', text: secret }] }), JSON.stringify({ items: SNAPSHOTS.fact, prose: secret }),
|
||||
- JSON.stringify({ items: [{ kind: 'correction', text: secret, cites: [] }] }),
|
||||
- JSON.stringify({ items: [{ kind: 'fact', text: secret, cites: [cite('a.md', [2, 1], 'q')] }] }),
|
||||
- JSON.stringify({ items: [{ kind: 'fact', text: secret, cites: [{ path: 'a.md', commit: 'abc', lines: [1, 1], quote: 'q' }] }] }),
|
||||
- JSON.stringify({ items: [{ kind: 'fact', text: secret, cites: [{ url: 'https://x.invalid', path: 'a.md', quote: 'q' }] }] }),
|
||||
- null, 42, '[]'];
|
||||
- for (const body of bodies) {
|
||||
- const out = renderItems(body, options);
|
||||
- assert.deepEqual(out, { kind: 'unreadable', text: UNREADABLE }, String(body));
|
||||
- assert.ok(!JSON.stringify(out).includes(secret));
|
||||
+test('a web cite is a link only for https', () => {
|
||||
+ const urls = { 'https://example.invalid/a': 'https://example.invalid/a', 'http://example.invalid/a': null,
|
||||
+ 'javascript:alert(1)': null, 'JAVASCRIPT:alert(1)': null, 'data:text/html,x': null, 'not a url': null, '//example.invalid': null };
|
||||
+ for (const [url, link] of Object.entries(urls)) {
|
||||
+ const out = renderReply(reply('t', [web(url)]));
|
||||
+ assert.equal(out.kind, 'reply', url);
|
||||
+ assert.equal(out.citations[0].link, link, url);
|
||||
+ assert.equal(out.citations[0].ref, url);
|
||||
@@ -80,0 +68,27 @@ test('a body without the reply shape shows a fixed line and none of its text', (
|
||||
+
|
||||
+test('a write notice renders its fixed line', () => {
|
||||
+ const body = op => JSON.stringify({ notice: 'library-write', op, path: 'Notes/Eyes.md', commit: B });
|
||||
+ assert.deepEqual(renderReply(body('write'), { name: 'Scribe' }),
|
||||
+ { kind: 'notice', op: 'write', path: 'Notes/Eyes.md', commit: B, text: 'Scribe wrote Notes/Eyes.md @bbbbbbb', plain: 'Scribe wrote Notes/Eyes.md @bbbbbbb' });
|
||||
+ assert.equal(renderReply(body('delete'), { name: 'Scribe' }).text, 'Scribe deleted Notes/Eyes.md @bbbbbbb');
|
||||
+ assert.equal(renderReply(body('write')).text, 'An agent wrote Notes/Eyes.md @bbbbbbb');
|
||||
+});
|
||||
+
|
||||
+test('a body without the reply or notice shape is free text: the whole body, no citations', () => {
|
||||
+ const bodies = [
|
||||
+ JSON.stringify({ text: 't' }), JSON.stringify({ citations: [] }), JSON.stringify({ text: 1, citations: [] }),
|
||||
+ JSON.stringify({ text: 't', citations: [], extra: 1 }), JSON.stringify({ items: [] }),
|
||||
+ reply('t', [cite('a.md', [2, 1], 'q')]), reply('t', [cite('a.md', [0, 1], 'q')]), reply('t', [cite('a.md', [1], 'q')]),
|
||||
+ reply('t', [{ path: 'a.md', commit: 'abc', lines: [1, 1], quote: 'q' }]), reply('t', [cite('a.md', [1, 1], 'q', A, { as: 'playground' })]),
|
||||
+ reply('t', [cite('a.md', [1, 1], 'q', A, { scope: 'canon' })]), reply('t', [{ url: 'https://x.invalid', path: 'a.md', quote: 'q' }]),
|
||||
+ reply('t', [{ url: 'https://x.invalid' }]), reply('t', [{ url: 'https://x.invalid', quote: 'q', agent: 'x/y' }]),
|
||||
+ JSON.stringify({ notice: 'library-write', op: 'move', path: 'a.md', commit: A }),
|
||||
+ JSON.stringify({ notice: 'library-write', op: 'write', path: 'a.md', commit: 'abc' }),
|
||||
+ JSON.stringify({ notice: 'library-write', op: 'write', path: 'a.md', commit: A, by: 'x' }),
|
||||
+ ];
|
||||
+ for (const body of bodies) assert.deepEqual(renderReply(body, { check: CHECK }), { kind: 'text', text: body, plain: body }, body);
|
||||
+});
|
||||
+
|
||||
+test('an empty citations list is a reply with no cites', () => {
|
||||
+ assert.deepEqual(renderReply(reply('Grey.', [])), { kind: 'reply', text: 'Grey.', citations: [], plain: 'Grey.' });
|
||||
+});
|
||||
@@ -0,0 +1,13 @@
|
||||
6bdaf870be3d8d03a68eb03f5f6916150bb1b3db134ffbe84018e91d47e6434d packages/bus/tests/channel-proof.test.mjs
|
||||
0385fc49b445ff730021eb11c20b29027631e0d27350e4591d5a0936ffbdccf6 packages/library/README.md
|
||||
653ff444ba66cb73e1ca4df1f6037f15a2ec7d3d009cf614a0dc51deabda4b50 packages/library/src/index.mjs
|
||||
dfcc9f271afc7afdab908395a7f3c402100fa89b4994b20d5bcae3140d5c335e packages/library/src/render.mjs
|
||||
f3c213f3b0bd080d0bc5837f741a29e324acb91cf0c27144dee08a4113262210 packages/library/tests/render.test.mjs
|
||||
9f33e9ca4feb7265ae33fd3ddf0ead0b75375d07ecbe9d8e55c618d29edea658 packages/webui/src/bus.mjs
|
||||
f1a0c9a55b1ae933e205c7e2b9753afe0c2f1fc9b0faa2cf18765396f99ac8dd packages/webui/src/cli.mjs
|
||||
bf49a22147be0535076640d20149116a744dad9b0b32dd667ee297a061d56134 packages/webui/src/console-bus.mjs
|
||||
793e7dd9edbe5a55c2deab3c8aef4fbd5b4c838e132e2ac9294043c7176ec6f7 packages/webui/src/public/chat.css
|
||||
af3a6f382e0d40cf2b28c31db7cb58ba775f1e242651ba42c7426bda99dc0d89 packages/webui/src/public/chat.js
|
||||
6412fe34bc640433e9cf7610f65d3574a3415c934354d8cb52e056793a81948f packages/webui/src/serve.mjs
|
||||
f191752f867a112c867ca24268f70aa99ca0903c9208f76bc4bb4c1587cb55df packages/webui/tests/chat-replies-browser.test.mjs
|
||||
df4ff385ac4ca8244ffa00faf82fcca1f4fcdac8da02a4f4d71233d4df8e1157 packages/webui/tests/library-routes.test.mjs
|
||||
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Run row225 mutants in disposable snapshots, only on Sage CLEAR.
|
||||
|
||||
Commit the tested candidate first. Never change the worktree or shared dependencies.
|
||||
A timeout, import failure or process failure is not a mutation kill.
|
||||
"""
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import shutil
|
||||
import subprocess
|
||||
import tarfile
|
||||
import tempfile
|
||||
|
||||
BROWSER = 'packages/webui/tests/chat-replies-browser.test.mjs'
|
||||
ROUTES = 'packages/webui/tests/library-routes.test.mjs'
|
||||
CHAT = 'packages/webui/src/public/chat.js'
|
||||
SERVE = 'packages/webui/src/serve.mjs'
|
||||
RENDER = 'packages/library/src/render.mjs'
|
||||
MUTANTS = [
|
||||
('M1-badges', RENDER, 'badge: scope, path:', 'badge: null, path:', BROWSER),
|
||||
('M1-agent-label', RENDER, 'canon: c.canon, agent,', 'canon: c.canon, agent: null,', BROWSER),
|
||||
('M2-http-links', RENDER, "new URL(url).protocol === 'https:' ? url : null", 'url', BROWSER),
|
||||
('M3-wrong-commit', CHAT, 'e.file !== e.last', 'cite.commit !== e.last', BROWSER),
|
||||
('M3-missing-file', CHAT, "SHA.test(e?.file ?? '') && SHA.test(e?.last ?? '')", "SHA.test(e?.last ?? '')", BROWSER),
|
||||
('M4-fallback', CHAT, 'Array.isArray(limits.fallback) ? limits.fallback.filter', 'Array.isArray(v.replyLimitsFallback) ? v.replyLimitsFallback.filter', BROWSER),
|
||||
('M4-problem', CHAT, "if (CODE.test(limits.problem ?? '')) parts.push(`<code>${txt(limits.problem)}</code>`);", '', BROWSER),
|
||||
('M5-send', SERVE, 'if (!send || !libraryRevert || !named)', 'if (!libraryRevert || !named)', ROUTES),
|
||||
('M5-project-receipt', SERVE, 'result.project !== value.project || ', '', ROUTES),
|
||||
('M5-commit-input', SERVE, '!COMMIT.test(value.commit)', 'false', ROUTES),
|
||||
('M5-origin', SERVE, "if (one(req, 'origin') !== ownOrigin(preview)) return refuse(403, 'cross-origin request refused', 'a revert needs the Console\\'s own Origin');", '', ROUTES),
|
||||
('M5-fetch-metadata', SERVE, "if (one(req, 'sec-fetch-site') !== 'same-origin') return refuse(403, 'cross-site request refused', 'a revert needs same-origin Fetch Metadata');", '', ROUTES),
|
||||
('M6-duplicate-call', SERVE, 'result = await libraryRevert({ project: value.project, commit: value.commit });', 'result = await libraryRevert({ project: value.project, commit: value.commit }); await libraryRevert({ project: value.project, commit: value.commit });', ROUTES),
|
||||
('M7-user-fence', SERVE, "if (path === '/api/chat' || path.startsWith('/api/chat/')) return true;", "if (path.startsWith('/api/library/')) return true; if (path === '/api/chat' || path.startsWith('/api/chat/')) return true;", ROUTES),
|
||||
]
|
||||
|
||||
|
||||
def digest(path):
|
||||
return hashlib.sha256(path.read_bytes()).hexdigest()
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--clear', required=True, help='Sage CLEAR authorizing this run')
|
||||
parser.add_argument('--output', required=True, type=Path)
|
||||
args = parser.parse_args()
|
||||
repo = Path(subprocess.check_output(['git', 'rev-parse', '--show-toplevel'], text=True).strip())
|
||||
if subprocess.check_output(['git', 'status', '--porcelain', '--', 'packages'], text=True).strip():
|
||||
raise SystemExit('Commit tested packages first: snapshot must match candidate.')
|
||||
head = subprocess.check_output(['git', 'rev-parse', 'HEAD'], text=True).strip()
|
||||
before = {p: digest(repo / p) for p in [CHAT, SERVE, RENDER]}
|
||||
args.output.mkdir(parents=True, exist_ok=True)
|
||||
results = []
|
||||
with tempfile.TemporaryDirectory(prefix='mosaic-row225-mutants-') as directory:
|
||||
scratch = Path(directory)
|
||||
archive = scratch / 'candidate.tar'
|
||||
with archive.open('wb') as stream:
|
||||
subprocess.run(['git', 'archive', 'HEAD', 'packages', 'roles', 'contracts', 'tasks', 'missions', 'package.json', 'RELEASE'], stdout=stream, check=True)
|
||||
for name, target, old, new, test in MUTANTS:
|
||||
tree = scratch / name
|
||||
tree.mkdir()
|
||||
with tarfile.open(archive) as bundle:
|
||||
bundle.extractall(tree, filter='data')
|
||||
(tree / 'node_modules').symlink_to((repo / 'node_modules').resolve(), target_is_directory=True)
|
||||
path = tree / target
|
||||
source = path.read_text()
|
||||
hits = source.count(old)
|
||||
if hits != 1:
|
||||
raise SystemExit(f'{name}: expected one anchor, found {hits}')
|
||||
path.write_text(source.replace(old, new, 1))
|
||||
command = ['timeout', '-k', '10', '240' if test == BROWSER else '120', 'node', '--test', '--test-reporter=tap', '--test-concurrency=1', '--test-timeout=30000', test]
|
||||
run = subprocess.run(command, cwd=tree, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, env=os.environ)
|
||||
log = args.output / f'{name}.tap'
|
||||
log.write_text(run.stdout)
|
||||
path.write_text(source)
|
||||
restored = digest(path) == hashlib.sha256(source.encode()).hexdigest()
|
||||
worktree_clean = before == {p: digest(repo / p) for p in before}
|
||||
if not restored or not worktree_clean:
|
||||
raise SystemExit(f'{name}: restore/hash check failed')
|
||||
killed = run.returncode == 1 and 'ERR_ASSERTION' in run.stdout and 'not ok ' in run.stdout
|
||||
results.append({'mutant': name, 'anchorHits': hits, 'restored': restored, 'worktreeUnchanged': worktree_clean, 'exit': run.returncode, 'killed': killed, 'test': test, 'log': str(log)})
|
||||
print(json.dumps(results[-1]), flush=True)
|
||||
shutil.rmtree(tree)
|
||||
if not killed:
|
||||
break
|
||||
after = {p: digest(repo / p) for p in before}
|
||||
report = {'head': head, 'clear': args.clear, 'worktreeUnchanged': before == after, 'results': results}
|
||||
(args.output / 'summary.json').write_text(json.dumps(report, indent=2) + '\n')
|
||||
if before != after or len(results) != len(MUTANTS) or not all(r['killed'] for r in results):
|
||||
raise SystemExit(1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,9 +0,0 @@
|
||||
# Gladstone
|
||||
|
||||
Builder seat, Codex gpt-6.1-sol, started by Mos (mos-1531, mos-1532). Owns the Case 1/2 host fixes for the 433 P1 rerun,
|
||||
F1 to F6 (#1816, Vikunja 614).
|
||||
|
||||
No launcher in this directory. The seat runs as a T3 thread (thread 433058fc) and works in its own worktree. It has no
|
||||
credentials of its own; it pushes only its own `gladstone/*` branches through the repository credential helper (mos-0981),
|
||||
never `refactor`, `main` or another seat's branch. Claude seats orchestrate and review (Q245). Registered by Sage on
|
||||
2026-10-23 so the queue can name the seat as row owner (store.mjs isSeatDir).
|
||||
@@ -1,304 +0,0 @@
|
||||
# Hostcheck item 5 and bundle verification (Gitea #1816, Vikunja 614)
|
||||
|
||||
Queue row pending from Sage. Owner Gladstone, reviewer Morgana, gate/landing Sage.
|
||||
Base: fetched origin/refactor 93694c5185d0a7f989d2fe78fb620e44599b744e;
|
||||
branch gladstone/hostcheck-item5. Scope: mos-1531 / ops-0256, sage-3738 and sage-3740.
|
||||
|
||||
## Before and after
|
||||
|
||||
Ubuntu 24.04 dpkg 1.22.6ubuntu6.6 prints `root mosaic 750 /usr/bin/bwrap`.
|
||||
Item 5 compared the literal `0750`, falsely refusing a correctly configured host;
|
||||
--enforce would unload the profile, close bwrap and record DRIFT.
|
||||
The candidate accepts exactly four fields, root, mosaic, octal 0750, and $BWRAP.
|
||||
`0*750` represents all octal spellings numerically equal to 0750 without arithmetic
|
||||
conversion/overflow. Horizontal whitespace separates fields; extra fields and
|
||||
embedded newlines refuse. Owner, group and path remain exact. The stat comparison
|
||||
and existing output strings remain unchanged. Only the item 5 comment also changes.
|
||||
|
||||
The two release-transport bundle checks previously ran outside any repository.
|
||||
Each now creates an empty bare scratch repository, verifies with git -C, and removes
|
||||
the scratch directory using an EXIT trap. A failure exits the shell before cloning
|
||||
or fetching. No other run-sheet text changes.
|
||||
|
||||
## Tests and mutants
|
||||
|
||||
Only packages/cli/tests/case1-hostcheck.test.mjs changes among tests, by appending
|
||||
three new test() blocks; the existing passing 0750 fake and failing fake are intact.
|
||||
The pass test exercises 750, 0750 and 000750. The enforce test checks no unload,
|
||||
chown, chmod, DRIFT or hostcheck log for 750. Refusals independently cover 755,
|
||||
0755, 4750, 75, 7500, 075, non-octal strings, other owner/group/path, missing path,
|
||||
extra fields, multiple lines, blank/empty output and a missing fixture file.
|
||||
|
||||
| Mutant | Change | Killer | Result |
|
||||
|---|---|---|---|
|
||||
| M1 | Restore the old literal root mosaic 0750 comparison (drop 750) | new check pass test | Unrun |
|
||||
| M2 | Accept any mode while preserving owner/group/path | new refusal test | Unrun |
|
||||
|
||||
Mutant procedure: preserve script bytes, assert one replacement, run the named
|
||||
killer alone, require failure for its intended assertion, restore in finally and
|
||||
check the original bytes/hash. Run the original targeted file again after restore.
|
||||
|
||||
## Verification status
|
||||
|
||||
Untested. Sage-3738 prohibits all Node until CLEAR because the joint full gate
|
||||
runs alone. Sage-3740 explicitly directs pushing this untested build for Morgana's
|
||||
static review before CLEAR. This supersedes test-first execution for this draft;
|
||||
no Node, tests, node --check, full suites or live-host operations have run.
|
||||
Queue next refused linked-worktree execution; Sage owns queue creation/movement.
|
||||
Push only gladstone/*, with MOSAIC_GITEA_CREDENTIAL_FILE unset; no amend/force.
|
||||
|
||||
Static draft receipt: `git diff --check` passed. Test-file numstat against the
|
||||
base is `46 0 packages/cli/tests/case1-hostcheck.test.mjs` (added/deleted).
|
||||
|
||||
## Scope and implementation amendment (mos-1534, sage-3741)
|
||||
|
||||
F1 correction: Sage requires precisely `750` or `0750` and exactly single spaces,
|
||||
so the candidate now uses `0?750` and literal spaces. It refuses 00750/000750,
|
||||
a doubled space and a tab. This supersedes the initial numeric-equivalence design
|
||||
above. Only this row's own appended tests change; no base test line changes.
|
||||
|
||||
F3: case2-unit.sh plain() adds @. abs_plain is its only caller and requires an
|
||||
absolute normalized path, so @ cannot become an ExecStart prefix. In sed @ is
|
||||
ordinary replacement text (the delimiter is |); &, backslash and | still refuse.
|
||||
Environment=MOSAIC_CLAUDE_BIN carries @ literally; the parser compares the complete
|
||||
value, with no shell evaluation. @anthropic-ai also cannot match the residual
|
||||
@[A-Z_]+@ token check. Tests render/reinstall with a regular executable under
|
||||
@anthropic-ai, checking Environment and the new copy's WorkingDirectory. Since a
|
||||
nonroot test cannot create root ownership, a stat fake models root:0755 only for
|
||||
that file and its ancestor chain. The real file type/executable checks, render,
|
||||
installed-unit parser, and all other stat calls remain active. A separate block
|
||||
refuses space, %, $, both quote characters, backslash, & and |.
|
||||
|
||||
F4: copy_tree changes to / before archive/npm/find, after all its path arguments
|
||||
are absolute. copy_bundle retains its existing relative-bundle resolution before
|
||||
calling copy_tree. Checkout copies have absolute REPO and COPIES too. Source-only
|
||||
use from stack-release.sh changes no cwd because copy_tree is not called there.
|
||||
Audit of every AS_USER command in stack-upgrade.sh: fetch and merge use git -C;
|
||||
plan, gate, revert, confirm-rollback, stage (activate/rollback), confirm and rehearse
|
||||
invoke stack-release.sh, which changes to its checkout at line 34. No other
|
||||
AS_USER command needs a fix. The new test enters a directory mode 0111, verifies
|
||||
that ls cannot read it, then runs both a relative-bundle copy and checkout copy,
|
||||
asserting success, no find restore error, and an immutable completed copy.
|
||||
|
||||
Additional mutants (unrun under the same no-Node hold):
|
||||
|
||||
| Mutant | Change | Killer | Result |
|
||||
|---|---|---|---|
|
||||
| M3 | Drop @ from plain() | new factory scoped Claude-path test | Unrun |
|
||||
| M4 | Remove copy_tree's cd / | new unreadable-cwd copy test | Unrun |
|
||||
|
||||
All four fixes remain untested. Follow-up is an additive commit on the pushed
|
||||
branch, per sage-3741, with no amend or force. Morgana's static F1/F2 read of
|
||||
f30c74b12 was CLEAN (morgana-0205); F3/F4 and execution remain open.
|
||||
|
||||
Morgana N1: the outer bundle-verification failure now prints
|
||||
`STOP: bundle verify failed; do not continue` instead of exiting the interactive
|
||||
root shell. The subshell still returns failure and cleans up. This follows the
|
||||
sheet's human read-and-stop convention and avoids sending remaining pasted lines
|
||||
to a parent shell after exiting sudo -i. Inner mktemp failure still exits only the
|
||||
subshell. This supersedes the initial outer-shell failure behavior noted above.
|
||||
|
||||
## File numstat against 93694c518 (added / deleted)
|
||||
|
||||
| File | Added | Deleted |
|
||||
|---|---:|---:|
|
||||
| `BUILD-LOG.md` | 4 | 0 |
|
||||
| `agents/gladstone/work/hostcheck-item5/BUILD.md` | 114 | 0 |
|
||||
| `docs/SESSIONS.md` | 1 | 0 |
|
||||
| `docs/guides/host-run-sheet.md` | 12 | 2 |
|
||||
| `packages/cli/tests/case1-hostcheck.test.mjs` | 48 | 0 |
|
||||
| `packages/cli/tests/case2-unit.test.mjs` | 29 | 0 |
|
||||
| `packages/cli/tests/stack-copy.test.mjs` | 16 | 0 |
|
||||
| `scripts/case1-hostcheck.sh` | 2 | 2 |
|
||||
| `scripts/case2-unit.sh` | 1 | 1 |
|
||||
| `scripts/stack-copy.sh` | 3 | 0 |
|
||||
|
||||
## F5 (mos-1536 / ops-0260): explicit notifier decision
|
||||
|
||||
Before: no run-sheet step creates the required notifier decision, and precheck
|
||||
accepts a host whose bus will refuse missing notify.json. After: section 9a
|
||||
requires the mosaic user to create its business notify directory at 0700 and an
|
||||
explicit {"notifyVersion": 1, "binding": null} file at 0600 before section 10.
|
||||
The shell runs with cwd / and umask 077; noclobber refuses an existing decision.
|
||||
Named binding is explicitly a later per-host choice requiring Mos's go.
|
||||
case2-install.sh is unchanged and makes no silent default.
|
||||
|
||||
case2-precheck.sh's existing facts helper dynamically imports readNotifyConfig
|
||||
from cli.mjs and calls it directly. File type, uid, exact 0600 mode, JSON keys,
|
||||
version and binding-name validation therefore stay identical to the bus. The
|
||||
shell checks the business notify directory with existing private_dir (same uid,
|
||||
not a symlink, exactly 0700) and prints the new notifier config line. No notifier
|
||||
is started and no configuration is written. Tests append pass cases for null and
|
||||
a valid named binding, and refusal cases for missing file, 0644, 0755 directory,
|
||||
extra key, malformed JSON, invalid binding/version and a symlinked file.
|
||||
|
||||
M5 (unrun): remove the notifier shell check, including its refusal branch; the
|
||||
new notifier refusal test must fail. Also include Morgana's F3 negative mutant
|
||||
M3b (allow $ in plain), killed by the new unsafe-character test.
|
||||
|
||||
Existing positive precheck tests need an explicit notify fixture. Approval
|
||||
requested via Sage in gladstone-0006/-0007 for minimal setup-only additions to
|
||||
case2-unit.test.mjs host(t) and case2-install.test.mjs world(t); assertions remain
|
||||
unchanged. Those additions are not yet applied. Correction to gladstone-0007:
|
||||
case1-accept.test.mjs also names case2-precheck.sh, but uses a stand-in; it does
|
||||
not execute the changed script and needs no fixture amendment.
|
||||
|
||||
Execution remains held by Sage: no Node/tests run. Morgana-0207 static F1-F4
|
||||
verdict on a75532db1 is CLEAN; execution and F5 review are still open.
|
||||
|
||||
F5 acceptance from mos-1536 (for review):
|
||||
1. Before section 10, as mosaic, explicitly create <dataRoot>/notify/<business>
|
||||
at 0700 and notify.json at 0600 with default binding null; a later named
|
||||
binding needs Mos's go. Do not make case2-install.sh write it.
|
||||
2. Precheck must refuse missing file, non-0600 file, directory looser than 0700
|
||||
and a document outside the CLI's exact shape. Reuse/match cli.mjs validation,
|
||||
and name the new line in this run-sheet step's Precheck entry.
|
||||
3. Append-only test blocks cover pass, missing, 0644, 0755 dir, extra key; record
|
||||
a skip-check mutant, the touched test file and its numstat.
|
||||
4. F3/F4 precede F5, each follow-up commit stays on gladstone/hostcheck-item5;
|
||||
send pushes to Sage/Morgana with Mos cc. No Node until Sage CLEAR.
|
||||
|
||||
Static F5 draft receipt: git diff --check passed. Existing fixture approvals
|
||||
remain pending; F5's new pass test creates its own explicit decisions. No claim
|
||||
that the old positive precheck tests pass without the pending setup changes.
|
||||
|
||||
## F5 candidate file numstat against 93694c518 (added / deleted)
|
||||
|
||||
| File | Added | Deleted |
|
||||
|---|---:|---:|
|
||||
| `BUILD-LOG.md` | 6 | 0 |
|
||||
| `agents/gladstone/work/hostcheck-item5/BUILD.md` | 179 | 0 |
|
||||
| `docs/SESSIONS.md` | 1 | 0 |
|
||||
| `docs/guides/host-run-sheet.md` | 34 | 2 |
|
||||
| `packages/cli/tests/case1-hostcheck.test.mjs` | 48 | 0 |
|
||||
| `packages/cli/tests/case2-unit.test.mjs` | 65 | 0 |
|
||||
| `packages/cli/tests/stack-copy.test.mjs` | 16 | 0 |
|
||||
| `scripts/case1-hostcheck.sh` | 2 | 2 |
|
||||
| `scripts/case2-precheck.sh` | 19 | 0 |
|
||||
| `scripts/case2-unit.sh` | 1 | 1 |
|
||||
| `scripts/stack-copy.sh` | 3 | 0 |
|
||||
|
||||
## Fixture approval and separate follow-up (mos-1537)
|
||||
|
||||
Mos approved exactly setup-only additions to case2-unit.test.mjs host(t) and
|
||||
case2-install.test.mjs world(t): each gets three added lines for a 0700
|
||||
notify/acme directory and 0600 notify.json with {"notifyVersion":1,"binding":null}.
|
||||
No existing line, fake or assertion changes or is deleted. F5's missing-file
|
||||
negative case removes the file after setup, so the new default cannot mask it.
|
||||
The newly appended install test checks preserved bytes and mode after success,
|
||||
and separately removes the decision before install and checks it stays absent.
|
||||
case1-accept.test.mjs is unchanged. This follow-up is committed separately on
|
||||
33950cf9b as directed, with no amend. No Node/tests run; suite claims remain open.
|
||||
Morgana-0211 found F5 source/run sheet CLEAN statically; the setup prerequisite B1
|
||||
is addressed by this approved fixture patch, pending execution.
|
||||
|
||||
Additional planned mutants from Morgana-0211 (unrun): M5b drops private_dir,
|
||||
killed by the directory fault; M5c prints NOTIFY ok unconditionally, killed by
|
||||
the document faults. Existing test preservation is checked by git diff showing
|
||||
only additions (numstat below).
|
||||
|
||||
Fixture follow-up numstat: case2-unit.test.mjs +3/-0,
|
||||
case2-install.test.mjs +18/-0. Against the original base: case1-hostcheck.test.mjs
|
||||
+48/-0, case2-unit.test.mjs +68/-0, stack-copy.test.mjs +16/-0,
|
||||
case2-install.test.mjs +18/-0. git diff --check passed.
|
||||
|
||||
## F6 and notify parent correction (mos-1537 / ops-0261)
|
||||
|
||||
Before: install creates a copy but no human CLI wrapper; the sheet's
|
||||
stack-copy.sh check --units external therefore fails even with correct units.
|
||||
After: the sheet explicitly places a wrapper step after successful install and
|
||||
before that check. On Mos's separate live-step go, mosaic changes cwd to /,
|
||||
creates $HOME/.npm-global/bin if absent, then invokes its clone's stack-copy.sh
|
||||
wrapper <sha> --create. Existing wrappers refuse and require review; install is
|
||||
unchanged. This is documentation of a gated host action, not execution of it.
|
||||
There are no tests pinning these sheet steps to adjust.
|
||||
|
||||
Section 9a now explicitly creates/chmods <dataRoot>/notify and then its business
|
||||
leaf, each 0700. This addresses ops-0261's observation that mkdir -p -m only
|
||||
controls the leaf. The existing umask 077 remains. All exits are inside the
|
||||
unprivileged shell, so no failure exits the operator's interactive root shell.
|
||||
|
||||
Static receipt: git diff --check passed. No Node, tests or live action. F6 and
|
||||
this parent-directory documentation correction are a separate commit after the
|
||||
approved fixture-only 5fd2328b6 follow-up. Reviewer should retain the earlier
|
||||
F1-F5 source verdicts and inspect this delta. Queue row still pending from Sage.
|
||||
|
||||
## F6 candidate file numstat against 93694c518 (added / deleted)
|
||||
|
||||
| File | Added | Deleted |
|
||||
|---|---:|---:|
|
||||
| `BUILD-LOG.md` | 10 | 0 |
|
||||
| `agents/gladstone/work/hostcheck-item5/BUILD.md` | 241 | 0 |
|
||||
| `docs/SESSIONS.md` | 1 | 0 |
|
||||
| `docs/guides/host-run-sheet.md` | 51 | 2 |
|
||||
| `packages/cli/tests/case1-hostcheck.test.mjs` | 48 | 0 |
|
||||
| `packages/cli/tests/case2-install.test.mjs` | 18 | 0 |
|
||||
| `packages/cli/tests/case2-unit.test.mjs` | 68 | 0 |
|
||||
| `packages/cli/tests/stack-copy.test.mjs` | 16 | 0 |
|
||||
| `scripts/case1-hostcheck.sh` | 2 | 2 |
|
||||
| `scripts/case2-precheck.sh` | 19 | 0 |
|
||||
| `scripts/case2-unit.sh` | 1 | 1 |
|
||||
| `scripts/stack-copy.sh` | 3 | 0 |
|
||||
|
||||
## F6 gate citation (sage-3747)
|
||||
|
||||
Added scripts/stack-copy.sh:3 to the F6 wrapper step's explicit Mos-go requirement.
|
||||
This is doc-only; commands and tests are unchanged. Sage ruled the delete-after-
|
||||
setup missing-file negative meets mos-1537, so no fixture change is needed.
|
||||
Morgana-0213 found the fixture/F6 deltas CLEAN statically. No Node/tests run;
|
||||
Morgana's eventual run waits for Sage's row and CLEAR after the 220+216 landing.
|
||||
Numstat for this follow-up: host-run-sheet.md +1/-1; BUILD.md +9/-0.
|
||||
Static receipt: git diff --check passed.
|
||||
|
||||
Correction: 0f3d874d4 added 10 BUILD.md lines, not 9; the git numstat is authoritative.
|
||||
|
||||
## First review run and F4 test correction (morgana-0217)
|
||||
|
||||
Morgana ran af201b4a9 (6fa47e07d only relocates this file) under her authorized
|
||||
slot with timeout -k 10 and TMPDIR under /mnt/storage/scratch/tmp. Receipts:
|
||||
/mnt/storage/scratch/morgana-g320-out/base-summary.txt and mutants-summary.txt.
|
||||
|
||||
| Targeted file | Passed | Failed |
|
||||
|---|---:|---:|
|
||||
| case1-hostcheck.test.mjs | 19 | 0 |
|
||||
| case2-unit.test.mjs | 47 | 0 |
|
||||
| case2-install.test.mjs | 24 | 0 |
|
||||
| stack-copy.test.mjs | 17 | 1 |
|
||||
|
||||
Seven of eight mutants were killed: M1 literal0750, M2 anymode, M3a drop@,
|
||||
M3b allow$, M5 drop shell block, M5b drop private_dir, M5c always NOTIFY ok.
|
||||
M4 drop cd / SURVIVED: base and mutant both failed only setup's cleanup hook.
|
||||
This is a test defect, not a green acceptance result. The 0111 cwd retained
|
||||
search permission and did not reproduce the inaccessible inherited cwd. It
|
||||
also blocked setup's chmod -R cleanup because the directory remained unreadable.
|
||||
|
||||
B1 correction touches only this row's appended F4 test: the child shell enters
|
||||
an initially searchable directory, chmods it 000, checks both ! -r and ! -x, then
|
||||
execs stack-copy. The parent asserts all read/search bits remain cleared. The
|
||||
bundle now lives outside cwd and is passed absolutely, matching the real flow;
|
||||
existing row232 coverage still tests relative bundles from an accessible cwd.
|
||||
Both bundle and checkout paths remain covered.
|
||||
B2 correction: each child run/assertion sequence has a finally that restores the
|
||||
cwd to0700 before setup's existing cleanup. No old setup/test lines change.
|
||||
Production scripts are unchanged; the cd / fix remains correct by static review.
|
||||
|
||||
Correction is untested locally: no builder Node/test CLEAR was given. Morgana
|
||||
will rerun stack-copy whole, M4 and residue cleanup on the pushed correction;
|
||||
other files need no rerun unless changed. git diff --check passed.
|
||||
|
||||
## F4 corrected candidate numstat against 93694c518 (added / deleted)
|
||||
|
||||
| File | Added | Deleted |
|
||||
|---|---:|---:|
|
||||
| `BUILD-LOG.md` | 12 | 0 |
|
||||
| `agents/gladstone/work/queue-320/BUILD.md` | 304 | 0 |
|
||||
| `docs/SESSIONS.md` | 1 | 0 |
|
||||
| `docs/guides/host-run-sheet.md` | 51 | 2 |
|
||||
| `packages/cli/tests/case1-hostcheck.test.mjs` | 48 | 0 |
|
||||
| `packages/cli/tests/case2-install.test.mjs` | 18 | 0 |
|
||||
| `packages/cli/tests/case2-unit.test.mjs` | 68 | 0 |
|
||||
| `packages/cli/tests/stack-copy.test.mjs` | 22 | 0 |
|
||||
| `scripts/case1-hostcheck.sh` | 2 | 2 |
|
||||
| `scripts/case2-precheck.sh` | 19 | 0 |
|
||||
| `scripts/case2-unit.sh` | 1 | 1 |
|
||||
| `scripts/stack-copy.sh` | 3 | 0 |
|
||||
@@ -1,171 +0,0 @@
|
||||
# Row 321: F7 wrapper environment and F10 first adoption (#1817)
|
||||
|
||||
Owner Gladstone; reviewer Boyd (separate Codex thread); queue/review/landing Sage.
|
||||
Authorized by sage-3791. Branch gladstone/row321 starts at fetched origin/refactor
|
||||
833ec1cc8d7c11842efb82e57c1a0b256c8d22d7. The row320 branch is unchanged.
|
||||
Brief: docs/plans/2026-10-23_host-fixes-1816-brief.md, section
|
||||
"Brief: F7, the wrapper step's PATH and umask under sudo", including F10;
|
||||
verified blob 7333f94ba9cfd58f87c5a3580d428b84c65845b6 (requested pin 7333f94ba9cf).
|
||||
Only the run sheet and this BUILD.md change. No scripts, tests, config, credentials,
|
||||
queue state, deployment or live host operation changed. No tests or Node commands run.
|
||||
|
||||
## Before and after
|
||||
|
||||
F7: sudo secure_path omits the pinned Node directory, so wrapper creation reaches
|
||||
instance.sh's bare node and exits127. An inherited umask can leave the bin dir0775.
|
||||
The MOSAIC_WRAPPER heredoc now sets umask077 and the sheet's existing pinned Node
|
||||
PATH before mkdir. One sentence names secure_path and why the step sets both.
|
||||
The existing Mos go remains explicit. No wrapper command is executed here.
|
||||
|
||||
F10: first install omits adoption, so the first activate refuses no-pointer.
|
||||
The release-transport section now places explicit adoption after both units are
|
||||
running (section10) and before any activate/upgrade, run as mosaic on Mos's go by
|
||||
Jason or Mos, citing stack-release.sh:14. It uses the configured dev instance and
|
||||
external units, with the same pinned Node PATH under sudo.
|
||||
Adjacent to the upgrade command, the sheet now says only the first upgrade after
|
||||
adopt takes --no-rehearsal: adopt writes no backup; missing flag refuses no-backup;
|
||||
later upgrades omit it, because a backup with that flag refuses rehearsal-required.
|
||||
Source checks: stack-release.sh pointer_for_business refuses no-pointer and directs
|
||||
adopt; stack-upgrade.sh rehearse handles rc3/no-backup and rc0/rehearsal-required.
|
||||
This records existing behavior and authority; it adds no requirement or live go.
|
||||
|
||||
## Test-reference grep (negative and positive control)
|
||||
|
||||
The required negative grep covers both F7 and F10 because neither is read by any
|
||||
matched test. The positive control locates the precheck path that the unit/install
|
||||
tests actually execute, showing the pathspecs reach their test files.
|
||||
|
||||
Negative grep:
|
||||
|
||||
```sh
|
||||
git grep -n 'host-run-sheet' -- 'packages/*/tests/*' 'scripts/test-*.sh'
|
||||
# exit 1
|
||||
# no matches
|
||||
```
|
||||
|
||||
Positive control:
|
||||
|
||||
```sh
|
||||
git grep -n 'case2-precheck.sh' -- 'packages/*/tests/*' 'scripts/test-*.sh'
|
||||
# exit 0
|
||||
packages/cli/tests/case1-accept.test.mjs:26:const PRECHECK = `${HOME}/.local/share/mosaic-stack/copies/${COPY}/scripts/case2-precheck.sh`;
|
||||
packages/cli/tests/case2-install.test.mjs:2:// scripts/case2-precheck.sh's library checks and --library-status mode. Brief:
|
||||
packages/cli/tests/case2-install.test.mjs:23:const PRECHECK = join(REPO, "scripts", "case2-precheck.sh");
|
||||
packages/cli/tests/case2-install.test.mjs:271:// ---- case2-precheck.sh, the library profile (D6a) ----
|
||||
packages/cli/tests/case2-install.test.mjs:334:// ---- case2-precheck.sh --library-status (D6b) ----
|
||||
packages/cli/tests/case2-unit.test.mjs:2:// and scripts/case2-precheck.sh checks the host before they start. Brief: docs/plans/2026-10-20_case2-rows.md
|
||||
packages/cli/tests/case2-unit.test.mjs:20:const PRECHECK = join(REPO, "scripts", "case2-precheck.sh");
|
||||
packages/cli/tests/case2-unit.test.mjs:588:// ---- case2-precheck.sh ----
|
||||
```
|
||||
|
||||
## Run-sheet diff against the pinned base (git diff --unified=0)
|
||||
|
||||
```diff
|
||||
diff --git a/docs/guides/host-run-sheet.md b/docs/guides/host-run-sheet.md
|
||||
index d2ba28d7c..96fd4f363 100644
|
||||
--- a/docs/guides/host-run-sheet.md
|
||||
+++ b/docs/guides/host-run-sheet.md
|
||||
@@ -209,0 +210,9 @@ sudo -u mosaic -H git clone -q -b refactor /srv/mosaic/incoming/<sha>.bundle /sr
|
||||
+After a first install, once both units are running (section 10), adopt the installed copy before
|
||||
+any activate or upgrade. This step runs only on Mos's go, with Jason or Mos running it
|
||||
+(`scripts/stack-release.sh:14`):
|
||||
+
|
||||
+```sh
|
||||
+sudo -u mosaic -H env PATH=/opt/mosaic-stack/node-<v>/bin:/usr/sbin:/usr/bin:/sbin:/bin \
|
||||
+ /srv/mosaic/src/mosaic-stack/scripts/stack-release.sh adopt <business> --instance dev --units external
|
||||
+```
|
||||
+
|
||||
@@ -211,0 +221,4 @@ Each upgrade, before `stack-upgrade.sh upgrade`:
|
||||
+Only the first upgrade after adopt takes `--no-rehearsal`: append it to the upgrade command below.
|
||||
+Adopt writes no backup, so omitting the flag then refuses `no-backup`. Subsequent upgrades omit it;
|
||||
+when a backup exists, supplying it refuses `rehearsal-required`.
|
||||
+
|
||||
@@ -246,0 +260 @@ step requiring Mos's go (`scripts/stack-copy.sh:3`); the install does not create
|
||||
+The step runs under sudo's `secure_path`, so it sets its own PATH and umask.
|
||||
@@ -250,0 +265,2 @@ cd / || exit 1
|
||||
+umask 077
|
||||
+PATH=/opt/mosaic-stack/node-<v>/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH
|
||||
```
|
||||
|
||||
## Verification
|
||||
|
||||
No matching test reads the changed lines, so the stop condition did not apply.
|
||||
No test run or slot is required under sage-3791. Verification is static: the
|
||||
required grep and positive control above, exact brief/base pins, scoped diff,
|
||||
and git diff --check. Reviewer Boyd and Sage own review/landing; no approval
|
||||
or landing is claimed here.
|
||||
|
||||
Receipt correction: the first commit embedded ordinary diff context lines that
|
||||
contain a single space. git diff --check flagged those as trailing whitespace.
|
||||
This follow-up uses the exact zero-context diff instead. The run sheet is
|
||||
unchanged, no tests or Node commands run, and no amend or force-push is used.
|
||||
|
||||
## F11 addition (sage-3805, mos-1549, ops-0275)
|
||||
|
||||
The brief was extended after F7/F10 drafting and re-pinned at revision3733:
|
||||
canonical local commit a9bae9af2, same F7 section anchor, full verified blob
|
||||
0e684ef2103447dcc2013b6bf81b1c4ca5bbc0bd (requested pin0e684ef21034).
|
||||
Read using git show from the canonical checkout; no fetch, rebase or queue write
|
||||
is required. This new pin supersedes the earlier brief pin for this follow-up.
|
||||
|
||||
Defect: a precheck one second after unit start found no bus.sqlite yet.
|
||||
Section10 now requires loopback healthz success after a unit start before any
|
||||
case2-precheck.sh, including section9's --library-status. It uses the same
|
||||
127.0.0.1:<port>/healthz curl form as scripts/case1-accept.sh:458. The subshell
|
||||
tries at most30 times, each curl capped at2 seconds, with1 second between failed
|
||||
attempts (at most89 seconds plus scheduling overhead). Exhaustion prints STOP
|
||||
and exits only the subshell. The instruction says to stop before precheck/adopt;
|
||||
it does not exit the interactive operator shell. The section9 library-gitea row
|
||||
now explicitly requires this bounded wait before --library-status. <port> is the
|
||||
installed Console unit's --port, not an assumed port or business name.
|
||||
No host action, test, Node command or credential access occurred.
|
||||
|
||||
Required grep repeated for the widened scope:
|
||||
|
||||
```sh
|
||||
git grep -n 'host-run-sheet' -- 'packages/*/tests/*' 'scripts/test-*.sh'
|
||||
# exit1, no matches
|
||||
git grep -n 'case2-precheck.sh' -- 'packages/*/tests/*' 'scripts/test-*.sh'
|
||||
# exit0, positive control; output follows
|
||||
packages/cli/tests/case1-accept.test.mjs:26:const PRECHECK = `${HOME}/.local/share/mosaic-stack/copies/${COPY}/scripts/case2-precheck.sh`;
|
||||
packages/cli/tests/case2-install.test.mjs:2:// scripts/case2-precheck.sh's library checks and --library-status mode. Brief:
|
||||
packages/cli/tests/case2-install.test.mjs:23:const PRECHECK = join(REPO, "scripts", "case2-precheck.sh");
|
||||
packages/cli/tests/case2-install.test.mjs:271:// ---- case2-precheck.sh, the library profile (D6a) ----
|
||||
packages/cli/tests/case2-install.test.mjs:334:// ---- case2-precheck.sh --library-status (D6b) ----
|
||||
packages/cli/tests/case2-unit.test.mjs:2:// and scripts/case2-precheck.sh checks the host before they start. Brief: docs/plans/2026-10-20_case2-rows.md
|
||||
packages/cli/tests/case2-unit.test.mjs:20:const PRECHECK = join(REPO, "scripts", "case2-precheck.sh");
|
||||
packages/cli/tests/case2-unit.test.mjs:588:// ---- case2-precheck.sh ----
|
||||
```
|
||||
|
||||
No test reads the changed run-sheet lines; the stop condition does not apply.
|
||||
No test run is needed under the docs-only brief. Static verification checks both
|
||||
locations, retry limit/timeout, the loopback URL, unchanged F7/F10 and scoped diff.
|
||||
|
||||
F11 delta against d9400f0d3 (git diff --unified=0):
|
||||
|
||||
```diff
|
||||
diff --git a/docs/guides/host-run-sheet.md b/docs/guides/host-run-sheet.md
|
||||
index 96fd4f363..e9fa87f24 100644
|
||||
--- a/docs/guides/host-run-sheet.md
|
||||
+++ b/docs/guides/host-run-sheet.md
|
||||
@@ -322 +322 @@ file with `stat -c '%U %a %n' PATH`, never `cat`. `<business>` is the host's bus
|
||||
-| `/srv/mosaic/.config/mosaic-dev/secrets/<business>/` | `library-gitea` | 0600 | mosaic | library | `case2-precheck.sh --business <business> --library-status`, after the bus is up: `library-last-error library-credential-missing` until it's placed, then `library <project> last fetched ...` |
|
||||
+| `/srv/mosaic/.config/mosaic-dev/secrets/<business>/` | `library-gitea` | 0600 | mosaic | library | After a unit start, wait for loopback `/healthz` with the bounded retry in section 10 before `case2-precheck.sh --business <business> --library-status`: `library-last-error library-credential-missing` until it's placed, then `library <project> last fetched ...` |
|
||||
@@ -357,0 +358,16 @@ None by hand. I2's `case2-unit.sh` enables both units, starts the bus, then the
|
||||
+After a unit start, wait for the Console's loopback `/healthz` to succeed before running
|
||||
+`case2-precheck.sh`, including `--library-status` in section 9. Replace `<port>` with the installed
|
||||
+Console unit's `--port`. This retry is bounded to 30 attempts, each with a 2-second timeout, with
|
||||
+1 second between failed attempts. If it prints STOP, stop here; do not run the precheck or adopt.
|
||||
+
|
||||
+```sh
|
||||
+(
|
||||
+ attempts=0
|
||||
+ until curl -fsS --max-time 2 -o /dev/null 'http://127.0.0.1:<port>/healthz'; do
|
||||
+ attempts=$((attempts + 1))
|
||||
+ [ "$attempts" -lt 30 ] || { echo "STOP: loopback healthz did not become ready; do not continue" >&2; exit 1; }
|
||||
+ sleep 1
|
||||
+ done
|
||||
+)
|
||||
+```
|
||||
+
|
||||
```
|
||||
@@ -1,9 +0,0 @@
|
||||
# Glomgold
|
||||
|
||||
Builder seat, Codex gpt-6.1-sol, started by Sage under Q246 and mos-1571. Owns row 309, O2 W1: the reviewed local
|
||||
thesaurus data (docs/plans/2026-10-21_q195-writing-editor.md, "W1 reviewed local thesaurus data").
|
||||
|
||||
No launcher in this directory. The seat runs as a T3 thread and works in its own worktree. It has no credentials of its
|
||||
own; it pushes only its own `glomgold/*` branches through the repository credential helper (mos-0981), never `refactor`,
|
||||
`main` or another seat's branch. Claude seats orchestrate and give the Opus 5.5 landing review (mos-1571). Registered by
|
||||
Sage on 2026-10-24 so the queue can name the seat as row owner (store.mjs isSeatDir).
|
||||
@@ -1,323 +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.
|
||||
@@ -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
@@ -1,9 +0,0 @@
|
||||
# Goldie
|
||||
|
||||
Builder seat, Codex gpt-6.1-sol, started by Sage under mos-1542 and mos-1546. Owns F8 and F9, the library persona
|
||||
import in `scripts/case2-install.sh` (#1818), for the 433 Run B rerun.
|
||||
|
||||
No launcher in this directory. The seat runs as a T3 thread and works in its own worktree. It has no credentials of its
|
||||
own; it pushes only its own `goldie/*` branches through the repository credential helper (mos-0981), never `refactor`,
|
||||
`main` or another seat's branch. Claude seats orchestrate and review the install path (mos-1542 rule 4). Registered by
|
||||
Sage on 2026-10-23 so the queue can name the seat as row owner (store.mjs isSeatDir).
|
||||
@@ -1,134 +0,0 @@
|
||||
# Row 265 / #1770 — project rooms
|
||||
|
||||
Current result: verified under sage-3942; slot returned in goldie-0034. Full bus 957/957, sandbox 10/10, parser 15/15, rooms 18/18, twelve mutants killed, restored files green. Review/push packet below includes mos-1567 closure scope.
|
||||
|
||||
Goldie, 2026-10-24. Branch goldie/row265, base ec86f2c847f6154a0677c6ed23c87dabc2c665d0. Brief docs/plans/2026-10-20_case2-rows.md § C2-09b rooms at blob3a5ed91a4fb3462df67e6939ae6f18290ac9b453; design agents/gosalyn/work/case2/DESIGN.md §6. Sage-3915 transfers ownership from Rocko to Goldie and review from Dewey to Boyd. No old test edit authorized. All tests/mutants wait for Sage CLEAR; queued behind Poe, Bentina and Sage's326 gate.
|
||||
|
||||
## Design and clarified readings
|
||||
|
||||
A room is a bus project. Members are all loaded business instances whose definitions are in THREAD_DEFINITIONS, sorted by key. Canonical room threads have those keys as names and belong to the requesting human. open checks all name/instance/owner collisions before creating anything; it delegates missing inserts to existing thread.create dispatch, including default session metadata. send/read require the complete canonical set. No schema or migration change.
|
||||
|
||||
Sage-3921 settles two brief readings: the single captured timestamp applies to the room.send MESSAGE rows; existing route/delivery/event helpers keep their own timestamps in the same dispatch transaction. They are unchanged. A final EOF-terminated @name is a tag, so bare @continuity is invalid-request rather than a broadcast. Leading whitespace is accepted. Pure parseAddress returns {tags,body}, where body is the unaddressed remainder; room.send stores the ORIGINAL input unchanged. Export it from the bus index and expose a separate reusable test table for C2-10c parity.
|
||||
|
||||
send resolves tags against current #named results and member instance keys, deduplicates recipients, and refuses multiple member matches. It checks each target's current default-session fence and messaging rule, then inserts one normal INFO message, route and human.input per target under the existing request transaction. All message rows share one at. No tag broadcasts; tags after the first non-tag token remain plain text.
|
||||
|
||||
read includes all sessions of the caller's canonical threads, globally ordered by messages.seq. Each entry retains first-message fields plus thread/session/instance and adds ids (every grouped message id) and to (each instance once). Only consecutive human rows with identical at/body/class group, and a repeated instance starts a new entry, so same-millisecond identical sends remain separate. Paging limit counts merged entries (THREAD_PAGE defaults/max); clients continue after the last ids element. Cursor must belong to a room thread. Bounded raw scan limit*memberCount+1 completes requested groups without reading unbounded history. Sage-3921 accepts these routine choices as proposed in goldie-0030.
|
||||
|
||||
## Scope / steps
|
||||
|
||||
1. Read current thread.create/send/messages, transaction wrapper, naming and messaging helpers; audit source readers/pins. Claim265 via queue after next. Done/read, claim recorded at rev 3814 with op goldie-0265-start-1 (same-op replay confirmed).
|
||||
2. Add parser + index export, only three room cases in broker, README verb rows and new bus tests/fixtures. Do not modify existing thread/messaging/ACL/helper behavior.
|
||||
3. New tests cover all brief cases, atomicity across message/route/input rows, ownership/projects, permissions, paging/grouping and session fences. No suites or test runs before CLEAR.
|
||||
4. Record exact refusal→test→mutant matrix here before requesting the slot; one targeted killed mutant per named refusal, restoration byte-checks. New files whole then bus suite under CLEAR, serial timeout-k10, fresh31-byte mktemp TMPDIR plus UTC/load/busy header.
|
||||
5. Before in-review, grep packages/*/tests for broker.mjs/TESTER_VERBS and changed-file pins. Push own branch and hand tip/base/manifest directly to Sage/Boyd. Sage owns request posting/landing.
|
||||
|
||||
No Console/Discord/CLI room surface or cross-agent reply visibility added. No tester verb, role, schema or secret change. No host action or credential access.
|
||||
|
||||
## New tests and refusal / mutant matrix
|
||||
|
||||
Only new test files and a new reusable vector fixture are added. No pre-existing test changes. Parser table: address.test.mjs consumes address-cases.mjs, including final EOF tags, leading whitespace, tags after the first word, repetition and blank/tag-only remainder. Broker cases: rooms.test.mjs covers sorted/reused canonical threads, other-instance and other-owner collisions, all three verbs' human/tester gates, missing projects/member set, partial/foreign/wrong-instance rooms, key and current-name addressing, ambiguity/same-member name+key, unknown/non-member/old-name tags, tags-only bodies, one/many/broadcast targets, original bytes, shared message timestamp, routes/deliveries/human.input, denied last recipient, clearing last session, all-session merged reads, agent reply metadata, merged paging/default/max, foreign/noncanonical/absent cursors, and same-at repeated sends. Synthetic historical rows append valid rows; they do not rewrite evidence or clocks. The same-at batches repeat the first recipient at each boundary, proving identical sends remain distinct.
|
||||
|
||||
Each named refusal has one mutation of its enforcement, run against the entire new rooms.test.mjs file. The driver mutants.py stores the exact original→mutant diff in logs/Mxx-*.diff, logs UTC/load/busy/TMPDIR, accepts only Node exit 1 with the named target test failing, and restores/verifies full broker bytes and SHA256 in finally. No mutation is retained. Generic pre-existing request/schema/argument policies are exercised through existing code; the matrix names the refusals added or deliberately inherited by these room cases.
|
||||
|
||||
| Mutant | Refusal | Guard relaxed | Required failing new test |
|
||||
| --- | --- | --- | --- |
|
||||
| M01-human | human-required | remove common room human check | room verbs require the human |
|
||||
| M02-tester | tester-refused | add the three room verbs to TESTER_VERBS | room verbs require the human (explicit absence pin) |
|
||||
| M03-project | project-not-found | remove room project lookup check | room verbs refuse missing projects |
|
||||
| M04-members | thread-instance-missing | allow empty member set | room verbs refuse missing projects |
|
||||
| M05-collision | room-thread-name-taken | remove canonical owner/instance collision check | room.open preflights instance collisions |
|
||||
| M06-open | room-not-open | remove missing canonical thread check | send/read refuse a missing canonical member |
|
||||
| M07-body | invalid-request | allow empty parsed remainder | unknown or non-member addressees and tags-only bodies |
|
||||
| M08-unknown | unknown-addressee | allow zero member matches | unknown or non-member addressees and tags-only bodies |
|
||||
| M09-ambiguous | addressee-ambiguous | allow multiple member matches | a legacy name colliding with another member key |
|
||||
| M10-messaging | message-sender-refused | omit room target messaging check | messaging denial on the last target |
|
||||
| M11-cursor | message-not-found | unknown room cursor falls back to seq zero | room.read groups one send, pages |
|
||||
| M12-fence | session-clearing | omit room target session fence | a clearing last member fences the whole send |
|
||||
|
||||
For M02, the existing human check remains a second barrier: the mutant deliberately relaxes only the tester allowlist; the new explicit absence assertion kills it without loosening or running the old pin. Existing helpers keep their full session-state behavior. No helper or schema mutation ships.
|
||||
|
||||
## Reader / hash audit
|
||||
|
||||
`rg -n 'broker\.mjs|TESTER_VERBS' packages/*/tests --glob '!fixtures/*'` produced reader-grep.txt (133 hits at audit time). These are imports except the concrete source read at bus/tests/limit-checks.test.mjs:323-326 (forbidden limit-check/token-limit imports) and the tester set assertions at bus/tests/tester-writes.test.mjs:18-32. The latter stays byte-for-byte unchanged. bus/tests/viewer.test.mjs:116 builds its coverage set from exported verb lists; rooms do not widen those lists. No old test needs an edit.
|
||||
|
||||
Pin check: recursively inspect packages/*/tests plus scripts/test-*.sh for changed-file mentions (broker.mjs, address.mjs, packages/bus/README.md, packages/bus/src/index.mjs) with literal 64-hex values within eight lines: pin-context-grep.txt records no hits. A direct same-line hash/digest/sha256 grep finds registrySha256 imports only, which hash host registry data rather than broker bytes. The independent channel-proof.test.mjs baselines cover proof/transport files, none changed here. Positive control: pin-positive-control.txt records actual schema.sql / SCHEMA_SHA256 / createHash references in bus/tests/schema.test.mjs and bus/src/store.mjs. Schema bytes are unchanged.
|
||||
|
||||
## Requested serialized slot plan (not run)
|
||||
|
||||
At each run: fresh `TMPDIR=$(mktemp -d /mnt/storage/scratch/tmp/XXXXXX)`, date -u, uptime, and `bash /mnt/storage/scratch/sage-busy-now.sh 2>/dev/null | tail -1` in the log. No concurrent test runs. Ignored root node_modules symlink targets the canonical checkout; it will not be committed.
|
||||
|
||||
1. `timeout -k 10 120 node --test packages/bus/tests/address.test.mjs` whole.
|
||||
2. `timeout -k 10 120 node --test packages/bus/tests/rooms.test.mjs` whole.
|
||||
3. `timeout -k 10 600 node --test --test-concurrency=1 packages/bus/tests/*.test.mjs` bus suite whole.
|
||||
4. `python3 agents/goldie/work/queue-265/mutants.py`: M01 through M12 serially, each runs `timeout -k 10 120 node --test packages/bus/tests/rooms.test.mjs` whole, fresh TMPDIR/header; stop on a live mutant or wrong failure. Record each diff and restoration digest.
|
||||
5. Restored address.test.mjs whole and rooms.test.mjs whole separately, same commands as 1/2 and fresh directories/header each.
|
||||
|
||||
Estimate 5–10 minutes; bus timeout ceiling 10 minutes, individual new/mutant ceilings 2 minutes each. On first new-test red, record/report it. On any old-test red or need for old-test change, stop and ask Sage. Static node --check for new modules/tests and git diff --check passed; no tests or mutants run yet.
|
||||
|
||||
## First slot STOP — sage-3932
|
||||
|
||||
2026-10-24T04:27Z: stopped on an old-test red. No old test changed or rerun, no mutant executed, no product adjustment after the failure, no commit/push claiming verification.
|
||||
|
||||
| Step | Exit | Counts / disposition | Log |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 address whole | 0 | 14 pass, 0 fail/skip/cancel; 58.559 ms | logs/01-address.log |
|
||||
| 2 rooms whole | 0 | 18 pass, 0 fail/skip/cancel; 1067.524 ms | logs/02-rooms.log |
|
||||
| 3 bus whole | 1 (stopped) | partial 619 top-level ok, 1 not ok; not a completed-suite result | logs/03-bus.log |
|
||||
| 4 twelve mutants | not run | stop rule | none |
|
||||
| 5 restored files | not run | stop rule; no mutations were applied | none |
|
||||
|
||||
All three run headers use UTC/date, uptime, helper CLEAR and distinct 31-byte scratch TMPDIRs. Bus began04:25:22Z at load2.80/2.91/2.61, TMPDIR /mnt/storage/scratch/tmp/LaZAaK. Parser used /mnt/storage/scratch/tmp/rqcTH7; rooms has its own header. Explicit TAP reporter was selected for rooms/bus and the mutant driver so failure detection/counts are stable across Node26's default spec reporter; this changes reporting only.
|
||||
|
||||
The old red is project-runtime.test.mjs:12, assertion:14, test620, “Broker keeps the sandbox client import closure: only the listed imports, no lazy project import”. Actual imports include the new `import { parseAddress } from './address.mjs';`; the pinned array omits it. ERR_ASSERTION deepStrictEqual; individual duration2.469251ms. The full expected/actual/stack is in 03-bus.log. No other red was observed before stopping.
|
||||
|
||||
Reader-audit correction: reader-grep.txt:100 already contains project-runtime.test.mjs:13, a direct broker source read. The earlier prose incorrectly described the import-closure assertion as a normal import; I missed this old source pin during inspection. This is not a hash pin. Follow-up static trace finds seat/src/sandbox.mjs:50-60 RUNNER_FILES includes broker and landing but not address; seat/tests/sandbox.test.mjs:45-53 compares this mount list to the recursively imported source closure. A parser dependency therefore also needs the one new RUNNER_FILES path. Both an old-test pin change and this out-of-owned-files product change require Sage/Mos approval before edits. Recommended bounded change: add only the parser import to the project-runtime expected imports, add only packages/bus/src/address.mjs beside broker in RUNNER_FILES, and leave the generic sandbox closure test unchanged.
|
||||
|
||||
Broker bytes remain SHA256 71b32ee4afa322793aad81231441ee7badc3e5aff65ff008c6cc0f7f63b72781. git diff --check still passes. Slot returned in goldie-0032, pending ruling/new CLEAR; no reruns.
|
||||
|
||||
## mos-1567 approved closure correction / second slot request
|
||||
|
||||
Sage-3940 relays Mos's mos-1567 and widened row scope (sage-3939). Applied exactly the approved pre-existing-file edits: project-runtime.test.mjs adds two lines at17-18, one Row265 comment and the parser import in the pinned array, no other line changed (numstat2 added/0 deleted); seat/src/sandbox.mjs adds only `packages/bus/src/address.mjs` immediately after broker in RUNNER_FILES. seat/tests/sandbox.test.mjs stays byte-for-byte unchanged. The parser remains a separate pure module. A NEW block in address.test.mjs asserts `doesNotMatch(/\bimport\b/)` on its source, with a node:fs import in that new test file; no existing assertion is moved or weakened.
|
||||
|
||||
Review packet must explicitly call out the RUNNER_FILES mount-list entry for Boyd's review. This is a read-only source-file mount needed by the broker's static dependency, with no new module dependency or role/verb authority. The first-run import pin failure remains recorded above and in logs/03-bus.log; new logs will have rerun-prefixed names, preserving first-slot bytes.
|
||||
|
||||
Requested rerun order, awaiting CLEAR after Bentina: first `timeout -k 10 180 node --test --test-reporter=tap packages/seat/tests/sandbox.test.mjs` whole, then the original five steps again from step1: address whole (now15 cases), rooms whole, bus whole with concurrency1 (includes project-runtime whole), M01–M12 whole-room-file mutants, then restored address and rooms files separately. Explicit TAP reporter is used throughout for stable logs/kill matching; timeouts otherwise120 per new/mutant run and600 for bus. Each run still gets fresh short mktemp TMPDIR, date/uptime/busy header, serialized with the same stop rule. Estimate5–10minutes. Only static node --check and git diff --check run since the STOP; all pass. No new test run yet.
|
||||
|
||||
## Verified result — sage-3942 CLEAR, slot returned goldie-0034
|
||||
|
||||
All rerun positives exit 0 with zero failures, skips or cancellations. Full bus suite passed 957/957, including the approved project-runtime import pin. The unchanged sandbox test passed 10/10, including its recursive mount/import-closure assertion. New parser cases passed 15/15, rooms 18/18, and both passed again after restoration. No tests run after slot return.
|
||||
|
||||
| Run | Exit | Pass / fail | Duration ms | UTC / load / helper | Log |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| rerun-00-sandbox | 0 | 10 / 0 | 5526.027699 | Sat Oct 24 04:31:35 UTC 2026; 23:31:35 up 10 days, 14:51, 2 users, load average: 2.83, 2.91, 2.73; CLEAR | [log](logs/rerun-00-sandbox.log.gz) |
|
||||
| rerun-01-address | 0 | 15 / 0 | 54.634817 | Sat Oct 24 04:31:45 UTC 2026; 23:31:45 up 10 days, 14:51, 2 users, load average: 2.54, 2.84, 2.71; CLEAR | [log](logs/rerun-01-address.log.gz) |
|
||||
| rerun-02-rooms | 0 | 18 / 0 | 921.788987 | Sat Oct 24 04:31:52 UTC 2026; 23:31:52 up 10 days, 14:51, 2 users, load average: 2.42, 2.81, 2.70; CLEAR | [log](logs/rerun-02-rooms.log.gz) |
|
||||
| rerun-03-bus | 0 | 957 / 0 | 118397.418425 | Sat Oct 24 04:32:01 UTC 2026; 23:32:01 up 10 days, 14:51, 2 users, load average: 2.28, 2.77, 2.68; CLEAR | [log](logs/rerun-03-bus.log.gz) |
|
||||
| rerun-05-restored-address | 0 | 15 / 0 | 54.587943 | Sat Oct 24 04:35:02 UTC 2026; 23:35:02 up 10 days, 14:54, 2 users, load average: 3.10, 3.07, 2.83; CLEAR | [log](logs/rerun-05-restored-address.log.gz) |
|
||||
| rerun-05-restored-rooms | 0 | 18 / 0 | 991.877991 | Sat Oct 24 04:35:11 UTC 2026; 23:35:11 up 10 days, 14:55, 2 users, load average: 3.17, 3.09, 2.84; CLEAR | [log](logs/rerun-05-restored-rooms.log.gz) |
|
||||
|
||||
Mutant driver exit 0; all twelve target tests killed their guard relaxation with Node exit 1. Every mutant log records exact bytes restored to broker SHA256 `71b32ee4afa322793aad81231441ee7badc3e5aff65ff008c6cc0f7f63b72781`. Driver receipt: [rerun-04-mutants-driver.log](logs/rerun-04-mutants-driver.log.gz).
|
||||
|
||||
| Mutant | Node exit | Pass / fail | Exact diff | Raw log |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| M01-human | 1, killed | 16 / 2 | [diff](logs/M01-human.diff) | [log](logs/M01-human.log.gz) |
|
||||
| M02-tester | 1, killed | 17 / 1 | [diff](logs/M02-tester.diff) | [log](logs/M02-tester.log.gz) |
|
||||
| M03-project | 1, killed | 17 / 1 | [diff](logs/M03-project.diff) | [log](logs/M03-project.log.gz) |
|
||||
| M04-members | 1, killed | 17 / 1 | [diff](logs/M04-members.diff) | [log](logs/M04-members.log.gz) |
|
||||
| M05-collision | 1, killed | 14 / 4 | [diff](logs/M05-collision.diff) | [log](logs/M05-collision.log.gz) |
|
||||
| M06-open | 1, killed | 17 / 1 | [diff](logs/M06-open.diff) | [log](logs/M06-open.log.gz) |
|
||||
| M07-body | 1, killed | 17 / 1 | [diff](logs/M07-body.diff) | [log](logs/M07-body.log.gz) |
|
||||
| M08-unknown | 1, killed | 16 / 2 | [diff](logs/M08-unknown.diff) | [log](logs/M08-unknown.log.gz) |
|
||||
| M09-ambiguous | 1, killed | 17 / 1 | [diff](logs/M09-ambiguous.diff) | [log](logs/M09-ambiguous.log.gz) |
|
||||
| M10-messaging | 1, killed | 17 / 1 | [diff](logs/M10-messaging.diff) | [log](logs/M10-messaging.log.gz) |
|
||||
| M11-cursor | 1, killed | 17 / 1 | [diff](logs/M11-cursor.diff) | [log](logs/M11-cursor.log.gz) |
|
||||
| M12-fence | 1, killed | 17 / 1 | [diff](logs/M12-fence.diff) | [log](logs/M12-fence.log.gz) |
|
||||
|
||||
## Final review scope and packet
|
||||
|
||||
Boyd reviews the three room cases, pure parser/export, README rows, new parser/room tests, and **the added read-only RUNNER_FILES mount for packages/bus/src/address.mjs**. mos-1567 authorizes that one sandbox source line and the sole old-test delta: project-runtime.test.mjs:17-18 adds exactly the Row265 comment and parser import pin (numstat 2 added / 0 deleted). Byte comparison against base after removing those additions proves all other old-test bytes unchanged. Removing the single RUNNER_FILES addition likewise restores sandbox.mjs to base. sandbox.test.mjs has no byte change. New address.test.mjs block proves the mounted parser source has no import word.
|
||||
|
||||
The widened changed-file hash-context audit includes sandbox.mjs: [pin-context-with-sandbox.txt](pin-context-with-sandbox.txt), zero 64-hex-near-reference hits. The original reader and positive-control receipts remain alongside it; the missed source pin and first STOP remain recorded, not concealed. No role/schema/tester allowlist or helper change ships. BUILD-LOG and SESSIONS only append tracking entries.
|
||||
|
||||
Base: `ec86f2c847f6154a0677c6ed23c87dabc2c665d0`. Branch: `goldie/row265`. MANIFEST.sha256 lists every changed source/test/tracking/evidence file except itself, with repository-relative paths, and is verified before commit/push. Raw first-red logs are retained separately from green reruns.
|
||||
|
||||
Evidence packaging: logs are stored losslessly as `.log.gz`; decompress with `gzip -cd`. Decompression was byte-compared with each raw run log before packing. This preserves the original failure/Node whitespace while keeping the committed diff whitespace-clean. The run driver recreates raw `.log` files when used. Mutant busy-check headers identify only their own Python driver PID3686656 as BUSY; positive runs report CLEAR. The driver held the assigned slot throughout, with serialized child tests.
|
||||
@@ -1,51 +0,0 @@
|
||||
996e9d0c1e7a8436691ce5d5d89b4eb940b07aafb3386f63a9847d203f43d998 BUILD-LOG.md
|
||||
26b5821895a152ddac66a26f16585c6c48ec71d99ca7e7c2b9a4d5a71943c5b4 agents/goldie/work/queue-265/BUILD.md
|
||||
1289c0f9f4e857590490a0972b5300cc8fb1a86e3ef79fe63e47472709e982f6 agents/goldie/work/queue-265/logs/01-address.log.gz
|
||||
bc0ac95454ca4a4478641832e68caeb82bfe8b1fdc9abc0b80f1126ef42b7be5 agents/goldie/work/queue-265/logs/02-rooms.log.gz
|
||||
459a45bd772576847338a438b27f4f578a2a660be744e1404fd239d192c6957c agents/goldie/work/queue-265/logs/03-bus.log.gz
|
||||
c30cecb149e98d64f285e81a82d07a0a89dad5ea223f9031b543230615663bb5 agents/goldie/work/queue-265/logs/M01-human.diff
|
||||
a75e02d91ff46fbfaf627beea943183b769e417bcb572bf11f778f0fca7fcf29 agents/goldie/work/queue-265/logs/M01-human.log.gz
|
||||
b78b1c5b205272411710f56a981acf58dc09c46333369924b98c4c8657dc949c agents/goldie/work/queue-265/logs/M02-tester.diff
|
||||
6a680dcb1db461cce3a3a2e066aa1245e4f84aa6754354058009bc0f6ebf4185 agents/goldie/work/queue-265/logs/M02-tester.log.gz
|
||||
02a6cfab404405099fc39eb83413614c67a0c4c3f87cd23c3849a35d1055ddb0 agents/goldie/work/queue-265/logs/M03-project.diff
|
||||
8b7cd0c568510e49b61fa14fce7b2680025b773eda884e0a84163d240a124e39 agents/goldie/work/queue-265/logs/M03-project.log.gz
|
||||
18b2cb43f2799301cf934e4c327bc1a03e08ff8d11ff590cb9677c86dfd43ff0 agents/goldie/work/queue-265/logs/M04-members.diff
|
||||
195f9ec57c9494552566d2f8b87f3b17a210b811f8b556dd65db89814e237816 agents/goldie/work/queue-265/logs/M04-members.log.gz
|
||||
a773e214c76acf5285ac4ca17cdd90dd552ddc79157abe75ef6de7f67a0b6a70 agents/goldie/work/queue-265/logs/M05-collision.diff
|
||||
1148cda3f6aaa7f6aeaab2f95c932114ddeac5bfd9318a6b77a4148079d486ed agents/goldie/work/queue-265/logs/M05-collision.log.gz
|
||||
56400065c9cdb6305763b2bff8c0e06e9ae1223fa89b4467634a9951622d3fbe agents/goldie/work/queue-265/logs/M06-open.diff
|
||||
b8f9bd9a5c488e604d0afe3feda4a2602359a94a49c7fdbd2f0f6a421b0ca1ce agents/goldie/work/queue-265/logs/M06-open.log.gz
|
||||
2c1b745a15602cdcaf194131e4d6e0f8fa349e9712ce2e8cb6e695699e4ec19d agents/goldie/work/queue-265/logs/M07-body.diff
|
||||
4857461e7a2ceb01a6446acb4708a732949a0d8d1a85fa2f6d10bedde6b9e11b agents/goldie/work/queue-265/logs/M07-body.log.gz
|
||||
e3480e69d016caea6c1fbcdfa022b18214a10e8deca4409d0dc2f72261d2ee92 agents/goldie/work/queue-265/logs/M08-unknown.diff
|
||||
3d0f347f21df3c388a4f39679d4694aadc9684ae8b8ad2d30bf0bb316e48dcb0 agents/goldie/work/queue-265/logs/M08-unknown.log.gz
|
||||
62420ed20affcab256facee05414b8b760a4c79a60f60be0c06c88abb61ec6ae agents/goldie/work/queue-265/logs/M09-ambiguous.diff
|
||||
14a18d61344df592e885c46ace34e0c59914f4fbe591fa99eeb3d81fa8ef8bf1 agents/goldie/work/queue-265/logs/M09-ambiguous.log.gz
|
||||
0671bf77394f82df92252275171fd9edea2e5b2e7143387840d03bda544676bf agents/goldie/work/queue-265/logs/M10-messaging.diff
|
||||
4202215d40999e0d1cc98ebfb5445f0c8fd4688e6ca968e85d225723076ca8a7 agents/goldie/work/queue-265/logs/M10-messaging.log.gz
|
||||
042598ecb551e761d37af898f69e17ec137d2f39687dbf81ce5e1eeb98a38202 agents/goldie/work/queue-265/logs/M11-cursor.diff
|
||||
deff3d0514c379bd3d9c6f6bbc60db59b9dce2baaafd6fa611711c98cc8365ce agents/goldie/work/queue-265/logs/M11-cursor.log.gz
|
||||
780e70fbcb2328006c8d9ace75aa62fcd0d935b4d758b50b0f5c5d5c55604122 agents/goldie/work/queue-265/logs/M12-fence.diff
|
||||
b629b41a39c028b70d4b847c351d248d6d70e8175d6d27f563b0ed8817f89642 agents/goldie/work/queue-265/logs/M12-fence.log.gz
|
||||
1b8c3cec31b44ff018a1bc74fef95996bcbdd21d340e2d2605154ba645648040 agents/goldie/work/queue-265/logs/rerun-00-sandbox.log.gz
|
||||
d18c5a9432de06ebec36c937da7dfb1a3e79dc397b33ff624058af351eee24dd agents/goldie/work/queue-265/logs/rerun-01-address.log.gz
|
||||
d10b83ccec56e47d8c7c74d8304fc4fc87b8ea92a50098380cd02b8012c32d09 agents/goldie/work/queue-265/logs/rerun-02-rooms.log.gz
|
||||
6ff5955fe5c85f51c1cf4daeb8eddd61ef1a30e170221f99bfb08da8304d7e4a agents/goldie/work/queue-265/logs/rerun-03-bus.log.gz
|
||||
eeba0182f06cee0c06cd15ecf7ef43aaeffd7149b2202cc0653078c20bb46198 agents/goldie/work/queue-265/logs/rerun-04-mutants-driver.log.gz
|
||||
5fe9fe35af60ef951c5c68b040aa9bb6067d9c746e143bb5782eb428acd4e4fe agents/goldie/work/queue-265/logs/rerun-05-restored-address.log.gz
|
||||
2b3f3305ff5f6926a0269bd6c88d5f2e4a89727eefcf99625bebb51a70abb649 agents/goldie/work/queue-265/logs/rerun-05-restored-rooms.log.gz
|
||||
f11ae40d923affad1936fe51d05981ac201a1051bc9f877d75fc1d544c6e38f1 agents/goldie/work/queue-265/mutants.py
|
||||
e9cdf16670a16a14f3dd722a69c63a1785e4deb3608ee05d519b0ec8c1a9ca0b agents/goldie/work/queue-265/pin-context-grep.txt
|
||||
491ba3bb25e918049249178f3c6a67b2b4f56a197f0a67059acb2420cd03b73c agents/goldie/work/queue-265/pin-context-with-sandbox.txt
|
||||
784fb42bff187c0eebcf7756942ec3cf56f8faa7b54ce4ad96181b81fe46f0e9 agents/goldie/work/queue-265/pin-positive-control.txt
|
||||
766ead519eefbde958bbdbf77bf858b10dd1e3d9dee8ab5d356fe821ce7602fe agents/goldie/work/queue-265/reader-grep.txt
|
||||
6c3c44eb943f33d5bb547f542c77da4d6f04e738056466bc491c2f6fd5f67946 docs/SESSIONS.md
|
||||
1ba33af1f42c88a5346d25fe915a44ee70a27fbc6b9ab880db0866cbdad5d45d packages/bus/README.md
|
||||
232a1c77c2f17011c53b55fc6052f70985598210769d41d7c2c0b535328aad23 packages/bus/src/address.mjs
|
||||
71b32ee4afa322793aad81231441ee7badc3e5aff65ff008c6cc0f7f63b72781 packages/bus/src/broker.mjs
|
||||
ed57d48d2af4a225259e0a44c86a30b12792ec9f725dd9c89251569b7dc89e5a packages/bus/src/index.mjs
|
||||
a6725ffe30d44981a9b9d3a3c319f7e96a46ec7bd74f0c8d869d9a798eca1a81 packages/bus/tests/address-cases.mjs
|
||||
fae431bc3743b224f69da33c4cebe376b47257d67f52d25d3ab0cb59f224a607 packages/bus/tests/address.test.mjs
|
||||
8594e94384c1c8b7234cfa8bbc17456cff86d9adef936cd1059a0d5a60e4546b packages/bus/tests/project-runtime.test.mjs
|
||||
892c3709393fa8962710bc07565d1097bbd79ea1fbfda34af5f9385db34ed0fa packages/bus/tests/rooms.test.mjs
|
||||
83019fa6b39ad9fd79b84627856b4dec82683d8261b8cba9b9ac840e0c489268 packages/seat/src/sandbox.mjs
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,10 +0,0 @@
|
||||
--- broker.original
|
||||
+++ M01-human
|
||||
@@ -6423,7 +6423,6 @@
|
||||
case 'room.open':
|
||||
case 'room.send':
|
||||
case 'room.read': {
|
||||
- this.#human(s);
|
||||
const opening = verb === 'room.open';
|
||||
const sending = verb === 'room.send';
|
||||
keys(a, opening ? ['project'] : sending ? ['project', 'body'] : ['project', 'after', 'limit'],
|
||||
Binary file not shown.
@@ -1,12 +0,0 @@
|
||||
--- broker.original
|
||||
+++ M02-tester
|
||||
@@ -122,7 +122,8 @@
|
||||
// Row 175 (#1673, Q173): the test system's reads and two writes, name.set and project.create,
|
||||
// each recorded with `tester` as its actor. The organization branch keeps its own list below.
|
||||
// Row 177 (#1675, Q173): the tester's own threads, owner `tester`, and a stop of their runs.
|
||||
-export const TESTER_VERBS = Object.freeze(['message.send', 'message.receive', 'message.read', 'inbox', 'agents', 'tasks', 'trail', 'decisions', 'messages', 'replies',
|
||||
+export const TESTER_VERBS = Object.freeze([
|
||||
+ 'room.open', 'room.send', 'room.read','message.send', 'message.receive', 'message.read', 'inbox', 'agents', 'tasks', 'trail', 'decisions', 'messages', 'replies',
|
||||
'usage', 'names', 'limits', 'plugins', 'instances', 'project.list', 'thread.list', 'name.set', 'project.create', 'credentials',
|
||||
'thread.create', 'thread.open', 'thread.send', 'thread.messages', 'assistant.stop',
|
||||
// Row 194 (#1692, D4.1): launch and terminate, and the read of the requests they make.
|
||||
Binary file not shown.
@@ -1,10 +0,0 @@
|
||||
--- broker.original
|
||||
+++ M03-project
|
||||
@@ -6429,7 +6429,6 @@
|
||||
keys(a, opening ? ['project'] : sending ? ['project', 'body'] : ['project', 'after', 'limit'],
|
||||
sending ? ['project', 'body'] : ['project']);
|
||||
const project = identifier(a.project);
|
||||
- if (!this.#store.get('SELECT 1 FROM projects WHERE id=? AND business=?', project, s.business)) fail('project-not-found');
|
||||
const members = Object.keys(b.roles).filter((instance) => this.#threaded(s.business, instance)).sort();
|
||||
if (!members.length) fail('thread-instance-missing');
|
||||
const owner = this.#owner(s);
|
||||
Binary file not shown.
@@ -1,10 +0,0 @@
|
||||
--- broker.original
|
||||
+++ M04-members
|
||||
@@ -6431,7 +6431,6 @@
|
||||
const project = identifier(a.project);
|
||||
if (!this.#store.get('SELECT 1 FROM projects WHERE id=? AND business=?', project, s.business)) fail('project-not-found');
|
||||
const members = Object.keys(b.roles).filter((instance) => this.#threaded(s.business, instance)).sort();
|
||||
- if (!members.length) fail('thread-instance-missing');
|
||||
const owner = this.#owner(s);
|
||||
// Preflight all collisions/missing threads before open creates or send writes anything.
|
||||
const threads = members.map((instance) => {
|
||||
Binary file not shown.
@@ -1,11 +0,0 @@
|
||||
--- broker.original
|
||||
+++ M05-collision
|
||||
@@ -6436,8 +6436,6 @@
|
||||
// Preflight all collisions/missing threads before open creates or send writes anything.
|
||||
const threads = members.map((instance) => {
|
||||
const t = this.#store.get('SELECT * FROM threads WHERE project=? AND name=?', project, instance);
|
||||
- if (t && (t.instance !== instance || t.owner !== owner))
|
||||
- fail(opening ? 'room-thread-name-taken' : 'room-not-open');
|
||||
if (!t && !opening) fail('room-not-open');
|
||||
return t ?? { instance, name: instance };
|
||||
});
|
||||
Binary file not shown.
@@ -1,10 +0,0 @@
|
||||
--- broker.original
|
||||
+++ M06-open
|
||||
@@ -6438,7 +6438,6 @@
|
||||
const t = this.#store.get('SELECT * FROM threads WHERE project=? AND name=?', project, instance);
|
||||
if (t && (t.instance !== instance || t.owner !== owner))
|
||||
fail(opening ? 'room-thread-name-taken' : 'room-not-open');
|
||||
- if (!t && !opening) fail('room-not-open');
|
||||
return t ?? { instance, name: instance };
|
||||
});
|
||||
if (opening) {
|
||||
Binary file not shown.
@@ -1,10 +0,0 @@
|
||||
--- broker.original
|
||||
+++ M07-body
|
||||
@@ -6450,7 +6450,6 @@
|
||||
if (sending) {
|
||||
string(a.body, 32768);
|
||||
const addressed = parseAddress(a.body);
|
||||
- if (!addressed.body.trim()) fail('invalid-request');
|
||||
const selected = new Set();
|
||||
for (const tag of addressed.tags) {
|
||||
const candidates = new Set([this.#named(s.business, tag), tag].filter((instance) => members.includes(instance)));
|
||||
Binary file not shown.
@@ -1,10 +0,0 @@
|
||||
--- broker.original
|
||||
+++ M08-unknown
|
||||
@@ -6454,7 +6454,6 @@
|
||||
const selected = new Set();
|
||||
for (const tag of addressed.tags) {
|
||||
const candidates = new Set([this.#named(s.business, tag), tag].filter((instance) => members.includes(instance)));
|
||||
- if (!candidates.size) fail('unknown-addressee');
|
||||
if (candidates.size > 1) fail('addressee-ambiguous');
|
||||
selected.add([...candidates][0]);
|
||||
}
|
||||
Binary file not shown.
@@ -1,10 +0,0 @@
|
||||
--- broker.original
|
||||
+++ M09-ambiguous
|
||||
@@ -6455,7 +6455,6 @@
|
||||
for (const tag of addressed.tags) {
|
||||
const candidates = new Set([this.#named(s.business, tag), tag].filter((instance) => members.includes(instance)));
|
||||
if (!candidates.size) fail('unknown-addressee');
|
||||
- if (candidates.size > 1) fail('addressee-ambiguous');
|
||||
selected.add([...candidates][0]);
|
||||
}
|
||||
const targets = threads.filter((t) => !addressed.tags.length || selected.has(t.instance));
|
||||
Binary file not shown.
@@ -1,10 +0,0 @@
|
||||
--- broker.original
|
||||
+++ M10-messaging
|
||||
@@ -6462,7 +6462,6 @@
|
||||
const sessions = targets.map((t) => {
|
||||
const session = this.#defaultSession(t.id);
|
||||
this.#sessionFence(session);
|
||||
- this.#checkMessaging(s.business, 'human', t.instance);
|
||||
return session;
|
||||
});
|
||||
const at = this.#now();
|
||||
Binary file not shown.
@@ -1,11 +0,0 @@
|
||||
--- broker.original
|
||||
+++ M11-cursor
|
||||
@@ -6488,7 +6488,7 @@
|
||||
`SELECT m.seq FROM messages m JOIN message_threads mt ON mt.message=m.id WHERE m.id=? AND m.business=? AND mt.thread IN (${placeholders})`,
|
||||
identifier(a.after), s.business, ...tids,
|
||||
)?.seq;
|
||||
- if (after === undefined) fail('message-not-found');
|
||||
+ if (after === undefined) after = 0;
|
||||
}
|
||||
// At most one row per instance joins a group; one lookahead row completes the last page.
|
||||
const rows = this.#store.all(
|
||||
Binary file not shown.
@@ -1,10 +0,0 @@
|
||||
--- broker.original
|
||||
+++ M12-fence
|
||||
@@ -6461,7 +6461,6 @@
|
||||
const targets = threads.filter((t) => !addressed.tags.length || selected.has(t.instance));
|
||||
const sessions = targets.map((t) => {
|
||||
const session = this.#defaultSession(t.id);
|
||||
- this.#sessionFence(session);
|
||||
this.#checkMessaging(s.business, 'human', t.instance);
|
||||
return session;
|
||||
});
|
||||
Binary file not shown.
Binary file not shown.
Loaded 100 of 319 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user