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.
- 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.
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: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: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
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.
- 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
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`