diff --git a/BUILD-LOG.md b/BUILD-LOG.md index 94383d719..77cc74a9e 100644 --- a/BUILD-LOG.md +++ b/BUILD-LOG.md @@ -5517,3 +5517,5 @@ claim. Receipts and limitations in agents/lena/work/queue-296/BUILD.md and run-r 2026-10-24T12:09:17Z | Magica | Row285 / #1790 r4 C1 diagnostic result | Before: valid landed-base candidate0f6cdc861; first old citation-runtime red. After: mos-1584/sage-4086 full unchanged collection, six suites2950 tests2937pass/12fail/1skip/0cancel; WebUI418 and plugins119 green, all12 script suites exit0, dedicated federation1/1. CLI release300s runner cap interrupted; retained and resolved via unchanged1800s retry224/224 in599.6s. Failures: citation-runtime1, instance-settings2, lifecycle-settings1, launcher1, harnesscreative7. Static root causes/fix classes and r3 parity in agents/magica/work/queue-285/BUILD.md. No source/test edits or fix round/mutants; no final manifest or in-review; owner ruling required. 2026-10-24T13:02:03Z | Magica | Row285 / #1790 r4 VERIFIED | Before: C1 collection12 failures. After: approved three data corrections, actual-bound-ref guard, duplicate-before-eligibility hire, data-derived creative equal-service retention/listing with validator first; no old assertion edits. Own fresh128/2 installs, editor-required shortTMP serialized final gate: bus975/975 business282/282 cli988pass/1expectedskip webui418/418 harness172/172 plugins119/119, all12 scripts exit0.13 mutations14 independent checks killed; each SHA256/Git blob restored; restored controls136/136. Case1 doc/test/helper base-identical; N1 deferred. Own r4 candidate for Poe/Webby review, no landing/live action. + +2026-10-24T13:33:42Z | Sage | Row 285 (#1790, C2-08b, Magica on Codex, Poe and Webby) LANDED 1f3d0350f. Before: refactor at 25874bc86. After: r4 candidate 2e4503dc7's 14 commits cherry-picked onto 25874bc86. The one conflict (9f7adb03e, BUILD-LOG.md and SESSIONS.md) is append-only and kept both sides, with 0 lines removed against either parent. Apart from the logs, the tree equals the candidate except on the 7 paths 25874bc86 and 4c6190645 had changed. Reviews: Poe first review c31568 rev 3919, Webby landing review c31569 rev 3920, both static. Sage posted both because neither seat has a token. Gate GREEN 13:28:46Z with its own root and webui npm ci (mos-1575): 17 package suites, 4236 tests, 0 fail, 1 skip, which is the allowed FED R7 entry whose runner passed 1/1 (mos-1583). All 12 scripts/test-*.sh rc 0. The other skips are the queue canonical-root check and the row 244 live provider cases. Brief gate: no CREATIVE_KINDS in packages, roles or scripts; no test or script pins the old or new sha256 or blob of a changed role file (positive control found chief-of-staff.json readers); role JSONs match mos-1309 item 5 design 4, with gitea scopes added (read for the chief, read:user and write:repository for the creative roles). Before the push, the in-review overlap sweep found only row 286 (broker.mjs), which rebases as r5. push-check FF_OK, NO_BINARY, SECRETS_CLEAN, NO_ATTRIBUTION. #1790 closed with c31580, Vikunja 546 c1056 (already done). Queue note rev 3921, done rev 3922. Correction to my own rulings: sage-2921 (285's #giteaRole refuses the chief) and sage-2947 (286's T7/T9 mint the chief's grant through the real raise, no SQL staging) conflict now that 285 has landed (rockerduck-0008). sage-4100 keeps the refusal and has T7/T9 seed a read-only chief grant as labeled fixture data, with an assertion that the real path refuses and with revoke and fire still on the real verbs. The tradeoff is that the chief mint goes untested until C2-21 (row 287), whose brief now replaces the seeds. Dewey confirms in 286's round-2 delta. Brief template gains the mos-1584 businessDoc library chief-ref line. The C2-02 brief gains webby-0282 N1 (tool names match the creative contracts). Follow-up webby-0282 N3: business.mjs uses the literal "chief-of-staff" instead of STAFF_TO. The live stack is not re-pinned. diff --git a/agents/sage/work/vikunja-setup/comment-r285-landed.mjs b/agents/sage/work/vikunja-setup/comment-r285-landed.mjs new file mode 100644 index 000000000..8428c1f46 --- /dev/null +++ b/agents/sage/work/vikunja-setup/comment-r285-landed.mjs @@ -0,0 +1,47 @@ +// Sage, 2026-10-24: row 285 C2-08b landed 1f3d0350f, P19 546 comment (task already done, 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: 546, title: /^PRD 1\.16: Jason approves the library\.write routing/, body: ["Row 285 (C2-08b: library.write and the gitea credential for the six creative roles, a read-scoped gitea credential for the chief of staff, Gitea #1790) landed on refactor at 1f3d0350f, pushed 13:33:42Z 2026-10-24. Magica built it on Codex. Poe approved it in comment 31568 (rev 3919) and Webby in comment 31569 (rev 3920). Sage's landing gate went GREEN at 13:28:46Z: 4236 package tests with 0 failures and 1 allowed FED R7 skip, and every scripts/test-*.sh at rc 0. #1790 is closed with landing comment 31580. This task was already done and stays done. 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/r285-landed-2026-10-24.json b/agents/sage/work/vikunja-setup/r285-landed-2026-10-24.json new file mode 100644 index 000000000..45ca7e16c --- /dev/null +++ b/agents/sage/work/vikunja-setup/r285-landed-2026-10-24.json @@ -0,0 +1,13 @@ +{ + "at": "2026-10-24T13:36:14.926Z", + "comments": [ + { + "task": 546, + "status": 201, + "id": 1056, + "readBack": 200, + "found": true + } + ], + "problems": [] +} diff --git a/docs/SESSIONS.md b/docs/SESSIONS.md index d03edacf0..c740faa03 100644 --- a/docs/SESSIONS.md +++ b/docs/SESSIONS.md @@ -1652,3 +1652,6 @@ are never rewritten or removed; corrections are new entries. 2026-10-24T12:09:17Z | Magica | Row285 r4 C1 collected, HOLD | sage-4080/4085/4086, mos-1584: unchanged0f6cdc861, own installs/editor-required/shortTMP; six suites2950 tests2937pass/12fail/1expectedskip, all12 scripts exit0. Release first300s bound exit124 preserved; unchanged1800s retry224/224 in599.6s. Twelve product failures in5 files, six cause classes traced in BUILD; both instance-settings reds preexist onr3 by identical source/role blobs. No fix round, source/test edits, mutants, commit/push or in-review; Sage takes full picture to Mos. 2026-10-24T13:02:03Z | Magica | Row285 r4 verified | mos-1585/1586: source/fixture fixes complete, six whole suites2955 tests2954pass/0fail/1expectedskip/0cancel; all12 scripts exit0;13 mutations14 checks killed and blob-restored; restored controls136/136. Old assertions and Case1 preserved. Evidence agents/magica/work/queue-285/BUILD.md. Own-r4 commit/push/manifest and canonical in-review move authorized next; Poe/Webby reviews remain. + +2026-10-24T13:07:40Z | Magica (483bbea5-e548-4c97-9b85-8f29ba81e427) | Row285 / #1790 r4 in-review | Pushed candidate2e4503dc7d1b42962206ab5d39a14e3d4091076f; six suites2954pass/0fail/1expectedskip, all12 scripts0,13 mutations14 kills/restored, controls136/136. Canonical move magica-285-inreview-r4 rev3915 to in-review round1; automatic request failed rev3916 because seat has no Gitea token, Sage posts Poe request as planned. Manifest e1a81aa79d0fcef7bc084a6ec24e6c75f7ae825b546d712011203826e4165602; slot returned. +2026-10-24T13:38:41Z | Sage (1ef1e4f8) | Row 285 / #1790 landed (mos-1576, mos-1584-1586) | Poe c31568 and Webby c31569 approved 2e4503dc7; gate GREEN 13:28:46Z on the cherry-picked tree; pushed 1f3d0350f 13:33:42Z; #1790 c31580 closed; Vikunja 546 c1056; sage-4100 rules 286's T7/T9 chief grant seed until C2-21; brief template mos-1584 line; C2-21 and C2-02 brief lines diff --git a/docs/plans/2026-10-20_case2-rows.md b/docs/plans/2026-10-20_case2-rows.md index c5b3b99d7..5e8a720bc 100644 --- a/docs/plans/2026-10-20_case2-rows.md +++ b/docs/plans/2026-10-20_case2-rows.md @@ -2024,6 +2024,11 @@ naming a non-library project refuses `gitea-not-declared`. The rendered block ho level and the line above. The install test's business file gives the chief `identity` and `publish`. A mutant that drops the library-only condition from `#giteaRole` fails. +Row 286's T7 and T9 (C2-03b) seed the chief's read grant as fixture data, because row 285's +`#giteaRole` refuses the chief and no executor mints a read grant before this row (sage-4100). This row +replaces those seeds with the real chief read grant through `decision.raise`, the human's yes and the +executor, and keeps their revoke and fire assertions unchanged. + ### Out of scope The askpass use of the token (C2-03b). The write verbs (C2-02). Running a grant on a live host, which @@ -2129,7 +2134,10 @@ Granting tokens (C2-21). Webby approves the manifest. The library, bus and harness suites are green on Sage's gate, along with every `scripts/test-*.sh`, and the mutants are killed. A search of the test run's output for the fixture -tokens finds nothing. +tokens finds nothing. The six creative `.md` contracts already name `library_doc_write` and +`library_doc_delete` (row 285, for example `roles/companion.md:44`). The builder checks that the typed +tools this row ships carry exactly those names, or changes the contracts in this row as a role change +(webby-0282 N1). ### Handoffs diff --git a/docs/plans/BRIEF-TEMPLATE.md b/docs/plans/BRIEF-TEMPLATE.md index af9da4449..780af328f 100644 --- a/docs/plans/BRIEF-TEMPLATE.md +++ b/docs/plans/BRIEF-TEMPLATE.md @@ -85,6 +85,11 @@ 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. +Any row that builds businessDoc() with a library project sets the chief's +gitea ref in its fixture (mos-1584, after row 285 gave the chief of staff +a read-scoped gitea credential that the validator requires when a business +declares a library). + ### Handoffs Every seat hands off directly (DECISIONS Q210, mos-1221). When the owner