From c5db8c8819417fefba00a75c4757f7eeea989906 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Sat, 26 Sep 2026 16:31:11 -0500 Subject: [PATCH] docs(records): row 25 approver fix, second Discord restart, SetSpark approver and docker network gaps Co-Authored-By: Claude Opus 5.5 --- BUILD-LOG.md | 46 +++++++++++++++++++++++++ docs/SESSIONS.md | 5 +++ docs/plans/2026-09-26_lead-decisions.md | 13 +++++++ docs/plans/DEFERRED.md | 14 ++++++++ 4 files changed, 78 insertions(+) diff --git a/BUILD-LOG.md b/BUILD-LOG.md index 3f0b3fc3..ddf2da58 100644 --- a/BUILD-LOG.md +++ b/BUILD-LOG.md @@ -3074,3 +3074,49 @@ extension enables the eight record and approval verbs from it. Receipt (0600): `restart-row25-20260926T205803Z.txt` in the Sage evidence directory. Jason's live check (one work item, one proposal approved by button) is still to do. + +## 2026-09-26: row 25 approver names, a second Discord restart (#1509, Sage, reviewed by Rocko) + +Correction to the entry above: the 20:58Z restart put the SetSpark verbs +live, but the approval half did not work. In Jason's live check, SS-027 was +created and read back. DEC-009 was also created, but no Approve button was +posted. The Discord Sage had written `required_approvers` as `["Jason", +"Carmen"]`. The SetSpark service stores approvers as `discord:` and +accepted the names without checking them. `open_approval_request` then +passed the names to the connector, and `validateRequest` refused them ("bad +approver id"). The connector was right to refuse. The gap was that the model +had no way to write a valid approver, and no test ran create through the +connector's check. + +After: 20ea5a0b. +- The binding's `users` provide the approver names. +- `record_create` and `record_update` turn each name into `discord:`. + An unknown name, a raw id, a duplicate or a non-list is refused before + any request goes out, and the refusal does not echo the value. +- `hideIds` removes Discord user ids from every SetSpark tool text and + refusal, before any field is cut. The connector's approval request still + carries the bare ids. +- With `setspark` set, a reload that changes a user's id or name is refused. + That change needs a restart. +- A local contract fixture runs from create through `validateRequest`, and + the old name-stored shape still refuses. + +Rocko asked for two revisions. R1: a refused id was echoed back, and ids +leaked through nested or embedded text. R2: the service code and bad +property names were cut before hiding. Rocko approved R3 (81379830…, report +da75219f…). The eight suites passed on an index export +(24/90/43/17/14/15/63/18), and the Discord node tests passed 173/173. + +The first R3 task and release runs failed 31 and 3 tests. The cause was +Docker running out of network address pools, not the change. My own stale +index-export compose networks had used them up. I removed the five that +were mine, none with a container attached, and both suites passed on the +same export. Follow-up in DEFERRED. + +Restart at 21:30:21Z from 20ea5a0b, with `packages/discord` clean. Old PID +499064 stopped cleanly. The new PID is 954332 with pi child 954554, and the +gateway was READY at 21:30:22Z. Pi's `setspark` config has the approver +names jason and carmen. Receipt (0600): +`restart-row25-approvers-20260926T213021Z.txt`. Jason reruns the approval +check. DEC-009 needs a `record_update` to names, or a new decision, and +then a new approval request. diff --git a/docs/SESSIONS.md b/docs/SESSIONS.md index 61f77ae9..1e3fd706 100644 --- a/docs/SESSIONS.md +++ b/docs/SESSIONS.md @@ -391,3 +391,8 @@ are never rewritten or removed; corrections are new entries. 2026-09-26T20:35:44Z | Dewey (T3 Claude Code, thread 84fb346c) | #1507 board Host/Origin guard before CHAT-02 | Correction: the entry above at 20:35:39Z used the wrong line format; this one restates it. packages/control-board serve.mjs foreignRequest (d0a9bbed) plus two failing-first tests in serve.test.mjs (e01d7bd9); HEAD fails at foreign Host, six mutations each fail, control-board/webui/seat suites 149/149. Packet agents/dewey/work/board-guard/NOTES.md for Rocko via Sage. No commit or push. 2026-09-26T20:38:14Z | Sage (T3 Claude Code, thread 1ef1e4f8) | Integration: board Host/Origin guard | Rocko approved de9ff942 (review 5a12f08e); Sage committed the guard with records after suites on an index export, pushed, and restarted the control board. Discord restart still held on 6b R2. 2026-09-26T20:58:56Z | Sage (T3 Claude Code, thread 1ef1e4f8) | #1509 row 25 SetSpark live, Gate F routing | Found resolveToolRoots dropping setspark; fixed with failing-first test, Rocko approved, committed 6c06a6f3 and pushed; restarted mosaic-discord@shared-signals (890894 -> 499064), pi has the eight SetSpark verbs. Ruled Darkwing's three Gate F questions; Filbert reviews the brief. Jason live check pending. +2026-09-26T21:04:43Z | Filbert (T3 Claude Code, thread 9cb9731e) | #1508 queue plan round 6; Gate F T3 ledger source brief review (#1506) | Plan re-pinned 889f2566 (Sage's jarvis path and 403 rulings), then 282fabbb answering Rocko r5 (3b031a70): Gate G pins before launch and audits retrospectively, since Pi writes no session file before the first assistant message, and the first entry's parentId is null (G1); the guard is checked as active on every invocation with a git hook run canary, scratch-checked (G2); lead login jarvis. Sent to Rocko for round 6. Gate F brief R1 08959a05: revise (review 19dda29a; WAL tests, live read-only DB counts, header cross-check, test isolation); R2 e8300cb6 approved with 3 nits (review bb02d8d3). My W2 clean-stop claim was wrong, and a correction entry was appended. No source edits, commit or push. +2026-09-26T21:05:39Z | Dewey (T3 Claude Code, thread 84fb346c) | #1507 CHAT-02 backend (packages/conversation) and board routes, at review | New read-only Pi history reader (safe-fs, parser, CHAT-01 pages, pinned snapshots, cursors, follow) plus GET /api/conversations and /api/conversation after the Host/Origin guard. Suites 175/175; chat-00/01/01c checks pass; real data 19 rows, 102 pages, 0 schema-invalid; mutations 27/28 reader (one equivalent) and 9/9 routes. Packet agents/dewey/work/chat-02/BACKEND.md pins nine files. Darkwing asked to review the routes; Filbert's code review request goes when his turn ends. No commit or push. +- 2026-09-26T21:06:18Z | filbert (T3 9cb9731e) | #1508 round 6 approved by Rocko (report 80cde839, verified; builder note: capture H before the step-1 canary and reuse it for base and CAS), plan left at 282fabbb; Gate F R3 f3c05c1b confirmed and approved, review be1aa414 | reported to Sage and Darkwing; no commits +2026-09-26T21:14:06Z | Filbert (T3 Claude Code, thread 9cb9731e) | #1507 CHAT-02 backend code review | Packet 286c3ad5 (nine pins verified): revise. The candidate alone passes 175/175 in a clean worktree. Three required fixes, each reproduced: branch id moves with every append; the assumed-link bridge merges branches; EACCES on a directory component turns the catalogue into a 500. Three small items. Report 27d64e14, scripts in agents/filbert/work/chat-02-backend-review-evidence/. No commit or push. +2026-09-26T21:31:11Z | Sage (T3 Claude Code, thread 1ef1e4f8) | #1509 row 25 approver fix and second Discord restart | Jason's live check found no Approve button (DEC-009 approvers stored as names). Fix 20ea5a0b (Rocko R1/R2 revise, R3 approve 81379830), pushed; restart 21:30:21Z, PID 954332, pi has approver names jason,carmen. Approval recheck with Jason next. diff --git a/docs/plans/2026-09-26_lead-decisions.md b/docs/plans/2026-09-26_lead-decisions.md index 7e40bdbc..e9493743 100644 --- a/docs/plans/2026-09-26_lead-decisions.md +++ b/docs/plans/2026-09-26_lead-decisions.md @@ -181,3 +181,16 @@ which stay with him. Each item names who decided it and what happened. each round stays small. C ships inside A1. Gate F's code goes ahead on Filbert's verdict, without a separate look from Jason. The design calls are the lead's (item 12). +16. **Row 25 approvals, second fix and restart.** Jason's live check found no + Approve button. DEC-009's approvers had been stored as names, and the + connector refused them. Sage fixed it so the model writes user names, + the connector maps them to Discord ids, and no id reaches tool text. + Rocko approved R3, and the fix is 20ea5a0b, pushed. Sage restarted the + connector at 21:30:21Z, the second restart today. It is a local dev + service, and Jason was waiting on the check. Two design calls: + - A user id or name change with `setspark` on needs a restart, not a + reload. + - Tool text drops every Discord user id, including ids the binding + doesn't know. + The SetSpark service accepting free-text approvers is reported to + Jason as a shared-signals gap. Mosaic doesn't change it. diff --git a/docs/plans/DEFERRED.md b/docs/plans/DEFERRED.md index 11068d8a..9ba69b32 100644 --- a/docs/plans/DEFERRED.md +++ b/docs/plans/DEFERRED.md @@ -114,6 +114,20 @@ at every gate. Started 2026-09-12 during the control board MVP. of the runtime files. Until then the rule is that unreviewed Discord source stays uncommitted in the tree only as long as a review needs it. (2026-09-26, #1509) +- **SetSpark service accepts any string as a decision approver.** Create + checks only that `required_approvers` are distinct non-empty strings, and + approval checks `discord:` against them. So a decision stored + with names (DEC-009) can never be approved, and nothing says so until + an approval is tried. Mosaic's connector now writes only `discord:` + (20ea5a0b), but the service should refuse other shapes. This belongs to + shared-signals, not Mosaic. Reported to Jason. (2026-09-26, #1509) +- **Index-export suite runs leave Docker networks behind.** Each export + directory becomes a compose project, and its `_default` network + stays after the run. On 2026-09-26 the host ran out of address pools. The + task and release suites then failed 31 and 3 tests with "all predefined + address pools have been fully subnetted". Sage removed its own five stale + networks. The dw-* ones are still there. Fix: the export recipe, or the + suites, removes the project network on exit. (2026-09-26) ## Queue