diff --git a/BUILD-LOG.md b/BUILD-LOG.md index ee10a1692..3fb6171fc 100644 --- a/BUILD-LOG.md +++ b/BUILD-LOG.md @@ -5501,3 +5501,4 @@ claim. Receipts and limitations in agents/lena/work/queue-296/BUILD.md and run-r 2026-10-24 | Beakley (88b97f65) | Row 217 round 2, sage-4037 | Rebased published dde5b8496 onto e0c6142f3 on new beakley/row217-r2; both append-log histories retained. Conflicts preserve landed grant dispatch, revocation hook and lookup exports. Added E4 citation-unavailable product path and real supporting-scope/index comparison tests after row283 8d2856ee3. Untested: no Node/npm/tests/mutants/build; ready for Sage CLEAR after Lena296. Full range-diff and honest discarded local rebase correction in agents/beakley/work/queue-217/BUILD.md. 2026-10-24T10:21Z | Beakley (88b97f65) | Row 217 round2 slot verified, sage-4042/4043 | Source 2d274a5b6: touched57/57, whole library142/142 business270/270 bus974/974 cli988/988 harness172/172 seat218/218, all zero fail/skip/cancel. M1-M5 killed, controls/restored controls green, product hashes restored after each; E4 RED stand-in observed. Only first-red was new runtime fixture invalid-authority, corrected and retained in receipts; no old test failed/edited. Local root/webui npm ci, short TMPDIR, timeout-k10; no canonical npm/rm or module link. Full evidence agents/beakley/work/queue-217/run-r2; Sage owns scripts landing gate and formal review. +2026-10-24T11:15:29Z | Sage | Rows 296 (#1802, Lena, Filbert) and 217 (#1718, Beakley, Webby) LANDED d0a6a87cd. Before: refactor at e0c6142f3 (local 98235fdb3). After: 296's 5 commits (range-diff 5 =, blobs equal b43156fd9 on 28 paths) and 217's 9 commits (5 = and 4 !, the ! are BUILD-LOG/SESSIONS append conflicts kept both sides; blobs equal 96659ccf4 on 79 paths) on 98235fdb3, with doc commits b19ffa04f and 98235fdb3. Reviews: Filbert c31547 rev 3896, Webby c31549 rev 3901. Gate: 1st run 10:57:16Z RED on one rule only, the gate's "cli skipped 0": 296's FED R7 test skips in the cli suite by design and runs only through scripts/test-federation-acceptance.sh, which passed 1/1 in the same run. Mos ruled that a RED gate doesn't land (mos-1583). The gate now allows a cli skip only from an explicit list (test file, test name, runner script) whose runner ran in the same gate with rc 0, at least 1 pass, 0 skipped and the named test passed; any unlisted skip stays RED; checked against a wrong-file and a runner-skip control, both RED. Rerun GREEN 11:14:53Z with its own npm ci: 17 package suites 0 failures (cli 989/988 pass, the allowed FED R7 skip; plugins 119; webui 418), every scripts/test-*.sh rc 0, federation-acceptance cleanup line present; skips otherwise are the queue canonical-root check and the row 244 live provider cases. push-check SECRETS_CLEAN, NO_ATTRIBUTION, PUSH_READY. #1802 closed c31557, #1718 closed c31559, Vikunja 533 comment 1054 (design task, left open for Q29). Row 286's approved manifest shares broker.mjs, runtime.mjs and library/src/index.mjs with 217, so 286 needs a rebase round before its gate. Brief template gains the skip-list rule. diff --git a/agents/sage/work/vikunja-setup/comment-r217-landed.mjs b/agents/sage/work/vikunja-setup/comment-r217-landed.mjs new file mode 100644 index 000000000..47629279c --- /dev/null +++ b/agents/sage/work/vikunja-setup/comment-r217-landed.mjs @@ -0,0 +1,47 @@ +// Sage, 2026-10-24: row 217 C2-06 landed d0a6a87cd, P19 533 comment (design task, comment only). Comments only. +// Checks each task's title before posting. Prints no secret. +// Usage: node comment-migrate-0cbe-w11.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 PROJECT = 19; +const PSIG = "Posted by Sage (T3 1ef1e4f8) with Sage's own key (bot user 13)."; +const esc = (s) => s.replace(/&/g, "&").replace(//g, ">"); +const ps = (xs) => xs.map((x) => `
${esc(x)}
`).join("") + `${esc(PSIG)}
`; +const POSTS = [ + { id: 533, title: /^Case 2 reply limits become settings/, body: ["Row 217 (C2-06: the citation guard, the page store, the runner texts and the retry, Gitea #1718) landed on refactor at d0a6a87cd, pushed 11:15Z 2026-10-24 together with row 296. Beakley built it on Codex. Webby approved 96659ccf4 (comment 31549, rev 3901). Sage's landing gate went GREEN at 11:14:53Z with every package suite at 0 failures and every scripts/test-*.sh at rc 0. #1718 is closed with landing comment 31559. This task stays open: part (2), Jason's Q29, is Mos's, and this comment doesn't answer it. The live stack is not re-pinned."] }, +]; +if (/LANDSHA|PUSHTIME|CLOSEID|GATE\b/.test(JSON.stringify(POSTS))) throw new Error("placeholder left; refusing"); +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(), comments: [], 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); +}; +for (const P of POSTS) { + const t = await api("GET", `/api/v2/tasks/${P.id}`, undefined, sync); + if (t.status !== 200 || t.json?.project_id !== PROJECT || !P.title.test(t.json?.title ?? "")) throw new Error(`task ${P.id}: ${t.status}, title check failed; nothing posted`); +} +writeFileSync(OUT, "", { flag: "wx" }); +for (const P of POSTS) { + const c = await api("PUT", `/api/v1/tasks/${P.id}/comments`, { comment: ps(P.body) }, key); + const e = { task: P.id, status: c.status, id: c.json?.id ?? null }; + rec.comments.push(e); + if (c.status >= 300 || !Number.isSafeInteger(c.json?.id)) { rec.problems.push(`comment ${P.id}: ${c.status} ${c.json?.message ?? ""}`); save(); continue; } + const back = await api("GET", `/api/v2/tasks/${P.id}/comments?per_page=50`, undefined, sync); + const found = list(back.json).find((x) => x.id === c.json.id); + Object.assign(e, { readBack: back.status, found: Boolean(found) }); + if (back.status !== 200 || !found) rec.problems.push(`comment ${P.id} read-back: ${back.status}`); + save(); +} +save(); +process.stdout.write(JSON.stringify(rec, null, 1) + "\n"); +if (rec.problems.length) process.exit(2); diff --git a/agents/sage/work/vikunja-setup/r217-landed-2026-10-24.json b/agents/sage/work/vikunja-setup/r217-landed-2026-10-24.json new file mode 100644 index 000000000..5557fc0d1 --- /dev/null +++ b/agents/sage/work/vikunja-setup/r217-landed-2026-10-24.json @@ -0,0 +1,13 @@ +{ + "at": "2026-10-24T11:18:48.702Z", + "comments": [ + { + "task": 533, + "status": 201, + "id": 1054, + "readBack": 200, + "found": true + } + ], + "problems": [] +} diff --git a/docs/SESSIONS.md b/docs/SESSIONS.md index 81f5e822e..6769085a6 100644 --- a/docs/SESSIONS.md +++ b/docs/SESSIONS.md @@ -1634,3 +1634,6 @@ are never rewritten or removed; corrections are new entries. 2026-10-24 | Beakley (88b97f65) | Row 217 round 2 under sage-4037 | New beakley/row217-r2 rebased onto e0c6142f3, retained both log histories, E4 product fix and supporting/index tests drafted. No Node/npm/tests/mutants run; ready for CLEAR; local-only dependency installs required on CLEAR, old-test red goes to Sage. 2026-10-24T10:21Z | Beakley (88b97f65) | Row217 #1718 round2 slot | All touched57 and six whole suites2764 pass, zero skips/cancels; M1-M5 killed/restored, E4 RED stand-in observed. First-new runtime fixture red recorded and corrected; no old-test change/failure. Evidence in agents/beakley/work/queue-217/run-r2. Verified for review on beakley/row217-r2; Sage landing scripts/review remain. +2026-10-23T19:03:29Z | Darkwing (7525c8e4) | Re-pin window 464010fbe to 45dca69f6 (sage-3572, mos-1487) | 3n with no migration. P0-P6, B0, W0-W6, W9, W10 PASS (P3 REHEARSAL_PASS mos-1492, W5 go mos-1493), activation 20261023T185911Z-45dca69f6e4b. Condition 11 and D2 held (0 user threads, tester threads unchanged, 0 revoke claims or thread-revoked lines). pm ra38826f3c6e2 ended by W5. Gitea 31271-31282 on 12 rows' issues. Window files pushed darkwing/window-repin-45dca69f6 7cbd02559. P19 body to Sage, slot returned (226 next). No rollback or prune. +2026-10-24T10:09:24Z | Filbert (048f3c63) | Row 296 FED R7 round 1 verdict (#1802) | APPROVE b43156fd9 (comment 31547, rev 3896) on Lena's sage-4035 scoped receipts (plain 0, killed-driver 1, M1/M2 killed by name, restores ok) and my static r2 check (source = a1321f8f9, manifest 2cdad3e6 29/29); full scripts and package gate is Sage's at landing (sage-4046); no tests run by me +2026-10-24T11:15:29Z | Sage (1ef1e4f8) | Rows 296 / #1802 and 217 / #1718 landed (mos-1576, mos-1583) | First gate RED 10:57Z on the cli-skip rule only (FED R7 skips in cli by design); gate rule changed to an explicit allow-list per mos-1583, rerun GREEN 11:14:53Z; pushed d0a6a87cd 11:15Z; #1802 c31557, #1718 c31559 closed; Vikunja 533 c1054; brief template skip-list rule; 286 needs a rebase round (3 shared files) diff --git a/docs/plans/BRIEF-TEMPLATE.md b/docs/plans/BRIEF-TEMPLATE.md index 26adaf6ad..af9da4449 100644 --- a/docs/plans/BRIEF-TEMPLATE.md +++ b/docs/plans/BRIEF-TEMPLATE.md @@ -74,6 +74,17 @@ the builder's and the lead's landing gate, runs its own after canonical node_modules was found empty at 05:45:15Z 10-24 and row 327's gate went red on it). +A skipped cli test turns the lead's landing gate RED unless it is on the +gate's skip list (mos-1583, after row 296's FED R7 test). An entry is the +test file, the test name and the runner script, for example +`tests/federation-acceptance.test.mjs`, "FED R7 scratch two-instance +acceptance", `scripts/test-federation-acceptance.sh`. The skip passes only +when that runner ran in the same gate with rc 0, at least one pass, no +skips, and the named test passed. A builder whose new cli test skips in the +suite by design and runs through a script puts that entry in the brief's +Gate and in BUILD.md with the row, and the lead adds it to the landing +gate's list. Any unlisted skip stays RED. + ### Handoffs Every seat hands off directly (DECISIONS Q210, mos-1221). When the owner