filbert: row 95 build packet (#1589), manifest 246c0557
Candidate on base a3f6e9e6, not committed here. Gate green 21:27:35Z-21:30:19Z;
mutants 30/35 killed, 5 equivalent guards explained in build.md.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
✔ explicit request, Seen, ordinary completion and a new request have distinct attention states (4.980463ms)
|
||||
✔ attention convention ignores reasoning/quoted examples and permits leading blank lines (0.272275ms)
|
||||
✔ completed smoke replies and ordinary questions are idle, not human blockers (1.303711ms)
|
||||
✔ only an explicit first-line input request makes a finished reply waiting (0.281027ms)
|
||||
✔ tool activity, user text, errors and unfinished turns override attention text (0.217434ms)
|
||||
✔ STOP access failure is unknown, not absence, under a non-root identity (44.907294ms)
|
||||
✔ connector Task never inherits Discord routing envelopes; ordinary Task still uses user text (3.708872ms)
|
||||
✔ connector discovery keeps only safe identity; rejects modes, mismatches, links and traversal (1.751708ms)
|
||||
✔ canonical owner identity and STOP are independent; no tmux fallback or forged registration (8.083017ms)
|
||||
✔ connector reply refusal precedes forged live tmux registration; ordinary agent still sends (0.7868ms)
|
||||
✔ server rescans connector discovery and refuses HTTP reply without transport (46.884682ms)
|
||||
✔ connector session links and linked directories are not read (1.295115ms)
|
||||
✔ newer live matching launch marks old activity, preserves history/attention/attribution, then clears on new activity (2.722154ms)
|
||||
✔ CLI print uses the relaunch notice instead of old current preview (104.326813ms)
|
||||
✔ connector owner and fixed task never inherit a native relaunch notice (2.584048ms)
|
||||
✔ equality, stale/unknown/offline, mismatched registration and unknown activity do not assert relaunch (2.689431ms)
|
||||
✔ loadConfig: missing file throws ConfigError (1.990891ms)
|
||||
✔ loadConfig: invalid JSON throws ConfigError (0.3859ms)
|
||||
✔ loadConfig: missing dataRoot throws ConfigError (0.282817ms)
|
||||
✔ loadConfig: relative dataRoot throws ConfigError (0.245402ms)
|
||||
✔ loadConfig: valid config returns dataRoot (0.759982ms)
|
||||
✔ findNewestSession: picks the newest by mtime among two files (0.518653ms)
|
||||
✔ findNewestSession: finds files in nested subdirectories (0.343092ms)
|
||||
✔ findNewestSession: returns null for a missing dir (0.141133ms)
|
||||
✔ readSession: extracts fields, collapses/truncates text, counts a truncated final line (0.960094ms)
|
||||
✔ readSession: model and provider follow the latest model_change entry or assistant turn; null when the log names neither; scanAgent carries them (1.573448ms)
|
||||
✔ readSession: lastError carries the assistant errorMessage only when the last assistant turn errored (0.717431ms)
|
||||
✔ findNewestSession/scan: never read sibling auth or secrets next to a sessions dir (1.203237ms)
|
||||
✔ deriveState: full state table (0.193974ms)
|
||||
✔ rule: newest entry is an assistant message with a tool call, after a question-looking text, is working (0.371336ms)
|
||||
✔ rule: newest entry is a tool result with no assistant text after it is working (0.297966ms)
|
||||
✔ rule: a finished ordinary turn is idle, even if it says your move (0.2992ms)
|
||||
✔ task: the first user message of the session, from text blocks (0.295735ms)
|
||||
✔ task: a plain-string user content is accepted, whitespace collapsed and long text capped (0.287859ms)
|
||||
✔ task: no user message in the log means null (shown as unknown), never a guess (0.300942ms)
|
||||
✔ workspace: the live tmux pane path wins; the session cwd is the fallback; neither means null (0.448892ms)
|
||||
✔ activeProject: basename of the nearest .git directory or .git file above the workspace; none means null (0.649005ms)
|
||||
✔ scan: the written record carries task, workspace and activeProject (0.647152ms)
|
||||
✔ registration: overrides task, project and workspace; every source says registration; registered carries the launch fields; the grouping column is untouched (0.675469ms)
|
||||
✔ registration: empty task and null project/workspace leave the derived values in place; registered is still non-null (0.421012ms)
|
||||
✔ registration: a record whose pid is gone is stale; derived values win, sources say derived, registered stays with alive false; a pid the probe cannot decide is not stale; pidAlive itself (1.049774ms)
|
||||
✔ registration: no registration leaves the Gate A fields exactly as before, and registered is null (0.463045ms)
|
||||
✔ loadRegistrations: a missing seatsDir gives empty lists (0.171517ms)
|
||||
✔ loadRegistrations: one good record, one malformed JSON, one with an unknown field; a stray file under seatsDir is ignored (0.827255ms)
|
||||
✔ matchRegistration: matches by sessionsDir, and by realpath through a symlink; sessionsDir null never matches; same seat name with a different sessionsDir does not match (fleet vs repo darkwing) (0.355393ms)
|
||||
✔ scan: writes the registration override to disk; index.json carries registered and registrationErrors (0.905133ms)
|
||||
✔ scan: a relative seatsDir throws ConfigError; an omitted seatsDir behaves as before (0.84953ms)
|
||||
✔ scanAgent: waitingOnYou is true for waiting/error and false otherwise (0.656805ms)
|
||||
✔ scanAgent: ageSeconds is computed from the injected now (0.282529ms)
|
||||
✔ scanAgent: sessionFile null and state idle when sessions dir is empty but alive (0.158459ms)
|
||||
✔ discoverRepoAgents: finds agents with a sessions dir, skips those without, sorted by name (0.354265ms)
|
||||
✔ discoverFleetAgents: finds agents with a sessions dir, sorted by name, fleet tmux fields (0.373748ms)
|
||||
✔ scan: writes per-agent files and index.json, rerun overwrites, no leftover tmp files (1.055963ms)
|
||||
✔ scan: relative boardDir throws ConfigError (0.091352ms)
|
||||
✔ CLI: scan with assume-alive liveness exits 0, prints board summary, writes board files (65.443737ms)
|
||||
✔ CLI: missing config exits 2 with a refused: message (66.984113ms)
|
||||
✔ CLI: unknown command exits 2 (59.279253ms)
|
||||
✔ CLI: unknown --liveness value exits 2 (56.675922ms)
|
||||
✔ panesRunPi: true when any trimmed line equals 'pi' (0.299223ms)
|
||||
✔ panesRunPi: false for bash-only, claude, empty, or node-pi-style lines (0.122281ms)
|
||||
✔ tmuxIsAlive: a pane running pi is alive (0.24044ms)
|
||||
✔ tmuxIsAlive: session exists but pi has exited is not alive (0.083883ms)
|
||||
✔ tmuxIsAlive: no such tmux session is not alive (0.069633ms)
|
||||
✔ tmuxIsAlive: tmux could not be run at all is unknown (null), never assumed alive (0.104304ms)
|
||||
✔ tmuxIsAlive: passes -L <socket> only when a socket is given (0.107395ms)
|
||||
✔ parsePanes: one pane per line, command and optional tab-separated path (0.082886ms)
|
||||
✔ tmuxInspect: reports the path of the pane running pi, not of a shell pane (0.07376ms)
|
||||
✔ tmuxInspect: no pi pane, no session, or no tmux gives no workspace and the matching liveness (0.1003ms)
|
||||
✔ loadSeen: missing file returns {} (0.175416ms)
|
||||
✔ loadSeen: invalid JSON throws ConfigError (0.224088ms)
|
||||
✔ loadSeen: a JSON array throws ConfigError (0.165393ms)
|
||||
✔ loadSeen: a non-string value throws ConfigError (0.205174ms)
|
||||
✔ markSeen: seen true adds the key and writes seen.json mode 0600, no leftover tmp files (0.384651ms)
|
||||
✔ markSeen: seen false deletes the key (0.347974ms)
|
||||
✔ markSeen: missing, empty, or non-string fields throw ConfigError (0.253717ms)
|
||||
✔ markSeen: project containing '/' throws ConfigError (0.146079ms)
|
||||
✔ markSeen: non-boolean seen throws ConfigError (0.115722ms)
|
||||
✔ scanAgent: a seen mark matching the waiting session's lastTimestamp clears waitingOnYou (0.340147ms)
|
||||
✔ scanAgent: a stale mark (agent wrote something newer) is not seen and waitingOnYou is true (0.261968ms)
|
||||
✔ scanAgent: a working session with a matching mark is not seen (marks only apply to waiting/error) (0.256389ms)
|
||||
✔ scanAgent: an error-state session with a matching mark is seen (0.258928ms)
|
||||
✔ scan: index.seen and waitingOnYou reflect seen.json, which scan never rewrites or deletes (0.673884ms)
|
||||
✔ scan: a corrupt seen.json makes scan throw ConfigError (fail closed) (0.284213ms)
|
||||
✔ taskSetBy: a registered task carries the record's setter; a record without the field (pre-#1511) reads unknown; the value is not copied into registered (0.773582ms)
|
||||
✔ taskSetBy: null whenever the task shown is not the registered one: no registration, an empty registered task, a stale registration; the field is always present (0.689493ms)
|
||||
✔ taskSetBy: scan() reads the field from disk through the seat package (bounded there), writes it to the per-agent record and index, and an invalid on-disk value is a registrationError, never a row value (1.221496ms)
|
||||
✔ isLoopbackHost: recognizes loopback hosts (1.453906ms)
|
||||
✔ isLoopbackHost: rejects non-loopback hosts (4.703991ms)
|
||||
✔ startServer: refuses a non-loopback host with ConfigError, never opens a socket (3.375558ms)
|
||||
✔ startServer: serves page, healthz, and a rescanning /api/board (39.525794ms)
|
||||
✔ startServer: a seatsDir registration overrides the row and index.registered reflects it (7.031069ms)
|
||||
✔ startServer: /api/board returns 500 JSON with an error field when scan throws (3.290601ms)
|
||||
✔ CLI: serve refuses a non-loopback host with exit 2 and a refused: message (70.342411ms)
|
||||
✔ CLI: serve rejects a non-numeric --port with exit 2 (62.465037ms)
|
||||
✔ CLI: scan still works after the async cli refactor (62.705613ms)
|
||||
✔ CLI: live serve prints its URL and answers /healthz (70.544074ms)
|
||||
✔ page.html: esc() escapes every HTML-significant character (0.728332ms)
|
||||
✔ POST /api/seen marks a row; GET /api/board still shows it seen; seen:false clears it (9.412186ms)
|
||||
✔ POST /api/seen without a JSON content-type returns 400 and does not write a mark (2.383613ms)
|
||||
✔ POST /api/seen with invalid JSON returns 400 (3.31709ms)
|
||||
✔ POST /api/seen with a body over 4096 bytes returns 400 (or resets the connection) and writes no mark (2.384349ms)
|
||||
✔ POST /api/seen with a missing agent returns 400 (1.487727ms)
|
||||
✔ POST /api/board returns 405; PUT /api/seen returns 405 (1.886858ms)
|
||||
✔ CLI: scan --print marks a seen row with 's' and the summary line ends with 'N seen)' (59.53651ms)
|
||||
✔ page.html: seenControl() escapes rec.project/agent/lastActivity, and the POST uses a JSON content-type (0.441732ms)
|
||||
✔ page.html: has a collapsed Seen section that lists seen rows with the shared row builder (0.339208ms)
|
||||
✔ page.html: each project has a Hide seen checkbox (default on) beside Hide offline, with a hidden-count note (0.225411ms)
|
||||
✔ page.html: a project header reads "N of N" only while a checkbox hides rows (0.169323ms)
|
||||
✔ page.html: every row shows Task and Active project, derived or the word unknown, with the workspace in the detail (0.390173ms)
|
||||
✔ page.html: task and active project cells show their source via sourceTag(); the detail has a Registered row via registeredText(); SOURCE_LABEL maps registration to registered; every dynamic value in sourceTag/fromSource/registeredText is escaped (0.743974ms)
|
||||
✔ POST /api/reply: runs agent-send.sh with -s from the registration, -S <host>:control-board, -m text plus the fixed trailer, no -L on the default socket, MOSAIC_TMUX_SOCKET stripped; answers delivered with the exit code and both streams (36.497378ms)
|
||||
✔ POST /api/reply: a registration with a tmux socket adds -L <socket> (34.056964ms)
|
||||
✔ POST /api/reply: a non-zero tool exit is a 200 with delivered false, the exit code and the stderr verbatim (32.762631ms)
|
||||
✔ POST /api/reply: refusals before the tool runs: empty or blank or long text 400, unknown row 404, no registration 409, stale registration 409, no tmux session 409, bad JSON 400; the tool is never called (18.671123ms)
|
||||
✔ POST /api/reply: a missing agent-send.sh is a 500 with the path in the error, not a crash (5.812585ms)
|
||||
✔ replyToRow: DEFAULT_AGENT_SEND is the repository's tools/tmux/agent-send.sh and it is executable (1.563312ms)
|
||||
✔ page.html: the reply box appears only where canReply() holds (live registration with a tmux session), the detail has a Reply row, the submit posts JSON to /api/reply, receipts and drafts survive a refresh, and every receipt value is escaped (0.677122ms)
|
||||
✔ startServer: /api/board carries taskSetBy from a live registration and null for the derived rows (3.593228ms)
|
||||
✔ page.html: the task cell and detail show who set a registered task via setByTag()/setByText(), both escaped, only from rec.taskSetBy; the reply gate does not read it (0.399106ms)
|
||||
✔ Host/Origin guard: GET /api/board and POST /api/reply refuse a foreign Host, a wrong port and a cross-origin Origin with 403 JSON, before any scan or send, and never send CORS headers (9.621515ms)
|
||||
✔ Host/Origin guard: loopback names on this port are accepted, with or without a same-origin Origin (40.151026ms)
|
||||
✔ conversation routes (F16): a foreign Host, a wrong port and a cross-origin Origin get 403 before the reader runs, with no CORS headers (6.822974ms)
|
||||
✔ every refusal code the reader can raise has an HTTP status (3.177074ms)
|
||||
✔ conversation routes: catalogue, first page, next page and follow over HTTP; refusals map to 4xx with their code; nothing is written (56.998429ms)
|
||||
ℹ tests 124
|
||||
ℹ suites 0
|
||||
ℹ pass 124
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 777.678976
|
||||
@@ -0,0 +1,13 @@
|
||||
start 2026-10-12T21:27:35Z
|
||||
webui rc=0 ℹ pass 86 ℹ fail 0
|
||||
control-board rc=0 ℹ pass 124 ℹ 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: 4 passed, 0 failed
|
||||
test-task rc=0 selftest: 26 passed, 0 failed
|
||||
end 2026-10-12T21:30:19Z
|
||||
@@ -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 'a3f6e9e66cc1961becb2c4a0ff87fdbdff5f5edc'.
|
||||
|
||||
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 'a3f6e9e66cc1961becb2c4a0ff87fdbdff5f5edc'.
|
||||
|
||||
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: 2381477 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/filbert-scratch/r95w) is not the queue's canonical root (/mnt/storage/src/mosaic-stack)
|
||||
|
||||
queue suite: 27 passed, 0 failed
|
||||
@@ -0,0 +1,7 @@
|
||||
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
|
||||
skip state-machine cases (docker daemon unavailable)
|
||||
|
||||
selftest: 4 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,95 @@
|
||||
✔ 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 (7492.290142ms)
|
||||
✔ 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 (7443.490999ms)
|
||||
✔ browser edge states: loading, empty, malformed, stale, hostile/long values, in-flight reply and appearance fallback (5015.364507ms)
|
||||
Rendered contrast: {"failures":[],"count":330,"lowest":4.504658476260286}
|
||||
✔ served Console browser: real board fixtures, keyboard, drafts, receipts, themes, 320px and failures (7076.42401ms)
|
||||
✔ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes (10731.026078ms)
|
||||
✔ bus routes serve the four reads from the reader view, unescaped JSON for the page to escape (602.765774ms)
|
||||
✔ decisions route serves the roles and recent lists from the reader view (1815.613031ms)
|
||||
✔ credentials route serves the broker credential status from the reader view (826.587477ms)
|
||||
✔ replies route serves the replies to one message from the reader view (1202.275155ms)
|
||||
✔ bus routes are GET-only, have no write verb, and keep the same-origin checks (276.321263ms)
|
||||
✔ bus refusals map to statuses and never carry a path or a stack (89.179741ms)
|
||||
✔ humanCall speaks the human transport protocol without blocking the server (2475.650074ms)
|
||||
✔ busReader takes --business, else the live bus host, else refuses (482.043377ms)
|
||||
✔ humanCall kills a transport that runs past its timeout (534.640365ms)
|
||||
✔ serve refuses a --business value that is not a business id (525.978048ms)
|
||||
✔ conversation view: full history, collapsed tools, hidden thinking, inert hostile content, malformed and reconcile markers (4701.592645ms)
|
||||
✔ conversation view: a fork keeps the open branch, says so, and opens the new one on request (5497.243708ms)
|
||||
✔ conversation view: a newer session with no readable history keeps the marker (2501.036152ms)
|
||||
✔ conversation view: seats without history say so and offer no reply (2209.329635ms)
|
||||
✔ Discord row through real board/WebUI: independent brake/liveness, no Reply, literal content (4833.374502ms)
|
||||
✔ return flow through the conversation view: send, tool call, delayed result, peer message, exact long answers, relaunch (57170.098808ms)
|
||||
✔ preview options are all three or none, and each is checked (16.770379ms)
|
||||
✔ the CLI refuses a partial or invalid preview flag set at start (4458.074961ms)
|
||||
✔ the CLI with all three flags serves the preview mode (623.146434ms)
|
||||
✔ a request for the public name needs the header equal to the user id, else 401 and nothing read (187.420244ms)
|
||||
✔ the header name matches without regard to case, and the value compare is exact (39.834406ms)
|
||||
✔ the public name with the header reads the bus views, and the Host and Origin are checked first (146.238762ms)
|
||||
✔ in preview mode every write answers 403 read-only, from the public name and loopback, and reaches nothing (80.412946ms)
|
||||
✔ loopback requests are unchanged in preview mode, and the bus views work with the board down (19.369922ms)
|
||||
✔ a proxy that rewrites Host to the loopback port gets 403 on its first request, whatever the user (88.442643ms)
|
||||
✔ a repeated Host is 400 before any other check, in preview mode and without it (54.92512ms)
|
||||
✔ without the preview flags the public name is refused and writes still reach the board (48.983846ms)
|
||||
✔ redactor: config, dataRoot, any absolute path, Discord ids and the JSON parser quote (3.60975ms)
|
||||
✔ credential state from the date alone, as the bus states it (0.383673ms)
|
||||
✔ queue: rows, one row, ids and methods, notes; no path or id from a row (3773.425083ms)
|
||||
✔ queue: a refused read fails closed with the store's text, redacted (1904.730011ms)
|
||||
✔ queue: a store that fails to load, or a child that dies, gives a fixed message with no path or stack (4442.987441ms)
|
||||
✔ business: names, vars on the allowlist, authority, credential metadata only (19.589813ms)
|
||||
✔ business: missing or invalid file refuses with the module's text, redacted (39.754666ms)
|
||||
✔ business without --business: the live bus host, else no-bus-host; no system config: not-configured (31.70911ms)
|
||||
✔ settings: release, board, loopback address, notifier binding name only (782.580405ms)
|
||||
✔ task fields: the committed table with no reads configured, GET only; a bad table refuses with no path (42.11733ms)
|
||||
✔ both presentations replace old activity with relaunch notice, label retained history, then resume after new activity (4992.292654ms)
|
||||
✔ reported return flow and relative Age: reply sent from the inspector, then the new answer appears there without manual refresh (23676.580187ms)
|
||||
✔ 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 (10410.664684ms)
|
||||
✔ a sent receipt lists its replies as the page refreshes, oldest first and capped, and marks none delivered or read (13022.330805ms)
|
||||
✔ startServer takes send only as a function and only with the preview mode (10.766006ms)
|
||||
✔ the CLI refuses --send without the preview flags, and without a configured bus (3757.284618ms)
|
||||
✔ the CLI with --send and a configured bus sends through the human transport and logs one line (985.404826ms)
|
||||
✔ without --send the route is read-only like every other write, and config says no send (39.754347ms)
|
||||
✔ with --send every other write is still 403 read-only, and nothing reaches the board or bus (38.596075ms)
|
||||
✔ config says send only on the public name with --send on (15.970811ms)
|
||||
✔ a send without the signed-in user is 401 and is neither sent nor logged, loopback included (27.630231ms)
|
||||
✔ each request check refuses before anything is sent, and logs the refusal without the body (96.413478ms)
|
||||
✔ a send passes exactly to, body and in_reply_to, answers the id, and logs it (99.145416ms)
|
||||
✔ a crafted role name cannot forge a log line (15.768661ms)
|
||||
✔ a bus refusal is not sent, with its status; an outcome the bus could not confirm is unknown and never retried (62.896628ms)
|
||||
✔ through the human transport the request is exactly the business, message.send and the keys (484.518564ms)
|
||||
✔ against a real broker: the message is written once as a human send, and its refusals map (1809.931442ms)
|
||||
✔ loopback host and board origin fail closed (10.61809ms)
|
||||
✔ real board fixture passes through WebUI; assets and isolated seen/reply work (224.574779ms)
|
||||
✔ proxy preserves exact request bytes, status and receipt, rejects forms and malformed JSON, never follows redirect (626.992929ms)
|
||||
✔ unreachable board reports URL; CLI rejects unsupported options (2758.214386ms)
|
||||
✔ render prints the unit without the preview flags (83.686445ms)
|
||||
✔ render carries every serve flag, the preview set included (74.488686ms)
|
||||
✔ a partial preview set is refused (152.719716ms)
|
||||
✔ a value the unit cannot carry is refused, for every flag (2654.670974ms)
|
||||
✔ the rendered unit names none of the human proof agent markers and sets no agent variable (98.265119ms)
|
||||
✔ install into --dir with --no-reload writes the file whole, then reports unchanged (317.914722ms)
|
||||
✔ install without --no-reload runs daemon-reload and nothing that starts the unit (48.220492ms)
|
||||
✔ uninstall refuses while the unit is active, and removes it once it is not (153.708374ms)
|
||||
✔ status prints the unit state and GET /healthz on the installed port (373.010192ms)
|
||||
✔ usage: an unknown verb or flag, and start or enable, exit 4 (99.465198ms)
|
||||
✔ without --send, render is the template with its placeholders filled, byte for byte (92.76238ms)
|
||||
✔ render --send with the preview set ends ExecStart with --send and changes nothing else (102.095197ms)
|
||||
✔ --send without the whole preview set is refused and writes nothing (289.885914ms)
|
||||
✔ install --send into --dir with --no-reload writes the sending unit, and status says whether it sends (920.823584ms)
|
||||
✔ uninstall and status take no --send (33.827526ms)
|
||||
✔ tokens.css and icons.svg are byte copies of docs/design (123.574529ms)
|
||||
✔ JetBrains Mono files match the digests in their sources file, with the OFL text (36.436083ms)
|
||||
✔ shipped strings are unchanged, and the web keeps its write boundary (5.219494ms)
|
||||
✔ shell in a browser: System default, seeded states, 400px, focus and the Ctrl+K palette (8798.348056ms)
|
||||
✔ five states on Board, Inbox, Tasks, Agents and Trail (2979.48091ms)
|
||||
✔ Queue, Business and Settings in their five states, with no move button (5937.510694ms)
|
||||
✔ seeded secrets, Discord ids and paths reach no response and no page; business refusals in the module's words (3122.074852ms)
|
||||
✔ the server log names no config path when the system config refuses (427.400388ms)
|
||||
ℹ tests 86
|
||||
ℹ suites 0
|
||||
ℹ pass 86
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 58444.167433
|
||||
Reference in New Issue
Block a user