diff --git a/docs/plans/2026-09-26_lead-decisions.md b/docs/plans/2026-09-26_lead-decisions.md index be6cb715a..662e61fe9 100644 --- a/docs/plans/2026-09-26_lead-decisions.md +++ b/docs/plans/2026-09-26_lead-decisions.md @@ -2143,3 +2143,24 @@ which stay with him. Each item names who decided it and what happened. - The tradeoff: the bot account names and token dates leave the host on every signed-in page load. If the preview ever admits a second user, this read goes back for review first. + +99. **Row 76's round 2 carries Darkwing's round 1 notes (2026-10-12).** + Darkwing approved round 1 (#1570, comment 27612) with notes N1 to N5 + and questions Q1 and Q2. Round 2 was already due as a rebase on row + 59's landing a8512007, because both rows change + `packages/webui/README.md` and `src/public/bus.js`. + - Round 2 adds N1 (a test for the "Not sent." Reply text), N2 (a test + that the caret survives the refresh), N3 and N4 (README wording on + the message class and on who records delivery), N5 (the refusal + receipt names its code once) and Q1's line in the README proxy + contract: the proxy passes the Console's status and body through and + doesn't rewrite upstream errors. + - Q2 stays as built: `--send` without the bus config refuses at start. + - The class stays INFO as briefed. Changing it to REQUEST would be a + brief change, not part of this row. + - Both reviewers re-review those additions as content, not as a digest + check. Anything that turns out larger than a small change leaves + round 2 and becomes a follow-up row. + - The tradeoff: round 2 takes longer to review. In exchange the proxy + contract line is in the README before any send box is served, and + no follow-up row is needed for five small notes. diff --git a/docs/plans/2026-10-12_runs-list-damaged-record.md b/docs/plans/2026-10-12_runs-list-damaged-record.md new file mode 100644 index 000000000..e9c7b7697 --- /dev/null +++ b/docs/plans/2026-10-12_runs-list-damaged-record.md @@ -0,0 +1,62 @@ +# Runs: one damaged run record stops `list` (2026-10-12) + +Status: written by Sage, lead. It follows `docs/plans/BRIEF-TEMPLATE.md`. +From issue #1551, which Rocko found in row 56 (#1545). Not a bus or +Console row, so the cutover hold (lead decision 94) doesn't apply. + +## Runs list survives a damaged run record + +### Problem + +`scripts/mosaic-task.mjs list` crashes with a `padEnd` TypeError when a +run's `result.json` is a JSON object whose `status` or `taskId` isn't a +string, `{}` for example. `listRuns` (`scripts/mosaic-task.mjs`, the +function above `showRun`) copies `result.status` and `result.taskId` as +they are and calls `padEnd` on them. `listRunRecords` +(`packages/runs/src/runs.mjs`) returns `null` only for a missing or +unreadable record, or a `result.json` that isn't an object, so `{}` +reaches `listRuns`. The crash hides every run listed after the damaged +one. Row 56's byte-identity check kept the behaviour as it was; the +evidence is in `agents/rocko/work/queue-56/BUILD.md` and `out/`. The +`packages/runs/README.md` table already lists `5` and `[]` as reported +`unknown`; an object with the wrong field types isn't covered. + +### Owner and reviewer + +- Owner: Rocko. +- Reviewer: Filbert. + +### Files owned + +- `scripts/mosaic-task.mjs`, `listRuns` only +- `packages/runs/src/runs.mjs`, only if the fix sits in + `listRunRecords` +- `packages/runs/tests/` +- `packages/runs/README.md`, the table of damaged records only +- `agents/rocko/work/queue-/` + +### What ships + +- `list` prints one line for every run, the damaged one included, and + exits as it does today. A `status`, `taskId`, `workspace` or `session` + value that isn't a string prints as `unknown` for the status and `-` + for the others; a well-formed record prints exactly as today. +- Rocko picks whether the check sits in `listRuns` or in + `listRunRecords`, and says why in the packet. If it sits in + `listRunRecords`, `show` and every other caller must print what they + print today for a well-formed record. +- The README table gets a row for an object with wrong field types. +- Tests: `{}`; a numeric `status`; a `null` `taskId`; a damaged run + between two good ones, with both good lines byte-identical to today's + output. Mutants that drop each check survive on the base and are + killed on the candidate. + +### Out of scope + +`show`'s output, `retry`, `prune`, writing or repairing any run record, +and the console's runs view. + +### Gate + +Filbert approves on the row's issue naming the candidate manifest. The +runs node suite and every `scripts/test-*.sh` green on Sage's gate rerun.