From 6dff1561a1c83e9189df300226182bdd57bc6bea Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Mon, 12 Oct 2026 13:45:43 -0500 Subject: [PATCH] build-log: darkwing row 61 (#1550) candidate, round 1 Co-Authored-By: Claude Opus 5.5 --- BUILD-LOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/BUILD-LOG.md b/BUILD-LOG.md index a5e0cc781..7fccba33f 100644 --- a/BUILD-LOG.md +++ b/BUILD-LOG.md @@ -4400,3 +4400,9 @@ After: Jason ruled "Always use Vikunja for task tracking" (Q109, relayed by Mos Before: `mosaic-webui.service` ran from the canonical checkout, so every landing there changed the live Console (decision 109). `install` and `uninstall --no-reload` didn't check whether the unit was running, a failed state read wasn't reported, `--allow-user` could start with `-`, and the uid header took any user name (Vikunja #146, #147, #155; brief `docs/plans/2026-10-12_console-pinned-copy.md`, decision 112). After (candidate, uncommitted, base 27a1a2bb, packet `agents/rocko/work/queue-77/`, candidate manifest sha256 4927de66): `scripts/webui-service.sh copy COMMIT` writes a read-only `git archive` of the Console's paths to `~/.local/share/mosaic-console//` (only from the canonical checkout and only for commits on refactor). `install --copy ID` points the unit at that copy, and serve's new `--checkout` keeps the queue read in the checkout. `status` shows the copy id and whether refactor has moved past it. `install` and `uninstall` refuse while the unit is in any state but inactive or failed, with or without `--no-reload`; a failed state read refuses with one line. Preview values must start with a letter or digit, and the uid header takes only `^[0-9a-f]{64}$`. The template carries decision 102's wording. Two choices are stricter than the brief: files are made read-only before the rename, and the running check covers every state but inactive or failed. Evidence: 28 service and pinned-copy tests; 18 mutants, all killed; a byte check showing `render` without `--copy` matches the base 8 of 8; and the gate (webui node 94/0 and all nine `scripts/test-*.sh` green, kept in `out/gate/`). Moved to in-review at rev 676; the review request failed at rev 677, as expected without a credential, so Sage sends it as jarvis. Nothing touched the live unit. + +### 2026-10-12, Darkwing, row 61 (#1550) candidate, round 1: the task field-writer table as data + +Before: the slice 1 field table was prose only (`docs/plans/2026-10-04_slice-1.md`), and five of its rows disagreed with what `packages/tasks/src/verbs.mjs` does. Lead decision 113 ruled that the prose follows the code and that the table has two layers: the verb-level writer, and whether a decision is needed, which comes from `roles/*.json`. + +After (candidate, uncommitted, base 4f8ac1e7, packet `agents/darkwing/work/queue-61/`, candidate manifest sha256 33b96986): `packages/tasks/fields.json` maps each of the 8 broker task verbs to its writer (`pm`, `assigned` or `any`) and lists the 11 fields with the verbs and Vikunja calls that write each. `checkFields` in `src/fields.mjs` is its schema in code, and `loadFields` checks and freezes it. `tests/fields.test.mjs` reads the writer layer from the table and authority from the role files, then drives every task verb as pm, coder, reviewer and researcher against the fake Vikunja; each verb's writes must equal the table's calls. The Console task page has a "Who may write" section, read from the new `GET /api/task-fields`. The field table section of the slice 1 plan now matches the code. No change to who may write a field or to `roles/*.json`. Evidence: tasks 74/0, webui 82/0 and all nine `scripts/test-*.sh` green; 33 mutants, all killed. Moved to in-review at revs 680-681, request comment 27772. It overlaps row 81 on three webui files; both apply cleanly together, and the second to land re-rounds. Landing changes the live Console (decision 109), so Mos gets notice first.