review(58): Darkwing round 2 candidate, rebased on row 74's tree (#1547)
Round 1's build.patch applies cleanly on424ada49(row 74 landed as351464ce). Only packages/webui/README.md's digest changes; the bullet text is the same. Manifest eb2b26c1. Gate 23:41:10Z-23:44:25Z: bus 83, tasks 71, webui 61, every scripts/test-*.sh green. 16 of 17 mutants fail, output identical to round 1. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
@@ -17,6 +17,66 @@ conflict. Row 57 adds the decisions reads and this row changes the
|
||||
the mutants are on `ae428a54`. The gate ran on `f2f2861b`, after row 62
|
||||
landed; no candidate file changed between the two.
|
||||
|
||||
## Round 2: rebased on row 74's tree
|
||||
|
||||
Row 74 (#1568) landed as `351464ce` and changed `packages/webui/README.md`,
|
||||
one of this row's 8 files. Sage's landing order is 74, then 58, then 60, so
|
||||
this round puts the same change on row 74's tree. Round 1 had Filbert's
|
||||
approval (comment 27426) and Dewey's (comment 27461) on manifest
|
||||
`e63e4c4f`.
|
||||
|
||||
Round 1's `build.patch` applies cleanly with `git apply --3way` on
|
||||
`424ada49` (`out/r2/apply.txt`; the "direct application" line is the new
|
||||
test file, which has no base blob). Row 74 added its preview section at
|
||||
lines 29 to 91 of the README, so this row's one bullet in the S5 section
|
||||
moved down 66 lines; the two changes share no lines. The other 7 files hash
|
||||
exactly as in round 1, and the bullet's text is unchanged. Nothing else in
|
||||
the code, tests or docs changed.
|
||||
|
||||
`base.txt`, `build.patch` and `candidate-manifest.sha256` now hold round 2.
|
||||
Round 1's are in `7f92a103`.
|
||||
|
||||
The three notes from round 1's reviews (Dewey's N1, Filbert's N1 and N2)
|
||||
are not in this round. They go to a test-only follow-up row Sage opens
|
||||
after this row lands.
|
||||
|
||||
### Round 2 checks
|
||||
|
||||
On the round 2 tree, one at a time (`out/r2/gate.sh`, `out/r2/mutants.sh`):
|
||||
|
||||
The gate ran from 23:41:10Z to 23:44:25Z on 2026-10-11, in a detached
|
||||
worktree at `424ada49` with `build.patch` applied and `node_modules` linked
|
||||
to the main checkout's (`out/r2/gate-summary.txt`).
|
||||
|
||||
| Suite | Result |
|
||||
|---|---|
|
||||
| packages/bus | 83 pass, 0 fail |
|
||||
| packages/tasks | 71 pass, 0 fail |
|
||||
| packages/webui | 61 pass, 0 fail, the browser tests and row 74's preview tests included |
|
||||
| test-auth | 15 passed |
|
||||
| test-conductor | 17 passed |
|
||||
| test-config | 24 passed |
|
||||
| test-discord | 66 passed |
|
||||
| test-extension-package | 18 passed |
|
||||
| test-foundation | 44 passed |
|
||||
| test-queue | 27 passed |
|
||||
| test-release | 14 passed |
|
||||
| test-task | 26 passed |
|
||||
|
||||
As in round 1, `test-task` ran with `DOCKER_HOST` set to a missing socket,
|
||||
so it skipped its Docker cases (adapter seam, workspace and capability,
|
||||
live task, live recall pair), and `test-queue` skipped its canonical-root
|
||||
check. Sage's gate rerun covers both. Afterwards I removed the
|
||||
`wt_default` Docker network, which had no containers.
|
||||
|
||||
The same 17 mutants ran on the round 2 tree from 23:48:40Z to 23:49:07Z
|
||||
(`out/r2/mutants.txt`). The output matches round 1's line for line, with
|
||||
the timings left out: 16 fail, and `ignore-row-priority` survives for the
|
||||
reason given under Mutants.
|
||||
|
||||
Candidate manifest sha256, round 2:
|
||||
`eb2b26c1b84866868ff6ed0fc5410b10d0debbd0bb299be66201150377474786`.
|
||||
|
||||
## The problem
|
||||
|
||||
The brief says priority isn't in `task_current.fields`. It is:
|
||||
|
||||
@@ -1 +1 @@
|
||||
ae428a5409a9171e0879e3ed843319e68be20ff8
|
||||
424ada49c0ab7ec585339e1150089e278415810c
|
||||
|
||||
@@ -226,10 +226,10 @@ index 00000000..2f353d1b
|
||||
+ assert.deepEqual(pick(tasks(bus.b, bus.reader)), [['vikunja:5/1', null, null]]);
|
||||
+});
|
||||
diff --git a/packages/webui/README.md b/packages/webui/README.md
|
||||
index e43118d5..88df712a 100644
|
||||
index 883b5a6d..bb7fc399 100644
|
||||
--- a/packages/webui/README.md
|
||||
+++ b/packages/webui/README.md
|
||||
@@ -87,6 +87,10 @@ note is `agents/dewey/work/wui/SLICE1-VIEWS.md`.
|
||||
@@ -153,6 +153,10 @@ note is `agents/dewey/work/wui/SLICE1-VIEWS.md`.
|
||||
since the list has no trail. The task page reads the trail and tells a task
|
||||
the stack never created from one changed in Vikunja after the stack wrote it.
|
||||
A stale poll read is shown in the snapshots and never as current.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
ef35b56f728caeb7c2f2094f654ec03cc68cab36ccaa942b7eaf23812cb14cd1 packages/bus/README.md
|
||||
1dcb833f4555bc808a3b46d000c27376a387d4dd05825ff74b59551bd3a07d48 packages/bus/src/broker.mjs
|
||||
a61476e7a7b14036f250e824e7ed545031d9a4cc58d91ec0c577f2b09ab4fc46 packages/bus/tests/task-read.test.mjs
|
||||
034b6758820fd183bbb1c8182d207c60234842fb180efcc6b4d839068accf8b8 packages/webui/README.md
|
||||
f51ce88732ad1825d52f986d79f58ba0d4ad79f4623752dfc44f947f0d9d8587 packages/webui/README.md
|
||||
847e21519333c9f03dc4a726cf51c03552cb638c2de4e844431fb661740e534e packages/webui/src/public/bus.css
|
||||
f5908e144a66839779cfbc97eaef98bd58f819bda32d0259ae9b358915fb8508 packages/webui/src/public/bus.js
|
||||
b9d496c16162c72e370acc589c95ac3db8649ca4d00f2c270cfdad9f34a08656 packages/webui/tests/bus-browser.test.mjs
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
$ git apply --cached --3way -v build.patch # round 1 patch, index of 424ada49
|
||||
Checking patch packages/bus/README.md...
|
||||
Applied patch to 'packages/bus/README.md' cleanly.
|
||||
Checking patch packages/bus/src/broker.mjs...
|
||||
Applied patch to 'packages/bus/src/broker.mjs' cleanly.
|
||||
Checking patch packages/bus/tests/task-read.test.mjs...
|
||||
Falling back to direct application...
|
||||
Checking patch packages/webui/README.md...
|
||||
Applied patch to 'packages/webui/README.md' cleanly.
|
||||
Checking patch packages/webui/src/public/bus.css...
|
||||
Applied patch to 'packages/webui/src/public/bus.css' cleanly.
|
||||
Checking patch packages/webui/src/public/bus.js...
|
||||
Applied patch to 'packages/webui/src/public/bus.js' cleanly.
|
||||
Checking patch packages/webui/tests/bus-browser.test.mjs...
|
||||
Applied patch to 'packages/webui/tests/bus-browser.test.mjs' cleanly.
|
||||
Checking patch packages/webui/tests/bus.test.mjs...
|
||||
Applied patch to 'packages/webui/tests/bus.test.mjs' cleanly.
|
||||
Applied patch packages/bus/README.md cleanly.
|
||||
Applied patch packages/bus/src/broker.mjs cleanly.
|
||||
Applied patch packages/bus/tests/task-read.test.mjs cleanly.
|
||||
Applied patch packages/webui/README.md cleanly.
|
||||
Applied patch packages/webui/src/public/bus.css cleanly.
|
||||
Applied patch packages/webui/src/public/bus.js cleanly.
|
||||
Applied patch packages/webui/tests/bus-browser.test.mjs cleanly.
|
||||
Applied patch packages/webui/tests/bus.test.mjs cleanly.
|
||||
rc=0
|
||||
@@ -0,0 +1,15 @@
|
||||
start 2026-10-11T23:41:10Z
|
||||
bus rc=0 ℹ pass 83 ℹ fail 0
|
||||
tasks rc=0 ℹ pass 71 ℹ fail 0
|
||||
webui rc=0 ℹ pass 61 ℹ fail 0
|
||||
test-auth rc=0 selftest: 15 passed, 0 failed
|
||||
test-conductor rc=0 selftest: 17 passed, 0 failed
|
||||
test-config rc=0 selftest: 24 passed, 0 failed
|
||||
test-discord rc=0 discord suite: 66 passed, 0 failed
|
||||
test-extension-package rc=0 extension package selftest: 18 passed, 0 failed
|
||||
test-foundation rc=0 selftest: 44 passed, 0 failed
|
||||
test-queue rc=0 queue suite: 27 passed, 0 failed
|
||||
test-release rc=0 selftest: 14 passed, 0 failed
|
||||
test-task rc=0 selftest: 26 passed, 0 failed
|
||||
end 2026-10-11T23:44:25Z
|
||||
DONE
|
||||
@@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
# Row 58 round 2 gate: the brief's suites (bus, tasks, webui) plus every scripts/test-*.sh, one at a
|
||||
# time, in a detached worktree of the base in base.txt with build.patch applied (row 74's tree).
|
||||
export TMPDIR=~/darkwing-scratch/r58r2/tmp
|
||||
G=~/darkwing-scratch/r58r2/wt; O=~/darkwing-scratch/r58r2/out/gate; mkdir -p $O; rm -f $O/summary.txt; cd $G
|
||||
# node_modules is a link to the main checkout's; test-discord needs node_modules/.bin/pi.
|
||||
[ -x node_modules/.bin/pi ] || { echo "node_modules not linked" >> $O/summary.txt; exit 1; }
|
||||
echo "start $(date -u +%FT%TZ)" >> $O/summary.txt
|
||||
for s in bus tasks webui; do
|
||||
env -u NODE_TEST_CONTEXT node --test "packages/$s/tests/*.test.mjs" > $O/$s-tests.log 2>&1
|
||||
echo "$s rc=$? $(grep -E '^ℹ (pass|fail) ' $O/$s-tests.log | tr '\n' ' ')" >> $O/summary.txt
|
||||
done
|
||||
for s in scripts/test-*.sh; do
|
||||
n=$(basename $s .sh)
|
||||
if [ $n = test-task ]; then DOCKER_HOST=unix:///nonexistent bash $s > $O/$n.log 2>&1; else bash $s > $O/$n.log 2>&1; fi
|
||||
echo "$n rc=$? $(grep -iE '[0-9]+ (passed|pass)' $O/$n.log | tail -1)" >> $O/summary.txt
|
||||
done
|
||||
echo "end $(date -u +%FT%TZ)" >> $O/summary.txt
|
||||
echo DONE >> $O/summary.txt
|
||||
@@ -0,0 +1,91 @@
|
||||
✔ launch identity is stamped, payload identity is refused and stale holder cannot send (262.615961ms)
|
||||
✔ decision classes route from policy; gated resolution is human-only, choice and target must match (512.269674ms)
|
||||
✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (677.803202ms)
|
||||
✔ launch events require a human CLI capability; generic emit cannot forge authority events (300.206733ms)
|
||||
✔ within-role decisions close atomically and invalid options or blocking omissions refuse (299.345505ms)
|
||||
✔ observer capabilities read human inbox but cannot mutate or forge launch identity (408.500921ms)
|
||||
✔ task action subjects and linked decision trail are complete and ordered (296.181092ms)
|
||||
✔ launch binding is durable and reconnecting requires the identical trusted record (134.746931ms)
|
||||
✔ business isolation includes inherited object names and cross-business message references (307.005982ms)
|
||||
✔ authority never transfers between action, run, target, unresolved or replaced role holder (403.717074ms)
|
||||
✔ task projection uses schema current view, skipping earlier and equal-start polls (189.087326ms)
|
||||
✔ revocation permanently bars the old run from reclaiming first, including after broker restart (277.942323ms)
|
||||
✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (137.417365ms)
|
||||
✔ both arbiters require human resolution when their cross-role route is themselves (259.604753ms)
|
||||
✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (2.629897ms)
|
||||
✔ only validated broker references load; returned data and exceptions cannot expose a known token (5.471066ms)
|
||||
✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (5.964089ms)
|
||||
✔ expiry refuses use and env references never become client data (1.029397ms)
|
||||
✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (5.593205ms)
|
||||
✔ opaque tokens shorter than 16 characters refuse before use (0.454866ms)
|
||||
✔ roles lists open decisions routed to a role, and never the human inbox (335.662193ms)
|
||||
✔ recent lists closed decisions of every route, newest close first, with how each closed (666.328123ms)
|
||||
✔ recent stops at RECENT rows (1617.599069ms)
|
||||
✔ every row is what trail already gives the same session for that id (319.63951ms)
|
||||
✔ a role session can't list decisions, so it can't read another role's open decisions (628.957474ms)
|
||||
✔ decisions is a read: one business, strict arguments, nothing written (470.860057ms)
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (217.595172ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (163.501643ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (381.106381ms)
|
||||
✔ endLaunch leaves a claim another run took alone (391.685111ms)
|
||||
✔ refuse records action.refused against the caller with the code only (362.316204ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (340.419485ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (503.895019ms)
|
||||
✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (2.916197ms)
|
||||
✔ process reader gets own kernel identity without exposing environment values (2.185845ms)
|
||||
✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (1.266519ms)
|
||||
✔ real pid 1 remains inspectable when its environment is protected (0.530533ms)
|
||||
✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (302.573884ms)
|
||||
✔ missing and foreign-business citations refuse and roll back message and grant (387.07673ms)
|
||||
✔ cross-role sends still need a matching resolved decision and consume it once (602.418215ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (295.797244ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (44.950078ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (422.041118ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (318.275125ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (442.984853ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (44.00331ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (289.196631ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (2183.9797ms)
|
||||
✔ gated approval authorizes once, survives store reopen, and fresh approval works (383.965909ms)
|
||||
✔ another run cannot consume an approval; a failed check leaves it usable (597.409883ms)
|
||||
✔ two scheduled callers have exactly one grant and one consumed refusal (391.515396ms)
|
||||
✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (579.584962ms)
|
||||
✔ class drift gated to cross-role refuses before consumption (471.277985ms)
|
||||
✔ class drift cross-role to gated refuses before consumption (348.11455ms)
|
||||
✔ class drift gated to within-role refuses before consumption (355.147273ms)
|
||||
✔ class drift cross-role to within-role refuses before consumption (380.634762ms)
|
||||
✔ class drift within-role to gated refuses before consumption (242.250238ms)
|
||||
✔ class drift within-role to cross-role refuses before consumption (241.450748ms)
|
||||
✔ message.send consumes approval and prevents a later send or authorize (239.606163ms)
|
||||
✔ role.revoke consumes approval and prevents a later revoke or authorize (269.560271ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (197.732097ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (252.121668ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (543.726016ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (431.421285ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (203.06359ms)
|
||||
✔ async transactions refuse before invoking their function (163.824365ms)
|
||||
✔ tasks rows carry priority and requirement for every session that reads tasks (455.622057ms)
|
||||
✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (871.600837ms)
|
||||
✔ an empty business and one with snapshots but no task.created read cleanly (293.885565ms)
|
||||
✔ recordTask keeps sync reads and a role write apart (271.52093ms)
|
||||
✔ read_at must be one canonical UTC format, so the projection compares strings safely (122.788762ms)
|
||||
✔ a bad entry refuses the whole record (310.532302ms)
|
||||
✔ taskView reads the projection for one business (317.793275ms)
|
||||
✔ requestTask hands only a holder and a task verb to the handler, and records refusals (558.068019ms)
|
||||
✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (589.832708ms)
|
||||
✔ without an adapter the server refuses every task verb (397.147052ms)
|
||||
✔ the runtime refuses an invalid adapter and closes a valid one (304.338866ms)
|
||||
✔ the process loads the S3 adapter from plain-data trackers (398.413681ms)
|
||||
✔ socket capability stamps launch identity; shared views use wire, no SQL client (255.903557ms)
|
||||
✔ two wire claims serialize; a lost reply never automatically retries (356.473888ms)
|
||||
✔ malformed, oversized and identity-forging envelopes refuse without echoing input (275.129665ms)
|
||||
✔ client preserves UTF-8 when a response divides a multibyte character (12.745025ms)
|
||||
✔ committed mutation followed by dropped reply reports unknown and is never retried (366.934043ms)
|
||||
ℹ tests 83
|
||||
ℹ suites 0
|
||||
ℹ pass 83
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4624.539188
|
||||
@@ -0,0 +1,79 @@
|
||||
✔ the boot config is checked before anything starts (84.481135ms)
|
||||
✔ a business with no tracker entry refuses task verbs (192.272377ms)
|
||||
✔ credential.expiring and .expired are recorded once per instance (273.091582ms)
|
||||
✔ a token file that changes on disk records credential.changed (197.083209ms)
|
||||
✔ autostart polls, reconciles and retries a startup the tracker was down for (184.775926ms)
|
||||
✔ a refusal a restart must clear is not retried by the poll (133.197646ms)
|
||||
✔ a poll that fires while two are queued is dropped (95.525362ms)
|
||||
✔ close waits for a running verb and refuses one that has not started (303.542575ms)
|
||||
✔ the bundled Vikunja is the pinned upstream image the runbook names (0.962677ms)
|
||||
✔ every published port is on 127.0.0.1, and no secret is in the file (0.570717ms)
|
||||
✔ the fake answers each route with the statuses and shapes Vikunja v2.7.0 sent (483.551503ms)
|
||||
✔ the project list holds recorded project objects in the recorded list envelope (156.039799ms)
|
||||
✔ the recorded task bodies pass the checks S3 applies to every read (0.691056ms)
|
||||
✔ the client works against the fake over real HTTP with the platform fetch (342.824457ms)
|
||||
✔ a correct install starts, and the first reconcile records tasks that already exist (167.770198ms)
|
||||
✔ verbs refuse while a business is starting and after startup refused it (169.804422ms)
|
||||
✔ startup refuses a token that can do more than its role needs (581.122579ms)
|
||||
✔ startup refuses an unsupported version and flags an untested one (401.808511ms)
|
||||
✔ startup refuses a board that the runbook did not install (478.202406ms)
|
||||
✔ startup refuses a project the sync bot cannot read (117.954125ms)
|
||||
✔ startup refuses a configured label the pm bot cannot see (259.103421ms)
|
||||
✔ startup refuses an expired credential and a missing sync credential (349.415652ms)
|
||||
✔ an unreachable tracker refuses with tracker-unavailable (101.493362ms)
|
||||
✔ an edit in the UI is recorded once, with the fields that changed (268.479902ms)
|
||||
✔ a move between open buckets is seen on the board, though updated does not change (234.72491ms)
|
||||
✔ a person's comment is counted and a bot's is not (411.094942ms)
|
||||
✔ the hourly reconcile catches a comment through comment_count (297.793524ms)
|
||||
✔ a task closed in the UI leaves the open view with its done bucket (498.806816ms)
|
||||
✔ a task that leaves the board is recorded as deleted, moved or out of reach (435.924669ms)
|
||||
✔ a poll that read before a verb wrote does not overwrite the verb (343.588824ms)
|
||||
✔ a tracker fault during a tick is reported and the next tick catches up (373.730771ms)
|
||||
✔ a malformed answer refuses the tick with tracker-shape (346.266196ms)
|
||||
✔ no token value reaches the database, the log or a refusal (636.340856ms)
|
||||
✔ the first look at a task counts only comments inside the window (251.146581ms)
|
||||
✔ with descendants off the adapter reads no project list and no child, as in v0 (186.598517ms)
|
||||
✔ a three-level tree is read per project, and a project outside it is not (135.854692ms)
|
||||
✔ a watch-only child keeps the business ready, and a failed child read refuses as transient (307.73622ms)
|
||||
✔ a root without the installed buckets refuses with descendants on (174.618748ms)
|
||||
✔ the project list refuses without read_all, and skips archived projects and saved filters (274.342862ms)
|
||||
✔ descendants must be true or false (149.348484ms)
|
||||
✔ a move inside the tree is a moved tombstone plus a snapshot under the new ref (202.541271ms)
|
||||
✔ a child made after startup joins the tree at the next reconcile (216.986997ms)
|
||||
✔ a child that leaves the tree has its tasks recorded missing, and the ledger keeps their history (206.372688ms)
|
||||
✔ a child deleted or hidden between reconciles drops out at the next tick, and the root still refuses (369.973891ms)
|
||||
✔ a reconcile that fails keeps the previous tree (237.944505ms)
|
||||
✔ a closed task the cursor missed takes its own project's done bucket (177.751867ms)
|
||||
✔ closed tasks read at startup take their own project's done bucket (354.123005ms)
|
||||
✔ a closed task the cursor returns takes its own project's done bucket (395.930084ms)
|
||||
✔ a task moved out of a child that leaves the tree at the same time is moved, not no-access (247.547743ms)
|
||||
✔ a task in a bucket outside the five keeps its raw bucket id (177.884963ms)
|
||||
✔ bucket 0 on a watch-only task never becomes a bucket or a state (281.615577ms)
|
||||
✔ a child whose kanban view is deleted still refuses the tick, and the reconcile reads it watch-only (184.334636ms)
|
||||
✔ a child dropped at a tick comes back at the next reconcile once the bot reads it again (156.912439ms)
|
||||
✔ task.create needs a recorded human request and a requirement id (260.801489ms)
|
||||
✔ only labels named in the business file can be written (308.794763ms)
|
||||
✔ task.schedule sets and clears a due date and relations (427.643931ms)
|
||||
✔ assign and reassign move the role bots and record task.assigned (416.046867ms)
|
||||
✔ task.update.assigned is for the assignee and records task.state (417.502164ms)
|
||||
✔ a wrong expected digest records task.conflict and writes nothing (444.089135ms)
|
||||
✔ a cross-role verb needs a resolved decision, used once (585.210861ms)
|
||||
✔ task.close needs a verdict; after it every verb refuses with task-done (657.717901ms)
|
||||
✔ a lost answer is settled by a re-read and never retried (393.822762ms)
|
||||
✔ a create whose answer is lost is reported uncertain, and the poll finds the task (285.78278ms)
|
||||
✔ a task the sync bot cannot read refuses and records nothing (221.082435ms)
|
||||
✔ verbs and polls for one business run one at a time (189.382252ms)
|
||||
✔ a due date with milliseconds is written to the second (254.545027ms)
|
||||
✔ every write landed and the final read failed: the verb succeeds and records what it wrote (155.407682ms)
|
||||
✔ some writes landed and the final read failed: write-uncertain, and nothing is recorded (246.416134ms)
|
||||
✔ a create whose final read fails succeeds and records task.created (275.445699ms)
|
||||
✔ an edit between the last write and the final read shows as external on the next poll (217.203586ms)
|
||||
✔ task.created is recorded when a later label write fails (259.141126ms)
|
||||
ℹ tests 71
|
||||
ℹ suites 0
|
||||
ℹ pass 71
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6141.287763
|
||||
@@ -0,0 +1,17 @@
|
||||
OK status with missing harness credential exits 3 and still lists accounts
|
||||
OK status reports harness credential (read-only) + mosaic accounts
|
||||
OK api key material never reaches output
|
||||
OK oauth token material never reaches output
|
||||
OK unparseable credential file exits 2
|
||||
OK symlinked credential file exits 4
|
||||
OK env-side credential names reported
|
||||
OK env var values never reach output
|
||||
OK accounts without an accounts dir reports none and creates nothing
|
||||
OK accounts lists files and marks the active one
|
||||
OK loose account perms flagged in listing
|
||||
OK agent --auth with missing account file refuses (exit 4)
|
||||
OK agent --auth with non-0600 account file refuses
|
||||
OK agent --auth with invalid account name refuses
|
||||
OK auth.sh without valid config refuses
|
||||
|
||||
selftest: 15 passed, 0 failed
|
||||
@@ -0,0 +1,55 @@
|
||||
Note: switching to '424ada49c0ab7ec585339e1150089e278415810c'.
|
||||
|
||||
You are in 'detached HEAD' state. You can look around, make experimental
|
||||
changes and commit them, and you can discard any commits you make in this
|
||||
state without impacting any branches by switching back to a branch.
|
||||
|
||||
If you want to create a new branch to retain commits you create, you may
|
||||
do so (now or later) by using -c with the switch command. Example:
|
||||
|
||||
git switch -c <new-branch-name>
|
||||
|
||||
Or undo this operation with:
|
||||
|
||||
git switch -
|
||||
|
||||
Turn off this advice by setting config variable advice.detachedHead to false
|
||||
|
||||
Not currently on any branch.
|
||||
nothing to commit, working tree clean
|
||||
Note: switching to '424ada49c0ab7ec585339e1150089e278415810c'.
|
||||
|
||||
You are in 'detached HEAD' state. You can look around, make experimental
|
||||
changes and commit them, and you can discard any commits you make in this
|
||||
state without impacting any branches by switching back to a branch.
|
||||
|
||||
If you want to create a new branch to retain commits you create, you may
|
||||
do so (now or later) by using -c with the switch command. Example:
|
||||
|
||||
git switch -c <new-branch-name>
|
||||
|
||||
Or undo this operation with:
|
||||
|
||||
git switch -
|
||||
|
||||
Turn off this advice by setting config variable advice.detachedHead to false
|
||||
|
||||
OK dry-run: allowed change, exit 0, nothing committed (exit 0)
|
||||
OK dry-run committed nothing
|
||||
OK apply: allowed change exits 0 (exit 0)
|
||||
OK apply: attribution in commit subject
|
||||
OK apply: target tree clean after commit
|
||||
OK disallowed path refused (exit 1)
|
||||
OK disallowed path: target untouched
|
||||
OK syntax gate refused broken .mjs (exit 1)
|
||||
OK syntax gate: target untouched
|
||||
OK suite failure refused (exit 1)
|
||||
OK suite failure: target reverted to clean
|
||||
OK disabled policy refused (exit 2)
|
||||
OK disabled policy: target untouched
|
||||
OK failed run refused (exit 1)
|
||||
OK failed run: target untouched
|
||||
OK missing run exits 4 (exit 4)
|
||||
OK invalid policy exits 2 (exit 2)
|
||||
|
||||
selftest: 17 passed, 0 failed
|
||||
@@ -0,0 +1,26 @@
|
||||
OK absent adapter defaults to pi
|
||||
OK adapter mock validates (exit 0)
|
||||
OK unsupported adapter exits 2 (exit 2)
|
||||
OK env exports adapter
|
||||
OK bootstrap creates default when absent (exit 0)
|
||||
OK bootstrap wrote config file
|
||||
OK bootstrap is idempotent on existing config (exit 0)
|
||||
OK bootstrap did not rewrite existing config
|
||||
OK validate missing config exits 3 (exit 3)
|
||||
OK malformed JSON exits 2 (exit 2)
|
||||
OK unsupported configVersion exits 2 (exit 2)
|
||||
OK unknown top-level key exits 2 (exit 2)
|
||||
OK unknown execution key exits 2 (exit 2)
|
||||
OK unsupported backend exits 2 (exit 2)
|
||||
OK unsupported environment exits 2 (exit 2)
|
||||
OK relative dataRoot exits 2 (exit 2)
|
||||
OK non-canonical dataRoot exits 2 (exit 2)
|
||||
OK filesystem root dataRoot exits 2 (exit 2)
|
||||
OK home directory dataRoot exits 2 (exit 2)
|
||||
OK dataRoot containing config dir exits 2 (exit 2)
|
||||
OK control character in provider exits 2 (exit 2)
|
||||
OK symlinked config file exits 2 (exit 2)
|
||||
OK env exports resolve correctly
|
||||
OK failed validation modified nothing
|
||||
|
||||
selftest: 24 passed, 0 failed
|
||||
@@ -0,0 +1,70 @@
|
||||
toolchain: node v26.8.1
|
||||
|
||||
OK syntax: packages/discord/src/approvals.mjs
|
||||
OK syntax: packages/discord/src/authorize.mjs
|
||||
OK syntax: packages/discord/src/binding.mjs
|
||||
OK syntax: packages/discord/src/cli.mjs
|
||||
OK syntax: packages/discord/src/connector.mjs
|
||||
OK syntax: packages/discord/src/context.mjs
|
||||
OK syntax: packages/discord/src/engine-pi.mjs
|
||||
OK syntax: packages/discord/src/errors.mjs
|
||||
OK syntax: packages/discord/src/gateway.mjs
|
||||
OK syntax: packages/discord/src/git.mjs
|
||||
OK syntax: packages/discord/src/journal.mjs
|
||||
OK syntax: packages/discord/src/notify.mjs
|
||||
OK syntax: packages/discord/src/rest.mjs
|
||||
OK syntax: packages/discord/src/setspark.mjs
|
||||
OK syntax: packages/discord/src/tools.mjs
|
||||
OK syntax: packages/discord/src/web.mjs
|
||||
OK syntax: packages/discord/bin/git-credential.mjs
|
||||
OK syntax: packages/discord/extension/tools.mjs
|
||||
OK syntax: packages/discord/tests/approvals.test.mjs
|
||||
OK syntax: packages/discord/tests/authorize.test.mjs
|
||||
OK syntax: packages/discord/tests/binding.test.mjs
|
||||
OK syntax: packages/discord/tests/connector.test.mjs
|
||||
OK syntax: packages/discord/tests/context.test.mjs
|
||||
OK syntax: packages/discord/tests/engine.test.mjs
|
||||
OK syntax: packages/discord/tests/fake-pi.mjs
|
||||
OK syntax: packages/discord/tests/gateway.test.mjs
|
||||
OK syntax: packages/discord/tests/git.test.mjs
|
||||
OK syntax: packages/discord/tests/helpers.mjs
|
||||
OK syntax: packages/discord/tests/journal.test.mjs
|
||||
OK syntax: packages/discord/tests/notify.test.mjs
|
||||
OK syntax: packages/discord/tests/recover.test.mjs
|
||||
OK syntax: packages/discord/tests/rest.test.mjs
|
||||
OK syntax: packages/discord/tests/setspark.test.mjs
|
||||
OK syntax: packages/discord/tests/tools.test.mjs
|
||||
OK syntax: packages/discord/tests/web.test.mjs
|
||||
OK syntax: packages/discord/fixtures/claim-worker.mjs
|
||||
OK syntax: packages/discord/fixtures/legacy-owner-worker.mjs
|
||||
OK syntax: scripts/discord.sh
|
||||
OK syntax: scripts/discord-service.sh
|
||||
OK packages/discord declares no dependencies
|
||||
OK no bot-token-shaped string in packages/discord
|
||||
OK fixture binding uses placeholder ids only
|
||||
OK fixture binding validates
|
||||
OK real pi with the extension exposes exactly list_dir, read_file, search and no built-in tool
|
||||
OK real pi with a writable root exposes exactly the three reads plus write_file and edit_file, and writes nothing at start
|
||||
OK real pi with a web key exposes the three reads plus web_fetch and web_search, and no write tool without a writable root
|
||||
OK real pi with a git root exposes the reads, writes and the four git verbs, commits nothing at start, and never shows the token
|
||||
OK real pi with protocol vault adds reserve_id to the git verbs
|
||||
OK real pi with a setspark key exposes the reads and the eight record verbs, no counters, and never shows the key
|
||||
OK real pi refuses a git key on a read-only root (fail closed)
|
||||
OK real pi with the pilot flags (--no-tools) exposes no tool at all
|
||||
OK real pi exits non-zero without MOSAIC_DISCORD_TOOLS: no session, no tools (fail closed)
|
||||
OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT
|
||||
OK node --test packages/discord/tests/ (ℹ pass 178)
|
||||
OK scripts/discord.sh --help exits 0
|
||||
OK scripts/discord.sh check without a binding exits 4
|
||||
OK scripts/discord.sh recover without a binding exits 4
|
||||
OK scripts/discord.sh reload without a binding exits 4
|
||||
OK scripts/discord-service.sh without a command exits 4
|
||||
OK service unit renders with the repository path, a supervised run as the main process, exit 3 never retried, and reload as SIGHUP
|
||||
OK service install writes the rendered unit (0644) and leaves no temp file
|
||||
OK service install a second time reports unchanged
|
||||
OK systemd-analyze verify accepts the rendered unit
|
||||
OK service uninstall removes the unit file
|
||||
OK service install with an unknown flag exits 4
|
||||
OK service install with USER unset finishes and names the account for lingering
|
||||
|
||||
discord suite: 66 passed, 0 failed
|
||||
@@ -0,0 +1,21 @@
|
||||
OK initial ordinary-file install
|
||||
OK installed tree matches canonical source
|
||||
OK installed tree has no symlinks
|
||||
OK check detects installation drift
|
||||
OK sync refuses to overwrite installation drift
|
||||
OK check detects an extra destination file
|
||||
OK check detects an extra destination directory
|
||||
OK check rejects a destination symlink
|
||||
OK sync accepts a canonical source update
|
||||
OK updated installation matches canonical source
|
||||
scripts/test-extension-package.sh: line 14: 1303039 Killed "$@" > /dev/null 2>&1
|
||||
OK forced interruption kills the replacing process
|
||||
OK next invocation recovers old consistent installation
|
||||
OK interrupted replacement rolled back
|
||||
OK sync succeeds after interruption recovery
|
||||
OK unlocked stale lock file does not block
|
||||
OK active lock refuses a concurrent sync
|
||||
OK source symlink fails closed
|
||||
OK nested second entrypoint fails closed
|
||||
|
||||
extension package selftest: 18 passed, 0 failed
|
||||
@@ -0,0 +1,53 @@
|
||||
toolchain: node v26.8.1, python 3.12.8, jsonschema 4.26.0
|
||||
|
||||
OK syntax: scripts/foundation-inspect.mjs
|
||||
OK syntax: scripts/foundation/strict-json.mjs
|
||||
OK syntax: scripts/foundation/canonical.mjs
|
||||
OK syntax: scripts/foundation/resolve.mjs
|
||||
OK syntax: scripts/foundation/validate-record.mjs
|
||||
OK syntax: scripts/foundation/fixtures/build-fixtures.mjs
|
||||
OK syntax: scripts/foundation/canonical.test.mjs
|
||||
OK syntax: scripts/foundation/cli.test.mjs
|
||||
OK syntax: scripts/foundation/fixtures.test.mjs
|
||||
OK syntax: scripts/foundation/resolve.test.mjs
|
||||
OK syntax: scripts/foundation/strict-json.test.mjs
|
||||
OK syntax: scripts/foundation/verify-schema.py (ast only; no bytecode written)
|
||||
OK fixture generator runs
|
||||
OK checked-in fixtures/bundles equal a fresh generation
|
||||
OK checked-in fixtures/raw equal a fresh generation
|
||||
OK checked-in fixtures/index.json equal a fresh generation
|
||||
OK checked-in demo bundles equal a fresh generation
|
||||
OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT
|
||||
OK node --test scripts/foundation/ (ℹ pass 80)
|
||||
OK differential schema oracle: PASS: differential schema oracle (finite corpus; compatibility evidence, not equivalence proof)
|
||||
platform witness: strftime('%Y') for year 999 -> '999' (pinned checker refuses years 0001..0999)
|
||||
node v26.8.1; corpus 1568 records (38 pinned fixtures, 478 unique bundle records, 1052 typeCase/mutation/lexical cases)
|
||||
schema column: agree-valid 540, agree-invalid 991, DISAGREEMENTS 0; strict-only (parser-bound) cases: 27; unsupported-kind records not schema-assessed by the inspector: 10
|
||||
profile column (schema-valid records only): profile-valid 510, profile-invalid 30
|
||||
profile refusals asserted: 30 schema-agreed-valid records refused only by the strict typed-string profile (rule profile-pattern-mismatch), 12 declared by name; 73 named probes verified against declared schema/profile columns
|
||||
OK oracle: zero schema-column disagreements with the pinned checker
|
||||
OK oracle: strict-only profile refusals are counted and asserted
|
||||
OK demo: permitted read preview exits 0 (exit 0)
|
||||
OK demo: permitted file.change preview exits 0 (exit 0)
|
||||
OK demo: assignment.change proposal is unresolved (exit 3) (exit 3)
|
||||
OK demo: revoked registration is refused (exit 3) (exit 3)
|
||||
OK demo: message is not authority (exit 3) (exit 3)
|
||||
OK usage: no arguments exits 2 (exit 2)
|
||||
OK io: missing file exits 4 (exit 4)
|
||||
OK io: directory exits 4 (exit 4)
|
||||
OK io: symlink exits 4 (O_NOFOLLOW) (exit 4)
|
||||
OK bound: oversize fixture exits 2 (exit 2)
|
||||
OK profile: one final LF in a typed selection id is refused before admission (exit 2) (exit 2)
|
||||
OK profile: two final LFs fail the schema pattern itself (exit 2) (exit 2)
|
||||
OK profile: escaped newlines in free-form text stay allowed (exit 0) (exit 0)
|
||||
OK profile refusal is invalid-request/profile-pattern-mismatch with selection and operation withheld, value not echoed
|
||||
OK text output starts with the disclaimer
|
||||
OK json output is valid JSON with result allowed and exactly the charter §7 fields
|
||||
OK json golden matches byte-for-byte
|
||||
OK sandboxed bundle run (env -i, PATH=/nonexistent) produced the unresolved proposal
|
||||
OK sandbox inventory (path/type/size/mode/uid/gid/inode/mtime/sha256) unchanged by runs
|
||||
OK canary never printed (bundle run and credential-file run)
|
||||
OK a non-bundle JSON file is refused at the shape gate, not read into output
|
||||
OK no field of the non-bundle file is echoed
|
||||
|
||||
selftest: 44 passed, 0 failed
|
||||
@@ -0,0 +1,35 @@
|
||||
toolchain: node v26.8.1, git version 2.55.0
|
||||
|
||||
OK syntax: packages/queue/src/cli.mjs
|
||||
OK syntax: packages/queue/src/errors.mjs
|
||||
OK syntax: packages/queue/src/io.mjs
|
||||
OK syntax: packages/queue/src/lock.mjs
|
||||
OK syntax: packages/queue/src/queue.mjs
|
||||
OK syntax: packages/queue/src/review.mjs
|
||||
OK syntax: packages/queue/src/store.mjs
|
||||
OK syntax: packages/queue/tests/commit.test.mjs
|
||||
OK syntax: packages/queue/tests/data.test.mjs
|
||||
OK syntax: packages/queue/tests/dispatch.test.mjs
|
||||
OK syntax: packages/queue/tests/helpers.mjs
|
||||
OK syntax: packages/queue/tests/lock.test.mjs
|
||||
OK syntax: packages/queue/tests/migration.test.mjs
|
||||
OK syntax: packages/queue/tests/review.test.mjs
|
||||
OK syntax: packages/queue/tests/store.test.mjs
|
||||
OK syntax: packages/queue/tests/write.test.mjs
|
||||
OK syntax: packages/queue/tests/fixtures/fake-gitea.mjs
|
||||
OK syntax: packages/queue/tests/fixtures/kill-at.mjs
|
||||
OK syntax: packages/queue/tests/fixtures/lock-child.mjs
|
||||
OK syntax: packages/queue/tests/fixtures/mosaic-pre-a2.sh
|
||||
OK syntax: scripts/queue-commit.sh
|
||||
OK syntax: scripts/git-hooks/pre-commit
|
||||
OK syntax: scripts/mosaic
|
||||
OK queue-commit.sh, the guard and scripts/mosaic are executable
|
||||
OK packages/queue declares no dependencies
|
||||
ℹ tests 150
|
||||
ℹ pass 150
|
||||
ℹ fail 0
|
||||
OK node --test packages/queue/tests/
|
||||
OK scripts/mosaic queue help
|
||||
skip queue verify and render --check: this checkout (/home/jwoltje/darkwing-scratch/r58r2/wt) is not the queue's canonical root (/mnt/storage/src/mosaic-stack)
|
||||
|
||||
queue suite: 27 passed, 0 failed
|
||||
@@ -0,0 +1,16 @@
|
||||
OK valid RELEASE resolves (exit 0)
|
||||
OK invalid RELEASE exits 1 (exit 1)
|
||||
OK missing RELEASE exits 1 (exit 1)
|
||||
OK valid RELEASE leaves image tag consistent with version
|
||||
OK status safe on empty state (exit 0)
|
||||
OK status created no pointer
|
||||
OK fault-injected activation refuses (exit 1)
|
||||
OK refused activation wrote no pointer
|
||||
OK refusal logged exactly once with valid fields
|
||||
OK healthy activation succeeds (exit 0)
|
||||
OK pointer written with valid fields
|
||||
OK repeat activation succeeds (log grows) (exit 0)
|
||||
OK log is append-only across activations
|
||||
OK rollback without previous refuses (exit 1)
|
||||
|
||||
selftest: 14 passed, 0 failed
|
||||
@@ -0,0 +1,32 @@
|
||||
OK valid task validates (exit 0)
|
||||
OK unknown task key exits 2 (exit 2)
|
||||
OK unsupported taskVersion exits 2 (exit 2)
|
||||
OK invalid task id exits 2 (exit 2)
|
||||
OK empty prompt exits 2 (exit 2)
|
||||
OK NUL in expectExact exits 2 (exit 2)
|
||||
OK out-of-range timeout exits 2 (exit 2)
|
||||
OK missing mission file exits 4 (exit 4)
|
||||
OK task with valid mission validates (exit 0)
|
||||
OK invalid mission exits 2 (exit 2)
|
||||
OK validate missing task exits 4 (exit 4)
|
||||
OK validation does not modify the task file
|
||||
OK prune dry-run exits 0 (exit 0)
|
||||
OK dry-run deleted nothing
|
||||
OK prune --keep=2 --yes removes oldest (exit 0)
|
||||
OK kept exactly 2 newest runs
|
||||
OK newest run kept, oldest pruned
|
||||
OK append-only receipt written (3 entries)
|
||||
OK sessions/workspaces untouched by prune
|
||||
OK prune with invalid keep exits 4 (exit 4)
|
||||
skip adapter seam cases (docker daemon unavailable)
|
||||
skip workspace/capability cases (docker daemon unavailable)
|
||||
skip live task cases (docker unavailable)
|
||||
OK onboard without name exits 4 (non-interactive) (exit 4)
|
||||
OK onboard --name renders profile (exit 0)
|
||||
OK profile written
|
||||
OK canon structure: required filled, optional placeholdered
|
||||
OK canon sections present
|
||||
skip live recall pair: user recall run, recalled user name (docker daemon unavailable)
|
||||
OK no agent identity on headless run
|
||||
|
||||
selftest: 26 passed, 0 failed
|
||||
@@ -0,0 +1,70 @@
|
||||
✔ browser edge states: loading, empty, malformed, stale, hostile/long values, in-flight reply and appearance fallback (7601.340778ms)
|
||||
Rendered contrast: {"failures":[],"count":330,"lowest":4.504658476260286}
|
||||
✔ served Console browser: real board fixtures, keyboard, drafts, receipts, themes, 320px and failures (8146.005448ms)
|
||||
✔ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes (9238.380137ms)
|
||||
✔ bus routes serve the four reads from the reader view, unescaped JSON for the page to escape (560.717762ms)
|
||||
✔ decisions route serves the roles and recent lists from the reader view (1293.219139ms)
|
||||
✔ bus routes are GET-only, have no write verb, and keep the same-origin checks (127.451013ms)
|
||||
✔ bus refusals map to statuses and never carry a path or a stack (37.722051ms)
|
||||
✔ humanCall speaks the human transport protocol without blocking the server (2247.801098ms)
|
||||
✔ busReader takes --business, else the live bus host, else refuses (461.792188ms)
|
||||
✔ humanCall kills a transport that runs past its timeout (544.937206ms)
|
||||
✔ serve refuses a --business value that is not a business id (373.134998ms)
|
||||
✔ conversation view: full history, collapsed tools, hidden thinking, inert hostile content, malformed and reconcile markers (7856.446628ms)
|
||||
✔ conversation view: a fork keeps the open branch, says so, and opens the new one on request (3204.460082ms)
|
||||
✔ conversation view: a newer session with no readable history keeps the marker (2593.572162ms)
|
||||
✔ conversation view: seats without history say so and offer no reply (1728.36009ms)
|
||||
✔ Discord row through real board/WebUI: independent brake/liveness, no Reply, literal content (7599.679659ms)
|
||||
✔ return flow through the conversation view: send, tool call, delayed result, peer message, exact long answers, relaunch (57232.734159ms)
|
||||
✔ preview options are all three or none, and each is checked (22.422098ms)
|
||||
✔ the CLI refuses a partial or invalid preview flag set at start (2521.02845ms)
|
||||
✔ the CLI with all three flags serves the preview mode (415.093067ms)
|
||||
✔ a request for the public name needs the header equal to the user id, else 401 and nothing read (79.648489ms)
|
||||
✔ the header name matches without regard to case, and the value compare is exact (7.388769ms)
|
||||
✔ the public name with the header reads the bus views, and the Host and Origin are checked first (100.565297ms)
|
||||
✔ in preview mode every write answers 403 read-only, from the public name and loopback, and reaches nothing (37.948611ms)
|
||||
✔ loopback requests are unchanged in preview mode, and the bus views work with the board down (17.345356ms)
|
||||
✔ a proxy that rewrites Host to the loopback port gets 403 on its first request, whatever the user (59.099971ms)
|
||||
✔ a repeated Host is 400 before any other check, in preview mode and without it (21.244569ms)
|
||||
✔ without the preview flags the public name is refused and writes still reach the board (15.324283ms)
|
||||
✔ redactor: config, dataRoot, any absolute path, Discord ids and the JSON parser quote (2.909767ms)
|
||||
✔ credential state from the date alone, as the bus states it (0.307055ms)
|
||||
✔ queue: rows, one row, ids and methods, notes; no path or id from a row (2106.817006ms)
|
||||
✔ queue: a refused read fails closed with the store's text, redacted (1603.482324ms)
|
||||
✔ queue: a store that fails to load, or a child that dies, gives a fixed message with no path or stack (5498.370472ms)
|
||||
✔ business: names, vars on the allowlist, authority, credential metadata only (17.678342ms)
|
||||
✔ business: missing or invalid file refuses with the module's text, redacted (27.730315ms)
|
||||
✔ business without --business: the live bus host, else no-bus-host; no system config: not-configured (13.977597ms)
|
||||
✔ settings: release, board, loopback address, notifier binding name only (535.633219ms)
|
||||
✔ both presentations replace old activity with relaunch notice, label retained history, then resume after new activity (7771.142671ms)
|
||||
✔ reported return flow and relative Age: reply sent from the inspector, then the new answer appears there without manual refresh (24946.734629ms)
|
||||
✔ loopback host and board origin fail closed (13.427489ms)
|
||||
✔ real board fixture passes through WebUI; assets and isolated seen/reply work (434.890063ms)
|
||||
✔ proxy preserves exact request bytes, status and receipt, rejects forms and malformed JSON, never follows redirect (163.418452ms)
|
||||
✔ unreachable board reports URL; CLI rejects unsupported options (1622.080261ms)
|
||||
✔ render prints the unit without the preview flags (59.081519ms)
|
||||
✔ render carries every serve flag, the preview set included (30.31013ms)
|
||||
✔ a partial preview set is refused (190.386037ms)
|
||||
✔ a value the unit cannot carry is refused, for every flag (2208.824468ms)
|
||||
✔ the rendered unit names none of the human proof agent markers and sets no agent variable (364.243715ms)
|
||||
✔ install into --dir with --no-reload writes the file whole, then reports unchanged (506.634523ms)
|
||||
✔ install without --no-reload runs daemon-reload and nothing that starts the unit (126.645267ms)
|
||||
✔ uninstall refuses while the unit is active, and removes it once it is not (745.990082ms)
|
||||
✔ status prints the unit state and GET /healthz on the installed port (620.126269ms)
|
||||
✔ usage: an unknown verb or flag, and start or enable, exit 4 (160.480897ms)
|
||||
✔ tokens.css and icons.svg are byte copies of docs/design (1.785069ms)
|
||||
✔ JetBrains Mono files match the digests in their sources file, with the OFL text (3.240471ms)
|
||||
✔ shipped strings are unchanged, and the web keeps its write boundary (2.680306ms)
|
||||
✔ shell in a browser: System default, seeded states, 400px, focus and the Ctrl+K palette (11130.648018ms)
|
||||
✔ five states on Board, Inbox, Tasks, Agents and Trail (4406.079536ms)
|
||||
✔ Queue, Business and Settings in their five states, with no move button (9247.136262ms)
|
||||
✔ seeded secrets, Discord ids and paths reach no response and no page; business refusals in the module's words (4088.247128ms)
|
||||
✔ the server log names no config path when the system config refuses (420.777381ms)
|
||||
ℹ tests 61
|
||||
ℹ suites 0
|
||||
ℹ pass 61
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 58142.505211
|
||||
@@ -0,0 +1,38 @@
|
||||
#!/bin/bash
|
||||
# Row 58 (#1547) round 2 mutants, on row 74's tree. Each edits one source file in the build worktree, runs the test file that
|
||||
# should fail it, then restores the file from the worktree index, which holds the candidate. Only
|
||||
# the one test file runs, since other seats' suites shared the machine; the gate runs every suite.
|
||||
export TMPDIR=~/darkwing-scratch/r58r2/tmp
|
||||
cd ~/darkwing-scratch/r58r2/wt
|
||||
B=packages/bus/src/broker.mjs; W=packages/webui/src/public/bus.js
|
||||
BT=packages/bus/tests/task-read.test.mjs; WE=packages/webui/tests/bus.test.mjs; WB=packages/webui/tests/bus-browser.test.mjs
|
||||
run() { # name file sed-expr test-file
|
||||
sed -i "$3" "$2"
|
||||
if git diff --quiet -- "$2"; then echo "$1: MUTATION DID NOT APPLY"; return; fi
|
||||
env -u NODE_TEST_CONTEXT node --test --test-timeout=60000 "$4" > ~/darkwing-scratch/r58r2/tmp/mut-$1.log 2>&1
|
||||
echo "$1: rc=$? $(grep -E '^ℹ (pass|fail) ' ~/darkwing-scratch/r58r2/tmp/mut-$1.log | tr '\n' ' ')"
|
||||
grep -E '^✖ ' ~/darkwing-scratch/r58r2/tmp/mut-$1.log | sed 's/ ([0-9.]*ms)$//; s/^/ /' | sort -u | head -4
|
||||
git checkout -q -- "$2"
|
||||
}
|
||||
# The broker's 'tasks' rows.
|
||||
run tasks-verb-unchanged $B 's/ if (verb === .tasks.) return this.#taskRows(s.business);/ if (verb === "tasks") return this.#store.all("SELECT * FROM task_current WHERE business=? ORDER BY task_ref", s.business).map((r) => ({ ...r, fields: JSON.parse(r.fields) }));/' $BT
|
||||
run no-priority $B 's/ const priority = fields.priority ?? null;/ const priority = null;/' $BT
|
||||
run zero-priority-null $B 's/ const priority = fields.priority ?? null;/ const priority = fields.priority || null;/' $BT
|
||||
run tombstone-priority-zero $B 's/ const priority = fields.priority ?? null;/ const priority = fields.priority ?? 0;/' $BT
|
||||
run requirement-by-ref $B "s/ const taskId = (ref) => ref.slice(ref.indexOf('\/') + 1);/ const taskId = (ref) => ref;/" $BT
|
||||
run requirement-last-wins $B 's/ if (!requirement.has(taskId(e.subject))) requirement.set/ requirement.set/' $BT
|
||||
run requirement-any-business $B "s/ FROM events WHERE business=? AND kind='task.created' ORDER BY seq\",/ FROM events WHERE (business=? OR 1) AND kind='task.created' ORDER BY seq\",/" $BT
|
||||
run requirement-undefined $B 's/requirement: requirement.get(taskId(r.task_ref)) ?? null }/requirement: requirement.get(taskId(r.task_ref)) }/' $BT
|
||||
run task-view-adds-keys $B 's/ const parse = (r) => ({ ...r, fields: JSON.parse(r.fields) });/ const parse = (r) => ({ ...r, fields: JSON.parse(r.fields), priority: null, requirement: null });/' $BT
|
||||
# The endpoint passes both keys through.
|
||||
run endpoint-drops-keys $B 's/ return { ...r, fields, priority, requirement: requirement.get(taskId(r.task_ref)) ?? null };/ return { ...r, fields };/' $WE
|
||||
# The Tasks view.
|
||||
run list-requirement-from-trail $W 's/ requirement: row.requirement ?? created?.body?.requirement ?? null,/ requirement: created?.body?.requirement ?? null,/' $WB
|
||||
run no-requirement-column $W "s/\['Task', 'Requirement', 'Assignees'/['Task', 'Assignees'/; s|<td>\${t.requirement ? txt(t.requirement) : '<span class=\"muted\">none</span>'}</td>||" $WB
|
||||
run priority-default-zero $W 's/priority: row.priority ?? shape.priority ?? null,/priority: row.priority ?? shape.priority ?? 0,/' $WB
|
||||
run tombstone-no-fallback $W 's/priority: row.priority ?? shape.priority ?? null,/priority: row.priority ?? null,/' $WB
|
||||
run detail-priority-raw $W 's|<dt>Priority</dt><dd>${priority(t.priority)}</dd>|<dt>Priority</dt><dd>${esc(PRIORITY[t.priority] \|\| t.priority)}</dd>|' $WB
|
||||
run list-priority-raw $W 's|<td>${due(t.due)}</td><td>${priority(t.priority)}</td>|<td>${due(t.due)}</td><td>${esc(PRIORITY[t.priority] \|\| t.priority)}</td>|' $WB
|
||||
# Expected to survive: for a live row the bus priority is fields.priority, which shape is too.
|
||||
run ignore-row-priority $W 's/priority: row.priority ?? shape.priority ?? null,/priority: shape.priority ?? null,/' $WB
|
||||
git diff --quiet -- $B $W && echo "restored: sources match the candidate index" || echo "NOT RESTORED"
|
||||
@@ -0,0 +1,60 @@
|
||||
tasks-verb-unchanged: rc=1 ℹ pass 0 ℹ fail 3
|
||||
✖ an empty business and one with snapshots but no task.created read cleanly
|
||||
✖ failing tests:
|
||||
✖ tasks rows carry priority and requirement for every session that reads tasks
|
||||
✖ the read model rebuilds from the ledger: a reopened bus and each trail give the same values
|
||||
no-priority: rc=1 ℹ pass 1 ℹ fail 2
|
||||
✖ failing tests:
|
||||
✖ tasks rows carry priority and requirement for every session that reads tasks
|
||||
✖ the read model rebuilds from the ledger: a reopened bus and each trail give the same values
|
||||
zero-priority-null: rc=1 ℹ pass 1 ℹ fail 2
|
||||
✖ failing tests:
|
||||
✖ tasks rows carry priority and requirement for every session that reads tasks
|
||||
✖ the read model rebuilds from the ledger: a reopened bus and each trail give the same values
|
||||
tombstone-priority-zero: rc=1 ℹ pass 0 ℹ fail 3
|
||||
✖ an empty business and one with snapshots but no task.created read cleanly
|
||||
✖ failing tests:
|
||||
✖ tasks rows carry priority and requirement for every session that reads tasks
|
||||
✖ the read model rebuilds from the ledger: a reopened bus and each trail give the same values
|
||||
requirement-by-ref: rc=1 ℹ pass 1 ℹ fail 2
|
||||
✖ failing tests:
|
||||
✖ tasks rows carry priority and requirement for every session that reads tasks
|
||||
✖ the read model rebuilds from the ledger: a reopened bus and each trail give the same values
|
||||
requirement-last-wins: rc=1 ℹ pass 1 ℹ fail 2
|
||||
✖ failing tests:
|
||||
✖ tasks rows carry priority and requirement for every session that reads tasks
|
||||
✖ the read model rebuilds from the ledger: a reopened bus and each trail give the same values
|
||||
requirement-any-business: rc=1 ℹ pass 2 ℹ fail 1
|
||||
✖ failing tests:
|
||||
✖ tasks rows carry priority and requirement for every session that reads tasks
|
||||
requirement-undefined: rc=1 ℹ pass 0 ℹ fail 3
|
||||
✖ an empty business and one with snapshots but no task.created read cleanly
|
||||
✖ failing tests:
|
||||
✖ tasks rows carry priority and requirement for every session that reads tasks
|
||||
✖ the read model rebuilds from the ledger: a reopened bus and each trail give the same values
|
||||
task-view-adds-keys: rc=1 ℹ pass 2 ℹ fail 1
|
||||
✖ failing tests:
|
||||
✖ tasks rows carry priority and requirement for every session that reads tasks
|
||||
endpoint-drops-keys: rc=1 ℹ pass 7 ℹ fail 1
|
||||
✖ bus routes serve the four reads from the reader view, unescaped JSON for the page to escape
|
||||
✖ failing tests:
|
||||
list-requirement-from-trail: rc=1 ℹ pass 0 ℹ fail 1
|
||||
✖ failing tests:
|
||||
✖ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes
|
||||
no-requirement-column: rc=1 ℹ pass 0 ℹ fail 1
|
||||
✖ failing tests:
|
||||
✖ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes
|
||||
priority-default-zero: rc=1 ℹ pass 0 ℹ fail 1
|
||||
✖ failing tests:
|
||||
✖ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes
|
||||
tombstone-no-fallback: rc=1 ℹ pass 0 ℹ fail 1
|
||||
✖ failing tests:
|
||||
✖ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes
|
||||
detail-priority-raw: rc=1 ℹ pass 0 ℹ fail 1
|
||||
✖ failing tests:
|
||||
✖ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes
|
||||
list-priority-raw: rc=1 ℹ pass 0 ℹ fail 1
|
||||
✖ failing tests:
|
||||
✖ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes
|
||||
ignore-row-priority: rc=0 ℹ pass 1 ℹ fail 0
|
||||
restored: sources match the candidate index
|
||||
Reference in New Issue
Block a user