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)
FAIL mock adapter: gate passes on matching mock response (exit 1, expected 0)
OK    mock adapter: expect-mismatch recorded (exit 1)
FAIL mismatch reason recorded
OK    unknown adapter fails closed (exit 1)
FAIL mission task runs via mock adapter (exit 1, expected 0)
grep: /home/jwoltje/darkwing-scratch/r48a/tmp/tmp.HNVro0rxF9/data/system-prompt.md: No such file or directory
FAIL mission section injected into generated prompt
FAIL retry of mission run succeeds (exit 1, expected 0)
OK    retriedFrom lineage recorded
grep: /home/jwoltje/darkwing-scratch/r48a/tmp/tmp.HNVro0rxF9/data/system-prompt.md: No such file or directory
FAIL mission section present after retry (relative path resolved)
OK    retry of missing run exits 4 (exit 4)
OK    skill install bundled ms-tools (exit 0)
OK    installed to skills-available
OK    double install refuses (exit 1)
OK    activate enables skill (exit 0)
OK    enabled dir populated
OK    uninstall while enabled refuses (exit 1)
OK    deactivate moves back to available (exit 0)
OK    uninstall removes from available (exit 0)
FAIL seat with enabled skill launches (exit 1)
SEATCASE stderr:
failed to connect to the docker API at unix:///nonexistent.sock; check if the path is correct and if the daemon is running: dial unix /nonexistent.sock: connect: no such file or directory
FAIL skill path delivered to adapter
OK    shipped researcher contract resolves (ceiling + network)
OK    resolve-role refuses a non-role document (conductor policy) (exit 2)
OK    resolve-role refuses name/filename mismatch (exit 2)
OK    resolve-role refuses unknown network declaration (exit 2)
OK    resolve-role refuses duplicate role tool (exit 2)
OK    resolve-role refuses unsupported tool (exit 2)
OK    resolve-role refuses missing contract file (exit 4)
OK    version 1 role prints no contract line
OK    shipped version 2 roles resolve with their contracts (pm, cto, coder, reviewer)
OK    resolve-role accepts a minimal version 2 role (exit 0)
OK    resolve-role refuses an action outside the vocabulary (exit 2)
OK    resolve-role refuses a gated-only action in a role file (exit 2)
OK    resolve-role refuses a Vikunja verb no role may hold (exit 2)
OK    resolve-role refuses a version 2 role whose contract is missing (exit 2)
OK    resolve-role refuses a contract that is a symbolic link (exit 2)
FAIL seat launches under role ceiling (exit 1)
ROLESEAT stderr:
agent: capability policy: role 'analyst' ceiling narrowed tools -> read,bash
failed to connect to the docker API at unix:///nonexistent.sock; check if the path is correct and if the daemon is running: dial unix /nonexistent.sock: connect: no such file or directory
FAIL role ceiling narrows seat tools (read,write,bash -> read,bash)
OK    narrowing recorded loudly
OK    missing role contract refuses launch (exit 2)
OK    missing-contract refusal names the role
FAIL empty ceiling intersection -> tool-free seat
OK    tool-free outcome recorded loudly
OK    overridden agents dir without seat definition refuses (exit 4)
OK    seat-resolution refusal names the seat
FAIL policy: mission only -> mission tools
FAIL policy: task only -> task tools
FAIL policy: both -> intersection (task narrowed)
FAIL policy: empty intersection -> tool-free
OK    invalid mission capabilities rejected (exit 2)
mosaic-task: unsupported mission tool: "sudo" (supported: read, write, edit, bash, grep, find, ls)
FAIL task run with user layer present (exit 1, expected 0)
grep: /home/jwoltje/darkwing-scratch/r48a/tmp/tmp.HNVro0rxF9/data/system-prompt.md: No such file or directory
FAIL user context dispatched into generated prompt
FAIL workspace+tools task runs via mock (exit 1, expected 0)
FAIL workspace path + tools delivered to adapter
OK    persistent workspace created on host
FAIL plain task still runs (no workspace/tools) (exit 1, expected 0)
FAIL workspace var present but empty when absent
FAIL tools empty when absent
OK    unknown tool exits 2 (exit 2)
OK    workspace traversal exits 2 (exit 2)
FAIL live hello task succeeds with exact marker
--- latest run evidence: /home/jwoltje/darkwing-scratch/r48a/tmp/tmp.HNVro0rxF9/data/runs/r-20261010T084717Z-c421be ---
--- stderr.txt (tail) ---
OK    result.json written in run dir
FAIL result.json contents are correct
FAIL wrong expectExact (exit 1, reason: 'exit-nonzero')
--- latest run evidence: /home/jwoltje/darkwing-scratch/r48a/tmp/tmp.HNVro0rxF9/data/runs/r-20261010T084718Z-fccf9d ---
--- stderr.txt (tail) ---
OK    each run gets a distinct run dir (no clobber)
OK    list shows both runs
FAIL fork base: teach succeeds (exit 1, expected 0)
FAIL fork child recalls ancestor context (exit 4, expected 0)
node:fs:621
    return binding.readFileUtf8(path, stringToFlags(options.flag));
                   ^

Error: ENOENT: no such file or directory, open '/home/jwoltje/darkwing-scratch/r48a/tmp/tmp.HNVro0rxF9/data/runs/r-20261010T084718Z-5a44e7/result.json'
    at Object.readFileSync (node:fs:621:20)
    at [eval]:1:34
    at runScriptInThisContext (node:internal/vm:219:10)
    at node:internal/process/execution:485:12
    at [eval]-wrapper:6:24
    at runScriptInContext (node:internal/process/execution:483:60)
    at evalFunction (node:internal/process/execution:317:30)
    at evalTypeScript (node:internal/process/execution:329:3)
    at node:internal/main/eval_string:71:3 {
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: '/home/jwoltje/darkwing-scratch/r48a/tmp/tmp.HNVro0rxF9/data/runs/r-20261010T084718Z-5a44e7/result.json'
}

Node.js v26.8.1
FAIL forked child recalled ancestor code word
OK    ancestor session untouched by fork
FAIL child session dir has its own branch file
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
FAIL user recall run succeeds (exit 1)
FAIL recalled user name (response: )
OK    no agent identity on headless run

selftest: 67 passed, 31 failed
