From bc49fb2c0323a5a9712962424fe3807e94ecab00 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Tue, 13 Oct 2026 09:11:18 -0500 Subject: [PATCH] docs: decisions 133 (redeploy without rows 91 and 93) and 134 (Filbert to Opus 5.5), P19 #250 close record Co-Authored-By: Claude Opus 5.5 --- agents/README.md | 2 +- .../vikunja-setup/2026-10-13_close-250.json | 19 ++++++ agents/sage/work/vikunja-setup/close-250.mjs | 63 +++++++++++++++++++ docs/SESSIONS.md | 1 + docs/plans/2026-09-26_lead-decisions.md | 44 +++++++++++++ 5 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 agents/sage/work/vikunja-setup/2026-10-13_close-250.json create mode 100644 agents/sage/work/vikunja-setup/close-250.mjs diff --git a/agents/README.md b/agents/README.md index bc9a8ae7b..b4c622390 100644 --- a/agents/README.md +++ b/agents/README.md @@ -14,7 +14,7 @@ not fleet seats. Keep changes in `/mnt/storage/src/mosaic-stack`; do not modify | Darkwing | Hands-on engineering; collaborating seat under Sage | Pi, configured Mosaic model | `agents/darkwing/launch.sh` | | Dewey | Frontend design, UX, accessibility, and UI implementation | Pi, configured Mosaic model | `agents/dewey/launch.sh` | | Rocko | General development, investigation, testing, and review | T3 session (Codex, gpt-6.1-sol, thread d99326cc, lead decision 122; Claude thread b84bb264 retired 2026-10-12); launcher Claude Code, Sonnet model | `agents/rocko/launch.sh` | -| Filbert | General development, investigation, testing, and review | T3 session (Codex, gpt-6.1-sol, thread f712d8af, non-sandbox reviews only, lead decision 130; Codex thread 50342f6a retired 2026-10-13, Claude thread 9cb9731e retired 2026-10-12); launcher Pi, `openai-codex/gpt-6-astra:low`, not to be used under R26 until it changes (lead decision 69) | `agents/filbert/launch.sh` | +| Filbert | General development, investigation, testing, and review | T3 session (Claude, Opus 5.5, thread 048f3c63, non-sandbox reviews only, lead decisions 130 and 134; Codex threads f712d8af and 50342f6a retired 2026-10-13, Claude thread 9cb9731e retired 2026-10-12); launcher Pi, `openai-codex/gpt-6-astra:low`, not to be used under R26 until it changes (lead decision 69) | `agents/filbert/launch.sh` | | Researcher | Source-grounded technical research and evidence | T3 session (Claude, Sonnet 5.5, thread 9bac0794, rows 97 and 98, lead decision 124); Haiku rows (71, 80, 84, 88, later 96) run as subagents Sage dispatches with model haiku, effort high and a worktree (lead decision 129); Haiku thread c98aaf4a retired 2026-10-13 unused; launcher Pi, configured Mosaic model | `agents/researcher/launch.sh` | | Sage | Project lead: coordination, review, integration; earlier DYOR strategy records retained | T3 session (Claude Code); Pi launcher `zai/glm-5.3:high` retained | `agents/sage/launch.sh` | diff --git a/agents/sage/work/vikunja-setup/2026-10-13_close-250.json b/agents/sage/work/vikunja-setup/2026-10-13_close-250.json new file mode 100644 index 000000000..dcf17745a --- /dev/null +++ b/agents/sage/work/vikunja-setup/2026-10-13_close-250.json @@ -0,0 +1,19 @@ +{ + "at": "2026-10-13T14:06:30.698Z", + "task": 250, + "problems": [], + "comment": { + "status": 201, + "id": 134, + "readBack": 200, + "found": true + }, + "update": { + "status": 200, + "inverse": "mark undone: POST /api/v1/tasks/250 done false (sage key)", + "readBack": 200, + "done": true, + "titleSame": true, + "descriptionSame": true + } +} diff --git a/agents/sage/work/vikunja-setup/close-250.mjs b/agents/sage/work/vikunja-setup/close-250.mjs new file mode 100644 index 000000000..f654661c9 --- /dev/null +++ b/agents/sage/work/vikunja-setup/close-250.mjs @@ -0,0 +1,63 @@ +// Sage, 2026-10-13: Mos's redeploy ruling (decision 133). Comments on #250 (row 94 mixed state, plain +// `mosaic inbox` fails on a pre-94 bus) and marks it done: the bus restarted on 2b2a9e14 code at +// 14:04:18Z, so the broker has the messages verb and row 99's fallback is dropped. Sage's own key (bot +// user 13). The update sends the task as the v1 GET returned it with only done changed; the sync key reads +// title, description and done back. Rollback is marking it undone. Prints no secret. +// Usage: node close-250.mjs https://tasks.woltje.com SAGE_TOKEN_FILE SYNC_TOKEN_FILE OUT_JSON +import { readFileSync, writeFileSync, existsSync } from "node:fs"; +const [ORIGIN, KEY, SYNC, OUT] = process.argv.slice(2); +if (!/^https:\/\/tasks\.woltje\.com$/.test(ORIGIN)) throw new Error("tasks.woltje.com only"); +if (!OUT || existsSync(OUT)) throw new Error("OUT_JSON missing or exists; refusing"); +const TASK = 250; +const TITLE = "Row 94 mixed state: plain `mosaic inbox` may fail until bus restart"; +const SIG = "Created by Sage (T3 1ef1e4f8) with Sage's own key (bot user 13)."; +const esc = (s) => s.replace(/&/g, "&").replace(//g, ">"); +const p = (...xs) => xs.map((x) => `

${esc(x)}

`).join("") + `

${esc(SIG)}

`; +const TEXT = [ + "Closed by the redeploy, not by a fix row. Jason rebooted dragon-lin at 13:40Z and the bus unit, which is not enabled, stayed down. Mos ruled the planned redeploy ships now without rows 91 and 93 (decision 133).", + "Sage reinstalled the unit (adds the EnvironmentFile line) and started mosaic-bus@mosaic-stack at 14:04:18Z from the canonical checkout at 8ac8055c. That tree includes row 94 (2b2a9e14), so the running broker dispatches the messages verb (packages/bus/src/broker.mjs:983) and plain `mosaic inbox` no longer gets unknown-verb.", + "Row 99 (the text-mode fallback, Gitea #1593) is dropped and does not land. The fallback only helps against a pre-94 bus, which can now only come back through a rollback. The packet stays as evidence at agents/researcher/work/queue-99/r1/ (commit 8ac8055c).", +]; +const key = readFileSync(KEY, "utf8").trim(), sync = readFileSync(SYNC, "utf8").trim(); +async function api(method, path, body, auth) { + const r = await fetch(ORIGIN + path, { method, headers: { Authorization: `Bearer ${auth}`, "Content-Type": "application/json" }, body: body === undefined ? undefined : JSON.stringify(body), redirect: "error" }); + const t = await r.text(); let json = null; try { json = JSON.parse(t); } catch {} + return { status: r.status, json }; +} +const list = (j) => j?.items ?? (Array.isArray(j) ? j : []); +const rec = { at: new Date().toISOString(), task: TASK, problems: [] }; +const save = () => { + const out = JSON.stringify(rec, null, 1) + "\n"; + if (out.includes(key) || out.includes(sync)) throw new Error("secret in the record; not written"); + writeFileSync(OUT, out); +}; +const task = await api("GET", `/api/v2/tasks/${TASK}`, undefined, sync); +if (task.status !== 200 || task.json?.project_id !== 19 || task.json?.title !== TITLE) throw new Error(`task ${TASK}: ${task.status}, project ${task.json?.project_id}, title differs or missing`); +if (task.json.done) throw new Error(`task ${TASK} is already done; refusing`); +const before = { title: task.json.title, description: task.json.description }; +writeFileSync(OUT, "", { flag: "wx" }); + +const c = await api("PUT", `/api/v1/tasks/${TASK}/comments`, { comment: p(...TEXT) }, key); +rec.comment = { status: c.status, id: c.json?.id ?? null }; +if (c.status >= 300 || !Number.isSafeInteger(c.json?.id)) rec.problems.push(`comment: ${c.status} ${c.json?.message ?? ""}`); +else { + const back = await api("GET", `/api/v2/tasks/${TASK}/comments?per_page=50`, undefined, sync); + const found = list(back.json).find((x) => x.id === c.json.id); + Object.assign(rec.comment, { readBack: back.status, found: Boolean(found) }); + if (back.status !== 200 || !found) rec.problems.push(`comment read-back: ${back.status}`); +} +save(); +if (!rec.problems.length) { + const full = await api("GET", `/api/v1/tasks/${TASK}`, undefined, key); + if (full.status !== 200 || full.json?.id !== TASK) rec.problems.push(`v1 get: ${full.status}`); + else { + const u = await api("POST", `/api/v1/tasks/${TASK}`, { ...full.json, done: true }, key); + rec.update = { status: u.status, inverse: `mark undone: POST /api/v1/tasks/${TASK} done false (sage key)` }; + const back = await api("GET", `/api/v2/tasks/${TASK}`, undefined, sync); + Object.assign(rec.update, { readBack: back.status, done: back.json?.done, titleSame: back.json?.title === before.title, descriptionSame: back.json?.description === before.description }); + if (u.status >= 300 || back.status !== 200 || back.json?.done !== true || !rec.update.titleSame || !rec.update.descriptionSame) rec.problems.push("update or read-back differs"); + } +} +save(); +process.stdout.write(JSON.stringify(rec, null, 1) + "\n"); +if (rec.problems.length) process.exit(2); diff --git a/docs/SESSIONS.md b/docs/SESSIONS.md index 8023b1b8a..3dcaf8b2e 100644 --- a/docs/SESSIONS.md +++ b/docs/SESSIONS.md @@ -839,3 +839,4 @@ are never rewritten or removed; corrections are new entries. 2026-10-13T13:13:59Z | darkwing | row 91 round 3 (#1585): Filbert submodule escape confirmed on round 2, fixed and tested, packet agents/darkwing/work/queue-91/r3 (372651716) | in review, manifest ca570607 on 2b2a9e14, request 28133, revs 893 to 895 (3c641c08), reviewer Dewey 2026-10-13T13:18:03Z | filbert (f712d8af) | row 97 round 3 confirm-only static re-review (#1591), manifest 868f43de2d7e216bc17e8a6f17f38b844a0c753cd666a0fc5ad39d5e95e45ba6 | approve, comment 28139; reconstructed on cd976b09, 3/3 hashes matched, 72 changed lines identical to r2; new messages reads traced behind sign-out guards, 8 mutant anchors match once; no tests, mutants or queue-commit run; Sage commits verdict revision and reruns gate; no push 2026-10-13T13:20:11Z | darkwing | row 97 (#1591) round 3 confirm-only review | approve, comment 28140, manifest 868f43de, base cd976b09; patch and manifest verified, test 2 and mutants 13, 13a, 26, 27 unaffected by row 94 by reading; note on a palette stale-cache race in bus.js (outside the row); queue rev 902 in c075bd04 +2026-10-13T14:11:18Z | sage (1ef1e4f8) | decision 133 redeploy: bus unit reinstall (EnvironmentFile line), start 14:04:18Z on 8ac8055c with rows 89, 90, 92, 94; row 99 dropped (rev 907, #1593 comment 28146 closed, P19 #250 comment 134 done); Darkwing and Dewey resumed; decision 134 Filbert to Opus thread 048f3c63, f712d8af retired | done; Mos enabled the unit 14:09:15Z; revs 903-907 still pending queue-commit diff --git a/docs/plans/2026-09-26_lead-decisions.md b/docs/plans/2026-09-26_lead-decisions.md index d189363a5..143c41b38 100644 --- a/docs/plans/2026-09-26_lead-decisions.md +++ b/docs/plans/2026-09-26_lead-decisions.md @@ -2966,3 +2966,47 @@ which stay with him. Each item names who decided it and what happened. It takes the test slot ahead of rows 80 and 88. - The bus restart doesn't move earlier for this. Decision 118's order stands. + +133. **The redeploy ships without rows 91 and 93 (2026-10-13, Mos's + ruling after Jason rebooted dragon-lin at 13:40:09Z).** The bus unit + stayed down after the reboot because it was never enabled. Decision + 118's redeploy went ahead instead of waiting for the sandbox rows. + - Sage reinstalled the unit with `scripts/bus-service.sh install` + from canonical 8ac8055c. The only change is the + `EnvironmentFile=-%h/.config/mosaic-dev/secrets/claude-session.env` + line. Mos's pm.conf drop-in still adds `--pm`. + - Sage started the bus at 14:04:18Z. The unit is active with + NRestarts 0, /healthz on :7332 returns ok, and `launches list` + shows PM run r71a2676a33a8. The bus runs the code from rows 89, + 90, 92 and 94. + - Install doesn't enable the unit and Sage didn't. Mos enabled it at + 14:09:15Z without restarting it. Undo with `systemctl --user + disable mosaic-bus@mosaic-stack.service`. Whether install should + enable units is a later row, not urgent. + - Row 99 is dropped: the fallback only helps against a pre-94 bus, + which only a rollback could bring back. Queue rev 907 blocks it + with the reason (no dropped state exists, and parking needs Jason + from briefed). It stays blocked until Jason is next in the queue. + Gitea #1593 is closed (comment 28146) and Vikunja P19 #250 is done + (comment 134). + - Rows 91 and 93 need their own bus restart when they land. Sage + asks Mos for it then. + - Next: Jason's PM re-test (#228, #232). Row 85 waits on it. + +134. **Filbert moves to Claude Opus 5.5 (2026-10-13, a seat change on + Jason's direct input).** Jason reported that OpenAI's cyber-risk + filter keeps blocking Filbert's reviews on gpt-6.1-sol. The thread + it blocked was the retired 50342f6a; f712d8af approved row 97 round 3 + at 13:18Z without a flag. The filter would still fire on any + security-adjacent review, so the seat moves while no Filbert review + is in flight. + - New thread 048f3c63 (Claude, claude-opus-5-5). Codex thread + f712d8af is retired; nobody messages it. + - Opus roster seats are now Darkwing, Dewey and Filbert, three of + decision 45's four. Sage's own thread isn't counted. + - Cost: no GPT reviewer remains, so every review is Claude on Claude. + Decision 122 chose Codex for reviewer diversity. Rocko stays on + Codex as a builder. + - Decision 130's split stands: Filbert reviews non-sandbox rows only, + and Dewey keeps rows 91 and 93. + - Mos had no objection.