docs: BUILD-LOG for the row 141 landing; Sage SESSIONS line; row 141 r2 packet; P19 follow-ups 321-322; row 155 carry line

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
jason.woltjeandClaude Opus 5.5 committed 2026-10-16 17:37:22 -05:00
1 parent 28eeef8eac
commit d4c3b2838d
9 files changed
+1601

No files matched your search

+9
View File
@@ -4967,3 +4967,12 @@ Not done: row 152 (#1646) is in review.
- Follow-ups in Vikunja P19, filed with agents/sage/work/vikunja-setup/file-r148-followups.mjs: 318 (Save stays off after a paint throw outside the render), 319 (the dead NUL check at bus.js:671 and :698), 320 (tracks Gitea #1650, the 1 MiB + 64 KiB buffer before the human proof). Correction to mos-0636's labels: #1650 is the buffering issue, not the NUL check. - Follow-ups in Vikunja P19, filed with agents/sage/work/vikunja-setup/file-r148-followups.mjs: 318 (Save stays off after a paint throw outside the render), 319 (the dead NUL check at bus.js:671 and :698), 320 (tracks Gitea #1650, the 1 MiB + 64 KiB buffer before the human proof). Correction to mos-0636's labels: #1650 is the buffering issue, not the NUL check.
- Earlier the same hour: pushed 862af3079..a4779d2a5 (Dewey's and Filbert's SESSIONS lines and queue revs 1588-1623) with no gate, under Mos's 18:57Z docs rule; no test reads the live queue files. - Earlier the same hour: pushed 862af3079..a4779d2a5 (Dewey's and Filbert's SESSIONS lines and queue revs 1588-1623) with no gate, under Mos's 18:57Z docs rule; no test reads the live queue files.
- Not live: the stack runs 52f35e7a0. The editor reaches the Console only through a re-pin, which needs Mos's go. Row 141 r1 is with Filbert, who holds the slot from 22:24Z for single test files. - Not live: the stack runs 52f35e7a0. The editor reaches the Console only through a re-pin, which needs Mos's go. Row 141 r1 is with Filbert, who holds the slot from 22:24Z for single test files.
2026-10-16 22:36:51 UTC | Sage | row 141 landed as de352dfaf (messages addressed by agent name, #1635); schema 3f to 3g; two follow-ups filed
- Before: refactor at 7e40fb83b, row 141 in review on round 1 (Darkwing, build.patch bb036c6d, manifest d474b330, 26 paths, base 18aee8fa1), approved by Filbert (28841). After: de352dfaf on origin/refactor, row 141 done (queue rev 1626, committed in 28eeef8ea with Filbert's rev 1625), #1635 closed with comment 28844.
- Drift: row 148 (d4ea7e5a6) changed packages/bus/README.md and packages/bus/src/broker.mjs. Sage built a rebase-only round 2 in agents/sage/work/queue-141-r2/: the r1 patch applied unchanged on 7e40fb83b, build.patch 72b890d9, manifest cae29087. The interdiff has only index and @@ lines: README +11, broker +5 for the first hunk and +41 for the other three. Filbert confirmed it and the per-file offsets in 28842.
- Landing gate on 7e40fb83b plus the candidate in /mnt/storage/scratch/sage-r141: 25 steps all rc 0 (15 packages, 10 script suites), 22:30:48Z to 22:35:15Z, network sage-r141_default removed, worktree removed. The commit was rebased onto Filbert's 2a85b41da, which adds one docs/SESSIONS.md line that no test reads; the manifest checks OK after the rebase. Push d49da64a9..de352dfaf: fast-forward, no binaries, secrets grep 0 matches; it carried Filbert's two SESSIONS commits 7e40fb83b and 2a85b41da.
- The row gate's "migration tested on a 3f copy" is name-migration.test.mjs on the tests/fixtures/schema-3f.sql store, never the live store.
- Carries: row 155's brief (docs/plans/2026-10-16_q169-assistant-config.md) now says the chief's untypedActions and bundle untyped list are ["instance.name"] and that row 155 brings both back to [] (tools.test.mjs:43, bundle.test.mjs:94). Vikunja P19 321 (TOOLS.md lacks mosaic name and names; acceptance 314 step 10 wording, Filbert's doc-only follow-up) and 322 (refuse or report a new key or definition equal to a current name), filed with agents/sage/work/vikunja-setup/file-r141-followups.mjs.
- Not live: the stack runs 52f35e7a0 at schema 3f. Per mos-0638, rows 148 and 141 go live in one re-pin window, with the 3f to 3g migration and the chief-manifest check expecting untyped == ["instance.name"]. Sage writes that plan next; the window needs Mos's go.
+27
View File
@@ -0,0 +1,27 @@
# Row 141 round 2: rebase only (Sage)
Darkwing's round 1 (agents/darkwing/work/queue-141/, build.patch bb036c6d,
manifest d474b330, base 18aee8fa1) was approved by Filbert (28841). Row 148
(d4ea7e5a6) then changed two of its 26 paths: packages/bus/README.md and
packages/bus/src/broker.mjs.
Sage applied the round 1 patch unchanged with `git apply --index` onto
7e40fb83b with no conflicts. Both paths move by offset only:
- packages/bus/README.md: index line moved; its one hunk moved from 752/754
to 763/765, an 11-line offset from row 148's README addition.
- packages/bus/src/broker.mjs: index line moved; its four hunks moved by 5
(539/543 to 544/548) and by 41 for the other three (1536, 1583, 1917 to
1577, 1624, 1958). Row 148's broker lines above each hunk account for
the shift.
No other path's index or @@ line changed.
- build.patch: 72b890d9, the staged diff on 7e40fb83b
- candidate-manifest.sha256: cae29087, the same 26 paths. Only the two paths
above change hash.
- interdiff.txt: `diff` of the r1 and r2 build.patch. With `index ` and `@@ `
lines removed, both patches are byte-identical (checked with cmp).
The reviewer checks that interdiff.txt touches only index and @@ lines. Sage's
full landing gate runs on 7e40fb83b plus this patch.
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,26 @@
4e6a7f2c37d7bde7c3c7cafeaeb2d12ebf7437c4ab7952c5acce7d6a594dbbf0 packages/business/src/vocabulary.mjs
202ded4cf70e65a88d0da231ac868aa36f5e8c634e8b5d27572ac93a25838e03 packages/business/tests/chief-of-staff.test.mjs
8db9e978f63cf4340065d39a6868d12e6b1014111d2818448ffcf3a3e0f4c237 packages/business/tests/hard-waits.test.mjs
52a98179fc56bb9fd4753c91503872802338b2b7f103b14551a7b894f75b76ff packages/business/tests/role.test.mjs
9dc9d0461c306a4d61bc6b9a045bc8fd07f0b56ce783f32789c17e961e116c6c packages/bus/README.md
a79b3dbe6f4dfba10871c01ad8513ea290071eb8d8af2b87be6db52dbcf23428 packages/bus/schema.sql
13774485342b58c95fbd495ed96974924fbf2cfd8b0bf3526e5a69789e90a929 packages/bus/src/broker.mjs
82f54b264919e34282bc214e34e9849f701cd3723b9b2f0a0d107c16f939dc05 packages/bus/src/migrations/3f-3g.sql
d5a2e64760155fbe0680b8dbe5e93af6de7b13e115b96bc08ec1e2c1bef2dc08 packages/bus/src/store.mjs
867ac287eb2eb04741b84b8ed72424302d926f28c0141d4eabcb3b05257368de packages/bus/tests/chief-of-staff.test.mjs
aa4f2420aeceacc677f4fc3b09256562380ab20617176d3458002ec3935763cb packages/bus/tests/comment-migration.test.mjs
472cbcd0d4548848873f3029e8250dc07bba4fb8db2a93241aae5b8e7e3771e2 packages/bus/tests/fixtures/schema-3f.sql
092a9f51a93bbc227c212e16d5c052dece0df99586f5af6f7019a640cac489ee packages/bus/tests/name-migration.test.mjs
bb67a7a3aebbcdf63f0dd847283f437ad9a31dc3771b046d78f89f251796360c packages/bus/tests/names.test.mjs
8da64ea9ef252368b6ec342ba0a5c7921c1eccf0d278f7d650eb56812796cfbb packages/bus/tests/project-runtime.test.mjs
0ab303ae5f424407742e0f66f57a3a8b7f8b2ade7f7b627c77698148aaebc273 packages/bus/tests/schema.test.mjs
0dfadf443d94e8d334a1337a112c7868b738ca02d26e44264dd316ab62da6e3f packages/bus/tests/spec-migration.test.mjs
9633ac1878ac696029027b643196585cb1723ae7bb46b40f7866cdcdf0f8bdec packages/bus/tests/thread-migration.test.mjs
1653cd668ceebdb3fa0fe8f50bda60854cef8e630f1b7fd7207568b7546ff1c9 packages/cli/README.md
fd0dde5d4c97578a8f266c223108c8e2cff0a94b30cd5995c21a8f477e61dbce packages/cli/src/cli.mjs
8f66da03db1db6f25e076525cf15d0e6acf1dd546b07b45a653d32430935c178 packages/cli/tests/names.test.mjs
71d6dd7a060b8e258520f957578bc3a00975e8d907c15cf51ff78938378ddcf3 packages/harness/README.md
e75325c2d443875bddf5237cf790377267d14971ab63274c4a4bd8c36cba6c1f packages/harness/src/tools.mjs
f9b984c4176a0d9c843ae951e00e23f628e2b8d95adb3a2af0715ed81889b796 packages/harness/tests/bundle.test.mjs
ecd511e74c9378d589445db2e7ae11da0fc7b4e1b204353c3222254d65df055c packages/harness/tests/tools.test.mjs
d227fb5f0a2d241a0091b57f6f396379d7be5a8329e89532e654c90a8f3acd53 roles/chief-of-staff.json
@@ -0,0 +1,28 @@
2c2
< index 1726b61b5..e6bbc3a8c 100644
---
> index 0e43da238..cf299049f 100644
33c33
< @@ -752,3 +754,9 @@ with nulls on existing rows. It changes no event or resolution and creates no
---
> @@ -763,3 +765,9 @@ with nulls on existing rows. It changes no event or resolution and creates no
77c77
< index e89d27fe0..f7ca4458c 100644
---
> index a4ccee699..a72f95885 100644
105c105
< @@ -539,6 +543,22 @@ export class Broker {
---
> @@ -544,6 +548,22 @@ export class Broker {
128c128
< @@ -1536,30 +1556,39 @@ export class Broker {
---
> @@ -1577,30 +1597,39 @@ export class Broker {
174c174
< @@ -1583,27 +1612,28 @@ export class Broker {
---
> @@ -1624,27 +1653,28 @@ export class Broker {
208c208
< @@ -1917,6 +1947,43 @@ export class Broker {
---
> @@ -1958,6 +1988,43 @@ export class Broker {
@@ -0,0 +1,27 @@
{
"at": "2026-10-16T22:36:04.375Z",
"project": 19,
"created": [
{
"title": "docs: name row 141's mosaic name and mosaic names in TOOLS.md and fix acceptance 314 step 10",
"id": 321,
"index": 161,
"inverse": "mark done: POST /api/v1/tasks/321 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
},
{
"title": "business: refuse or report a new instance key or definition equal to a current instance name",
"id": 322,
"index": 162,
"inverse": "mark done: POST /api/v1/tasks/322 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,67 @@
// Sage, 2026-10-16: decision 110. Files row 141's two landing follow-ups (#1635) as tasks in project 19
// with Sage's own key (bot user 13). Refuses if a title already exists. The sync
// key reads each 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-r141-followups.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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
const p = (...xs) => xs.map((x) => `<p>${esc(x)}</p>`).join("") + `<p>${esc(SIG)}</p>`;
const TASKS = [
{ title: "docs: name row 141's mosaic name and mosaic names in TOOLS.md and fix acceptance 314 step 10",
description: p("Row 141 round 1 (#1635), doc-only follow-up from Filbert (comment 28841), decision 137. Row 141 adds the CLI verbs mosaic name INSTANCE NAME and mosaic names [--json] (packages/cli/src/cli.mjs), and docs/acceptance/314.md step 10 points at TOOLS.md for them.",
"Three fixes. 1) docs/TOOLS.md has no entry for mosaic name or mosaic names; add them. 2) Step 10's command reads talk <name from the agents list>; the name comes from mosaic names, so say that. 3) Step 10's pass line says the trail records both the name and the instance; name the read that shows to_role and to_name instead.",
"Doc-only. Before editing, grep packages/*/tests and scripts/test-*.sh for both files; if a test reads either one, it goes through the gate.") },
{ title: "business: refuse or report a new instance key or definition equal to a current instance name",
description: p("Row 141 (#1635) follow-up from Darkwing's BUILD.md, ruled bounded in sage-0590. Row 141 adds instance names; the resolver tries the instance key, then the role, then the name. Whoever adds instances or definitions to a business can create a key or definition equal to a current name. Today the key or role wins and the name stops resolving, which fails safe but silently.",
"Make the writer that adds an instance or a definition refuse that collision, or report the name it shadows, with a test. Row 155 excludes adding instances, so it does not carry this.") },
];
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);
+1
View File
@@ -1093,3 +1093,4 @@ are never rewritten or removed; corrections are new entries.
2026-10-16T22:25:47Z | Sage (Opus 5.5, 1ef1e4f8) | row 148 landing, #1642 | d4ea7e5a6 pushed after Mos's decision 123 go (mos-0636) and a green 25-step landing gate; row done rev 1624, #1642 closed 28838, Vikunja 318-320 filed; a4779d2a5 docs push; not live until a re-pin on Mos's go 2026-10-16T22:25:47Z | Sage (Opus 5.5, 1ef1e4f8) | row 148 landing, #1642 | d4ea7e5a6 pushed after Mos's decision 123 go (mos-0636) and a green 25-step landing gate; row done rev 1624, #1642 closed 28838, Vikunja 318-320 filed; a4779d2a5 docs push; not live until a re-pin on Mos's go
2026-10-16T22:28:19Z | Filbert (Opus 5.5, 048f3c63) | row 141 round 1 review (#1635), manifest d474b330 rebuilt on 18aee8fa1; 15 test files singly on Sage's slot | approve, comment 28841, rev 1625; 114/114 pass 22:26:51Z-22:26:58Z; widened vocabulary.mjs pin holds (sandbox.test.mjs walk plus bare-import assertion); doc-only follow-up on acceptance 314 step 10 and TOOLS.md; row 148 drift on 2 paths noted for the landing 2026-10-16T22:28:19Z | Filbert (Opus 5.5, 048f3c63) | row 141 round 1 review (#1635), manifest d474b330 rebuilt on 18aee8fa1; 15 test files singly on Sage's slot | approve, comment 28841, rev 1625; 114/114 pass 22:26:51Z-22:26:58Z; widened vocabulary.mjs pin holds (sandbox.test.mjs walk plus bare-import assertion); doc-only follow-up on acceptance 314 step 10 and TOOLS.md; row 148 drift on 2 paths noted for the landing
2026-10-16T22:31:42Z | Filbert (Opus 5.5, 048f3c63) | row 141 round 2 rebase check (#1635), manifest cae29087 on 7e40fb83b (sage-0640), read-only, no slot | confirmed, comment 28842; interdiff reproduced and index/@@ only, stripped patches cmp-identical, offsets +11 README and +5/+41 broker match row 148's hunks, rebuild manifest OK 2026-10-16T22:31:42Z | Filbert (Opus 5.5, 048f3c63) | row 141 round 2 rebase check (#1635), manifest cae29087 on 7e40fb83b (sage-0640), read-only, no slot | confirmed, comment 28842; interdiff reproduced and index/@@ only, stripped patches cmp-identical, offsets +11 README and +5/+41 broker match row 148's hunks, rebuild manifest OK
2026-10-16T22:36:51Z | Sage (Opus 5.5, 1ef1e4f8) | row 141 landing, #1635 | rebase-only r2 packet (Filbert 28842), green 25-step gate, de352dfaf pushed; row done rev 1626 (28eeef8ea), #1635 closed 28844, Vikunja 321-322 filed, row 155 brief carry line; not live until the shared 148+141 window on Mos's go
@@ -37,6 +37,14 @@ What exists on base 9aa90193d:
instance-names table, a human-only CLI writer and `to_name`. It has no instance-names table, a human-only CLI writer and `to_name`. It has no
Console route and no chief of staff tool. Row 139 says whichever of 139 Console route and no chief of staff tool. Row 139 says whichever of 139
and 141 lands second gives the chief of staff the grant to set names. and 141 lands second gives the chief of staff the grant to set names.
- Row 141 landed second and carries that grant: `instance.name`, routed,
within-role in `roles/chief-of-staff.json:9`. The chief has no harness
tool for it, so `untypedActions(chief)` and the chief bundle's
`manifest.untyped` are `["instance.name"]`
(`packages/harness/tests/tools.test.mjs:43`,
`packages/harness/tests/bundle.test.mjs:94`). This row gives the chief
a tool for `instance.name`, brings both back to `[]` and re-pins those
two assertions (sage-0590).
- Ending the assistant's run. `end_run` (`tools.mjs:157-162`) is refused - Ending the assistant's run. `end_run` (`tools.mjs:157-162`) is refused
at `broker.mjs:1131`. Once row 139 lets the chief of staff past that at `broker.mjs:1131`. Once row 139 lets the chief of staff past that
check, the end still can't work: `#holder` reads `role_claims` check, the end still can't work: `#holder` reads `role_claims`