Files
stack/agents/filbert/work/s6/out/node-control-board.txt
T
jason.woltjeandClaude Opus 5.5 55bff3b274 docs(s6): row 41 round 4 candidate packet, R5 fix (filbert)
Candidate manifest 08a78972 (42 files). Gate at 0a4c8f13.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 22:30:16 -05:00

133 lines
13 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
✔ explicit request, Seen, ordinary completion and a new request have distinct attention states (3.516208ms)
✔ attention convention ignores reasoning/quoted examples and permits leading blank lines (0.221007ms)
✔ completed smoke replies and ordinary questions are idle, not human blockers (1.021704ms)
✔ only an explicit first-line input request makes a finished reply waiting (0.214674ms)
✔ tool activity, user text, errors and unfinished turns override attention text (0.201649ms)
✔ STOP access failure is unknown, not absence, under a non-root identity (34.432562ms)
✔ connector Task never inherits Discord routing envelopes; ordinary Task still uses user text (2.75456ms)
✔ connector discovery keeps only safe identity; rejects modes, mismatches, links and traversal (1.225648ms)
✔ canonical owner identity and STOP are independent; no tmux fallback or forged registration (4.882625ms)
✔ connector reply refusal precedes forged live tmux registration; ordinary agent still sends (0.494122ms)
✔ server rescans connector discovery and refuses HTTP reply without transport (32.30068ms)
✔ connector session links and linked directories are not read (1.085108ms)
✔ newer live matching launch marks old activity, preserves history/attention/attribution, then clears on new activity (2.307688ms)
✔ CLI print uses the relaunch notice instead of old current preview (59.647081ms)
✔ connector owner and fixed task never inherit a native relaunch notice (1.913401ms)
✔ equality, stale/unknown/offline, mismatched registration and unknown activity do not assert relaunch (1.034946ms)
✔ loadConfig: missing file throws ConfigError (1.421104ms)
✔ loadConfig: invalid JSON throws ConfigError (0.285492ms)
✔ loadConfig: missing dataRoot throws ConfigError (0.21408ms)
✔ loadConfig: relative dataRoot throws ConfigError (0.2884ms)
✔ loadConfig: valid config returns dataRoot (0.759311ms)
✔ findNewestSession: picks the newest by mtime among two files (0.45778ms)
✔ findNewestSession: finds files in nested subdirectories (0.275495ms)
✔ findNewestSession: returns null for a missing dir (0.114267ms)
✔ readSession: extracts fields, collapses/truncates text, counts a truncated final line (0.621165ms)
✔ readSession: model and provider follow the latest model_change entry or assistant turn; null when the log names neither; scanAgent carries them (1.160846ms)
✔ readSession: lastError carries the assistant errorMessage only when the last assistant turn errored (0.445693ms)
✔ findNewestSession/scan: never read sibling auth or secrets next to a sessions dir (1.029261ms)
✔ deriveState: full state table (0.169314ms)
✔ rule: newest entry is an assistant message with a tool call, after a question-looking text, is working (0.299936ms)
✔ rule: newest entry is a tool result with no assistant text after it is working (0.258709ms)
✔ rule: a finished ordinary turn is idle, even if it says your move (0.248311ms)
✔ task: the first user message of the session, from text blocks (0.239443ms)
✔ task: a plain-string user content is accepted, whitespace collapsed and long text capped (0.285634ms)
✔ task: no user message in the log means null (shown as unknown), never a guess (0.262166ms)
✔ workspace: the live tmux pane path wins; the session cwd is the fallback; neither means null (0.355924ms)
✔ activeProject: basename of the nearest .git directory or .git file above the workspace; none means null (0.479249ms)
✔ scan: the written record carries task, workspace and activeProject (0.440493ms)
✔ registration: overrides task, project and workspace; every source says registration; registered carries the launch fields; the grouping column is untouched (0.556582ms)
✔ registration: empty task and null project/workspace leave the derived values in place; registered is still non-null (0.372034ms)
✔ 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 (0.969936ms)
✔ registration: no registration leaves the Gate A fields exactly as before, and registered is null (0.434541ms)
✔ loadRegistrations: a missing seatsDir gives empty lists (0.14972ms)
✔ loadRegistrations: one good record, one malformed JSON, one with an unknown field; a stray file under seatsDir is ignored (0.809575ms)
✔ 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.322588ms)
✔ scan: writes the registration override to disk; index.json carries registered and registrationErrors (0.689167ms)
✔ scan: a relative seatsDir throws ConfigError; an omitted seatsDir behaves as before (0.293359ms)
✔ scanAgent: waitingOnYou is true for waiting/error and false otherwise (0.549315ms)
✔ scanAgent: ageSeconds is computed from the injected now (0.274554ms)
✔ scanAgent: sessionFile null and state idle when sessions dir is empty but alive (0.212229ms)
✔ discoverRepoAgents: finds agents with a sessions dir, skips those without, sorted by name (0.317955ms)
✔ discoverFleetAgents: finds agents with a sessions dir, sorted by name, fleet tmux fields (0.333089ms)
✔ scan: writes per-agent files and index.json, rerun overwrites, no leftover tmp files (0.874775ms)
✔ scan: relative boardDir throws ConfigError (0.101351ms)
✔ CLI: scan with assume-alive liveness exits 0, prints board summary, writes board files (56.416439ms)
✔ CLI: missing config exits 2 with a refused: message (50.322403ms)
✔ CLI: unknown command exits 2 (49.401288ms)
✔ CLI: unknown --liveness value exits 2 (51.189689ms)
✔ panesRunPi: true when any trimmed line equals 'pi' (0.193137ms)
✔ panesRunPi: false for bash-only, claude, empty, or node-pi-style lines (0.072732ms)
✔ tmuxIsAlive: a pane running pi is alive (0.182205ms)
✔ tmuxIsAlive: session exists but pi has exited is not alive (0.071052ms)
✔ tmuxIsAlive: no such tmux session is not alive (0.048439ms)
✔ tmuxIsAlive: tmux could not be run at all is unknown (null), never assumed alive (0.067025ms)
✔ tmuxIsAlive: passes -L <socket> only when a socket is given (0.091318ms)
✔ parsePanes: one pane per line, command and optional tab-separated path (0.074592ms)
✔ tmuxInspect: reports the path of the pane running pi, not of a shell pane (0.066011ms)
✔ tmuxInspect: no pi pane, no session, or no tmux gives no workspace and the matching liveness (0.091921ms)
✔ loadSeen: missing file returns {} (0.141722ms)
✔ loadSeen: invalid JSON throws ConfigError (0.177117ms)
✔ loadSeen: a JSON array throws ConfigError (0.149854ms)
✔ loadSeen: a non-string value throws ConfigError (0.161851ms)
✔ markSeen: seen true adds the key and writes seen.json mode 0600, no leftover tmp files (0.323351ms)
✔ markSeen: seen false deletes the key (0.271685ms)
✔ markSeen: missing, empty, or non-string fields throw ConfigError (0.226171ms)
✔ markSeen: project containing '/' throws ConfigError (0.125133ms)
✔ markSeen: non-boolean seen throws ConfigError (0.113424ms)
✔ scanAgent: a seen mark matching the waiting session's lastTimestamp clears waitingOnYou (0.298807ms)
✔ scanAgent: a stale mark (agent wrote something newer) is not seen and waitingOnYou is true (0.219178ms)
✔ scanAgent: a working session with a matching mark is not seen (marks only apply to waiting/error) (0.216414ms)
✔ scanAgent: an error-state session with a matching mark is seen (0.23189ms)
✔ scan: index.seen and waitingOnYou reflect seen.json, which scan never rewrites or deletes (0.491272ms)
✔ scan: a corrupt seen.json makes scan throw ConfigError (fail closed) (0.188284ms)
✔ 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.597317ms)
✔ 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.567468ms)
✔ 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 (0.907092ms)
✔ isLoopbackHost: recognizes loopback hosts (1.301749ms)
✔ isLoopbackHost: rejects non-loopback hosts (4.395006ms)
✔ startServer: refuses a non-loopback host with ConfigError, never opens a socket (3.037957ms)
✔ startServer: serves page, healthz, and a rescanning /api/board (32.7969ms)
✔ startServer: a seatsDir registration overrides the row and index.registered reflects it (5.757893ms)
✔ startServer: /api/board returns 500 JSON with an error field when scan throws (2.289878ms)
✔ CLI: serve refuses a non-loopback host with exit 2 and a refused: message (48.755191ms)
✔ CLI: serve rejects a non-numeric --port with exit 2 (48.672064ms)
✔ CLI: scan still works after the async cli refactor (53.128023ms)
✔ CLI: live serve prints its URL and answers /healthz (58.19203ms)
✔ page.html: esc() escapes every HTML-significant character (0.583626ms)
✔ POST /api/seen marks a row; GET /api/board still shows it seen; seen:false clears it (7.824105ms)
✔ POST /api/seen without a JSON content-type returns 400 and does not write a mark (1.849175ms)
✔ POST /api/seen with invalid JSON returns 400 (2.650642ms)
✔ POST /api/seen with a body over 4096 bytes returns 400 (or resets the connection) and writes no mark (1.955345ms)
✔ POST /api/seen with a missing agent returns 400 (1.288633ms)
✔ POST /api/board returns 405; PUT /api/seen returns 405 (1.62688ms)
✔ CLI: scan --print marks a seen row with 's' and the summary line ends with 'N seen)' (53.682982ms)
✔ page.html: seenControl() escapes rec.project/agent/lastActivity, and the POST uses a JSON content-type (0.306082ms)
✔ page.html: has a collapsed Seen section that lists seen rows with the shared row builder (0.272848ms)
✔ page.html: each project has a Hide seen checkbox (default on) beside Hide offline, with a hidden-count note (0.163563ms)
✔ page.html: a project header reads "N of N" only while a checkbox hides rows (0.128431ms)
✔ page.html: every row shows Task and Active project, derived or the word unknown, with the workspace in the detail (0.267941ms)
✔ 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.543486ms)
✔ 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 (26.420253ms)
✔ POST /api/reply: a registration with a tmux socket adds -L <socket> (27.128876ms)
✔ POST /api/reply: a non-zero tool exit is a 200 with delivered false, the exit code and the stderr verbatim (24.803785ms)
✔ 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 (14.134004ms)
✔ POST /api/reply: a missing agent-send.sh is a 500 with the path in the error, not a crash (4.289581ms)
✔ replyToRow: DEFAULT_AGENT_SEND is the repository's tools/tmux/agent-send.sh and it is executable (0.16247ms)
✔ 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.568982ms)
✔ startServer: /api/board carries taskSetBy from a live registration and null for the derived rows (2.348384ms)
✔ 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.300945ms)
✔ 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 (7.60865ms)
✔ Host/Origin guard: loopback names on this port are accepted, with or without a same-origin Origin (36.209428ms)
✔ conversation routes (F16): a foreign Host, a wrong port and a cross-origin Origin get 403 before the reader runs, with no CORS headers (5.451935ms)
✔ every refusal code the reader can raise has an HTTP status (0.909668ms)
✔ conversation routes: catalogue, first page, next page and follow over HTTP; refusals map to 4xx with their code; nothing is written (48.522532ms)
ℹ tests 124
ℹ suites 0
ℹ pass 124
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 622.509231