webui: Console pinned copy, update step and service hardening (#1571)

Row 77, round 3 (round 2 rebased onto row 95). Rocko built it. This
covers row 75's N1-N5 and Vikunja 146 and 147. `install --copy ID`
refuses unless every ExecStart path of the bus unit, read from
`systemctl --user show` so drop-ins count, lies inside that copy. It
also refuses when the unit isn't loaded, no unit is loaded, ExecStart
has no path, or systemctl fails. COPY_PATHS gains packages/tasks/src and
packages/tasks/fields.json. Every copy directory is 0555. TOOLS.md and
the webui README give the removal command and the rollback floor.

Candidate manifest d9880f4c92d1d976027562a03cc5dd07512954e86f49f1da0ebb34e642a955f5
(10 paths, 8 applied by the patch, 2 packet files already committed),
base 2e26fbe1, packet agents/rocko/work/queue-77/r2b/. Approvals on round
3: Darkwing 27979 and Filbert 27985 (Filbert round 2: 27898). Sage's
gate rerun 22:32:51Z-22:35:12Z on 459c4fc6 plus the patch (row 92
included), manifest 10/10: webui 101, control-board 124, and every
scripts/test-*.sh exited 0 (test-release 4, Docker cases skipped at a
dead socket).

Live at the next Console install and restart (decision 109). Mos makes
that call.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-12 17:35:26 -05:00
co-authored by Claude Opus 5.5
parent cca5f23eaf
commit 0d10cf0798
8 changed files with 921 additions and 94 deletions
@@ -1,13 +1,16 @@
# Mosaic Console: `node packages/webui/src/cli.mjs serve`, one instance.
# Rendered by scripts/webui-service.sh from packages/webui/systemd/; @REPO@,
# @PATH@, @NODE@ and the serve flags below are filled in at install time.
# Edit the template and reinstall; do not edit the installed copy.
# @REPO@ is the read-only copy `install --copy ID` names, and the flags
# pass the canonical checkout as --checkout for the queue read (row 77).
# Edit the template and reinstall; do not edit the installed unit.
#
# The Console reads the bus through the human transport, so whoever starts
# this unit holds the human's capability. Jason starts it from his own
# shell (`systemctl --user enable --now mosaic-webui`); an agent starting
# it works around the human proof (lead decisions 62 and 94). The unit sets
# no MOSAIC_*, CLAUDE*, CODEX* or PI_* variable.
# this unit holds the human's capability. Jason starts and restarts it
# (`systemctl --user enable --now mosaic-webui`), and so may Mos under lead
# decision 102, which accepts that sends then enter the trail as Jason. Any
# other agent starting it works around the human proof (lead decisions 62
# and 94). The unit sets no MOSAIC_*, CLAUDE*, CODEX* or PI_* variable.
[Unit]
Description=Mosaic Console
Documentation=file://@REPO@/packages/webui/README.md