filbert: row 90 round 2 static review, full gate pending reserved slot

This commit is contained in:
2026-10-12 18:36:26 -05:00
parent c6711453b7
commit 14c1484da4
4 changed files with 85 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
"""Full row 90 round 2 gate. Wait for Sage's slot-clear before executing."""
import os, subprocess, signal, pathlib, json, hashlib, datetime
root=pathlib.Path.home()/'filbert-scratch/r90-r2-review/wt'
out=root.parent/'gate';out.mkdir(exist_ok=True)
env=dict(os.environ,TMPDIR=str(pathlib.Path.home()/'filbert-scratch/tmp'),DOCKER_HOST='unix:///nonexistent.sock')
seats=['darkwing','dewey','rocko','researcher','sage']
other=[str(pathlib.Path.home()/f'{seat}-scratch') for seat in seats]+[str(pathlib.Path('/mnt/storage/scratch')/seat) for seat in seats]
def quiet():
busy=[]
for p in pathlib.Path('/proc').iterdir():
if not p.name.isdigit():continue
try:
cwd=str((p/'cwd').resolve(strict=True))
if any(cwd==x or cwd.startswith(x+'/') for x in other):busy.append((p.name,cwd))
except (OSError,RuntimeError):pass
if busy:raise SystemExit('Other scratch processes active: '+repr(busy))
def matches():
m=pathlib.Path('/mnt/storage/src/mosaic-stack/agents/dewey/work/queue-90/r2/candidate-manifest.sha256')
for line in m.read_text().splitlines():
sha,path=line.split();assert hashlib.sha256((root/path).read_bytes()).hexdigest()==sha,path
quiet();matches();rows=[]
def run(cmd,cwd,log):
quiet();start=datetime.datetime.now(datetime.timezone.utc).isoformat()
with log.open('w') as f:
p=subprocess.Popen(cmd,cwd=cwd,env=env,stdout=f,stderr=subprocess.STDOUT,start_new_session=True)
try:p.wait(timeout=300);rc=p.returncode
except subprocess.TimeoutExpired:
try:os.killpg(p.pid,signal.SIGKILL)
except ProcessLookupError:pass
p.wait();rc='timeout'
return rc,start
for package in ['tasks','bus','harness','webui','cli','business','seat','control-board']:
cwd=root/'packages'/package
files=['tests/'] if package in ['seat','webui'] else [str(p.relative_to(cwd)) for p in sorted((cwd/'tests').glob('*.test.mjs'))]
log=out/f'node-{package}.log';rc,start=run(['node','--test',*files],cwd,log)
stats=[s for s in log.read_text().splitlines() if s.startswith(('ℹ tests ','ℹ pass ','ℹ fail ','# tests ','# pass ','# fail '))]
row={'suite':package,'rc':rc,'started':start,'stats':stats};rows.append(row);print(json.dumps(row),flush=True)
(out/'summary.json').write_text(json.dumps(rows,indent=2)+'\n')
for script in sorted((root/'scripts').glob('test-*.sh')):
log=out/f'{script.stem}.log';rc,start=run(['bash',str(script)],root,log)
row={'suite':script.stem,'rc':rc,'started':start,'last':log.read_text().splitlines()[-1:]};rows.append(row);print(json.dumps(row),flush=True)
(out/'summary.json').write_text(json.dumps(rows,indent=2)+'\n')
matches();print('manifest 21/21 after full gate',flush=True)
raise SystemExit(any(r['rc']!=0 for r in rows))
+11
View File
@@ -0,0 +1,11 @@
# Row 90 round 2 review, full gate pending
Candidate 95611274ff1c5d022f958f6158c5bde8f9482fa11dc6820cc749402ef326022b, 21 paths, detached base b8539480. Reconstructed under ~/filbert-scratch/r90-r2-review/wt with Dewey's r2 build.patch applied by git apply --index and node_modules symlinked. Manifest 21/21, no drift on candidate paths, no whitespace errors (static-receipt.json).
Static rebase and sandbox review complete, no blocking finding. Eighteen paths have exactly the same added/removed patch lines as round 1. verbs.test.mjs also has identical added/removed lines; its changed world import is context from row 63 (SCOPES retained). The README keeps both the requirement/request sentences and the project sentences, rewrapped. The new sandbox.mjs patch adds exactly one read-only RUNNER_FILES dependency, packages/tasks/src/requirements.mjs, as decision 127 authorizes.
The dependency chain is runner to client to broker to requirements.mjs. Importing requirements.mjs initializes constants and function declarations but does not load requirements.json. loadRequirements is called by the host Broker constructor and host task verbs; the runner constructs neither. The data file remains unmounted. RUNNER_FILES is still a reviewed explicit list rather than a directory bind, and sandbox.test.mjs's exact import-walk comparison covers the new dependency. Full runtime integration verification is still required; the prior twenty-path run's cli/seat failures demonstrate why static drift checks alone are insufficient.
Decision 127 requires every suite on this 21-path candidate, harness included. gate.py is prepared to run tasks, bus, harness, webui, cli, business, seat and control-board sequentially, then every scripts/test-*.sh, with DOCKER_HOST=unix:///nonexistent.sock throughout and both-root /proc cwd busy checks before every run. Its syntax was checked. No round 2 suite has been run by this review yet and no verdict is posted. The three round 1 follow-ups stay out of this candidate.
Slot authorization: Darkwing's row 91 run first, then Sage's row 69 landing gate, then this full row 90 gate, then Dewey's row 94. Sage will send gate-clear; do not infer authorization from a momentary quiet interval before that message. The next step is to run the prepared full gate on that clearance and report any failures before posting a verdict.
@@ -0,0 +1,29 @@
{
"candidate": "95611274ff1c5d022f958f6158c5bde8f9482fa11dc6820cc749402ef326022b",
"base": "b8539480",
"head_at_check": "c6711453b726f7628c388f2aa02e03afff464ca7",
"manifest_matches": {
"packages/bus/README.md": true,
"packages/bus/src/broker.mjs": true,
"packages/bus/tests/requirements.test.mjs": true,
"packages/harness/src/bundle.mjs": true,
"packages/harness/src/runner.mjs": true,
"packages/harness/src/tools.mjs": true,
"packages/harness/tests/bundle.test.mjs": true,
"packages/harness/tests/runner.test.mjs": true,
"packages/harness/tests/tools.test.mjs": true,
"packages/seat/src/sandbox.mjs": true,
"packages/tasks/README.md": true,
"packages/tasks/requirements.json": true,
"packages/tasks/src/requirements.mjs": true,
"packages/tasks/src/verbs.mjs": true,
"packages/tasks/tests/adapter.test.mjs": true,
"packages/tasks/tests/fields.test.mjs": true,
"packages/tasks/tests/requirements.test.mjs": true,
"packages/tasks/tests/shapes.test.mjs": true,
"packages/tasks/tests/sync.test.mjs": true,
"packages/tasks/tests/verbs.test.mjs": true,
"roles/pm.md": true
},
"drift_paths": []
}
+1
View File
@@ -818,3 +818,4 @@ are never rewritten or removed; corrections are new entries.
2026-10-12T23:20:59Z | filbert | rows 69 (#1562) and 97 (#1591) static reviews | reconstructed manifests 4/4 (c68e6582) and 3/3 (bdeca38d), no drift, no blocking static finding; guarded verification scripts ready and syntax checked, no tests or verdicts; Dewey owns row 90 gate/mutant slot until about 23:30Z, then my row 69; row 90 round 2 takes priority when requested, followed by rows 97 and 98; Darkwing gets direct scratch-clear after my tests
2026-10-12T23:31:49Z | dewey | row 90 round 2 (#1584): 21-path packet 2f367900 on b8539480 (round 1 plus row 92's RUNNER_FILES line, decision 127), manifest 95611274; revs 853-855 ee00386b; request comment 28054, packet note 28056; reviewer filbert | in review
2026-10-12T23:33:05Z | filbert | row 69 (#1562) round 1 review on c68e6582, base dad20531 | approve comment 28055, rev 856 committed 557707c1; cli 123/0, queue 150/0, six named mutants killed, restored-app passed and manifest 4/4; scratch/worktree clear, Darkwing directly notified for row 91 slot; existing cut-help pointer is non-blocking; no push
2026-10-12T23:36:26Z | filbert | row 90 (#1584) round 2 static review on 95611274, base b8539480 | reconstructed 21/21, no drift; rebase edits preserved and decision 127 read-only requirements.mjs bind reviewed, requirements.json remains unmounted; full 8-node/9-shell gate script ready and syntax checked, no tests or verdict yet; hold until Darkwing row 91 and Sage row 69 landing gates clear; no push