diff --git a/docs/plans/2026-09-26_lead-decisions.md b/docs/plans/2026-09-26_lead-decisions.md index 41c3fbc9..b4a60d09 100644 --- a/docs/plans/2026-09-26_lead-decisions.md +++ b/docs/plans/2026-09-26_lead-decisions.md @@ -1704,3 +1704,33 @@ which stay with him. Each item names who decided it and what happened. terminal gets it through a CLI verb in a later row. - Talk, launch budget, stop and Library are briefed when row 41 lands. + +82. **Q14 F9 is answered by plan rev8's gate V, with no code change + before the window; decision 80's journal claim was wrong + (2026-10-10).** rev-sol-01 failed rev7 on F9: `mosaic tasks` reads + the broker's stored task view and never proves the adapter is ready + after the restart. ops-01's rev8 adds gate V, which reads the + Vikunja pod's request log. `tick` runs only in state `ready`, so two + tick pairs returning 200 after the restart show a ready adapter + making real reads. Sage acked rev8 at brain 6743ec95c, sha + f4003b78, after three wording changes (W1 to W3): the startup + reconcile reads belong to V-B, comment and task reads after ready + are not triggers, and item 6 reads the journal for the refusal line. + - Correction to decision 80: "the journal is empty for the unit" is + wrong. The broker's stderr reaches the user journal, and a refusal + logs `tasks startup `. Success logs nothing. The + 10-09 22:57Z start lines had aged out, because this host's user + journal starts at 2026-10-10T05:52Z. Item 6 now checks for that + line inside gate V's 3 minutes. + - No status verb before the window: it would change `packages/bus` + and `packages/cli`, both frozen, and row 41 rewrites + `packages/bus`. A one-line `startup ready ` log in + `packages/tasks` is issue #1552, briefed in + `docs/plans/2026-10-10_q14-adapter-ready-line.md`. It is queued + after the hold ends. Landing code the night before a window only + to make the window observable is the wrong trade when gate V + already observes it. + - The only node client in mosaic-stack that reaches the tracker is + Sage's one-off `agents/sage/work/vikunja-setup/` scripts, which + don't run during the window. Seats run no live tracker probes from + 2026-10-11T15:00Z until the hold ends. diff --git a/docs/plans/2026-10-10_q14-adapter-ready-line.md b/docs/plans/2026-10-10_q14-adapter-ready-line.md new file mode 100644 index 00000000..a6de8b9f --- /dev/null +++ b/docs/plans/2026-10-10_q14-adapter-ready-line.md @@ -0,0 +1,89 @@ +# Q14 F9: the tracker adapter logs its ready state + +Lead: Sage. Issue #1552. Lead decision 82 records the ruling: this row +waits until the Q14 hold ends. Q14 plan rev8's gate V answers F9 without +code, so the row is a follow-up, not a window prerequisite. + +## Tracker adapter logs its ready state + +### Why + +rev-sol-01 failed Q14 plan rev7 on F9. The plan proved tracker readiness +after the bus restart with `scripts/mosaic tasks --business mosaic-stack`. +That command reads the broker's persisted `task_current` view and never +reaches the adapter, so a cached row passes even when the adapter refuses. +The review asks for "an actual post-restart bus-driven tracker result or +demonstrable adapter readiness." + +The adapter (`packages/tasks/src/adapter.mjs`) holds `state` per business: +`starting`, `ready` or `refused`. Nothing outside the process can read it. + +- A refusal logs `tasks startup ` on stderr. The unit's + stderr goes to the user journal. +- A successful start logs nothing unless the Vikunja version is untested. +- A poll writes rows (`task_snapshots` with `source = 'poll'`, and + `task.changed.external` events) only when a task changed, so a quiet + tracker leaves no row after a restart. +- `mosaic bus status` reads files and /proc only. + +A status verb that asks the running broker would need changes in +`packages/bus` and `packages/cli`. Row 41 (S6) rewrites `packages/bus`, and +the Q14 freeze holds both, so that is not this row. + +### Change + +In `start(ctx)` in `packages/tasks/src/adapter.mjs`, once `startup(ctx)` +and the startup `reconcile(ctx)` have both returned and `state` is +`ready`, log exactly: + +``` +tasks startup ready +``` + +`` is `ctx.version`, the version string `GET /info` returned. The +line comes before the existing `startup untested-version` line, which +stays as it is. A refused start still logs only the refusal. A transient +refusal that a later poll-interval retry clears logs the refusal first and +then the ready line. Nothing else changes: no new state, no new verb, no +change to what `handle`, `tick` or `reconcile` do. + +### Tests + +- `packages/tasks/tests/adapter.test.mjs` and `startup.test.mjs`: every + assertion on `w.log` after a successful start now expects the ready line + first. The untested-version test expects both lines in order. +- A new test: a refused start logs no ready line, and a transient refusal + that a retry clears logs `startup ` and then + `startup ready `, in that order. +- A mutant that drops the line, or moves it before `reconcile` returns, + must fail a test. + +### Docs + +`packages/tasks/README.md`, section "Startup": say that a passing start +logs `tasks startup ready ` after the startup +reconcile, and that this line is the positive signal an operator checks +after a restart. + +### Files + +`packages/tasks/src/adapter.mjs`, `packages/tasks/tests/adapter.test.mjs`, +`packages/tasks/tests/startup.test.mjs`, `packages/tasks/README.md`, +`agents/rocko/work/queue-62/`. Nothing under `packages/bus`, +`packages/cli`, `scripts/bus-service.sh` or `scripts/mosaic`. + +### Gate + +`node --test 'packages/tasks/tests/*.test.mjs'`, the +`packages/runs`, `queue`, `webui`, `conversation` and `control-board` node +suites, every `scripts/test-*.sh`, and `test-task.sh` without Docker. +Sage reruns the gate in a scratch worktree and lands the row. + +### Deadline and deployment + +`packages/tasks` is frozen until ops-01 reports the Q14 hold ended, so the +row is queued only after that. It has no deadline. + +The unit's ExecStart is the checkout's `scripts/mosaic bus start`, so the +next bus restart after landing loads the change. The row adds no restart +of its own. Don't restart the running bus to try it.