docs(row253): record green run5 whole gate and forty kills

This commit is contained in:
jason.woltje committed 2026-10-22 12:18:29 -05:00
1 parent dd9d519b11
commit 3b91cfdaf1
335 files changed
+33004 -41

No files matched your search

+5
View File
@@ -316,3 +316,8 @@ M38 drops setsid but a blocking signals query can still fail closed with inner-t
### Run5 busy guard refusal, sage-2786
Fresh on48e450ce8/591020a1. Both intendedREDs observed; touched whole43/0/0 and34/0/0; all6base PID/SID equalities passed. Controls13/0, M1-M31 killed; no survivor, timeout or unexpected red. External SSH docker-compose process tripped busy guard before M32 base; no bypass/retry. M32-M40 and full whole stages NOTRUN; M38 assertion kill remains unproven. Wall425.340s,0skips,N9passed. Byte restoration verified; sweep0run-created leftovers. Reported unplaced for classification/resume direct to Duckworth/Mos, cc Sage in gander-0121 and returned slot. run5-gate/ preserves exact raw records.
### Run5 GREEN, sage-2786 plus sage-2811 same-run resume
Candidate48e450ce8,source14e460061,manifest591020a1,baseaca16404c. CLI whole55files861/0/0;WebUI whole58files345/0/1;bus rebase union20files240/0/0;ten shells425/0 self-assertions. Separate touched whole77/0/0, intendedREDs2/2;20fresh controls passed. M1-M40 killed40 with exact restoration,0timeouts. M38 dies by required new PID/SID equality ERR_ASSERTION at203:10; all6base cases pass. No other round carries; foreign SSH busy refusal classified in sage-2811, freshM32base on resume. Stages wall sums1253.715/267.028/46.282/140.514s;active windows425.340+2106.873s. N9passed verbatim inRESULTS. Named skips: pinned-esbuild rebuild, noncanonical queue verify/render, two live-provider cases; exact lines in run5-gate/RESULTS.md. Manifest and shell hashes verify; sweep0run-created leftovers. Raw commands,logs,full counts and kill table retained. No product/test change during gate.
+114
View File
@@ -0,0 +1,114 @@
#!/usr/bin/env python3
"""Run explicit row253 changes only under Sage's grant. --static runs no tests."""
import argparse
import hashlib
import json
import os
from pathlib import Path
import signal
import subprocess
import time
HERE = Path(__file__).resolve().parent
REPO = HERE.parents[3]
def digest(data):
return hashlib.sha256(data).hexdigest()
def busy():
p = subprocess.run(['bash', '/mnt/storage/scratch/sage-busy-now.sh'], text=True, capture_output=True)
if p.returncode or p.stdout.splitlines()[-1:] != ['CLEAR']:
raise RuntimeError('busy refusal: ' + p.stdout + p.stderr)
def run(command, path, seconds=60):
if command[:2] == ['node', '--test']:
limits = json.loads((HERE/'WHOLE-GATE-LIMITS.json').read_text())['files']
limit = limits.get(command[-1], 900)
command = ['timeout','-k','10',str(limit),*command]
seconds = limit + 30
busy()
started = time.monotonic()
command_file = path.with_suffix('.command.json')
command_file.write_text(json.dumps(command))
# Keep command text out of wrapper argv: the busy guard scans every argv.
# launch.py execs the structured command. bash owns a pipefail/tee pipeline.
p = subprocess.Popen(['bash','-o','pipefail','-c',
'python3 "$1" "$2" 2>&1 | tee "$3"', '--',str(HERE/'launch.py'),str(command_file),str(path)],
cwd=REPO,start_new_session=True)
expired = False
try:
code = p.wait(timeout=seconds)
expired = code in (124, 137)
except subprocess.TimeoutExpired:
expired = True
os.killpg(p.pid, signal.SIGKILL)
code = p.wait()
finally:
try:
os.killpg(p.pid, signal.SIGKILL)
except ProcessLookupError:
pass
return dict(code=code, timeout=expired, seconds=round(time.monotonic()-started, 3), log=str(path))
def main():
ap = argparse.ArgumentParser()
ap.add_argument('--static', action='store_true')
ap.add_argument('--grant')
ap.add_argument('--out', type=Path)
args = ap.parse_args()
definitions = json.loads((HERE/'changes.json').read_text())
checked = []
for d in definitions:
original = (REPO/d['file']).read_bytes()
count = original.count(d['old'].encode())
if count != 1:
raise RuntimeError(f"{d['id']}: target occurs {count} times")
changed = original.replace(d['old'].encode(), d['new'].encode(), 1)
checked.append(dict(id=d['id'], file=d['file'], occurrences=count,
before=digest(original), after=digest(changed)))
if args.static:
print(json.dumps(checked, indent=2))
return
if not args.grant or not args.out:
ap.error('execution needs --grant and --out')
if not os.environ.get('TMPDIR', '').startswith('/mnt/storage/scratch/tmp/g'):
raise RuntimeError('TMPDIR must be the granted scratch directory')
status = subprocess.check_output(['git','status','--porcelain','--untracked-files=no'],cwd=REPO)
args.out.mkdir(parents=True, exist_ok=True)
results = dict(grant=args.grant, static=checked, bases={}, changes=[])
failures = 0
for d in [x for x in definitions if int(x['id'][1:]) >= 32]:
key = d['killer']+'|'+d['pattern']
command = ['node','--test','--test-reporter=tap','--test-name-pattern',d['pattern'],d['killer']]
if key not in results['bases']:
base = run(command, args.out/(d['id']+'-base.log'))
results['bases'][key] = base
(args.out/'results.json').write_text(json.dumps(results,indent=2)+'\n')
if base['code'] != 0 or base['seconds'] > 30:
raise RuntimeError('base failed or exceeded 30 seconds: '+d['id'])
target = REPO/d['file']
original = target.read_bytes()
try:
target.write_bytes(original.replace(d['old'].encode(),d['new'].encode(),1))
pre = subprocess.run(['bash','-n',str(target)],capture_output=True)
if pre.returncode:
raise RuntimeError('invalid syntax: '+d['id'])
result = run(command,args.out/(d['id']+'.log'))
result.update(id=d['id'], base_seconds=results['bases'][key]['seconds'],
outcome='timeout' if result['timeout'] else 'killed' if result['code'] != 0 else 'survived')
results['changes'].append(result)
if result['timeout']:
raise RuntimeError('timeout requires Sage/Mos classification: '+d['id'])
if result['outcome'] != 'killed':
failures += 1
finally:
target.write_bytes(original)
assert target.read_bytes() == original
assert subprocess.check_output(['git','status','--porcelain','--untracked-files=no'],cwd=REPO) == status
(args.out/'results.json').write_text(json.dumps(results,indent=2)+'\n')
if failures >= 1:
raise RuntimeError('first unexpected failure: end the sage-2297 window')
print(json.dumps(results,indent=2))
if __name__ == '__main__':
main()
Whitespace-only changes.
@@ -0,0 +1,46 @@
# M1-M40 kill table
Every base passes; each change restored exact bytes and tracked status before the next. No timeout counts as kill.
| Check | Named killer | Base seconds | Changed seconds | Outcome |
|---|---|---:|---:|---|
| M1 | row253 factory refuses retired TCP | 0.265 | 0.215 | killed |
| M2 | library refuses a privileged-floor miss | 0.515 | 0.465 | killed |
| M3 | factory refuses duplicate socket | 0.465 | 0.616 | killed |
| M4 | row253 installer refuses unsafe location and query facts | 4.073 | 5.778 | killed |
| M5 | row253 installer refuses unsafe location and query facts | 4.073 | 3.923 | killed |
| M6 | row253 installer refuses unsafe location and query facts | 4.073 | 0.565 | killed |
| M7 | row253 protected homes | 0.214 | 0.265 | killed |
| M8 | row253 installer refuses unsafe location and query facts | 4.073 | 3.172 | killed |
| M9 | row253 installer refuses unsafe location and query facts | 4.073 | 2.87 | killed |
| M10 | row253 installer refuses unsafe location and query facts | 4.073 | 4.023 | killed |
| M11 | row253 installer refuses unsafe location and query facts | 4.073 | 3.973 | killed |
| M12 | a bad args file refuses | 0.365 | 0.264 | killed |
| M13 | a bad args file refuses | 0.365 | 1.116 | killed |
| M14 | a bad args file refuses | 0.365 | 1.217 | killed |
| M15 | row253 acceptance rejects bad config | 2.069 | 2.369 | killed |
| M16 | row253 P8 refuses | 2.069 | 1.016 | killed |
| M17 | row253 P10 refuses unsafe metadata | 13.144 | 1.016 | killed |
| M18 | row253 P10 refuses unsafe metadata | 13.144 | 2.47 | killed |
| M19 | row253 P10 refuses unsafe metadata | 13.144 | 6.328 | killed |
| M20 | row253 P10 refuses unsafe metadata | 13.144 | 4.624 | killed |
| M21 | row253 P10 refuses unsafe metadata | 13.144 | 8.683 | killed |
| M22 | row253 P10 refuses unsafe metadata | 13.144 | 8.283 | killed |
| M23 | row253 P10 refuses unsafe metadata | 13.144 | 11.038 | killed |
| M24 | row253 factory socket uses actual config | 0.615 | 0.315 | killed |
| M25 | row253 socket observation uses configured root | 1.116 | 1.017 | killed |
| M26 | row253 P10 refuses unsafe metadata | 13.144 | 13.244 | killed |
| M27 | row253 socket observation uses configured root | 1.116 | 1.117 | killed |
| M28 | row253 installer refuses unsafe location and query facts | 4.073 | 3.171 | killed |
| M29 | row253 installer refuses unsafe location and query facts | 4.073 | 2.269 | killed |
| M30 | row253 installer refuses unsafe location and query facts | 4.073 | 0.866 | killed |
| M31 | row253 config parser is strict | 0.214 | 0.265 | killed |
| M32 | row253 C4 overflow is output-limit | 0.866 | 0.565 | killed |
| M33 | row253 query reaps its group | 0.365 | 0.866 | killed |
| M34 | row253 C4 signals query | 11.189 | 7.28 | killed |
| M35 | row253 C4 stalled supervisor | 14.395 | 9.735 | killed |
| M36 | row253 C4 member query | 11.088 | 7.28 | killed |
| M37 | row253 C4 overflow is output-limit | 0.866 | 0.515 | killed |
| M38 | row253 C4 signals query | 11.189 | 5.275 | killed |
| M39 | row253 C4 inline supervisor is byte-identical | 0.215 | 0.214 | killed |
| M40 | row253 C4 cleanup budget starts after inventory pass one | 0.265 | 0.214 | killed |
@@ -0,0 +1 @@
sage-2824,16:53:55Z: Sage self-reports one canonical scripts/mosaic queue --help at16:53:3xZ, under1s, no tests or queue write, gone. Classified benign by Sage; continue grants2786/2811. No guard refusal from this call observed by this seat.
+161 -40
View File
@@ -1,47 +1,168 @@
# Run5 busy refusal before M32
# Row253 whole gate RESULTS
HEAD48e450ce8, manifest591020a1, sage-2786. Nothing carried.
HEAD 48e450ce8fbb10df0beabc8da67ab90ea14587ea, product 14e46006171ef700a72f971fda5cb3a0b8dcc4f2, manifest 591020a1096a1606c11f2ee34b37243acddf83d91c69922ccc5cfe22d6180d3a.
Both intendedREDs observed. Installer whole43/0/0 in70.670s; acceptance whole34/0/0 in126.752s. All six kind/mode PID/SID equalities passed on base. Controls13/0; M1-M31 killed, M32-M40 and all full package/union/shell stages NOTRUN. No timeout, unexpected red or survivor. Gate wall425.340s.
48e450ce8..actual record HEAD name-only outside agents/gander/:
Busy guard matched PID1196971, an external-project SSH command running docker compose exec under /opt/setspark-ops. It refused before M32 base. No bypass or retry. Raw controller.log preserved. Reported direct to Duckworth and Mos, cc Sage in gander-0121; slot returned. Classification/resume pending.
```text
```
Source restored and all7manifest entries verified; tracked status clean. Sweep0 run-created leftovers;9 known pre-existing infrastructure processes excluded.
All listed whole files ran, with no unlisted-file coverage claim. Intended REDs and focused repeats are separate from package totals. Bus coverage is the20-file rebase union, not a bus-whole claim.
N9 passed, no skip:
| Whole file | Pass/fail/skip | Wall seconds | Limit seconds |
|---|---:|---:|---:|
| packages/cli/tests/access.test.mjs | 22/0/0 | 6.178 | 900 |
| packages/cli/tests/app.test.mjs | 30/0/0 | 15.149 | 900 |
| packages/cli/tests/boot-status.test.mjs | 3/0/0 | 1.668 | 900 |
| packages/cli/tests/case1-accept.test.mjs | 34/0/0 | 123.341 | 418 |
| packages/cli/tests/case1-hostcheck.test.mjs | 16/0/0 | 2.721 | 900 |
| packages/cli/tests/case2-persona-import.test.mjs | 14/0/0 | 3.221 | 900 |
| packages/cli/tests/case2-unit.test.mjs | 43/0/0 | 71.568 | 320 |
| packages/cli/tests/channel-cli.test.mjs | 2/0/0 | 0.214 | 900 |
| packages/cli/tests/channel-recovery.test.mjs | 1/0/0 | 2.569 | 900 |
| packages/cli/tests/cli.test.mjs | 12/0/0 | 0.415 | 900 |
| packages/cli/tests/config.test.mjs | 6/0/0 | 0.465 | 900 |
| packages/cli/tests/credentials.test.mjs | 5/0/0 | 0.315 | 900 |
| packages/cli/tests/follow.test.mjs | 6/0/0 | 0.716 | 900 |
| packages/cli/tests/format.test.mjs | 4/0/0 | 0.114 | 900 |
| packages/cli/tests/gate-lane-auth.test.mjs | 5/0/0 | 19.407 | 900 |
| packages/cli/tests/gate-lane-fixtures.test.mjs | 8/0/0 | 0.465 | 900 |
| packages/cli/tests/gate-lane-image.test.mjs | 13/0/0 | 0.415 | 900 |
| packages/cli/tests/gate-lane-state.test.mjs | 14/0/0 | 2.17 | 900 |
| packages/cli/tests/gate-lane.test.mjs | 13/0/0 | 0.665 | 900 |
| packages/cli/tests/git-socket.test.mjs | 24/0/0 | 18.905 | 900 |
| packages/cli/tests/grants.test.mjs | 6/0/0 | 0.365 | 900 |
| packages/cli/tests/host.test.mjs | 43/0/0 | 13.795 | 900 |
| packages/cli/tests/hosts.test.mjs | 8/0/0 | 0.315 | 900 |
| packages/cli/tests/instances.test.mjs | 14/0/0 | 3.07 | 900 |
| packages/cli/tests/launch-account.test.mjs | 7/0/0 | 0.365 | 900 |
| packages/cli/tests/launch-limit-checks.test.mjs | 5/0/0 | 0.315 | 900 |
| packages/cli/tests/launch-limits.test.mjs | 1/0/0 | 0.265 | 900 |
| packages/cli/tests/launch-routes.test.mjs | 9/0/0 | 0.415 | 900 |
| packages/cli/tests/launcher.test.mjs | 34/0/0 | 30.18 | 900 |
| packages/cli/tests/lifecycle.test.mjs | 24/0/0 | 15.148 | 160 |
| packages/cli/tests/limits-tokens.test.mjs | 5/0/0 | 0.215 | 900 |
| packages/cli/tests/limits.test.mjs | 5/0/0 | 0.415 | 900 |
| packages/cli/tests/mark-read.test.mjs | 6/0/0 | 0.966 | 900 |
| packages/cli/tests/names.test.mjs | 2/0/0 | 0.265 | 900 |
| packages/cli/tests/notifier.test.mjs | 27/0/0 | 0.766 | 900 |
| packages/cli/tests/other-tree.test.mjs | 4/0/0 | 0.265 | 900 |
| packages/cli/tests/processing-cli.test.mjs | 4/0/0 | 0.265 | 900 |
| packages/cli/tests/project-name-repo.test.mjs | 2/0/0 | 0.315 | 900 |
| packages/cli/tests/project.test.mjs | 4/0/0 | 0.565 | 900 |
| packages/cli/tests/publish-socket.test.mjs | 9/0/0 | 7.23 | 900 |
| packages/cli/tests/stack-copy.test.mjs | 17/0/0 | 17.403 | 900 |
| packages/cli/tests/stack-instances.test.mjs | 24/0/0 | 4.073 | 900 |
| packages/cli/tests/stack-release-external.test.mjs | 25/0/0 | 99.183 | 900 |
| packages/cli/tests/stack-release.test.mjs | 218/0/0 | 683.647 | 1871 |
| packages/cli/tests/stack-upgrade.test.mjs | 21/0/0 | 70.916 | 900 |
| packages/cli/tests/tester-http.test.mjs | 2/0/0 | 0.164 | 900 |
| packages/cli/tests/tester-reads.test.mjs | 6/0/0 | 2.469 | 900 |
| packages/cli/tests/tester-threads.test.mjs | 5/0/0 | 2.971 | 900 |
| packages/cli/tests/tester.test.mjs | 11/0/0 | 0.365 | 900 |
| packages/cli/tests/thread-cli.test.mjs | 11/0/0 | 1.868 | 126 |
| packages/cli/tests/thread-launch.test.mjs | 11/0/0 | 17.303 | 170 |
| packages/cli/tests/trackers-boot.test.mjs | 2/0/0 | 0.916 | 900 |
| packages/cli/tests/transport.test.mjs | 3/0/0 | 2.369 | 900 |
| packages/cli/tests/usage.test.mjs | 2/0/0 | 0.365 | 900 |
| packages/cli/tests/verbs.test.mjs | 9/0/0 | 3.522 | 900 |
| packages/webui/tests/agents-browser.test.mjs | 2/0/0 | 14.396 | 900 |
| packages/webui/tests/agents.test.mjs | 8/0/0 | 0.315 | 900 |
| packages/webui/tests/assistant.test.mjs | 6/0/0 | 0.214 | 900 |
| packages/webui/tests/board-held.test.mjs | 3/0/0 | 9.54 | 900 |
| packages/webui/tests/browser-edge.test.mjs | 1/0/0 | 1.669 | 900 |
| packages/webui/tests/browser.test.mjs | 1/0/0 | 1.818 | 900 |
| packages/webui/tests/bus-browser.test.mjs | 2/0/0 | 3.572 | 900 |
| packages/webui/tests/bus.test.mjs | 10/0/0 | 3.171 | 900 |
| packages/webui/tests/channel-chat.test.mjs | 3/0/0 | 0.265 | 900 |
| packages/webui/tests/chat-browser.test.mjs | 11/0/0 | 18.958 | 900 |
| packages/webui/tests/chat.test.mjs | 23/0/0 | 0.615 | 122 |
| packages/webui/tests/conversation.test.mjs | 4/0/0 | 4.626 | 900 |
| packages/webui/tests/discord.test.mjs | 1/0/0 | 0.966 | 900 |
| packages/webui/tests/docs-browser.test.mjs | 1/0/0 | 1.97 | 900 |
| packages/webui/tests/editor-browser.test.mjs | 16/0/0 | 14.747 | 900 |
| packages/webui/tests/editor-provenance.test.mjs | 5/0/1 | 0.315 | 900 |
| packages/webui/tests/editor.test.mjs | 5/0/0 | 1.969 | 900 |
| packages/webui/tests/history-return-flow.test.mjs | 1/0/0 | 52.48 | 900 |
| packages/webui/tests/instances-browser.test.mjs | 1/0/0 | 1.518 | 900 |
| packages/webui/tests/instances.test.mjs | 5/0/0 | 0.515 | 900 |
| packages/webui/tests/library-cli.test.mjs | 1/0/0 | 0.365 | 900 |
| packages/webui/tests/library-status.test.mjs | 1/0/0 | 0.114 | 900 |
| packages/webui/tests/limits-browser.test.mjs | 2/0/0 | 2.169 | 900 |
| packages/webui/tests/limits-route.test.mjs | 4/0/0 | 0.265 | 900 |
| packages/webui/tests/markdown-preview.test.mjs | 19/0/0 | 8.734 | 900 |
| packages/webui/tests/messages.test.mjs | 3/0/0 | 3.071 | 900 |
| packages/webui/tests/pinned-copy.test.mjs | 10/0/0 | 7.48 | 900 |
| packages/webui/tests/preview.test.mjs | 11/0/0 | 1.167 | 900 |
| packages/webui/tests/processing-browser.test.mjs | 9/0/0 | 7.331 | 900 |
| packages/webui/tests/processing-ui.test.mjs | 5/0/0 | 0.164 | 900 |
| packages/webui/tests/processing.test.mjs | 6/0/0 | 0.215 | 900 |
| packages/webui/tests/project-file.test.mjs | 10/0/0 | 0.265 | 900 |
| packages/webui/tests/project-name-repo.test.mjs | 1/0/0 | 0.164 | 900 |
| packages/webui/tests/proof-cli.test.mjs | 3/0/0 | 2.219 | 900 |
| packages/webui/tests/proof.test.mjs | 4/0/0 | 0.315 | 900 |
| packages/webui/tests/reads.test.mjs | 11/0/0 | 1.818 | 900 |
| packages/webui/tests/relaunch.test.mjs | 1/0/0 | 1.117 | 900 |
| packages/webui/tests/return-flow.test.mjs | 1/0/0 | 21.111 | 900 |
| packages/webui/tests/routes-browser.test.mjs | 1/0/0 | 1.568 | 900 |
| packages/webui/tests/routes.test.mjs | 5/0/0 | 0.415 | 900 |
| packages/webui/tests/send-browser.test.mjs | 2/0/0 | 13.895 | 900 |
| packages/webui/tests/send.test.mjs | 13/0/0 | 1.018 | 900 |
| packages/webui/tests/serve.test.mjs | 4/0/0 | 0.866 | 900 |
| packages/webui/tests/service.test.mjs | 32/0/0 | 13.593 | 900 |
| packages/webui/tests/settings-form.test.mjs | 5/0/0 | 5.327 | 900 |
| packages/webui/tests/settings-write.test.mjs | 4/0/0 | 0.265 | 900 |
| packages/webui/tests/shell.test.mjs | 5/0/0 | 8.735 | 900 |
| packages/webui/tests/sso-browser.test.mjs | 2/0/0 | 7.129 | 900 |
| packages/webui/tests/sso.test.mjs | 28/0/0 | 3.522 | 900 |
| packages/webui/tests/tester-browser.test.mjs | 2/0/0 | 2.119 | 900 |
| packages/webui/tests/tester-cli.test.mjs | 2/0/0 | 4.074 | 900 |
| packages/webui/tests/tester-listener.test.mjs | 10/0/0 | 0.916 | 900 |
| packages/webui/tests/tester-socket.test.mjs | 3/0/0 | 0.215 | 900 |
| packages/webui/tests/thread-claims-browser.test.mjs | 6/0/0 | 4.875 | 900 |
| packages/webui/tests/thread-claims.test.mjs | 4/0/0 | 0.417 | 900 |
| packages/webui/tests/usage-browser.test.mjs | 1/0/0 | 0.966 | 900 |
| packages/webui/tests/usage.test.mjs | 2/0/0 | 0.265 | 900 |
| packages/webui/tests/views.test.mjs | 3/0/0 | 5.125 | 900 |
| packages/bus/tests/account-migration.test.mjs | 3/0/0 | 0.415 | 122 |
| packages/bus/tests/chief-of-staff.test.mjs | 42/0/0 | 2.419 | 127 |
| packages/bus/tests/comment-migration.test.mjs | 5/0/0 | 0.666 | 122 |
| packages/bus/tests/end-launch.test.mjs | 7/0/0 | 0.515 | 122 |
| packages/bus/tests/fire-revokes-grants.test.mjs | 22/0/0 | 3.722 | 130 |
| packages/bus/tests/gitea-grant.test.mjs | 49/0/0 | 9.534 | 146 |
| packages/bus/tests/gitea-migration.test.mjs | 5/0/0 | 0.465 | 122 |
| packages/bus/tests/grant-executor.test.mjs | 42/0/0 | 22.312 | 185 |
| packages/bus/tests/grant-migration.test.mjs | 6/0/0 | 0.565 | 122 |
| packages/bus/tests/lifecycle-revoke.test.mjs | 8/0/0 | 0.766 | 122 |
| packages/bus/tests/message-filter.test.mjs | 6/0/0 | 0.565 | 122 |
| packages/bus/tests/name-migration.test.mjs | 1/0/0 | 0.265 | 121 |
| packages/bus/tests/schema.test.mjs | 1/0/0 | 0.214 | 121 |
| packages/bus/tests/sessions.test.mjs | 7/0/0 | 0.665 | 122 |
| packages/bus/tests/spec-migration.test.mjs | 1/0/0 | 0.215 | 121 |
| packages/bus/tests/tester-writes.test.mjs | 8/0/0 | 0.515 | 122 |
| packages/bus/tests/thread-claims.test.mjs | 6/0/0 | 0.315 | 121 |
| packages/bus/tests/thread-migration.test.mjs | 3/0/0 | 0.415 | 122 |
| packages/bus/tests/threads.test.mjs | 17/0/0 | 1.52 | 124 |
| packages/bus/tests/usage-migration.test.mjs | 1/0/0 | 0.214 | 121 |
| scripts/test-auth.sh | 15/0/0 | 1.067 | 126 |
| scripts/test-conductor.sh | 17/0/0 | 6.529 | 145 |
| scripts/test-config.sh | 31/0/0 | 1.968 | 130 |
| scripts/test-discord.sh | 81/0/0 | 8.033 | 147 |
| scripts/test-extension-package.sh | 18/0/0 | 1.617 | 130 |
| scripts/test-foundation.sh | 44/0/0 | 49.367 | 240 |
| scripts/test-land-work.sh | 86/0/0 | 16.854 | 158 |
| scripts/test-queue.sh | 28/0/0 | 35.155 | 191 |
| scripts/test-release.sh | 14/0/0 | 3.271 | 157 |
| scripts/test-task.sh | 91/0/0 | 16.653 | 231 |
`ok 43 - inside a session's sandbox a bind below 1024 fails with EACCES, and a bind on a free high port succeeds`
N9 verbatim: ok 43 - inside a session's sandbox a bind below 1024 fails with EACCES, and a bind on a free high port succeeds
| Variant | Outcome | Base seconds | Variant seconds |
|---|---|---:|---:|
| M1 | killed | 0.265 | 0.215 |
| M2 | killed | 0.515 | 0.465 |
| M3 | killed | 0.465 | 0.616 |
| M4 | killed | 4.073 | 5.778 |
| M5 | killed | 4.073 | 3.923 |
| M6 | killed | 4.073 | 0.565 |
| M7 | killed | 0.214 | 0.265 |
| M8 | killed | 4.073 | 3.172 |
| M9 | killed | 4.073 | 2.870 |
| M10 | killed | 4.073 | 4.023 |
| M11 | killed | 4.073 | 3.973 |
| M12 | killed | 0.365 | 0.264 |
| M13 | killed | 0.365 | 1.116 |
| M14 | killed | 0.365 | 1.217 |
| M15 | killed | 2.069 | 2.369 |
| M16 | killed | 2.069 | 1.016 |
| M17 | killed | 13.144 | 1.016 |
| M18 | killed | 13.144 | 2.470 |
| M19 | killed | 13.144 | 6.328 |
| M20 | killed | 13.144 | 4.624 |
| M21 | killed | 13.144 | 8.683 |
| M22 | killed | 13.144 | 8.283 |
| M23 | killed | 13.144 | 11.038 |
| M24 | killed | 0.615 | 0.315 |
| M25 | killed | 1.116 | 1.017 |
| M26 | killed | 13.144 | 13.244 |
| M27 | killed | 1.116 | 1.117 |
| M28 | killed | 4.073 | 3.171 |
| M29 | killed | 4.073 | 2.269 |
| M30 | killed | 4.073 | 0.866 |
| M31 | killed | 0.214 | 0.265 |
Every named skip:
- packages/webui/tests/editor-provenance.test.mjs: ok 6 - rebuilding from the source gives the same bytes (needs the pinned esbuild; MOSAIC_REQUIRE_EDITOR_BUILD=1 makes its absence a failure) # SKIP esbuild 0.28.1 is installed at /mnt/storage/src/mosaic-stack/node_modules/esbuild; the editor rebuild needs exactly 0.28.2 (npm ci --ignore-scripts in packages/webui) (set MOSAIC_REQUIRE_EDITOR_BUILD=1 to fail instead of skip)
- scripts/test-queue.sh: skip queue verify and render --check: this checkout (/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196) is not the queue's canonical root (/mnt/storage/src/mosaic-stack)
- scripts/test-task.sh: skip live provider cases (row 244: no provider call in the gate)
- scripts/test-task.sh: skip live provider cases (row 244: no provider call in the gate)
Same-run resume under sage-2811 after classified external-process guard refusal. No other round carries. Actual record HEADdd9d519b1 differs from candidate48e450ce8 only under agents/gander/. Stage measured wall sums: CLI1253.715s,WebUI267.028s,bus union46.282s,shells140.514s; control20/0 in64.223s; variants40/40 killed in128.497s. Active window walls425.340s and2106.873s, excluding the classified gap. M21 named P10 assertion kill; M38 ERR_ASSERTION strictEqual at case2-unit.test.mjs:203:10, signals/exec PID1298470 vs SID1298319. Both scripts match candidate; all7manifest checks pass. Sweep0run-created leftovers.
@@ -0,0 +1 @@
sage-2811 classifies the external busy refusal as unrelated and clears this same run5 from M32 with fresh bases. resume5.py is driver.py with only its execution loop filtered to M32-M40; static uniqueness still checks all40, run()/busy()/restoration unchanged. Candidate48e450ce8; actual record HEADdd9d519b1 differs only in agents/gander/. No other round carries.
File diff suppressed because it is too large. Load diff
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 overflow is output-limit", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: row253 C4 overflow is output-limit in both sudo modes
ok 1 - row253 C4 overflow is output-limit in both sudo modes
---
duration_ms: 625.994428
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 760.206204
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 overflow is output-limit", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,37 @@
TAP version 13
# Subtest: row253 C4 overflow is output-limit in both sudo modes
not ok 1 - row253 C4 overflow is output-limit in both sudo modes
---
duration_ms: 323.005464
type: 'test'
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:211:1'
failureType: 'testCodeFailure'
error: |-
The input did not match the regular expression /^case2-unit: tester config query output-limit\n$/. Input:
'case2-unit: tester config query has invalid facts\n'
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected:
actual: |-
case2-unit: tester config query has invalid facts
operator: 'match'
stack: |-
refuses (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:293:10)
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:215:49)
Test.runInAsyncScope (node:async_hooks:226:14)
Test.run (node:internal/test_runner/test:1402:25)
Test.start (node:internal/test_runner/test:1262:17)
startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17)
...
1..1
# tests 1
# suites 0
# pass 0
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 490.238569
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 query reaps its group", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: row253 query reaps its group even when a child closes stdout before the query returns
ok 1 - row253 query reaps its group even when a child closes stdout before the query returns
---
duration_ms: 157.91649
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 283.847211
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 query reaps its group", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,28 @@
TAP version 13
# Subtest: row253 query reaps its group even when a child closes stdout before the query returns
not ok 1 - row253 query reaps its group even when a child closes stdout before the query returns
---
duration_ms: 663.440496
type: 'test'
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:263:1'
failureType: 'testCodeFailure'
error: 'query descendant 1248560 still S'
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected: true
actual: false
operator: '=='
stack: |-
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:277:9)
async Test.run (node:internal/test_runner/test:1409:7)
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
...
1..1
# tests 1
# suites 0
# pass 0
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 784.189133
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 signals query", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: row253 C4 signals query has exact inner reason and cleans all members
ok 1 - row253 C4 signals query has exact inner reason and cleans all members
---
duration_ms: 10950.217059
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 11089.397589
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 signals query", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,37 @@
TAP version 13
# Subtest: row253 C4 signals query has exact inner reason and cleans all members
not ok 1 - row253 C4 signals query has exact inner reason and cleans all members
---
duration_ms: 7064.848782
type: 'test'
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:192:49'
failureType: 'testCodeFailure'
error: |-
The input did not match the regular expression /^case2-unit: tester config query inner-timeout\n$/. Input:
'case2-unit: tester config query outer-timeout\n'
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected:
actual: |-
case2-unit: tester config query outer-timeout
operator: 'match'
stack: |-
refuses (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:293:10)
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:201:3)
Test.runInAsyncScope (node:async_hooks:226:14)
Test.run (node:internal/test_runner/test:1402:25)
Test.start (node:internal/test_runner/test:1262:17)
startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17)
...
1..1
# tests 1
# suites 0
# pass 0
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 7210.704044
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 stalled supervisor", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: row253 C4 stalled supervisor uses the outer reason and explicit residual cleanup
ok 1 - row253 C4 stalled supervisor uses the outer reason and explicit residual cleanup
---
duration_ms: 14171.49424
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 14286.424938
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 stalled supervisor", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,37 @@
TAP version 13
# Subtest: row253 C4 stalled supervisor uses the outer reason and explicit residual cleanup
not ok 1 - row253 C4 stalled supervisor uses the outer reason and explicit residual cleanup
---
duration_ms: 9539.03879
type: 'test'
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:221:1'
failureType: 'testCodeFailure'
error: |-
The input did not match the regular expression /^case2-unit: tester config query outer-timeout\n$/. Input:
'case2-unit: tester config query inner-command\n'
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected:
actual: |-
case2-unit: tester config query inner-command
operator: 'match'
stack: |-
refuses (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:293:10)
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:227:3)
Test.runInAsyncScope (node:async_hooks:226:14)
Test.run (node:internal/test_runner/test:1402:25)
Test.start (node:internal/test_runner/test:1262:17)
startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17)
...
1..1
# tests 1
# suites 0
# pass 0
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 9657.55839
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 member query", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: row253 C4 member query has exact inner reason and cleans all members
ok 1 - row253 C4 member query has exact inner reason and cleans all members
---
duration_ms: 10905.789988
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 11021.001085
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 member query", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,37 @@
TAP version 13
# Subtest: row253 C4 member query has exact inner reason and cleans all members
not ok 1 - row253 C4 member query has exact inner reason and cleans all members
---
duration_ms: 7081.317279
type: 'test'
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:192:49'
failureType: 'testCodeFailure'
error: |-
The input did not match the regular expression /^case2-unit: tester config query inner-timeout\n$/. Input:
'case2-unit: tester config query outer-timeout\n'
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected:
actual: |-
case2-unit: tester config query outer-timeout
operator: 'match'
stack: |-
refuses (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:293:10)
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:201:3)
Test.runInAsyncScope (node:async_hooks:226:14)
Test.run (node:internal/test_runner/test:1402:25)
Test.start (node:internal/test_runner/test:1262:17)
startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17)
...
1..1
# tests 1
# suites 0
# pass 0
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 7220.110326
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 overflow is output-limit", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,37 @@
TAP version 13
# Subtest: row253 C4 overflow is output-limit in both sudo modes
not ok 1 - row253 C4 overflow is output-limit in both sudo modes
---
duration_ms: 314.41894
type: 'test'
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:211:1'
failureType: 'testCodeFailure'
error: |-
The input did not match the regular expression /^case2-unit: tester config query output-limit\n$/. Input:
'case2-unit: tester config query has invalid facts\n'
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected:
actual: |-
case2-unit: tester config query has invalid facts
operator: 'match'
stack: |-
refuses (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:293:10)
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:215:49)
Test.runInAsyncScope (node:async_hooks:226:14)
Test.run (node:internal/test_runner/test:1402:25)
Test.start (node:internal/test_runner/test:1262:17)
startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17)
...
1..1
# tests 1
# suites 0
# pass 0
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 453.186682
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 signals query", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,37 @@
TAP version 13
# Subtest: row253 C4 signals query has exact inner reason and cleans all members
not ok 1 - row253 C4 signals query has exact inner reason and cleans all members
---
duration_ms: 5074.020127
type: 'test'
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:192:49'
failureType: 'testCodeFailure'
error: |-
signals/exec: direct query PID must equal its kernel SID
+ actual - expected
+ 1298470
- 1298319
^
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected: 1298319
actual: 1298470
operator: 'strictEqual'
stack: |-
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:203:10)
Test.runInAsyncScope (node:async_hooks:226:14)
Test.run (node:internal/test_runner/test:1402:25)
Test.start (node:internal/test_runner/test:1262:17)
startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17)
...
1..1
# tests 1
# suites 0
# pass 0
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 5205.043793
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 inline supervisor is byte-identical", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: row253 C4 inline supervisor is byte-identical in both host scripts
ok 1 - row253 C4 inline supervisor is byte-identical in both host scripts
---
duration_ms: 1.534242
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 137.347553
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 inline supervisor is byte-identical", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,202 @@
TAP version 13
# Subtest: row253 C4 inline supervisor is byte-identical in both host scripts
not ok 1 - row253 C4 inline supervisor is byte-identical in both host scripts
---
duration_ms: 2.718028
type: 'test'
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:235:1'
failureType: 'testCodeFailure'
error: |-
Expected values to be strictly equal:
+ actual - expected
"IFS= read -r -d '' TESTER_SUPERVISOR <<'MOSAIC_TESTER_SUPERVISOR' || :\n" +
+ '# one-copy drift\n' +
'set +m\n' +
'seconds="$1" setsid_bin="$2" sleep_bin="$3"; shift 3\n' +
'child="" timer="" verified=0\n' +
'stat_fields() {\n' +
' local pid="$1" raw="" rest\n' +
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected: |-
IFS= read -r -d '' TESTER_SUPERVISOR <<'MOSAIC_TESTER_SUPERVISOR' || :
set +m
seconds="$1" setsid_bin="$2" sleep_bin="$3"; shift 3
child="" timer="" verified=0
stat_fields() {
local pid="$1" raw="" rest
# EOF is expected: stat has no NUL. Decide on content, not read's status.
IFS= read -r -d '' raw < "/proc/$pid/stat" 2>/dev/null || :
[ -n "$raw" ] || { [ -e "/proc/$pid/stat" ] && return 1; return 3; }
rest="${raw##*) }"
[ "$rest" != "$raw" ] || return 1
read -r ST_STATE ST_PARENT ST_GROUP ST_SESSION _ <<< "$rest"
[[ "$ST_STATE" =~ ^[A-Za-z]$ && "$ST_SESSION" =~ ^[0-9]+$ && "$ST_GROUP" =~ ^[0-9]+$ ]]
}
clock_cs() {
local boot spare
read -r boot spare < /proc/uptime || return 1
[[ "$boot" =~ ^([0-9]+)\.([0-9]{2})$ ]] || return 1
CLOCK_CS=$((10#${BASH_REMATCH[1]} * 100 + 10#${BASH_REMATCH[2]}))
}
clean_session() {
local entry pid rc live until=""
while :; do
live=0
for entry in /proc/[0-9]*/stat; do
pid="${entry%/stat}"; pid="${pid##*/}"
rc=0; stat_fields "$pid" || rc=$?
[ "$rc" != 3 ] || continue
[ "$rc" = 0 ] || return 1
[ "$ST_SESSION" = "$child" ] || continue
case "$ST_STATE" in Z|X) continue ;; esac
live=1
if ! kill -KILL "$pid" 2>/dev/null; then
rc=0; stat_fields "$pid" || rc=$?
[ "$rc" = 3 ] || { [ "$rc" = 0 ] && { [ "$ST_STATE" = Z ] || [ "$ST_STATE" = X ]; }; } || return 1
fi
done
[ "$live" != 0 ] || return 0
clock_cs || return 1
# Inventory pass 1 is outside the bounded confirmation/retry budget.
[ -n "$until" ] || until=$((CLOCK_CS + 25))
[ "$CLOCK_CS" -lt "$until" ] || return 1
"$sleep_bin" 0.01
done
}
finish() {
local rc="$?"
trap - EXIT HUP INT TERM
if [ "$verified" = 1 ]; then
clean_session || rc=86
elif [ -n "$child" ]; then
kill -KILL "$child" 2>/dev/null || :
fi
[ -z "$child" ] || wait "$child" 2>/dev/null || :
if [ -n "$timer" ]; then kill -KILL "$timer" 2>/dev/null || :; wait "$timer" 2>/dev/null || :; fi
exit "$rc"
}
trap finish EXIT
trap 'exit 88' HUP INT TERM
"$sleep_bin" "$seconds" & timer=$!
"$setsid_bin" "$@" & child=$!
# Allow session creation the whole inner budget, rather than a 200 ms margin.
while :; do
rc=0; stat_fields "$child" || rc=$?
[ "$rc" = 0 ] || exit 85
if [ "$ST_SESSION" = "$child" ]; then verified=1; break; fi
kill -0 "$timer" 2>/dev/null || exit 81
"$sleep_bin" 0.002
done
[ "$verified" = 1 ] || exit 85
while kill -0 "$child" 2>/dev/null; do
kill -0 "$timer" 2>/dev/null || exit 81
"$sleep_bin" 0.01
done
kill -0 "$timer" 2>/dev/null || exit 81
rc=0; wait "$child" || rc=$?
[ "$rc" = 0 ] || exit 87
exit 0
MOSAIC_TESTER_SUPERVISOR
actual: |-
IFS= read -r -d '' TESTER_SUPERVISOR <<'MOSAIC_TESTER_SUPERVISOR' || :
# one-copy drift
set +m
seconds="$1" setsid_bin="$2" sleep_bin="$3"; shift 3
child="" timer="" verified=0
stat_fields() {
local pid="$1" raw="" rest
# EOF is expected: stat has no NUL. Decide on content, not read's status.
IFS= read -r -d '' raw < "/proc/$pid/stat" 2>/dev/null || :
[ -n "$raw" ] || { [ -e "/proc/$pid/stat" ] && return 1; return 3; }
rest="${raw##*) }"
[ "$rest" != "$raw" ] || return 1
read -r ST_STATE ST_PARENT ST_GROUP ST_SESSION _ <<< "$rest"
[[ "$ST_STATE" =~ ^[A-Za-z]$ && "$ST_SESSION" =~ ^[0-9]+$ && "$ST_GROUP" =~ ^[0-9]+$ ]]
}
clock_cs() {
local boot spare
read -r boot spare < /proc/uptime || return 1
[[ "$boot" =~ ^([0-9]+)\.([0-9]{2})$ ]] || return 1
CLOCK_CS=$((10#${BASH_REMATCH[1]} * 100 + 10#${BASH_REMATCH[2]}))
}
clean_session() {
local entry pid rc live until=""
while :; do
live=0
for entry in /proc/[0-9]*/stat; do
pid="${entry%/stat}"; pid="${pid##*/}"
rc=0; stat_fields "$pid" || rc=$?
[ "$rc" != 3 ] || continue
[ "$rc" = 0 ] || return 1
[ "$ST_SESSION" = "$child" ] || continue
case "$ST_STATE" in Z|X) continue ;; esac
live=1
if ! kill -KILL "$pid" 2>/dev/null; then
rc=0; stat_fields "$pid" || rc=$?
[ "$rc" = 3 ] || { [ "$rc" = 0 ] && { [ "$ST_STATE" = Z ] || [ "$ST_STATE" = X ]; }; } || return 1
fi
done
[ "$live" != 0 ] || return 0
clock_cs || return 1
# Inventory pass 1 is outside the bounded confirmation/retry budget.
[ -n "$until" ] || until=$((CLOCK_CS + 25))
[ "$CLOCK_CS" -lt "$until" ] || return 1
"$sleep_bin" 0.01
done
}
finish() {
local rc="$?"
trap - EXIT HUP INT TERM
if [ "$verified" = 1 ]; then
clean_session || rc=86
elif [ -n "$child" ]; then
kill -KILL "$child" 2>/dev/null || :
fi
[ -z "$child" ] || wait "$child" 2>/dev/null || :
if [ -n "$timer" ]; then kill -KILL "$timer" 2>/dev/null || :; wait "$timer" 2>/dev/null || :; fi
exit "$rc"
}
trap finish EXIT
trap 'exit 88' HUP INT TERM
"$sleep_bin" "$seconds" & timer=$!
"$setsid_bin" "$@" & child=$!
# Allow session creation the whole inner budget, rather than a 200 ms margin.
while :; do
rc=0; stat_fields "$child" || rc=$?
[ "$rc" = 0 ] || exit 85
if [ "$ST_SESSION" = "$child" ]; then verified=1; break; fi
kill -0 "$timer" 2>/dev/null || exit 81
"$sleep_bin" 0.002
done
[ "$verified" = 1 ] || exit 85
while kill -0 "$child" 2>/dev/null; do
kill -0 "$timer" 2>/dev/null || exit 81
"$sleep_bin" 0.01
done
kill -0 "$timer" 2>/dev/null || exit 81
rc=0; wait "$child" || rc=$?
[ "$rc" = 0 ] || exit 87
exit 0
MOSAIC_TESTER_SUPERVISOR
operator: 'strictEqual'
stack: |-
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:238:34)
Test.runInAsyncScope (node:async_hooks:226:14)
Test.run (node:internal/test_runner/test:1402:25)
Test.start (node:internal/test_runner/test:1262:17)
startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17)
...
1..1
# tests 1
# suites 0
# pass 0
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 126.372046
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 cleanup budget starts after inventory pass one", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: row253 C4 cleanup budget starts after inventory pass one
ok 1 - row253 C4 cleanup budget starts after inventory pass one
---
duration_ms: 48.881506
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 169.630508
@@ -0,0 +1 @@
["timeout", "-k", "10", "320", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row253 C4 cleanup budget starts after inventory pass one", "packages/cli/tests/case2-unit.test.mjs"]
@@ -0,0 +1,34 @@
TAP version 13
# Subtest: row253 C4 cleanup budget starts after inventory pass one
not ok 1 - row253 C4 cleanup budget starts after inventory pass one
---
duration_ms: 27.786408
type: 'test'
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:241:1'
failureType: 'testCodeFailure'
error: |-
Expected values to be strictly equal:
1 !== 0
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected: 0
actual: 1
operator: 'strictEqual'
stack: |-
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case2-unit.test.mjs:260:9)
Test.runInAsyncScope (node:async_hooks:226:14)
Test.run (node:internal/test_runner/test:1402:25)
Test.start (node:internal/test_runner/test:1262:17)
startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17)
...
1..1
# tests 1
# suites 0
# pass 0
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 159.852259
@@ -0,0 +1,412 @@
{
"grant": "sage-2811",
"static": [
{
"id": "M1",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "4de5294507816ddc4114c418a6bb7c197b3fefe92f19b3b18cb95384e23de594"
},
{
"id": "M2",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "caf88ee7ad50b89169a0f57e12b696fe3828238af2ef1008ba6b6016ea7b2528"
},
{
"id": "M3",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "4401886e41fdb4c27610198b66f12d0b3103c5422e0862e9cea30a6f67c93fde"
},
{
"id": "M4",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "ef9a92bb24c72832bdba4d782bf4662394ee05e06a12b750a23d488d9181cd1d"
},
{
"id": "M5",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "4ab80b9db782a97c935f732bec87ac3bb45b58bf9076bc9f9abb4970fef1cada"
},
{
"id": "M6",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "7064e1926c77aedb5453c7771cd42091a5e90fc546821ddbb75d39e6a87c5a31"
},
{
"id": "M7",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "aece2a211aefa1dc4cfb6a3540f922ee5e7f23de26ce974b7655f8fe1722ee16"
},
{
"id": "M8",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "076d4f8f73570a21ad512b12eb5f6f494cb246b2a9d071fea27cc3c126efca2b"
},
{
"id": "M9",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "244cee7128d3b6e380ff24ab9e31f6c456d5153dddf88bb4719028277f523276"
},
{
"id": "M10",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "0e7d369f34cd41708d7b5104113093ebac0296d08902193ced03a1a2bbb83567"
},
{
"id": "M11",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "84181be89249975dd48e1a5daa51eab4bae7b483ea8edf5d6c0cdf373459c046"
},
{
"id": "M12",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "7f8b45e467b197bc00fb740a6507ee85cae332e404e8ffdd8c749b4264239e97"
},
{
"id": "M13",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "85ec11381f4e6662ec1729d84c57022e2f573a2f4c2682250fa005803cdfd63c"
},
{
"id": "M14",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "131f78c490b5ec26142c0703be0b5341551dd9d154c13e519604215fe1240b67"
},
{
"id": "M15",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "077b2eb210c853a03152733f4aa99e450ef0fa17d28f97f8adb78229b02ef147"
},
{
"id": "M16",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "2439d201b902c13fe3903a2d936c8700f0124a430b7d9b2877d485e1f381d3fb"
},
{
"id": "M17",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "1be36e62095e97c64c0bdc5d50b4a3a2e6dd18f1c45cfe1da0fe66cbb8aebd61"
},
{
"id": "M18",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "f5e61c286c51e5a2b26acab22fc5a32c35add0cb8126dc25b5ce747677e34888"
},
{
"id": "M19",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "2f337c03acc60978f1850275a2c8ba6d1b2c74befeb8d73f94d2b477e43b8c56"
},
{
"id": "M20",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "99689c22c6eb73ff9d599ba7305da552357baa99145305ca400f083017bbe3b1"
},
{
"id": "M21",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "bff90f2b1f59086575f98ff96dbd51bacb0265342f595b4bee96cb228d67c030"
},
{
"id": "M22",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "7a8cb7ce47774ab80a55331fc831b7458487be7187b10128746321b375dc83ff"
},
{
"id": "M23",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "e6814801188a6eb98f705d93ac123e988e4daf43afbe96464451f925b1c98d1c"
},
{
"id": "M24",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "ea8d8875f0b4503a6cf4fb96bd88184af65a7f61d1236b9b49baacc748b0c741"
},
{
"id": "M25",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "cfed9261a03eafcdcfb903226b0ddb3fba779d1105e3b4c411b66c10e1672d11"
},
{
"id": "M26",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "1a245b5403b1b9b5f25dfb8cc8ee24acf99121ff063277d52c928ba18543f997"
},
{
"id": "M27",
"file": "scripts/case1-accept.sh",
"occurrences": 1,
"before": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
"after": "efaa027cf7ec3252a675be80219e40fa7b5a3317b28c21fe02363d23ec6e5323"
},
{
"id": "M28",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "bb734cc1a42c0853068f77154dddaaee8eeef5696f67de2e27d1a898409f3b44"
},
{
"id": "M29",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "a6f353aa419862a473eee28e41c5208b464a378ae23e14a73b62ed92bd36cd1f"
},
{
"id": "M30",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "d22cf0f492178b3071604abd550355573c28bf4c26f4a3582f6895710ad3d788"
},
{
"id": "M31",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "3e7450a19cf152653bf6e73be39ef9fb552ec7a656564ca35e44bc12f1586ef5"
},
{
"id": "M32",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "ff11fc1013d70d861643cfd70aa964422cb6a82fb8b4b959bae04703803838b9"
},
{
"id": "M33",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "1c2a58bef2369d8af90b65f9473dd7a112f484db983d8460e2524cb8a673f18b"
},
{
"id": "M34",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "13c1ab861017f3c3c65f50d34a64d7028482e3bc11a8e5908632ec6685416025"
},
{
"id": "M35",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "8f05c1a3a18c5294c63a5853317ce5a5066303145410039629697b5d15d99bfe"
},
{
"id": "M36",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "c1247a7cab2c24e0ab017c49f66797ed16149d3f52cfa41c0968f154261d0d00"
},
{
"id": "M37",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "f210b9c796322333849bc4897b9db3e44bd573fef24c4ba757151981b891f11b"
},
{
"id": "M38",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "736418014b96a09ebe82d996ff6f45b9eb1f3c1e0ada274c505f89fbbd732783"
},
{
"id": "M39",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "1486b8907be4f327bc17b64ddf615cd8b3db1193c185f7934bcba1c7ccc5ec31"
},
{
"id": "M40",
"file": "scripts/case2-unit.sh",
"occurrences": 1,
"before": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b",
"after": "2f654a76d887ca62525e01c307a2a8f828ee426087dc63a2d4df6a07dc525d53"
}
],
"bases": {
"packages/cli/tests/case2-unit.test.mjs|row253 C4 overflow is output-limit": {
"code": 0,
"timeout": false,
"seconds": 0.866,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M32-base.log"
},
"packages/cli/tests/case2-unit.test.mjs|row253 query reaps its group": {
"code": 0,
"timeout": false,
"seconds": 0.365,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M33-base.log"
},
"packages/cli/tests/case2-unit.test.mjs|row253 C4 signals query": {
"code": 0,
"timeout": false,
"seconds": 11.189,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M34-base.log"
},
"packages/cli/tests/case2-unit.test.mjs|row253 C4 stalled supervisor": {
"code": 0,
"timeout": false,
"seconds": 14.395,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M35-base.log"
},
"packages/cli/tests/case2-unit.test.mjs|row253 C4 member query": {
"code": 0,
"timeout": false,
"seconds": 11.088,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M36-base.log"
},
"packages/cli/tests/case2-unit.test.mjs|row253 C4 inline supervisor is byte-identical": {
"code": 0,
"timeout": false,
"seconds": 0.215,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M39-base.log"
},
"packages/cli/tests/case2-unit.test.mjs|row253 C4 cleanup budget starts after inventory pass one": {
"code": 0,
"timeout": false,
"seconds": 0.265,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M40-base.log"
}
},
"changes": [
{
"code": 1,
"timeout": false,
"seconds": 0.565,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M32.log",
"id": "M32",
"base_seconds": 0.866,
"outcome": "killed"
},
{
"code": 1,
"timeout": false,
"seconds": 0.866,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M33.log",
"id": "M33",
"base_seconds": 0.365,
"outcome": "killed"
},
{
"code": 1,
"timeout": false,
"seconds": 7.28,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M34.log",
"id": "M34",
"base_seconds": 11.189,
"outcome": "killed"
},
{
"code": 1,
"timeout": false,
"seconds": 9.735,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M35.log",
"id": "M35",
"base_seconds": 14.395,
"outcome": "killed"
},
{
"code": 1,
"timeout": false,
"seconds": 7.28,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M36.log",
"id": "M36",
"base_seconds": 11.088,
"outcome": "killed"
},
{
"code": 1,
"timeout": false,
"seconds": 0.515,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M37.log",
"id": "M37",
"base_seconds": 0.866,
"outcome": "killed"
},
{
"code": 1,
"timeout": false,
"seconds": 5.275,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M38.log",
"id": "M38",
"base_seconds": 11.189,
"outcome": "killed"
},
{
"code": 1,
"timeout": false,
"seconds": 0.214,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M39.log",
"id": "M39",
"base_seconds": 0.215,
"outcome": "killed"
},
{
"code": 1,
"timeout": false,
"seconds": 0.214,
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-253/run5-gate/changes-resume/M40.log",
"id": "M40",
"base_seconds": 0.265,
"outcome": "killed"
}
]
}
@@ -0,0 +1 @@
2026-10-22T17:18:29.556861+00:00
@@ -0,0 +1,58 @@
#!/usr/bin/env python3
"""Assemble complete whole-gate evidence from retained logs only."""
import hashlib,json,re
from pathlib import Path
HERE=Path(__file__).resolve().parent.parent
RUN=HERE/'run5-gate'
def main():
sections={n:json.loads((RUN/n/'results.json').read_text()) for n in ['focused','changes','whole']}
resumed=json.loads((RUN/'changes-resume/results.json').read_text())
sections['changes']['changes'] += resumed['changes']
sections['changes']['bases'].update(resumed['bases'])
sections['changes']['resume_grant']='sage-2811'
header=json.loads((RUN/'HEADER.json').read_text());lists=json.loads((RUN/'FILE-LISTS.json').read_text())
whole=sections['whole']['steps'];expected=sum(map(len,lists.values()))+10
assert len(whole)==expected
assert all(s['code']==0 and not s['timeout'] for s in whole)
focused=sections['focused']['steps']
assert len(focused)==4 and all(not s['timeout'] and (s['code']!=0 if s['expected_red'] else s['code']==0) for s in focused)
changes=sections['changes']['changes'];assert len(changes)==40 and all(s['outcome']=='killed' and not s['timeout'] for s in changes)
limits=json.loads((HERE/'WHOLE-GATE-LIMITS.json').read_text())['files'];shell_limits=json.loads((HERE/'SHELL-LIMITS.json').read_text())['scripts']
counts={};skips=[];rows=[];shells=[];n9=[]
for package,files in lists.items():
steps=[s for s in whole if s['name'].startswith(package+'-')]
commands=[json.loads(Path(s['log']).with_suffix('.command.json').read_text()) for s in steps]
assert [c[-1] for c in commands]==files
counts[package]={k:sum(s['counts'].get(k,0) for s in steps) for k in ['pass','fail','skipped']}
for s,c,file in zip(steps,commands,files):
assert c==['timeout','-k','10',str(limits[file]),'node','--test','--test-reporter=tap',file]
text=Path(s['log']).read_text(errors='replace')
skips += [dict(file=file,line=line) for line in text.splitlines() if '# SKIP' in line]
if file.endswith('/case2-unit.test.mjs'):n9 += [line for line in text.splitlines() if line.startswith('ok ') and "inside a session's sandbox" in line]
rows.append(dict(file=file,counts=s['counts'],seconds=s['seconds'],limit_seconds=limits[file],log=s['log']))
for s in whole[-10:]:
command=json.loads(Path(s['log']).with_suffix('.command.json').read_text());file=command[-1]
assert command==['timeout','-k','10',str(shell_limits[file]['limit_seconds']),'bash',file]
text=Path(s['log']).read_text(errors='replace');found=re.findall(r'([^\n]*?: (\d+) passed, (\d+) failed)',text);assert found,file
line,passed,failed=found[-1];assert int(failed)==0
skips += [dict(file=file,line=line) for line in text.splitlines() if re.match(r'^\s*skip\b',line,re.I) or '# SKIP' in line]
shells.append(dict(file=file,pass_count=int(passed),fail_count=int(failed),seconds=s['seconds'],limit_seconds=shell_limits[file]['limit_seconds'],summary_line=line,log=s['log']))
assert len(n9)==1
counts['shell_self_assertions']=dict(pass_count=sum(s['pass_count'] for s in shells),fail_count=0)
result=dict(status='GREEN',header=header,sections=sections,counts=counts,files=rows,shells=shells,named_skips=skips,n9_exact_line=n9[0],killed=40,survived=0,timeouts=0,head_diff_outside_gander=(RUN/'HEAD-DIFF-OUTSIDE-GANDER.txt').read_text().splitlines())
repo=HERE.parents[3]
expected_hashes=json.loads((HERE/'CANDIDATE-SHAS.json').read_text())
assert all(hashlib.sha256((repo/n).read_bytes()).hexdigest()==v for n,v in expected_hashes.items())
assert all(hashlib.sha256((repo/n).read_bytes()).hexdigest()==v['script_sha256'] for n,v in shell_limits.items())
(RUN/'SUMMARY.json').write_text(json.dumps(result,indent=2)+'\n')
lines=['# Row253 whole gate RESULTS','','HEAD '+header['head']+', product '+header['product']+', manifest '+header['manifest']+'.','','48e450ce8..actual record HEAD name-only outside agents/gander/:','','```text',*result['head_diff_outside_gander'],'```','','All listed whole files ran, with no unlisted-file coverage claim. Intended REDs and focused repeats are separate from package totals. Bus coverage is the20-file rebase union, not a bus-whole claim.','','| Whole file | Pass/fail/skip | Wall seconds | Limit seconds |','|---|---:|---:|---:|']
lines += [f"| {r['file']} | {r['counts']['pass']}/{r['counts']['fail']}/{r['counts']['skipped']} | {r['seconds']} | {r['limit_seconds']} |" for r in rows]
lines += [f"| {r['file']} | {r['pass_count']}/{r['fail_count']}/0 | {r['seconds']} | {r['limit_seconds']} |" for r in shells]
lines += ['','N9 verbatim: '+n9[0],'','Every named skip:','']+[f"- {s['file']}: {s['line']}" for s in skips]
(RUN/'RESULTS.md').write_text('\n'.join(lines)+'\n')
defs={d['id']:d for d in json.loads((HERE/'changes.json').read_text())}
table=['# M1-M40 kill table','','Every base passes; each change restored exact bytes and tracked status before the next. No timeout counts as kill.','','| Check | Named killer | Base seconds | Changed seconds | Outcome |','|---|---|---:|---:|---|']
table += [f"| {s['id']} | {defs[s['id']]['pattern']} | {s['base_seconds']} | {s['seconds']} | {s['outcome']} |" for s in changes]
(RUN/'KILL-TABLE.md').write_text('\n'.join(table)+'\n')
print(json.dumps(dict(counts=counts,named_skips=skips,n9=n9,killed=40),indent=2))
if __name__=='__main__':main()
File diff suppressed because it is too large. Load diff
@@ -0,0 +1 @@
{"stage": "whole", "code": 0, "wall_seconds": 2106.873}
@@ -0,0 +1 @@
2026-10-22T16:42:17.718084+00:00
@@ -0,0 +1,12 @@
import datetime,json,pathlib,subprocess,sys,time
r=pathlib.Path(__file__).resolve().parent;p=r.parent
start=time.monotonic()
(r/'resume-start.txt').write_text(datetime.datetime.now(datetime.timezone.utc).isoformat()+'\n')
print((r/'HEADER.json').read_text(),flush=True)
print('RESUME sage-2811; candidate48e450ce8; actual record HEADdd9d519b1; only agents/gander differs',flush=True)
for stage,command in [('changes-resume',[sys.executable,str(p/'resume5.py'),'--grant','sage-2811','--out',str(r/'changes-resume')]),('whole',[sys.executable,str(p/'window.py'),'--grant','sage-2811','--stage','whole','--out',str(r/'whole')])]:
print('START '+stage,flush=True)
code=subprocess.call(command)
(r/'resume-progress.json').write_text(json.dumps(dict(stage=stage,code=code,wall_seconds=round(time.monotonic()-start,3))))
if code:sys.exit(code)
print('END '+stage,flush=True)
@@ -1,5 +1,5 @@
{
"timestamp": "2026-10-22T16:40:27.619123+00:00",
"timestamp": "2026-10-22T17:17:49.489308+00:00",
"count": 0,
"remaining": [],
"excluded_preexisting_infrastructure": [
@@ -0,0 +1 @@
["timeout", "-k", "10", "122", "node", "--test", "--test-reporter=tap", "packages/bus/tests/account-migration.test.mjs"]
@@ -0,0 +1,28 @@
TAP version 13
# Subtest: REQ-LIMIT-4 3h copy migrates to 3i: every row keeps its seq, the sequence carries over, and only the account CHECK changes
ok 1 - REQ-LIMIT-4 3h copy migrates to 3i: every row keeps its seq, the sequence carries over, and only the account CHECK changes
---
duration_ms: 84.326411
type: 'test'
...
# Subtest: REQ-LIMIT-4 a 3h→3i step that fails partway leaves the store at 3h with every row, the sequence and the schema intact
ok 2 - REQ-LIMIT-4 a 3h→3i step that fails partway leaves the store at 3h with every row, the sequence and the schema intact
---
duration_ms: 106.635759
type: 'test'
...
# Subtest: REQ-LIMIT-4 the 3h engine refuses a migrated store, migrating or not, and leaves it as it was
ok 3 - REQ-LIMIT-4 the 3h engine refuses a migrated store, migrating or not, and leaves it as it was
---
duration_ms: 90.186998
type: 'test'
...
1..3
# tests 3
# suites 0
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 362.170558
@@ -0,0 +1 @@
["timeout", "-k", "10", "127", "node", "--test", "--test-reporter=tap", "packages/bus/tests/chief-of-staff.test.mjs"]
@@ -0,0 +1,271 @@
TAP version 13
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# Subtest: REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged
ok 1 - REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged
---
duration_ms: 33.189988
type: 'test'
...
# Subtest: REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke
ok 2 - REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke
---
duration_ms: 29.798725
type: 'test'
...
# Subtest: REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither
ok 3 - REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither
---
duration_ms: 20.544341
type: 'test'
...
# Subtest: REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path
ok 4 - REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path
---
duration_ms: 20.046761
type: 'test'
...
# Subtest: REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason
ok 5 - REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason
---
duration_ms: 24.36214
type: 'test'
...
# Subtest: REQ-ROLE-2: a reason is required, bounded, and never sent with a decision
ok 6 - REQ-ROLE-2: a reason is required, bounded, and never sent with a decision
---
duration_ms: 27.539514
type: 'test'
...
# Subtest: REQ-COS-1: the chief of staff cannot end its own run; its end of the assistant stops the assistant's thread run
ok 7 - REQ-COS-1: the chief of staff cannot end its own run; its end of the assistant stops the assistant's thread run
---
duration_ms: 27.924042
type: 'test'
...
# Subtest: REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor
ok 8 - REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor
---
duration_ms: 22.713552
type: 'test'
...
# Subtest: REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set
ok 9 - REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set
---
duration_ms: 27.980077
type: 'test'
...
# Subtest: REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change
ok 10 - REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change
---
duration_ms: 33.865977
type: 'test'
...
# Subtest: REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys
ok 11 - REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys
---
duration_ms: 43.95588
type: 'test'
...
# Subtest: REQ-COS-1: organization.revision answers the revision alone to the chief of staff and spends nothing
ok 12 - REQ-COS-1: organization.revision answers the revision alone to the chief of staff and spends nothing
---
duration_ms: 27.703007
type: 'test'
...
# Subtest: REQ-COS-1, REQ-LIMIT-1: organization.revision is refused for every caller whose role file lacks organization.change
ok 13 - REQ-COS-1, REQ-LIMIT-1: organization.revision is refused for every caller whose role file lacks organization.change
---
duration_ms: 28.057528
type: 'test'
...
# Subtest: REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused
ok 14 - REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused
---
duration_ms: 96.290654
type: 'test'
...
# Subtest: REQ-COS-1: the chief of staff reads the revision, changes the file with it, and reads again after a stale one is refused
ok 15 - REQ-COS-1: the chief of staff reads the revision, changes the file with it, and reads again after a stale one is refused
---
duration_ms: 87.391751
type: 'test'
...
# Subtest: Q169: the chief of staff's change of the assistant is validated, written and logged; a stale or protection-stripping one is refused
ok 16 - Q169: the chief of staff's change of the assistant is validated, written and logged; a stale or protection-stripping one is refused
---
duration_ms: 84.062651
type: 'test'
...
# Subtest: row 65, Q169: the chief's change of the assistant's route runs the routing checks, and a valid one saves as the chief
ok 17 - row 65, Q169: the chief's change of the assistant's route runs the routing checks, and a valid one saves as the chief
---
duration_ms: 65.893283
type: 'test'
...
# Subtest: REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused
ok 18 - REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused
---
duration_ms: 71.80945
type: 'test'
...
# Subtest: row 194 T10: the chief's reason end of a kept instance refuses instance-kept, holds the claim and spends nothing
ok 19 - row 194 T10: the chief's reason end of a kept instance refuses instance-kept, holds the claim and spends nothing
---
duration_ms: 21.059884
type: 'test'
...
# Subtest: row 194 T10 (Q2): a role.revoke citing a decision the human resolved still ends a kept run
ok 20 - row 194 T10 (Q2): a role.revoke citing a decision the human resolved still ends a kept run
---
duration_ms: 21.845086
type: 'test'
...
# Subtest: row 194 T10 (B7): the chief's organization.set of a kept instance's model refuses before the writer; the human's limits.set does not
ok 21 - row 194 T10 (B7): the chief's organization.set of a kept instance's model refuses before the writer; the human's limits.set does not
---
duration_ms: 22.02787
type: 'test'
...
# Subtest: row 194 T13: organization.set and limits.set refuse the launch, retired, keep and noHire keys before the writer
ok 22 - row 194 T13: organization.set and limits.set refuse the launch, retired, keep and noHire keys before the writer
---
duration_ms: 26.122601
type: 'test'
...
# Subtest: row 194 T18 (D2.4): from a chief session veto.set and instances.set refuse, and nothing reaches the writer
ok 23 - row 194 T18 (D2.4): from a chief session veto.set and instances.set refuse, and nothing reaches the writer
---
duration_ms: 24.584071
type: 'test'
...
# Subtest: row 194 T8: the chief hires with a reason and no decision, the writer gets the reason as context, and the log names it
ok 24 - row 194 T8: the chief hires with a reason and no decision, the writer gets the reason as context, and the log names it
---
duration_ms: 21.667787
type: 'test'
...
# Subtest: row 194 T11: on a bus with two businesses, the chief of one hires and fires only in its own
ok 25 - row 194 T11: on a bus with two businesses, the chief of one hires and fires only in its own
---
duration_ms: 19.252327
type: 'test'
...
# Subtest: row 194 T8: hire and fire need a reason of 1 to 500 characters and refuse a decision key
ok 26 - row 194 T8: hire and fire need a reason of 1 to 500 characters and refuse a decision key
---
duration_ms: 32.74728
type: 'test'
...
# Subtest: row 194 T8 (sage-1471): only the chief hires or fires; every other role refuses role-not-chief, even one granted the actions
ok 27 - row 194 T8 (sage-1471): only the chief hires or fires; every other role refuses role-not-chief, even one granted the actions
---
duration_ms: 35.919083
type: 'test'
...
# Subtest: row 194 T8 (sage-1471): a chief whose authority lacks role.hire or role.fire refuses decision-required before the writer
ok 28 - row 194 T8 (sage-1471): a chief whose authority lacks role.hire or role.fire refuses decision-required before the writer
---
duration_ms: 51.837467
type: 'test'
...
# Subtest: row 194 T8a: a re-hire of a fired name goes to the writer like a hire, and the writer's refusals pass through by name
ok 29 - row 194 T8a: a re-hire of a fired name goes to the writer like a hire, and the writer's refusals pass through by name
---
duration_ms: 26.830905
type: 'test'
...
# Subtest: row 194 T8b: a definition is hireable only when every action is on HIRE_ALLOWED, it is version 2, the chief lists it and noHire doesn't
ok 30 - row 194 T8b: a definition is hireable only when every action is on HIRE_ALLOWED, it is version 2, the chief lists it and noHire doesn't
---
duration_ms: 754.320986
type: 'test'
...
# Subtest: row 194 T8b: a hire without the role files configured refuses not-configured
ok 31 - row 194 T8b: a hire without the role files configured refuses not-configured
---
duration_ms: 20.913229
type: 'test'
...
# Subtest: row 194 T9: a fire revokes the claim, cancels open requests, asks the launcher to kill the runs, then delists and logs
ok 32 - row 194 T9: a fire revokes the claim, cancels open requests, asks the launcher to kill the runs, then delists and logs
---
duration_ms: 24.175936
type: 'test'
...
# Subtest: row 194 T9a (bus): a fire end's done writes lifecycle.end.killed and lifecycle.end.alive with run and pid, and an unknown stop's reason; a terminate's done or a bad stop refuses
ok 33 - row 194 T9a (bus): a fire end's done writes lifecycle.end.killed and lifecycle.end.alive with run and pid, and an unknown stop's reason; a terminate's done or a bad stop refuses
---
duration_ms: 32.61146
type: 'test'
...
# Subtest: row 194 T9: fire refusals come before step A and leave the claim, the requests and the file alone
ok 34 - row 194 T9: fire refusals come before step A and leave the claim, the requests and the file alone
---
duration_ms: 23.760072
type: 'test'
...
# Subtest: row 194 T9c: a writer failure at B leaves the instance firing, and the repeat delists and logs once
ok 35 - row 194 T9c: a writer failure at B leaves the instance firing, and the repeat delists and logs once
---
duration_ms: 27.181196
type: 'test'
...
# Subtest: row 194 T9c: a failure at C leaves the fire unlogged and the instance firing, and the repeat logs it
ok 36 - row 194 T9c: a failure at C leaves the fire unlogged and the instance firing, and the repeat logs it
---
duration_ms: 32.473952
type: 'test'
...
# Subtest: row 194 W-N1: a fire.done before a later fire.stopped of the same instance leaves it firing; another instance's done does not end it
ok 37 - row 194 W-N1: a fire.done before a later fire.stopped of the same instance leaves it firing; another instance's done does not end it
---
duration_ms: 28.763745
type: 'test'
...
# Subtest: row 194 T10: a hire or fire of a kept name refuses instance-kept before the writer
ok 38 - row 194 T10: a hire or fire of a kept name refuses instance-kept before the writer
---
duration_ms: 23.713749
type: 'test'
...
# Subtest: row 194 T10: a fire the writer's check refuses from the file stops nothing and leaves the instance launchable
ok 39 - row 194 T10: a fire the writer's check refuses from the file stops nothing and leaves the instance launchable
---
duration_ms: 22.850337
type: 'test'
...
# Subtest: row 194 T18: hire and fire take only their own keys, and a refused call writes nothing
ok 40 - row 194 T18: hire and fire take only their own keys, and a refused call writes nothing
---
duration_ms: 30.46199
type: 'test'
...
# Subtest: row 194 T8, T9, T18: through the runtime the chief hires and fires with the real writer, the receipt carries the reason, and a refusal leaves the file alone
ok 41 - row 194 T8, T9, T18: through the runtime the chief hires and fires with the real writer, the receipt carries the reason, and a refusal leaves the file alone
---
duration_ms: 74.266705
type: 'test'
...
# Subtest: row 194 W-N1: the launcher's take of a launch or regenerate of a firing instance closes it as instance-firing
ok 42 - row 194 W-N1: the launcher's take of a launch or regenerate of a firing instance closes it as instance-firing
---
duration_ms: 25.754677
type: 'test'
...
1..42
# tests 42
# suites 0
# pass 42
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 2335.738057
@@ -0,0 +1 @@
["timeout", "-k", "10", "122", "node", "--test", "--test-reporter=tap", "packages/bus/tests/comment-migration.test.mjs"]
@@ -0,0 +1,40 @@
TAP version 13
# Subtest: explicit 3b copy migration preserves evidence and opens as 3g; normal startup never migrates
ok 1 - explicit 3b copy migration preserves evidence and opens as 3g; normal startup never migrates
---
duration_ms: 94.206485
type: 'test'
...
# Subtest: migration refuses active writers and drifted legacy schemas, with no partial upgrade
ok 2 - migration refuses active writers and drifted legacy schemas, with no partial upgrade
---
duration_ms: 95.033385
type: 'test'
...
# Subtest: named migration registry chains 3b through 3g to a fixture-only future version in order
ok 3 - named migration registry chains 3b through 3g to a fixture-only future version in order
---
duration_ms: 88.657051
type: 'test'
...
# Subtest: migration refuses mismatched source metadata without changing schema or evidence
ok 4 - migration refuses mismatched source metadata without changing schema or evidence
---
duration_ms: 32.292763
type: 'test'
...
# Subtest: offline command migrates only the supplied fixture root and reports usage errors
ok 5 - offline command migrates only the supplied fixture root and reports usage errors
---
duration_ms: 161.569057
type: 'test'
...
1..5
# tests 5
# suites 0
# pass 5
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 565.272724
@@ -0,0 +1 @@
["timeout", "-k", "10", "122", "node", "--test", "--test-reporter=tap", "packages/bus/tests/end-launch.test.mjs"]
@@ -0,0 +1,52 @@
TAP version 13
# Subtest: endLaunch writes session.ended, releases the run claim and kills its capabilities
ok 1 - endLaunch writes session.ended, releases the run claim and kills its capabilities
---
duration_ms: 22.645651
type: 'test'
...
# Subtest: endLaunch refuses an unknown run, a second end and a rebind of the ended run
ok 2 - endLaunch refuses an unknown run, a second end and a rebind of the ended run
---
duration_ms: 12.002293
type: 'test'
...
# Subtest: a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound
ok 3 - a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound
---
duration_ms: 16.156189
type: 'test'
...
# Subtest: endLaunch leaves a claim another run took alone
ok 4 - endLaunch leaves a claim another run took alone
---
duration_ms: 15.643604
type: 'test'
...
# Subtest: refuse records action.refused against the caller with the code only
ok 5 - refuse records action.refused against the caller with the code only
---
duration_ms: 12.387348
type: 'test'
...
# Subtest: launches off refuses role.launch with launch-revoked until launches on
ok 6 - launches off refuses role.launch with launch-revoked until launches on
---
duration_ms: 17.607273
type: 'test'
...
# Subtest: broker process: launch ops authorize role.launch, record refusals and end runs
ok 7 - broker process: launch ops authorize role.launch, record refusals and end runs
---
duration_ms: 215.095057
type: 'test'
...
1..7
# tests 7
# suites 0
# pass 7
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 401.517194
@@ -0,0 +1 @@
["timeout", "-k", "10", "130", "node", "--test", "--test-reporter=tap", "packages/bus/tests/fire-revokes-grants.test.mjs"]
@@ -0,0 +1,142 @@
TAP version 13
# Subtest: row 281 T2: a fire with host grants on two hosts and a Gitea grant answers with a job, then revokes all three
ok 1 - row 281 T2: a fire with host grants on two hosts and a Gitea grant answers with a job, then revokes all three
---
duration_ms: 272.794411
type: 'test'
...
# Subtest: row 281 T3 (sage-2575): a delete with grants takes two requests: the first starts the job, the next completes
ok 2 - row 281 T3 (sage-2575): a delete with grants takes two requests: the first starts the job, the next completes
---
duration_ms: 276.243311
type: 'test'
...
# Subtest: row 281 T3b (Q2): a delete whose job refuses on host B; the retry refuses grant-revoke-failed and revokes only B and Gitea
ok 3 - row 281 T3b (Q2): a delete whose job refuses on host B; the retry refuses grant-revoke-failed and revokes only B and Gitea
---
duration_ms: 237.090531
type: 'test'
...
# Subtest: row 281 T3b: B cleared by hand with hosts.revoke; the next delete starts a job for Gitea and the leftover line only
ok 4 - row 281 T3b: B cleared by hand with hosts.revoke; the next delete starts a job for Gitea and the leftover line only
---
duration_ms: 215.967643
type: 'test'
...
# Subtest: row 281 T3c (sage-2575 condition 4): a delete of an instance with no grant completes in one request
ok 5 - row 281 T3c (sage-2575 condition 4): a delete of an instance with no grant completes in one request
---
duration_ms: 63.369791
type: 'test'
...
# Subtest: row 281 T4: host B unreachable in a fire: the job refuses, A stays revoked, B and Gitea untouched; a repeat completes
ok 6 - row 281 T4: host B unreachable in a fire: the job refuses, A stays revoked, B and Gitea untouched; a repeat completes
---
duration_ms: 209.563263
type: 'test'
...
# Subtest: row 281 T4b (Q1): a line a manual hosts.revoke left on C is removed by the fire, with its close
ok 7 - row 281 T4b (Q1): a line a manual hosts.revoke left on C is removed by the fire, with its close
---
duration_ms: 84.643578
type: 'test'
...
# Subtest: row 281 T4b (Q1): with C unreachable, the fire completes and names the line in grantsLeft
ok 8 - row 281 T4b (Q1): with C unreachable, the fire completes and names the line in grantsLeft
---
duration_ms: 91.402587
type: 'test'
...
# Subtest: row 281 T5: Gitea's admin token can't be checked: the job refuses with the Gitea grant intact
ok 9 - row 281 T5: Gitea's admin token can't be checked: the job refuses with the Gitea grant intact
---
duration_ms: 112.342702
type: 'test'
...
# Subtest: row 281 T5b (N1): a failed token DELETE refuses gitea-left; the repeat retries only this agent's entries
ok 10 - row 281 T5b (N1): a failed token DELETE refuses gitea-left; the repeat retries only this agent's entries
---
duration_ms: 305.089464
type: 'test'
...
# Subtest: row 281 T6 (sage-2574): a host decision approved before the fire and run after it ends revoked, with nothing applied
ok 11 - row 281 T6 (sage-2574): a host decision approved before the fire and run after it ends revoked, with nothing applied
---
duration_ms: 76.455592
type: 'test'
...
# Subtest: row 281 T6b (sage-2574): a Gitea decision approved before the fire and run after it ends revoked before any Gitea write
ok 12 - row 281 T6b (sage-2574): a Gitea decision approved before the fire and run after it ends revoked before any Gitea write
---
duration_ms: 114.809436
type: 'test'
...
# Subtest: row 281 T6c: a host executor in flight aborts and ends revoked; a Gitea executor in flight is awaited and leaves no token
ok 13 - row 281 T6c: a host executor in flight aborts and ends revoked; a Gitea executor in flight is awaited and leaves no token
---
duration_ms: 277.202762
type: 'test'
...
# Subtest: row 281 T6d (B1): undecided host and Gitea decisions are in the set, and approved after the fire both end revoked
ok 14 - row 281 T6d (B1): undecided host and Gitea decisions are in the set, and approved after the fire both end revoked
---
duration_ms: 110.496226
type: 'test'
...
# Subtest: row 281 T6e (B1): a grant raise refuses instance-fired while firing and after the fire, goes through after a rehire, and refuses grant-revoke-running during a delete job
ok 15 - row 281 T6e (B1): a grant raise refuses instance-fired while firing and after the fire, goes through after a rehire, and refuses grant-revoke-running during a delete job
---
duration_ms: 130.795425
type: 'test'
...
# Subtest: row 281 T7: an instance with no grant fires as today, synchronously, with the same events
ok 16 - row 281 T7: an instance with no grant fires as today, synchronously, with the same events
---
duration_ms: 67.699061
type: 'test'
...
# Subtest: row 281 T9 (B3): one step G per agent; the manual verbs refuse while it runs, and sweep names it running
ok 17 - row 281 T9 (B3): one step G per agent; the manual verbs refuse while it runs, and sweep names it running
---
duration_ms: 272.422397
type: 'test'
...
# Subtest: row 281 T10 (B2): the fire and the delete answer while their jobs are held, and the broker answers other verbs
ok 18 - row 281 T10 (B2): the fire and the delete answer while their jobs are held, and the broker answers other verbs
---
duration_ms: 237.283514
type: 'test'
...
# Subtest: row 281 T11 (C1): a fire's job completes after the chief's run ends and processing halts
ok 19 - row 281 T11 (C1): a fire's job completes after the chief's run ends and processing halts
---
duration_ms: 97.48128
type: 'test'
...
# Subtest: row 281 T12 (C1, N7): a step B refusal in the job is fire.failed, and the repeat runs B and C synchronously
ok 20 - row 281 T12 (C1, N7): a step B refusal in the job is fire.failed, and the repeat runs B and C synchronously
---
duration_ms: 87.059613
type: 'test'
...
# Subtest: row 281 T13 (N4): a restart records each held job interrupted once, with one message each; an ended job gets none
ok 21 - row 281 T13 (N4): a restart records each held job interrupted once, with one message each; an ended job gets none
---
duration_ms: 142.841798
type: 'test'
...
# Subtest: row 281 T14 (N1, sage-2653): a host removed under an undecided decision stops the fire on host-unknown; the human's no closes it, and the repeat fire has no job
ok 22 - row 281 T14 (N1, sage-2653): a host removed under an undecided decision stops the fire on host-unknown; the human's no closes it, and the repeat fire has no job
---
duration_ms: 63.476255
type: 'test'
...
1..22
# tests 22
# suites 0
# pass 22
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 3657.73187
@@ -0,0 +1 @@
["timeout", "-k", "10", "146", "node", "--test", "--test-reporter=tap", "packages/bus/tests/gitea-grant.test.mjs"]
@@ -0,0 +1,304 @@
TAP version 13
# Subtest: versionAtLeast compares numbers and refuses a prerelease of 1.27.0
ok 1 - versionAtLeast compares numbers and refuses a prerelease of 1.27.0
---
duration_ms: 1.389107
type: 'test'
...
# Subtest: X-G1: a raise that fails a check refuses and stores nothing
ok 2 - X-G1: a raise that fails a check refuses and stores nothing
---
duration_ms: 95.809829
type: 'test'
...
# Subtest: X-G1: a creative role, a role without identity and a missing or due slot refuse at raise
ok 3 - X-G1: a creative role, a role without identity and a missing or due slot refuse at raise
---
duration_ms: 182.125991
type: 'test'
...
# Subtest: X-G2: admin set refuses each failed check and writes nothing, then writes the slot once
ok 4 - X-G2: admin set refuses each failed check and writes nothing, then writes the slot once
---
duration_ms: 149.412704
type: 'test'
...
# Subtest: X-G3 to X-G8: an approve makes the user, mints the token, forks, checks reach and writes the file, record and grant.applied
ok 5 - X-G3 to X-G8: an approve makes the user, mints the token, forks, checks reach and writes the file, record and grant.applied
---
duration_ms: 107.86787
type: 'test'
...
# Subtest: X-G4: a user this stack did not make, an admin, a disabled user and a remade user each refuse
ok 6 - X-G4: a user this stack did not make, an admin, a disabled user and a remade user each refuse
---
duration_ms: 329.856108
type: 'test'
...
# Subtest: X-G6 and X-G8: the user and mint steps are written before their calls, and each result after its call
ok 7 - X-G6 and X-G8: the user and mint steps are written before their calls, and each result after its call
---
duration_ms: 102.351221
type: 'test'
...
# Subtest: X-G4: a fork by the seat user of another repository than the project refuses fork-foreign
ok 8 - X-G4: a fork by the seat user of another repository than the project refuses fork-foreign
---
duration_ms: 81.909237
type: 'test'
...
# Subtest: X-G5: a failure after the mint deletes the token, unloads nothing it did not load and leaves no file
ok 9 - X-G5: a failure after the mint deletes the token, unloads nothing it did not load and leaves no file
---
duration_ms: 169.711113
type: 'test'
...
# Subtest: X-G5: a token delete that fails is left at Gitea, shown by status and taken by sweep
ok 10 - X-G5: a token delete that fails is left at Gitea, shown by status and taken by sweep
---
duration_ms: 146.658802
type: 'test'
...
# Subtest: X-G5: a mint that fails deletes by name, and a refusal at step 0 leaves the decision unspent
ok 11 - X-G5: a mint that fails deletes by name, and a refusal at step 0 leaves the decision unspent
---
duration_ms: 222.329644
type: 'test'
...
# Subtest: X-G5: an agent held for an unknown token is refused at step 0 with no Gitea call
ok 12 - X-G5: an agent held for an unknown token is refused at step 0 with no Gitea call
---
duration_ms: 93.51614
type: 'test'
...
# Subtest: X-G5 and X-G9 (step 7): a rotation whose old-token delete fails stays applied with the old id left
ok 13 - X-G5 and X-G9 (step 7): a rotation whose old-token delete fails stays applied with the old id left
---
duration_ms: 246.960267
type: 'test'
...
# Subtest: X-G10: in a rotation the store file holds the new token before the old one is deleted
ok 14 - X-G10: in a rotation the store file holds the new token before the old one is deleted
---
duration_ms: 195.949625
type: 'test'
...
# Subtest: X-G6: a rotation cut before the rename settles back at once, and the old token stays live
ok 15 - X-G6: a rotation cut before the rename settles back at once, and the old token stays live
---
duration_ms: 176.09133
type: 'test'
...
# Subtest: X-G6: a rotation whose step 8 write fails is settle-pending, and a restart settles it forward
ok 16 - X-G6: a rotation whose step 8 write fails is settle-pending, and a restart settles it forward
---
duration_ms: 228.479229
type: 'test'
...
# Subtest: X-G6: a restart settles an open rotation back when the file still holds the old token
ok 17 - X-G6: a restart settles an open rotation back when the file still holds the old token
---
duration_ms: 139.405206
type: 'test'
...
# Subtest: X-G6: a restart settles an open rotation forward when the file holds the new token
ok 18 - X-G6: a restart settles an open rotation forward when the file holds the new token
---
duration_ms: 136.294865
type: 'test'
...
# Subtest: X-G6: a 401 on the file token loses the grant: both tokens go, the record goes and memory unloads
ok 19 - X-G6: a 401 on the file token loses the grant: both tokens go, the record goes and memory unloads
---
duration_ms: 145.462482
type: 'test'
...
# Subtest: X-G6: a 403, 404, 500, a hang and a dropped socket each leave the rotation settle-pending with nothing deleted
ok 20 - X-G6: a 403, 404, 500, a hang and a dropped socket each leave the rotation settle-pending with nothing deleted
---
duration_ms: 1045.299273
type: 'test'
...
# Subtest: X-G6: a file token no grant minted is held; the next restart says so again; a revoke clears it and takes both ids
ok 21 - X-G6: a file token no grant minted is held; the next restart says so again; a revoke clears it and takes both ids
---
duration_ms: 163.866838
type: 'test'
...
# Subtest: N9: a revoke of an open rotation, then a restart: no settle, no Gitea call and no message
ok 22 - N9: a revoke of an open rotation, then a restart: no settle, no Gitea call and no message
---
duration_ms: 145.943814
type: 'test'
...
# Subtest: N9: a 404 on a delete by id counts as done
ok 23 - N9: a 404 on a delete by id counts as done
---
duration_ms: 142.881057
type: 'test'
...
# Subtest: X-G6: a restart undoes each step a killed child left, and spends an approved unspent decision
ok 24 - X-G6: a restart undoes each step a killed child left, and spends an approved unspent decision
---
duration_ms: 470.571476
type: 'test'
...
# Subtest: X-G6: a restart with no admin slot leaves the user an orphan and the token left
ok 25 - X-G6: a restart with no admin slot leaves the user an orphan and the token left
---
duration_ms: 60.248186
type: 'test'
...
# Subtest: X-G7: a change to the definition, identity, publish remotes or admin slot after the raise ends decision-mismatch
ok 26 - X-G7: a change to the definition, identity, publish remotes or admin slot after the raise ends decision-mismatch
---
duration_ms: 118.79729
type: 'test'
...
# Subtest: X-G7 and X-G9: an admin rotate voids open decisions, and rotate --finish deletes what was left
ok 27 - X-G7 and X-G9: an admin rotate voids open decisions, and rotate --finish deletes what was left
---
duration_ms: 114.580002
type: 'test'
...
# Subtest: X-G9: a rotate whose name is taken refuses and writes nothing; remove takes the slot away
ok 28 - X-G9: a rotate whose name is taken refuses and writes nothing; remove takes the slot away
---
duration_ms: 67.752452
type: 'test'
...
# Subtest: X-G9: a slot past its rotate-by date refuses a run at step 0, leaving the decision unspent
ok 29 - X-G9: a slot past its rotate-by date refuses a run at step 0, leaving the decision unspent
---
duration_ms: 57.538143
type: 'test'
...
# Subtest: X-G11: run refuses every caller but the human, an unapproved, a spent and a busy decision
ok 30 - X-G11: run refuses every caller but the human, an unapproved, a spent and a busy decision
---
duration_ms: 115.642626
type: 'test'
...
# Subtest: kill switch (plan :16): while halted the chief still reads grants.status, and an agent grants.revoke refuses
ok 31 - kill switch (plan :16): while halted the chief still reads grants.status, and an agent grants.revoke refuses
---
duration_ms: 112.116641
type: 'test'
...
# Subtest: X-G11: a revoke while the executor runs aborts it and the grant ends revoked
ok 32 - X-G11: a revoke while the executor runs aborts it and the grant ends revoked
---
duration_ms: 111.549218
type: 'test'
...
# Subtest: X-G11: a revoke unloads memory and removes the file before its Gitea delete
ok 33 - X-G11: a revoke unloads memory and removes the file before its Gitea delete
---
duration_ms: 137.407006
type: 'test'
...
# Subtest: X-G11: a revoke during a rotation step 7 ends it revoked, and step 8 writes no record back
ok 34 - X-G11: a revoke during a rotation step 7 ends it revoked, and step 8 writes no record back
---
duration_ms: 205.333394
type: 'test'
...
# Subtest: X-G11: a revoke while a sweep settles a rotation, forward or back, ends it revoked with no record
ok 35 - X-G11: a revoke while a sweep settles a rotation, forward or back, ends it revoked with no record
---
duration_ms: 361.315899
type: 'test'
...
# Subtest: X-G11: a revoke during a settle whoami that finds a foreign token ends it revoked, not held
ok 36 - X-G11: a revoke during a settle whoami that finds a foreign token ends it revoked, not held
---
duration_ms: 190.635822
type: 'test'
...
# Subtest: X-G11: a revoke during a settle whoami that gets a 401 ends it revoked, not lost
ok 37 - X-G11: a revoke during a settle whoami that gets a 401 ends it revoked, not lost
---
duration_ms: 185.480554
type: 'test'
...
# Subtest: X-G12: a token that reaches wider than its forks fails with the repository named
ok 38 - X-G12: a token that reaches wider than its forks fails with the repository named
---
duration_ms: 415.656657
type: 'test'
...
# Subtest: X-G12: reach is paged by X-Total-Count and a count that does not add up refuses
ok 39 - X-G12: reach is paged by X-Total-Count and a count that does not add up refuses
---
duration_ms: 306.65068
type: 'test'
...
# Subtest: X-G13: an agent cannot record a grant event, and the trigger refuses one from any writer but the grant writer
ok 40 - X-G13: an agent cannot record a grant event, and the trigger refuses one from any writer but the grant writer
---
duration_ms: 79.581731
type: 'test'
...
# Subtest: X-G14: credentials delete fires the user: tokens go, login is prohibited, and grant.revoke.closed records it
ok 41 - X-G14: credentials delete fires the user: tokens go, login is prohibited, and grant.revoke.closed records it
---
duration_ms: 275.310948
type: 'test'
...
# Subtest: X-G14: a fire whose token delete or login PATCH fails lands it in serviceLeft
ok 42 - X-G14: a fire whose token delete or login PATCH fails lands it in serviceLeft
---
duration_ms: 170.129525
type: 'test'
...
# Subtest: X-G14: a fire whose user is gone or remade skips the fire steps and says why
ok 43 - X-G14: a fire whose user is gone or remade skips the fire steps and says why
---
duration_ms: 305.836811
type: 'test'
...
# Subtest: X-G14: a sweep retries a fire only for the user it fired: a remade or gone user is skipped and named
ok 44 - X-G14: a sweep retries a fire only for the user it fired: a remade or gone user is skipped and named
---
duration_ms: 411.493295
type: 'test'
...
# Subtest: X-G14: a revoke Gitea cannot reach stays open, and a restart closes it
ok 45 - X-G14: a revoke Gitea cannot reach stays open, and a restart closes it
---
duration_ms: 148.33404
type: 'test'
...
# Subtest: row 281 T8: a tester grants.revoke refuses tester-dev-only once bus.tester is off; the human revoke keeps its records and starts no job
ok 46 - row 281 T8: a tester grants.revoke refuses tester-dev-only once bus.tester is off; the human revoke keeps its records and starts no job
---
duration_ms: 166.82091
type: 'test'
...
# Subtest: X-G15: look-alike commit steps outside the grant writer are ignored at start, by revoke and by status
ok 47 - X-G15: look-alike commit steps outside the grant writer are ignored at start, by revoke and by status
---
duration_ms: 137.700847
type: 'test'
...
# Subtest: X-G15: a look-alike spend under another kind with the grant writer pair is not an open grant
ok 48 - X-G15: a look-alike spend under another kind with the grant writer pair is not an open grant
---
duration_ms: 46.211743
type: 'test'
...
# Subtest: status lists the slot, users, grants and nothing secret, and every grants verb needs service gitea
ok 49 - status lists the slot, users, grants and nothing secret, and every grants verb needs service gitea
---
duration_ms: 142.352075
type: 'test'
...
1..49
# tests 49
# suites 0
# pass 49
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 9468.066693
@@ -0,0 +1 @@
["timeout", "-k", "10", "122", "node", "--test", "--test-reporter=tap", "packages/bus/tests/gitea-migration.test.mjs"]
@@ -0,0 +1,40 @@
TAP version 13
# Subtest: 3j copy migrates to 3k: every row kept, and sqlite_master gains only the two tables and their keys
ok 1 - 3j copy migrates to 3k: every row kept, and sqlite_master gains only the two tables and their keys
---
duration_ms: 92.57512
type: 'test'
...
# Subtest: a 3j→3k step that fails partway leaves the store at 3j with every row and the schema intact
ok 2 - a 3j→3k step that fails partway leaves the store at 3j with every row and the schema intact
---
duration_ms: 102.278568
type: 'test'
...
# Subtest: the 3j engine refuses a migrated store, migrating or not, and leaves it as it was
ok 3 - the 3j engine refuses a migrated store, migrating or not, and leaves it as it was
---
duration_ms: 91.506598
type: 'test'
...
# Subtest: gitea_users: one user per business and agent, an id above 0, a 16-hex nonce and a real decision
ok 4 - gitea_users: one user per business and agent, an id above 0, a 16-hex nonce and a real decision
---
duration_ms: 11.936654
type: 'test'
...
# Subtest: gitea_grants: one grant per agent, a projects array, a token id above 0, and only for a recorded user
ok 5 - gitea_grants: one grant per agent, a projects array, a token id above 0, and only for a recorded user
---
duration_ms: 15.826027
type: 'test'
...
1..5
# tests 5
# suites 0
# pass 5
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 400.3477
@@ -0,0 +1 @@
["timeout", "-k", "10", "185", "node", "--test", "--test-reporter=tap", "packages/bus/tests/grant-executor.test.mjs"]
@@ -0,0 +1,262 @@
TAP version 13
# Subtest: row 280: an occupied TCP port is attempted, refused, and retried with our sshd
ok 1 - row 280: an occupied TCP port is attempted, refused, and retried with our sshd
---
duration_ms: 98.447592
type: 'test'
...
# Subtest: row 280: every injected picker sample is unprivileged and outside the ephemeral range
ok 2 - row 280: every injected picker sample is unprivileged and outside the ephemeral range
---
duration_ms: 0.370868
type: 'test'
...
# Subtest: G7: an Approve installs the tagged line, logs in with the new key, and writes the key file, record and grant.applied
ok 3 - G7: an Approve installs the tagged line, logs in with the new key, and writes the key file, record and grant.applied
---
duration_ms: 708.508681
type: 'test'
...
# Subtest: G7: a commands change on a live grant updates the record in one transaction and keeps the key and line
ok 4 - G7: a commands change on a live grant updates the record in one transaction and keeps the key and line
---
duration_ms: 560.863117
type: 'test'
...
# Subtest: G8: a failure at install or verify removes the line and leaves no record, key file or reference
ok 5 - G8: a failure at install or verify removes the line and leaves no record, key file or reference
---
duration_ms: 1559.84374
type: 'test'
...
# Subtest: G8: a failed remove adds hostLineLeft and tells the human to sweep
ok 6 - G8: a failed remove adds hostLineLeft and tells the human to sweep
---
duration_ms: 655.562344
type: 'test'
...
# Subtest: G8: a failure in step 5 before commit unlinks the key file, drops the reference and removes the line
ok 7 - G8: a failure in step 5 before commit unlinks the key file, drops the reference and removes the line
---
duration_ms: 675.455365
type: 'test'
...
# Subtest: G8: a store fault in the commit transaction ends host-failed with no record, key file, reference or line
ok 8 - G8: a store fault in the commit transaction ends host-failed with no record, key file, reference or line
---
duration_ms: 701.212144
type: 'test'
...
# Subtest: G8: a failed step 1 check spends the decision and runs nothing remote
ok 9 - G8: a failed step 1 check spends the decision and runs nothing remote
---
duration_ms: 88.854318
type: 'test'
...
# Subtest: G9: a registry, definition or commands change between raise and Approve ends decision-mismatch before any remote step
ok 10 - G9: a registry, definition or commands change between raise and Approve ends decision-mismatch before any remote step
---
duration_ms: 544.508001
type: 'test'
...
# Subtest: G9: an agent no longer a role or no longer declaring host ends with its code, spent
ok 11 - G9: an agent no longer a role or no longer declaring host ends with its code, spent
---
duration_ms: 69.685141
type: 'test'
...
# Subtest: G10: a second start refuses decision-consumed, and an unresolved or agent-resolved decision not-authorized, writing nothing
ok 12 - G10: a second start refuses decision-consumed, and an unresolved or agent-resolved decision not-authorized, writing nothing
---
duration_ms: 534.920885
type: 'test'
...
# Subtest: G15: no event, message or decision holds the private key
ok 13 - G15: no event, message or decision holds the private key
---
duration_ms: 536.771599
type: 'test'
...
# Subtest: G23: a revoke during install ends grant.failed revoked with no key file, no grant and no line
ok 14 - G23: a revoke during install ends grant.failed revoked with no key file, no grant and no line
---
duration_ms: 533.359006
type: 'test'
...
# Subtest: G23 (row 249): an add that writes after an abort's remove leaves hostLineLeft until the sweep
ok 15 - G23 (row 249): an add that writes after an abort's remove leaves hostLineLeft until the sweep
---
duration_ms: 869.455692
type: 'test'
...
# Subtest: G23 (row 249): an add that writes after a timed-out install's remove leaves hostLineLeft until the sweep
ok 16 - G23 (row 249): an add that writes after a timed-out install's remove leaves hostLineLeft until the sweep
---
duration_ms: 876.092586
type: 'test'
...
# Subtest: G23: a revoke recorded after the raise and before the start ends step 1 revoked, and a held slot ends host-busy
ok 17 - G23: a revoke recorded after the raise and before the start ends step 1 revoked, and a held slot ends host-busy
---
duration_ms: 529.412732
type: 'test'
...
# Subtest: G24: names at 64 characters with . and _ give distinct tags of the fixed length
ok 18 - G24: names at 64 characters with . and _ give distinct tags of the fixed length
---
duration_ms: 0.638856
type: 'test'
...
# Subtest: G11: a restart after install removes the line, then ends interrupted with the tag, holding the slot until then
ok 19 - G11: a restart after install removes the line, then ends interrupted with the tag, holding the slot until then
---
duration_ms: 226.24599
type: 'test'
...
# Subtest: G11: a restart after a new key's commit, with the key file written, ends with no key file, record, reference or line
ok 20 - G11: a restart after a new key's commit, with the key file written, ends with no key file, record, reference or line
---
duration_ms: 221.761798
type: 'test'
...
# Subtest: G11: a restart after a commands change's commit leaves the record as it was and asks nothing of the host
ok 21 - G11: a restart after a commands change's commit leaves the record as it was and asks nothing of the host
---
duration_ms: 526.137797
type: 'test'
...
# Subtest: G11 (B2): a restart before step 1, spent or not yet spent, ends interrupted and nothing runs later
ok 22 - G11 (B2): a restart before step 1, spent or not yet spent, ends interrupted and nothing runs later
---
duration_ms: 74.81192
type: 'test'
...
# Subtest: G11: a remote undo that fails ends interrupted with hostLineLeft and the sweep hint
ok 23 - G11: a remote undo that fails ends interrupted with hostLineLeft and the sweep hint
---
duration_ms: 277.315357
type: 'test'
...
# Subtest: G11: a restart leaves a finished grant alone, and the reconcile adds nothing for it
ok 24 - G11: a restart leaves a finished grant alone, and the reconcile adds nothing for it
---
duration_ms: 520.235108
type: 'test'
...
# Subtest: N1 (G27): the start sweep unlinks host.<id> files with no record in loaded businesses only, and refuses a store dir that is not private
ok 25 - N1 (G27): the start sweep unlinks host.<id> files with no record in loaded businesses only, and refuses a store dir that is not private
---
duration_ms: 8.053326
type: 'test'
...
# Subtest: G12: the human's hosts.revoke deletes the record, the key file, the reference and the line, with a closed marker
ok 26 - G12: the human's hosts.revoke deletes the record, the key file, the reference and the line, with a closed marker
---
duration_ms: 669.479405
type: 'test'
...
# Subtest: G12 (N4): a revoke with no record still removes the computed tag's line, with granted false; bad args refuse
ok 27 - G12 (N4): a revoke with no record still removes the computed tag's line, with granted false; bad args refuse
---
duration_ms: 220.747329
type: 'test'
...
# Subtest: G13: a revoke during install aborts the executor, which ends revoked, and the line goes
ok 28 - G13: a revoke during install aborts the executor, which ends revoked, and the line goes
---
duration_ms: 539.581667
type: 'test'
...
# Subtest: G26: the human, the assistant and the tester revoke; the chief and a pm refuse; sweep is the human's or the tester's
ok 29 - G26: the human, the assistant and the tester revoke; the chief and a pm refuse; sweep is the human's or the tester's
---
duration_ms: 516.808358
type: 'test'
...
# Subtest: row 281 T8: a tester hosts.revoke refuses tester-dev-only once bus.tester is off, and a human revoke writes no job records
ok 30 - row 281 T8: a tester hosts.revoke refuses tester-dev-only once bus.tester is off, and a human revoke writes no job records
---
duration_ms: 688.408575
type: 'test'
...
# Subtest: G27: a restart after step 1 sweeps the key file and runs step 3 once the bus is up; status shows the revoke until then
ok 31 - G27: a restart after step 1 sweeps the key file and runs step 3 once the bus is up; status shows the revoke until then
---
duration_ms: 693.247599
type: 'test'
...
# Subtest: G27: after step 2 with the host down, the restart closes the marker with hostLineLeft; a marker without a revoke id is not reopened
ok 32 - G27: after step 2 with the host down, the restart closes the marker with hostLineLeft; a marker without a revoke id is not reopened
---
duration_ms: 988.184839
type: 'test'
...
# Subtest: G27: a key file a revoke could not unlink is reported left and goes at the next start
ok 33 - G27: a key file a revoke could not unlink is reported left and goes at the next start
---
duration_ms: 702.203491
type: 'test'
...
# Subtest: G28: a commands change, then a revoke, then a restart leave no record, key, reference or line
ok 34 - G28: a commands change, then a revoke, then a restart leave no record, key, reference or line
---
duration_ms: 729.536724
type: 'test'
...
# Subtest: G24 (B4): hosts.sweep removes only this business's recorded tags no live grant holds, and records what it left
ok 35 - G24 (B4): hosts.sweep removes only this business's recorded tags no live grant holds, and records what it left
---
duration_ms: 998.021303
type: 'test'
...
# Subtest: G12: the local steps finish before the host step, so a host that hangs leaves the agent no access
ok 36 - G12: the local steps finish before the host step, so a host that hangs leaves the agent no access
---
duration_ms: 711.78963
type: 'test'
...
# Subtest: G23 (X5): a revoke right after the spend reaches the executor's claim, so the grant ends revoked
ok 37 - G23 (X5): a revoke right after the spend reaches the executor's claim, so the grant ends revoked
---
duration_ms: 214.684402
type: 'test'
...
# Subtest: G23 (X5): a revoke that lands as verify returns ends revoked with no record, key file or line
ok 38 - G23 (X5): a revoke that lands as verify returns ends revoked with no record, key file or line
---
duration_ms: 653.002715
type: 'test'
...
# Subtest: G13: a revoke whose host remove fails still drops the record and key, and reports the line left for a sweep
ok 39 - G13: a revoke whose host remove fails still drops the record and key, and reports the line left for a sweep
---
duration_ms: 659.933018
type: 'test'
...
# Subtest: G22: enroll, check, grant, host.run, a commands change the next host.run uses, and a revoke that kills a run in flight
ok 40 - G22: enroll, check, grant, host.run, a commands change the next host.run uses, and a revoke that kills a run in flight
---
duration_ms: 1185.126402
type: 'test'
...
# Subtest: mos-1163: a grant whose agent became a creative role after the raise ends host-creative-role at step 1, spent, with nothing remote
ok 41 - mos-1163: a grant whose agent became a creative role after the raise ends host-creative-role at step 1, spent, with nothing remote
---
duration_ms: 66.900793
type: 'test'
...
# Subtest: sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record
ok 42 - sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record
---
duration_ms: 513.6272
type: 'test'
...
1..42
# tests 42
# suites 0
# pass 42
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 22245.10321
@@ -0,0 +1 @@
["timeout", "-k", "10", "122", "node", "--test", "--test-reporter=tap", "packages/bus/tests/grant-migration.test.mjs"]
@@ -0,0 +1,46 @@
TAP version 13
# Subtest: 3i copy migrates to 3j: every row kept, and sqlite_master gains only the two tables, their keys and the guard
ok 1 - 3i copy migrates to 3j: every row kept, and sqlite_master gains only the two tables, their keys and the guard
---
duration_ms: 87.006874
type: 'test'
...
# Subtest: a 3i→3j step that fails partway leaves the store at 3i with every row and the schema intact
ok 2 - a 3i→3j step that fails partway leaves the store at 3i with every row and the schema intact
---
duration_ms: 96.365918
type: 'test'
...
# Subtest: the 3i engine refuses a migrated store, migrating or not, and leaves it as it was
ok 3 - the 3i engine refuses a migrated store, migrating or not, and leaves it as it was
---
duration_ms: 89.116681
type: 'test'
...
# Subtest: A22b, sage-1703: a session-written grant.* row from before the step survives it, and the grant readers ignore it
ok 4 - A22b, sage-1703: a session-written grant.* row from before the step survives it, and the grant readers ignore it
---
duration_ms: 72.098372
type: 'test'
...
# Subtest: the guard: a grant.* action or operation on action.allowed needs the (NULL, grant) actor
ok 5 - the guard: a grant.* action or operation on action.allowed needs the (NULL, grant) actor
---
duration_ms: 14.5452
type: 'test'
...
# Subtest: hosts: one record per business and host, a ready host has its installer and check, grants need the host
ok 6 - hosts: one record per business and host, a ready host has its installer and check, grants need the host
---
duration_ms: 11.867593
type: 'test'
...
1..6
# tests 6
# suites 0
# pass 6
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 463.588911
@@ -0,0 +1 @@
["timeout", "-k", "10", "122", "node", "--test", "--test-reporter=tap", "packages/bus/tests/lifecycle-revoke.test.mjs"]
@@ -0,0 +1,59 @@
TAP version 13
# organization: {"event":"reload-needs-restart","business":"demo"}
# Subtest: T20 fire: a revoke that fails stops the fire with the file unchanged; one that succeeds revokes, keeps the directory and names the services outside the store
ok 1 - T20 fire: a revoke that fails stops the fire with the file unchanged; one that succeeds revokes, keeps the directory and names the services outside the store
---
duration_ms: 93.274675
type: 'test'
...
# Subtest: T20 fire: an instance already delisted still has its tokens revoked and the file is left alone
ok 2 - T20 fire: an instance already delisted still has its tokens revoked and the file is left alone
---
duration_ms: 57.676362
type: 'test'
...
# Subtest: T20 fire: with no entry in the running bus, a token on disk refuses and an empty store goes on
ok 3 - T20 fire: with no entry in the running bus, a token on disk refuses and an empty store goes on
---
duration_ms: 63.340351
type: 'test'
...
# Subtest: T20 delete: a revoke that fails keeps the file; one that succeeds clears the store, deletes, and names the tracker bot
ok 4 - T20 delete: a revoke that fails keeps the file; one that succeeds clears the store, deletes, and names the tracker bot
---
duration_ms: 79.425748
type: 'test'
...
# Subtest: T20 delete: with no entry in the running bus, a token file is cleared and the delete goes on; a file reference refuses
ok 5 - T20 delete: with no entry in the running bus, a token file is cleared and the delete goes on; a file reference refuses
---
duration_ms: 63.405744
type: 'test'
...
# Subtest: T21 delete: a write between the raise and the take makes the delete refuse revision-conflict before it revokes anything
ok 6 - T21 delete: a write between the raise and the take makes the delete refuse revision-conflict before it revokes anything
---
duration_ms: 58.127385
type: 'test'
...
# Subtest: row 281 T1 fire: a host.<id> or granted gitea file in the store refuses step B credential-revoke-failed, file unchanged
ok 7 - row 281 T1 fire: a host.<id> or granted gitea file in the store refuses step B credential-revoke-failed, file unchanged
---
duration_ms: 55.893818
type: 'test'
...
# Subtest: row 281 T1 start: a host grant record whose key file is gone starts and reads not-issued
ok 8 - row 281 T1 start: a host grant record whose key file is gone starts and reads not-issued
---
duration_ms: 62.55636
type: 'test'
...
1..8
# tests 8
# suites 0
# pass 8
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 671.935182
@@ -0,0 +1 @@
["timeout", "-k", "10", "122", "node", "--test", "--test-reporter=tap", "packages/bus/tests/message-filter.test.mjs"]
@@ -0,0 +1,46 @@
TAP version 13
# Subtest: trail on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester
ok 1 - trail on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester
---
duration_ms: 28.093807
type: 'test'
...
# Subtest: replies on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester
ok 2 - replies on a hidden message id answers exactly as on an unknown id, for the owner, a reader and the tester
---
duration_ms: 24.35033
type: 'test'
...
# Subtest: trail on a decision keeps the decision and drops the user thread messages, their deliveries and their events
ok 3 - trail on a decision keeps the decision and drops the user thread messages, their deliveries and their events
---
duration_ms: 34.011659
type: 'test'
...
# Subtest: replies leaves out other users thread messages and still fills a page
ok 4 - replies leaves out other users thread messages and still fills a page
---
duration_ms: 172.631143
type: 'test'
...
# Subtest: messages in the business human and tester threads are not hidden (row 177 unchanged)
ok 5 - messages in the business human and tester threads are not hidden (row 177 unchanged)
---
duration_ms: 37.215228
type: 'test'
...
# Subtest: governance pin: the owner sees decisions, inbox entries, claims, tasks and project files, but not the user messages
ok 6 - governance pin: the owner sees decisions, inbox entries, claims, tasks and project files, but not the user messages
---
duration_ms: 100.140791
type: 'test'
...
1..6
# tests 6
# suites 0
# pass 6
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 482.521866
@@ -0,0 +1 @@
["timeout", "-k", "10", "121", "node", "--test", "--test-reporter=tap", "packages/bus/tests/name-migration.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: 3f copy migrates to 3g preserving every old column/row, with an empty instance_names and null to_name
ok 1 - 3f copy migrates to 3g preserving every old column/row, with an empty instance_names and null to_name
---
duration_ms: 92.115148
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 169.006815
@@ -0,0 +1 @@
["timeout", "-k", "10", "121", "node", "--test", "--test-reporter=tap", "packages/bus/tests/schema.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: v3b prototype refusals, views and append-only mutations
ok 1 - v3b prototype refusals, views and append-only mutations
---
duration_ms: 86.755157
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 137.328413
@@ -0,0 +1 @@
["timeout", "-k", "10", "122", "node", "--test", "--test-reporter=tap", "packages/bus/tests/sessions.test.mjs"]
@@ -0,0 +1,52 @@
TAP version 13
# Subtest: T1 REQ-ROLE-2: two sessions of one thread keep their own history, delivery and replies
ok 1 - T1 REQ-ROLE-2: two sessions of one thread keep their own history, delivery and replies
---
duration_ms: 47.588897
type: 'test'
...
# Subtest: T2 REQ-ROLE-2: one holder per session, generations count its claims, and a sibling session's message never reaches the other holder
ok 2 - T2 REQ-ROLE-2: one holder per session, generations count its claims, and a sibling session's message never reaches the other holder
---
duration_ms: 42.331438
type: 'test'
...
# Subtest: T2 sage-2257: a released or revoked run's retired generation refuses its approval, delivery and read, and writes nothing
ok 3 - T2 sage-2257: a released or revoked run's retired generation refuses its approval, delivery and read, and writes nothing
---
duration_ms: 57.372264
type: 'test'
...
# Subtest: session.create is idempotent on its op, refuses a reused op or a taken name, and reaches only the owner's threads
ok 4 - session.create is idempotent on its op, refuses a reused op or a taken name, and reaches only the owner's threads
---
duration_ms: 38.051812
type: 'test'
...
# Subtest: the 3l triggers keep sessions in their thread and session ids apart from thread ids
ok 5 - the 3l triggers keep sessions in their thread and session ids apart from thread ids
---
duration_ms: 71.191846
type: 'test'
...
# Subtest: T7: a 3k store migrates to 3l, each thread's default session has the thread's id, and old rows keep their seqs
ok 6 - T7: a 3k store migrates to 3l, each thread's default session has the thread's id, and old rows keep their seqs
---
duration_ms: 108.858323
type: 'test'
...
# Subtest: T7 D9: the 3k engine refuses a 3l store, migrating or not, and leaves it as it was
ok 7 - T7 D9: the 3k engine refuses a 3l store, migrating or not, and leaves it as it was
---
duration_ms: 158.172156
type: 'test'
...
1..7
# tests 7
# suites 0
# pass 7
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 606.588824
@@ -0,0 +1 @@
["timeout", "-k", "10", "121", "node", "--test", "--test-reporter=tap", "packages/bus/tests/spec-migration.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: 3e copy migrates through 3f to 3g preserving every old column/row and adding null spec citations
ok 1 - 3e copy migrates through 3f to 3g preserving every old column/row and adding null spec citations
---
duration_ms: 88.005873
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 158.79729
@@ -0,0 +1 @@
["timeout", "-k", "10", "122", "node", "--test", "--test-reporter=tap", "packages/bus/tests/tester-writes.test.mjs"]
@@ -0,0 +1,63 @@
TAP version 13
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# organization: {"event":"reload-needs-restart","business":"demo"}
# Subtest: row 175: TESTER_VERBS and the organization branch tester set are pinned
ok 1 - row 175: TESTER_VERBS and the organization branch tester set are pinned
---
duration_ms: 1.228104
type: 'test'
...
# Subtest: row 175: each of the six reads as the tester deep-equals the human read
ok 2 - row 175: each of the six reads as the tester deep-equals the human read
---
duration_ms: 66.259871
type: 'test'
...
# Subtest: row 175: W1-W3 as the tester land with receipt actor tester; the human still logs the human
ok 3 - row 175: W1-W3 as the tester land with receipt actor tester; the human still logs the human
---
duration_ms: 71.522454
type: 'test'
...
# Subtest: row 175: W2 as the tester refuses credentials, protected definitions, human, tester and bus.tester, and changes nothing
ok 4 - row 175: W2 as the tester refuses credentials, protected definitions, human, tester and bus.tester, and changes nothing
---
duration_ms: 61.180737
type: 'test'
...
# Subtest: row 175: the human-only actions refuse a tester tester-refused, and the file and store stay as they were
ok 5 - row 175: the human-only actions refuse a tester tester-refused, and the file and store stay as they were
---
duration_ms: 59.981658
type: 'test'
...
# Subtest: row 175: W4 as the tester writes by tester and keeps every name check
ok 6 - row 175: W4 as the tester writes by tester and keeps every name check
---
duration_ms: 17.177062
type: 'test'
...
# Subtest: row 175: W6 as the tester records created_by tester; the human records the human
ok 7 - row 175: W6 as the tester records created_by tester; the human records the human
---
duration_ms: 12.161058
type: 'test'
...
# Subtest: row 175: with bus.tester unset or not exactly true no tester binds, so no read or write runs
ok 8 - row 175: with bus.tester unset or not exactly true no tester binds, so no read or write runs
---
duration_ms: 45.917174
type: 'test'
...
1..8
# tests 8
# suites 0
# pass 8
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 454.820949
@@ -0,0 +1 @@
["timeout", "-k", "10", "121", "node", "--test", "--test-reporter=tap", "packages/bus/tests/thread-claims.test.mjs"]
@@ -0,0 +1,46 @@
TAP version 13
# Subtest: T1: the human and the reader see a held thread claim; agents still lists the role only
ok 1 - T1: the human and the reader see a held thread claim; agents still lists the role only
---
duration_ms: 25.941182
type: 'test'
...
# Subtest: T2: a released or revoked thread claim is not listed, though its thread has an earlier claim row
ok 2 - T2: a released or revoked thread claim is not listed, though its thread has an earlier claim row
---
duration_ms: 22.668306
type: 'test'
...
# Subtest: T3: a role session refuses human-required and the tester refuses tester-refused
ok 3 - T3: a role session refuses human-required and the tester refuses tester-refused
---
duration_ms: 19.732425
type: 'test'
...
# Subtest: T4: agents answers each session the same before and after a thread run claims
ok 4 - T4: agents answers each session the same before and after a thread run claims
---
duration_ms: 19.442262
type: 'test'
...
# Subtest: T5: the result carries neither the thread name a user wrote nor a message body
ok 5 - T5: the result carries neither the thread name a user wrote nor a message body
---
duration_ms: 18.111967
type: 'test'
...
# Subtest: T6: two held sessions of one thread list as two rows, each its session's latest claim
ok 6 - T6: two held sessions of one thread list as two rows, each its session's latest claim
---
duration_ms: 22.066921
type: 'test'
...
1..6
# tests 6
# suites 0
# pass 6
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 213.201573
@@ -0,0 +1 @@
["timeout", "-k", "10", "122", "node", "--test", "--test-reporter=tap", "packages/bus/tests/thread-migration.test.mjs"]
@@ -0,0 +1,28 @@
TAP version 13
# Subtest: REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written
ok 1 - REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written
---
duration_ms: 95.812559
type: 'test'
...
# Subtest: REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables
ok 2 - REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables
---
duration_ms: 46.076971
type: 'test'
...
# Subtest: REQ-THREAD-1: the offline command prints the kept-message counts before the ready line
ok 3 - REQ-THREAD-1: the offline command prints the kept-message counts before the ready line
---
duration_ms: 120.706356
type: 'test'
...
1..3
# tests 3
# suites 0
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 349.963327
@@ -0,0 +1 @@
["timeout", "-k", "10", "124", "node", "--test", "--test-reporter=tap", "packages/bus/tests/threads.test.mjs"]
@@ -0,0 +1,112 @@
TAP version 13
# Subtest: REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger
ok 1 - REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger
---
duration_ms: 40.152005
type: 'test'
...
# Subtest: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker
ok 2 - REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker
---
duration_ms: 64.507026
type: 'test'
...
# Subtest: REQ-MSG-1: a message to or from the assistant names its thread, or is refused
ok 3 - REQ-MSG-1: a message to or from the assistant names its thread, or is refused
---
duration_ms: 32.616267
type: 'test'
...
# Subtest: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work
ok 4 - REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work
---
duration_ms: 760.671835
type: 'test'
...
# Subtest: REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance
ok 5 - REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance
---
duration_ms: 22.131461
type: 'test'
...
# Subtest: REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder
ok 6 - REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder
---
duration_ms: 30.735682
type: 'test'
...
# Subtest: REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it
ok 7 - REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it
---
duration_ms: 41.300812
type: 'test'
...
# Subtest: REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder
ok 8 - REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder
---
duration_ms: 33.556564
type: 'test'
...
# Subtest: REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder
ok 9 - REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder
---
duration_ms: 28.199577
type: 'test'
...
# Subtest: REQ-ROLE-2 REQ-THREAD-1 Q169: a role.revoke the human approved ends every thread run of the assistant
ok 10 - REQ-ROLE-2 REQ-THREAD-1 Q169: a role.revoke the human approved ends every thread run of the assistant
---
duration_ms: 25.874138
type: 'test'
...
# Subtest: Q169 REQ-USER-2: assistant.stop ends the human's own assistant thread runs, and only the human's
ok 11 - Q169 REQ-USER-2: assistant.stop ends the human's own assistant thread runs, and only the human's
---
duration_ms: 38.551572
type: 'test'
...
# Subtest: REQ-USER-2: the human verbs refuse another owner's thread
ok 12 - REQ-USER-2: the human verbs refuse another owner's thread
---
duration_ms: 29.47369
type: 'test'
...
# Subtest: REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one
ok 13 - REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one
---
duration_ms: 24.245997
type: 'test'
...
# Subtest: REQ-ORG-2: projects and threads are named once, and the repo names a business project
ok 14 - REQ-ORG-2: projects and threads are named once, and the repo names a business project
---
duration_ms: 24.168059
type: 'test'
...
# Subtest: REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing
ok 15 - REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing
---
duration_ms: 81.784484
type: 'test'
...
# Subtest: project.create refuses a repository name without its matching repo before any write
ok 16 - project.create refuses a repository name without its matching repo before any write
---
duration_ms: 17.347949
type: 'test'
...
# Subtest: project.create keeps unrelated names with and without a repository
ok 17 - project.create keeps unrelated names with and without a repository
---
duration_ms: 12.922753
type: 'test'
...
1..17
# tests 17
# suites 0
# pass 17
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 1405.299929
@@ -0,0 +1 @@
["timeout", "-k", "10", "121", "node", "--test", "--test-reporter=tap", "packages/bus/tests/usage-migration.test.mjs"]
@@ -0,0 +1,16 @@
TAP version 13
# Subtest: REQ-LIMIT-4 3g copy migrates through 3h, 3i, 3j and 3k to 3l preserving every old column, row and sequence; new usage table is empty
ok 1 - REQ-LIMIT-4 3g copy migrates through 3h, 3i, 3j and 3k to 3l preserving every old column, row and sequence; new usage table is empty
---
duration_ms: 84.439926
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 158.042094
@@ -0,0 +1 @@
["timeout", "-k", "10", "900", "node", "--test", "--test-reporter=tap", "packages/cli/tests/access.test.mjs"]
@@ -0,0 +1,142 @@
TAP version 13
# Subtest: list prints the revision and the users
ok 1 - list prints the revision and the users
---
duration_ms: 36.418344
type: 'test'
...
# Subtest: grant writes one revision up, a receipt line, and the id in the file
ok 2 - grant writes one revision up, a receipt line, and the id in the file
---
duration_ms: 36.033768
type: 'test'
...
# Subtest: a viewer grant writes the viewer level, one revision up
ok 3 - a viewer grant writes the viewer level, one revision up
---
duration_ms: 31.803819
type: 'test'
...
# Subtest: a second write appends a second receipt and leaves the first intact
ok 4 - a second write appends a second receipt and leaves the first intact
---
duration_ms: 65.794139
type: 'test'
...
# Subtest: a stale revision refuses with revision-conflict and writes nothing
ok 5 - a stale revision refuses with revision-conflict and writes nothing
---
duration_ms: 58.183038
type: 'test'
...
# Subtest: a live holder's lock refuses and leaves the file and the lock alone
ok 6 - a live holder's lock refuses and leaves the file and the lock alone
---
duration_ms: 26.998476
type: 'test'
...
# Subtest: an empty or unreadable lock refuses, since its holder may still be writing
ok 7 - an empty or unreadable lock refuses, since its holder may still be writing
---
duration_ms: 64.366519
type: 'test'
...
# Subtest: a lock left by a dead pid refuses, names the pid, and is not reclaimed
ok 8 - a lock left by a dead pid refuses, names the pid, and is not reclaimed
---
duration_ms: 53.073637
type: 'test'
...
# Subtest: a failed rename leaves the old bytes, removes the temp file, and writes no receipt
ok 9 - a failed rename leaves the old bytes, removes the temp file, and writes no receipt
---
duration_ms: 26.105967
type: 'test'
...
# Subtest: a group-writable access file refuses with exit 3, names the file, and changes nothing
ok 10 - a group-writable access file refuses with exit 3, names the file, and changes nothing
---
duration_ms: 29.744328
type: 'test'
...
# Subtest: an agent or tester caller is refused before the context or the access file is read
ok 11 - an agent or tester caller is refused before the context or the access file is read
---
duration_ms: 1.259065
type: 'test'
...
# Subtest: the lock is mode 0600 while held and removed after a refused write
ok 12 - the lock is mode 0600 while held and removed after a refused write
---
duration_ms: 32.115779
type: 'test'
...
# Subtest: a grant naming an unknown instance is refused before any write
ok 13 - a grant naming an unknown instance is refused before any write
---
duration_ms: 31.939509
type: 'test'
...
# Subtest: a project name resolves to its id at grant time
ok 14 - a project name resolves to its id at grant time
---
duration_ms: 33.537247
type: 'test'
...
# Subtest: an unknown project name refuses before any write
ok 15 - an unknown project name refuses before any write
---
duration_ms: 43.774544
type: 'test'
...
# Subtest: revoke removes the user's grants and leaves a revision behind
ok 16 - revoke removes the user's grants and leaves a revision behind
---
duration_ms: 90.540273
type: 'test'
...
# Subtest: revoke of a user with no grant refuses and writes nothing
ok 17 - revoke of a user with no grant refuses and writes nothing
---
duration_ms: 33.988188
type: 'test'
...
# Subtest: an agent caller is refused before the bus is asked
ok 18 - an agent caller is refused before the bus is asked
---
duration_ms: 1.310469
type: 'test'
...
# Subtest: --tester is refused on every verb before the bus is asked
ok 19 - --tester is refused on every verb before the bus is asked
---
duration_ms: 1.350115
type: 'test'
...
# Subtest: a bus that refuses the human proof blocks the write
ok 20 - a bus that refuses the human proof blocks the write
---
duration_ms: 39.519025
type: 'test'
...
# Subtest: the context reads console.sso subjects and the business files, and peers stay empty
ok 21 - the context reads console.sso subjects and the business files, and peers stay empty
---
duration_ms: 31.178142
type: 'test'
...
# Subtest: the real human-cli, run from agent ancestry, refuses and writes nothing
ok 22 - the real human-cli, run from agent ancestry, refuses and writes nothing
---
duration_ms: 5173.415666
type: 'test'
...
1..22
# tests 22
# suites 0
# pass 22
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 6111.578667
@@ -0,0 +1 @@
["timeout", "-k", "10", "900", "node", "--test", "--test-reporter=tap", "packages/cli/tests/app.test.mjs"]
@@ -0,0 +1,190 @@
TAP version 13
# Subtest: every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row
ok 1 - every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row
---
duration_ms: 1532.643825
type: 'test'
...
# Subtest: width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0
ok 2 - width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0
---
duration_ms: 86.568954
type: 'test'
...
# Subtest: broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal
ok 3 - broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal
---
duration_ms: 176.767315
type: 'test'
...
# Subtest: NO_COLOR: no escape codes, except reverse video on the selected row
ok 4 - NO_COLOR: no escape codes, except reverse video on the selected row
---
duration_ms: 279.648544
type: 'test'
...
# Subtest: 1-9 shows the decide flow's own lines and question; only y resolves
ok 5 - 1-9 shows the decide flow's own lines and question; only y resolves
---
duration_ms: 70.224731
type: 'test'
...
# Subtest: the app shows the same decide text as mosaic decide
ok 6 - the app shows the same decide text as mosaic decide
---
duration_ms: 29.098485
type: 'test'
...
# Subtest: any key but y or Y at the question answers No; nothing is sent
ok 7 - any key but y or Y at the question answers No; nothing is sent
---
duration_ms: 245.313167
type: 'test'
...
# Subtest: below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3)
ok 8 - below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3)
---
duration_ms: 84.365501
type: 'test'
...
# Subtest: under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10)
ok 9 - under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10)
---
duration_ms: 322.43389
type: 'test'
...
# Subtest: a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12)
ok 10 - a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12)
---
duration_ms: 41.175879
type: 'test'
...
# Subtest: a throw while answering the question goes to crash, sends nothing and leaves no job pending
ok 11 - a throw while answering the question goes to crash, sends nothing and leaves no job pending
---
duration_ms: 26.253511
type: 'test'
...
# Subtest: type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs
ok 12 - type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs
---
duration_ms: 471.702899
type: 'test'
...
# Subtest: quitting at the question answers No and sends nothing, armed or not
ok 13 - quitting at the question answers No and sends nothing, armed or not
---
duration_ms: 53.482536
type: 'test'
...
# Subtest: a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status
ok 14 - a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status
---
duration_ms: 42.586629
type: 'test'
...
# Subtest: a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1)
ok 15 - a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1)
---
duration_ms: 57.120873
type: 'test'
...
# Subtest: a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3)
ok 16 - a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3)
---
duration_ms: 413.847115
type: 'test'
...
# Subtest: at every size the decide box shows each line y depends on, or says it is hidden
ok 17 - at every size the decide box shows each line y depends on, or says it is hidden
---
duration_ms: 10350.99217
type: 'test'
...
# Subtest: outcome unknown: the CLI's sentence, no retry, then the trail or a re-read
ok 18 - outcome unknown: the CLI's sentence, no retry, then the trail or a re-read
---
duration_ms: 85.759006
type: 'test'
...
# Subtest: refused and failed reads keep the last list, marked stale; a refused decide says refused
ok 19 - refused and failed reads keep the last list, marked stale; a refused decide says refused
---
duration_ms: 42.603372
type: 'test'
...
# Subtest: help or a detail box cut to fit keeps its last line, Esc included (Dewey)
ok 20 - help or a detail box cut to fit keeps its last line, Esc included (Dewey)
---
duration_ms: 33.51499
type: 'test'
...
# Subtest: keys: views, moving, trail of a selection, the command line, help and quit
ok 21 - keys: views, moving, trail of a selection, the command line, help and quit
---
duration_ms: 114.836631
type: 'test'
...
# Subtest: one option: the status line says Press 1, not 1-1
ok 22 - one option: the status line says Press 1, not 1-1
---
duration_ms: 29.837064
type: 'test'
...
# Subtest: no business: the app says so and :business picks one
ok 23 - no business: the app says so and :business picks one
---
duration_ms: 18.022254
type: 'test'
...
# Subtest: mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one
ok 24 - mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one
---
duration_ms: 2.738309
type: 'test'
...
# Subtest: scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted
ok 25 - scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted
---
duration_ms: 249.788143
type: 'test'
...
# Subtest: strings to keep exactly live once, in the decide flow and the transport; the app does not restate them
ok 26 - strings to keep exactly live once, in the decide flow and the transport; the app does not restate them
---
duration_ms: 0.606502
type: 'test'
...
# Subtest: decide with --note still asks; a No sends nothing
ok 27 - decide with --note still asks; a No sends nothing
---
duration_ms: 19.773121
type: 'test'
...
# Subtest: the app's business comes from a live bus host only
ok 28 - the app's business comes from a live bus host only
---
duration_ms: 1.843111
type: 'test'
...
# Subtest: runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included
ok 29 - runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included
---
duration_ms: 14.892061
type: 'test'
...
# Subtest: draw is pure: same state, same frame
ok 30 - draw is pure: same state, same frame
---
duration_ms: 1.02984
type: 'test'
...
1..30
# tests 30
# suites 0
# pass 30
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 15067.019043
@@ -0,0 +1 @@
["timeout", "-k", "10", "900", "node", "--test", "--test-reporter=tap", "packages/cli/tests/boot-status.test.mjs"]
@@ -0,0 +1,28 @@
TAP version 13
# Subtest: recordBootRefused keeps the last good load across refusals; recordBootOk clears the refusal
ok 1 - recordBootRefused keeps the last good load across refusals; recordBootOk clears the refusal
---
duration_ms: 3.362938
type: 'test'
...
# Subtest: an unknown key and a JSON syntax error each leave the bus down with the reason and path in the status
ok 2 - an unknown key and a JSON syntax error each leave the bus down with the reason and path in the status
---
duration_ms: 791.414465
type: 'test'
...
# Subtest: a missing file is recorded too, and a valid file clears the status on the next start
ok 3 - a missing file is recorded too, and a valid file clears the status on the next start
---
duration_ms: 689.6287
type: 'test'
...
1..3
# tests 3
# suites 0
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 1602.291306
@@ -0,0 +1 @@
["timeout", "-k", "10", "418", "node", "--test", "--test-reporter=tap", "packages/cli/tests/case1-accept.test.mjs"]
@@ -0,0 +1,214 @@
TAP version 13
# Subtest: row253 socket observation uses configured root, metadata and the Console peer without sending bytes
ok 1 - row253 socket observation uses configured root, metadata and the Console peer without sending bytes
---
duration_ms: 980.909502
type: 'test'
...
# Subtest: row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
ok 2 - row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
---
duration_ms: 13838.500394
type: 'test'
...
# Subtest: row253 acceptance rejects bad config and unsupported copies before talk
ok 3 - row253 acceptance rejects bad config and unsupported copies before talk
---
duration_ms: 2243.132115
type: 'test'
...
# Subtest: row253 stalled peer observation ends within its bound without leaving a reader
ok 4 - row253 stalled peer observation ends within its bound without leaving a reader
---
duration_ms: 3123.981452
type: 'test'
...
# Subtest: row253 P8 refuses both retired TCP and board listeners
ok 5 - row253 P8 refuses both retired TCP and board listeners
---
duration_ms: 2057.85553
type: 'test'
...
# Subtest: row253 C4 acceptance query inner reason holds under both sudo models
ok 6 - row253 C4 acceptance query inner reason holds under both sudo models
---
duration_ms: 11022.472843
type: 'test'
...
# Subtest: row253 C4 acceptance query outer reason discards stdout and names residual cleanup
ok 7 - row253 C4 acceptance query outer reason discards stdout and names residual cleanup
---
duration_ms: 14323.985846
type: 'test'
...
# Subtest: row253 C4 acceptance query overflow is output-limit in both models
ok 8 - row253 C4 acceptance query overflow is output-limit in both models
---
duration_ms: 626.423511
type: 'test'
...
# Subtest: row253 C4 P10 inner reason holds under both sudo models
ok 9 - row253 C4 P10 inner reason holds under both sudo models
---
duration_ms: 6213.425224
type: 'test'
...
# Subtest: row253 C4 P10 outer reason holds under both sudo models
ok 10 - row253 C4 P10 outer reason holds under both sudo models
---
duration_ms: 9596.158652
type: 'test'
...
# Subtest: row253 C4 P10 overflow reason holds under both sudo models
ok 11 - row253 C4 P10 overflow reason holds under both sudo models
---
duration_ms: 2129.054092
type: 'test'
...
# Subtest: row 195 accept: every check passing exits 0, with each P mark and counts that match the lines
ok 12 - row 195 accept: every check passing exits 0, with each P mark and counts that match the lines
---
duration_ms: 1030.711311
type: 'test'
...
# Subtest: row 195 accept: exits 1 with each F check failing alone, and its line names it
ok 13 - row 195 accept: exits 1 with each F check failing alone, and its line names it
---
duration_ms: 10363.436722
type: 'test'
...
# Subtest: row 195 accept: F3 fails on exit 0 with no reply line, and its evidence takes talk's error
ok 14 - row 195 accept: F3 fails on exit 0 with no reply line, and its evidence takes talk's error
---
duration_ms: 1822.802284
type: 'test'
...
# Subtest: row 195 accept: F1 fails on a unit that isn't active or isn't User=mosaic
ok 15 - row 195 accept: F1 fails on a unit that isn't active or isn't User=mosaic
---
duration_ms: 1663.378092
type: 'test'
...
# Subtest: row 195 accept: F2 fails when healthz doesn't answer and when another pid holds the port
ok 16 - row 195 accept: F2 fails when healthz doesn't answer and when another pid holds the port
---
duration_ms: 1691.124523
type: 'test'
...
# Subtest: row 195 accept: F5 fails on unpriv_bwrap (enforce), on complain and on a trailing space
ok 17 - row 195 accept: F5 fails on unpriv_bwrap (enforce), on complain and on a trailing space
---
duration_ms: 3431.279464
type: 'test'
...
# Subtest: row 195 accept: F5 fails with no bwrap of mosaic's, and passes on comm alone
ok 18 - row 195 accept: F5 fails with no bwrap of mosaic's, and passes on comm alone
---
duration_ms: 1728.779323
type: 'test'
...
# Subtest: row 195 accept: F6 fails on a stub that prints nothing, on a path outside claude-<pin> and on a .. segment
ok 19 - row 195 accept: F6 fails on a stub that prints nothing, on a path outside claude-<pin> and on a .. segment
---
duration_ms: 2796.343556
type: 'test'
...
# Subtest: row 195 accept: F7 fails on two live PM launches, one for another business, and no launch.by
ok 20 - row 195 accept: F7 fails on two live PM launches, one for another business, and no launch.by
---
duration_ms: 2576.75183
type: 'test'
...
# Subtest: row 195 accept: F8 fails on 0640, on another owner and on a symlink, and never prints the credential
ok 21 - row 195 accept: F8 fails on 0640, on another owner and on a symlink, and never prints the credential
---
duration_ms: 2952.460918
type: 'test'
...
# Subtest: row 195 accept: F9 fails on another owner, a group-writable mode and a number for the flag
ok 22 - row 195 accept: F9 fails on another owner, a group-writable mode and a number for the flag
---
duration_ms: 2895.06599
type: 'test'
...
# Subtest: row 195 accept: F9 won't run --node as root off the pin path or with a writable directory above it
ok 23 - row 195 accept: F9 won't run --node as root off the pin path or with a writable directory above it
---
duration_ms: 2480.803521
type: 'test'
...
# Subtest: row 195 accept: F11 fails on one *.json under discord/ and passes on an empty directory
ok 24 - row 195 accept: F11 fails on one *.json under discord/ and passes on an empty directory
---
duration_ms: 1659.210989
type: 'test'
...
# Subtest: row 195 accept: each P check reports unnamed on its fault, and the exit stays 0
ok 25 - row 195 accept: each P check reports unnamed on its fault, and the exit stays 0
---
duration_ms: 8054.992104
type: 'test'
...
# Subtest: row 195 accept: P2 is unnamed with a supplementary group, and P5 names docker
ok 26 - row 195 accept: P2 is unnamed with a supplementary group, and P5 names docker
---
duration_ms: 1800.23175
type: 'test'
...
# Subtest: row 195 accept: P5 is closed with no jarvis account, and P2 with an empty authorized_keys
ok 27 - row 195 accept: P5 is closed with no jarvis account, and P2 with an empty authorized_keys
---
duration_ms: 1011.860363
type: 'test'
...
# Subtest: row 195 accept: P9 is unnamed once for each item missing
ok 28 - row 195 accept: P9 is unnamed once for each item missing
---
duration_ms: 4709.458028
type: 'test'
...
# Subtest: row253 accept: P10 fails its observation with another peer; P11 with the unit disabled
ok 29 - row253 accept: P10 fails its observation with another peer; P11 with the unit disabled
---
duration_ms: 1758.580533
type: 'test'
...
# Subtest: row 195 accept: every P check unnamed together still exits 0
ok 30 - row 195 accept: every P check unnamed together still exits 0
---
duration_ms: 627.052274
type: 'test'
...
# Subtest: row 195 accept: a bad args file refuses with exit 2 before any check, each for its own reason
ok 31 - row 195 accept: a bad args file refuses with exit 2 before any check, each for its own reason
---
duration_ms: 132.044699
type: 'test'
...
# Subtest: row 195 accept: usage errors and a run without --root as a user exit 2
ok 32 - row 195 accept: usage errors and a run without --root as a user exit 2
---
duration_ms: 14.941784
type: 'test'
...
# Subtest: row 195 accept: every in-instance call goes through sudo -u mosaic -H env PATH=<node dir>:...
ok 33 - row 195 accept: every in-instance call goes through sudo -u mosaic -H env PATH=<node dir>:...
---
duration_ms: 897.107512
type: 'test'
...
# Subtest: row 195 accept: the host check runs with --check and never --enforce
ok 34 - row 195 accept: the host check runs with --check and never --enforce
---
duration_ms: 883.694618
type: 'test'
...
1..34
# tests 34
# suites 0
# pass 34
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 123268.643368
@@ -0,0 +1 @@
["timeout", "-k", "10", "900", "node", "--test", "--test-reporter=tap", "packages/cli/tests/case1-hostcheck.test.mjs"]
@@ -0,0 +1,106 @@
TAP version 13
# Subtest: row 240 check: exits 0 with all seven items and a note that bubblewrap is the install pin
ok 1 - row 240 check: exits 0 with all seven items and a note that bubblewrap is the install pin
---
duration_ms: 50.319832
type: 'test'
...
# Subtest: row 240 check: exits 1 with each item failing alone, and its line names it
ok 2 - row 240 check: exits 1 with each item failing alone, and its line names it
---
duration_ms: 286.435607
type: 'test'
...
# Subtest: row 240 check: item 1 fails when a package owns the profile, when dpkg -S errs, or with no pin
ok 3 - row 240 check: item 1 fails when a package owns the profile, when dpkg -S errs, or with no pin
---
duration_ms: 132.253907
type: 'test'
...
# Subtest: row 240 check: item 2 fails on a loaded mosaic-bwrap, a missing unpriv_bwrap or a failed aa-status
ok 4 - row 240 check: item 2 fails on a loaded mosaic-bwrap, a missing unpriv_bwrap or a failed aa-status
---
duration_ms: 105.675172
type: 'test'
...
# Subtest: row 240 check: item 3 fails on a second file naming bwrap as a word, /{usr/,}bin/bwrap included
ok 5 - row 240 check: item 3 fails on a second file naming bwrap as a word, /{usr/,}bin/bwrap included
---
duration_ms: 165.964621
type: 'test'
...
# Subtest: row 240 check: item 4 reads the label under the units' no-new-privs and matches it exactly
ok 6 - row 240 check: item 4 reads the label under the units' no-new-privs and matches it exactly
---
duration_ms: 189.56662
type: 'test'
...
# Subtest: row 240 check: item 5 needs the statoverride and stat to agree
ok 7 - row 240 check: item 5 needs the statoverride and stat to agree
---
duration_ms: 46.475561
type: 'test'
...
# Subtest: row 240 check: item 6 fails on protected_hardlinks 0; item 7 fails with the floor at 732 and reads 1023 with no unit
ok 8 - row 240 check: item 6 fails on protected_hardlinks 0; item 7 fails with the floor at 732 and reads 1023 with no unit
---
duration_ms: 335.031237
type: 'test'
...
# Subtest: row 240 check: a bubblewrap version other than the install pin is a note, not a failure
ok 9 - row 240 check: a bubblewrap version other than the install pin is a note, not a failure
---
duration_ms: 47.69351
type: 'test'
...
# Subtest: row 240 enforce: a pass with no DRIFT changes nothing and exits 0
ok 10 - row 240 enforce: a pass with no DRIFT changes nothing and exits 0
---
duration_ms: 52.404871
type: 'test'
...
# Subtest: row 240 enforce: each failure exits 0, unloads the profile, closes bwrap, writes DRIFT and one log line
ok 11 - row 240 enforce: each failure exits 0, unloads the profile, closes bwrap, writes DRIFT and one log line
---
duration_ms: 393.938281
type: 'test'
...
# Subtest: row 240 enforce: with DRIFT present and every item passing, it still closes bwrap
ok 12 - row 240 enforce: with DRIFT present and every item passing, it still closes bwrap
---
duration_ms: 54.758403
type: 'test'
...
# Subtest: row 240 enforce: no unload when aa-status lists neither bwrap profile; never writes the statoverride
ok 13 - row 240 enforce: no unload when aa-status lists neither bwrap profile; never writes the statoverride
---
duration_ms: 495.817198
type: 'test'
...
# Subtest: row 240 upstream: a candidate whose profile differs prints the difference and exits 0
ok 14 - row 240 upstream: a candidate whose profile differs prints the difference and exits 0
---
duration_ms: 73.504883
type: 'test'
...
# Subtest: row 240 boot unit: a oneshot after apparmor and before the bus that runs --enforce
ok 15 - row 240 boot unit: a oneshot after apparmor and before the bus that runs --enforce
---
duration_ms: 0.652154
type: 'test'
...
# Subtest: row 240 pins and usage: the shipped pins are r6's, the script reads the pins beside it, and bad usage exits 2
ok 16 - row 240 pins and usage: the shipped pins are r6's, the script reads the pins beside it, and bad usage exits 2
---
duration_ms: 48.194579
type: 'test'
...
1..16
# tests 16
# suites 0
# pass 16
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 2621.785833
@@ -0,0 +1 @@
["timeout", "-k", "10", "900", "node", "--test", "--test-reporter=tap", "packages/cli/tests/case2-persona-import.test.mjs"]
@@ -0,0 +1,94 @@
TAP version 13
# Subtest: stage takes each profile's SOUL.md byte for byte and prints the pairing with sizes and digests
ok 1 - stage takes each profile's SOUL.md byte for byte and prints the pairing with sizes and digests
---
duration_ms: 70.554665
type: 'test'
...
# Subtest: stage lists the per-channel prompts in all three places by name and byte count only
ok 2 - stage lists the per-channel prompts in all three places by name and byte count only
---
duration_ms: 59.537005
type: 'test'
...
# Subtest: a config key with a newline prints as one quoted line
ok 3 - a config key with a newline prints as one quoted line
---
duration_ms: 62.157579
type: 'test'
...
# Subtest: a read trace shows stage and the dry run open SOUL.md and config.yaml and never memory, sessions or secrets
ok 4 - a read trace shows stage and the dry run open SOUL.md and config.yaml and never memory, sessions or secrets
---
duration_ms: 127.513349
type: 'test'
...
# Subtest: the pairing refuses anything but two existing profiles naming Bean and Chet once each, and writes nothing
ok 5 - the pairing refuses anything but two existing profiles naming Bean and Chet once each, and writes nothing
---
duration_ms: 469.331834
type: 'test'
...
# Subtest: a profile with no persona refuses: no SOUL.md, a blank one, a symlink, not UTF-8
ok 6 - a profile with no persona refuses: no SOUL.md, a blank one, a symlink, not UTF-8
---
duration_ms: 432.019542
type: 'test'
...
# Subtest: the import applies C2-08's exported fence at its boundaries
ok 7 - the import applies C2-08's exported fence at its boundaries
---
duration_ms: 433.829207
type: 'test'
...
# Subtest: install writes 0600 persona files in 0700 directories whose digests match, and prints the vars
ok 8 - install writes 0600 persona files in 0700 directories whose digests match, and prints the vars
---
duration_ms: 101.133736
type: 'test'
...
# Subtest: install refuses an open or foreign staging file, a digest off the manifest and an existing persona
ok 9 - install refuses an open or foreign staging file, a digest off the manifest and an existing persona
---
duration_ms: 570.81313
type: 'test'
...
# Subtest: --dry-run writes nothing and prints only counts and the fence fault, two heading lines in a fixture counted
ok 10 - --dry-run writes nothing and prints only counts and the fence fault, two heading lines in a fixture counted
---
duration_ms: 50.290632
type: 'test'
...
# Subtest: --dry-run applies C2-08's fence: over it the fault prints, nothing is written and it exits 1
ok 11 - --dry-run applies C2-08's fence: over it the fault prints, nothing is written and it exits 1
---
duration_ms: 94.286146
type: 'test'
...
# Subtest: a directory made between the check and mkdir refuses by name, at stage and at install
ok 12 - a directory made between the check and mkdir refuses by name, at stage and at install
---
duration_ms: 170.327466
type: 'test'
...
# Subtest: --dry-run counts three lines naming a Hermes tool or channel and prints none of the words
ok 13 - --dry-run counts three lines naming a Hermes tool or channel and prints none of the words
---
duration_ms: 52.373648
type: 'test'
...
# Subtest: usage: stage needs one of --staging and --dry-run, install takes only its own options
ok 14 - usage: stage needs one of --staging and --dry-run, install takes only its own options
---
duration_ms: 353.037721
type: 'test'
...
1..14
# tests 14
# suites 0
# pass 14
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 3155.798424
Loaded 100 of 335 files, more files were not shown because too many files have changed in this diff. Show more