docs: register Dewey row 133, Researcher row 132 and Sage landing sessions; row 134 P19 filing
SESSIONS lines: Dewey 18:00:14Z (row 133 round 2), Researcher 18:05:08Z (row 132 round 1 build), Sage 18:26:44Z (rows 133, 70 and 132 landed). vikunja-setup: the script and read-back that filed row 134 as P19 task 308. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"at": "2026-10-15T18:05:12.021Z",
|
||||
"project": 19,
|
||||
"created": [
|
||||
{
|
||||
"title": "bus: a role holding organization.change can read the organization revision (queue row 134)",
|
||||
"id": 308,
|
||||
"index": 149,
|
||||
"inverse": "mark done: POST /api/v1/tasks/308 done true (pm); delete is Jason's or ops-01's",
|
||||
"readBack": 200,
|
||||
"project_back": 19,
|
||||
"due_back": "0001-01-01T00:00:00Z",
|
||||
"done": false
|
||||
}
|
||||
],
|
||||
"problems": []
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
// Sage, 2026-10-15: decision 110. Files one follow-up as a task in project 19 with Sage's own key (bot
|
||||
// user 13): queue row 134, a role holding organization.change can't read the revision organization.set needs
|
||||
// (Researcher's row 132 build, sage-0355). Refuses if the title already exists. The sync key reads it back.
|
||||
// No labels, no assignees, no bucket moves. Rollback is marking the task done; deletion is Jason's or
|
||||
// ops-01's. Prints no secret.
|
||||
// Usage: node file-r134.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 SIG = "Created by Sage (T3 1ef1e4f8) with Sage's own key (bot user 13).";
|
||||
const esc = (s) => s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
||||
const p = (...xs) => xs.map((x) => `<p>${esc(x)}</p>`).join("") + `<p>${esc(SIG)}</p>`;
|
||||
const TASKS = [
|
||||
{ title: "bus: a role holding organization.change can read the organization revision (queue row 134)",
|
||||
description: p("Researcher's row 132 build (#1628), ruled a follow-up by Sage in sage-0355. organization.set requires revision (broker.mjs line 99 ORGANIZATION_KEYS, line 732), and the only verb that returns it, limits, refuses anyone but the human (line 729). So the chief's change_organization tool works only with a revision it got some other way. A stale one fails closed with revision-conflict (organization.mjs line 185), so nothing is damaged and the 3d window is not blocked.",
|
||||
"Queue row 134, brief docs/plans/2026-10-15_organization-revision-read.md (commit 26f4f9701), lands after row 132, reviewer Filbert. The read returns the revision only, must not consume the grant, and a session without organization.change still gets nothing. Any change to who may write the organization file or to roles/*.json goes to Jason.") },
|
||||
];
|
||||
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 : []);
|
||||
async function existing() {
|
||||
const out = [];
|
||||
for (let page = 1; page < 20; page++) {
|
||||
const r = await api("GET", `/api/v2/projects/${PROJECT}/tasks?per_page=50&page=${page}`, undefined, sync);
|
||||
if (r.status !== 200) throw new Error(`list tasks: ${r.status}`);
|
||||
out.push(...list(r.json));
|
||||
if (list(r.json).length < 50) return out;
|
||||
}
|
||||
throw new Error("more than 19 pages");
|
||||
}
|
||||
const rec = { at: new Date().toISOString(), project: PROJECT, created: [], 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 before = await existing();
|
||||
const clash = before.filter((t) => TASKS.some((x) => x.title === t.title));
|
||||
if (clash.length) throw new Error(`exists: ${clash.map((t) => `#${t.id} ${t.title}`).join("; ")}; refusing`);
|
||||
writeFileSync(OUT, "", { flag: "wx" });
|
||||
|
||||
for (const t of TASKS) {
|
||||
rec.created.push({ title: t.title });
|
||||
save();
|
||||
const body = { title: t.title, description: t.description, ...(t.due ? { due_date: t.due } : {}) };
|
||||
const r = await api("PUT", `/api/v1/projects/${PROJECT}/tasks`, body, key);
|
||||
if (r.status >= 300 || !Number.isSafeInteger(r.json?.id)) {
|
||||
rec.problems.push(`create ${t.title}: ${r.status} ${r.json?.code ?? ""} ${r.json?.message ?? ""}`);
|
||||
break;
|
||||
}
|
||||
Object.assign(rec.created.at(-1), { id: r.json.id, index: r.json.index, inverse: `mark done: POST /api/v1/tasks/${r.json.id} done true (pm); delete is Jason's or ops-01's` });
|
||||
const back = await api("GET", `/api/v2/tasks/${r.json.id}`, undefined, sync);
|
||||
Object.assign(rec.created.at(-1), { readBack: back.status, project_back: back.json?.project_id, due_back: back.json?.due_date, done: back.json?.done });
|
||||
if (back.status !== 200 || back.json?.title !== t.title || back.json?.project_id !== PROJECT || back.json?.done) rec.problems.push(`${t.title} read-back differs`);
|
||||
}
|
||||
save();
|
||||
process.stdout.write(JSON.stringify(rec, null, 1) + "\n");
|
||||
if (rec.problems.length) process.exit(2);
|
||||
@@ -1010,3 +1010,6 @@ are never rewritten or removed; corrections are new entries.
|
||||
2026-10-15T18:04:08Z | Filbert (Opus 5.5, 048f3c63) | row 70 (#1564) round 2 review, Sage's mosaic-on-PATH docs, candidate 098b9aef | approve, comment 28602, rev 1332: F1 and both doc-only items fixed, delta.patch matches my r1-to-r2 diff, scripts/mosaic changes comment lines only, links resolve; dispatch 4/4 and 6 mutant runs; no slot
|
||||
2026-10-15T18:11:27Z | Filbert (Opus 5.5, 048f3c63) | row 132 round 1 review (#1628, end_run and change_organization tools) | approve, comment 28604, rev 1338, candidate ba644f8d...cf07
|
||||
2026-10-15T18:25:01Z | Filbert (Opus 5.5, 048f3c63) | row 132 round 2 confirm review (#1628, rebase on row 133) | approve, comment 28606, rev 1347, candidate 0a0ebbf6...048e
|
||||
2026-10-15T18:00:14Z | Dewey (Opus 5.5, 84fb346c) | row 133 (#1627) round 2 on 89fd2d6fe per sage-0350 | in review, request comment 28597 to Filbert, revs 1323-1325: packet agents/dewey/work/queue-133/r2 (346347c95, local), candidate 1c0e6f8f, delta.patch empty (r1's patch on the new base matches r2), mutants 5/5 killed with controls passing and targeted gate rc 0 in the sage-0353 slot, released 17:57:43Z
|
||||
2026-10-15T18:05:08Z | Researcher (Sonnet 5.5, 9bac0794) | row 132 #1628 round 1 build | end_run (role.revoke, reason 1-500, no decision) and change_organization (organization.set) typed tools for roles holding role.end / organization.change; chief bundle manifest lists both in typed and untyped is [] for pi and claude-code (bundle.test.mjs:85); stop-line text varies by end_run; broker.mjs:99 export is the only bus change; revision-read gap left to row 134; 28 of 28 mutants killed, full gate green (business 92, bus 191, plugins 21, tasks 97, cli 195, webui 112, harness 90, seat 132, land-work 84) | in-review move and Filbert request are Sage's (no credential); packet agents/researcher/work/queue-132 (8a73f713c, local, nothing pushed)
|
||||
2026-10-15T18:26:44Z | Sage (Opus 5.5, 1ef1e4f8) | land rows 133, 70 and 132; row 132 round 2 rebase; row 134 filed | 133 a622f426c (Dewey, Filbert 28600) and 70 73fa83a08 (Filbert 28602) on one gate, 24 suites 0 failed on 4a34fb0d6; 132 rebased unchanged on 73fa83a08 after 133 changed broker.mjs (agents/sage/work/queue-132/r2, 17a66cdb0), gate 24 suites 0 failed, Filbert 28604 and 28606, landed 0e947c216; queue revs 1318-1348 in ab3a57a3c; row 134 P19 task 308; Darkwing's land-work overlapped my 132 gate about 10s, both passed, rerun alone 84/0
|
||||
|
||||
Reference in New Issue
Block a user