Watch
1
0
Fork
You've already forked SouveraineOS
0

file task 76: nothing owns provisioning

Five souveraine files own no package across the two live devices, and
/etc/systemd/system/souveraine-machined.service shadows the packaged
signer unit on both — measured, not inferred. Retires the Phase C deploy
checklist: CLAUDE.md banned its build step on 2026-07-24, START-HERE §5
bans its deploy step.
This commit is contained in:
Fimeg 2026-08-15 09:53:49 -04:00
commit 6e2f3f80ab
3 changed files with 144 additions and 7 deletions

View file

@ -151,14 +151,29 @@ gap or heartbeat proves flaky in practice.
## Deploy checklist (phone, when reachable)
1. On-device build: `cargo build --release --features sessiond --bin
**Superseded 2026-08-15 — steps 13 below are the pre-packaging route and three
of them are now banned. Kept as the record of how Phase C first reached the
phone; do not follow them.** The current route:
1. `pacman -Syu` on the phone. sessiond, its unit and (since TASK-76) its PAM
file are all package-owned.
2. Cold boot, and step 4 below is still the expected sequence.
The original, and why each step retired:
1. ~~On-device build: `cargo build --release --features sessiond --bin
souveraine-sessiond` in `~/build/souveraine` (nice 15, -j 3), install to
`/usr/local/bin`.
2. Sync Pixel3Arch rootfs-overlay bits: `/etc/pam.d/souveraine-sessiond`,
`/etc/systemd/user/souveraine-sessiond.service`; `systemctl --user
daemon-reload`.
3. Deploy hyprland.lua (restore flag + hook line) and `deploy.sh --phone`
for the shell (bridge + LockScreen patch).
`/usr/local/bin`.~~ Banned 2026-07-24 — `souveraine/CLAUDE.md`: binaries
hand-copied to `/usr/local/bin` are owned by no package and silently never
update; sessiond sat five days behind and its state machine never ran.
archdev cross-compiles, CI packages, pacman delivers.
2. ~~Sync Pixel3Arch rootfs-overlay bits.~~ The overlay reaches a device only
on flash and the phone does not flash (TASK-28). Both files are packaged
now: the unit from `PKGBUILD.prebuilt`, the PAM file added 2026-08-15.
The overlay copies are a shadowing hazard, not a delivery route (TASK-76).
3. ~~`deploy.sh --phone` for the shell.~~ `START-HERE.md` §5: never. TASK-25
demoted it to a recovery instrument for an explicitly quiesced target,
after it killed a live conversation mid-use.
4. Cold boot. Expected: splash → sessiond PIN surface (spartan) → shell lock
replaces it seamlessly once quickshell is up. `journalctl --user -u
souveraine-sessiond` shows acquire → handoff → locked_ack.

View file

@ -0,0 +1,121 @@
# TASK 76 — Provisioning belongs to a package, per device, per arch
**Status:** scoped 2026-08-15, measured on both devices, not started.
**Size:** one session for the audit fixes, a second for the provision packages.
Every souveraine binary ships as a package. Nothing that *activates* those
binaries does. Five system files on the two live devices are owned by no
package, and one of them shadows a packaged unit on both machines at once.
## Measured 2026-08-15
`pacman -Qo` across the laptop (souveraine r506) and the phone (r503):
```
phone /etc/pam.d/souveraine-sessiond Jul 16 21:17 UNOWNED
phone /etc/systemd/system/souveraine-machined.service Jul 16 12:36 UNOWNED
phone /etc/systemd/system/souveraine-splash.service Jul 17 08:23 UNOWNED
phone /etc/systemd/user/souveraine-shell.service Jul 17 07:49 UNOWNED
laptop /etc/systemd/system/souveraine-machined.service UNOWNED
```
All five were hand-placed inside one 20-hour window on 2026-07-16/17 — the
Phase C session in `session-authority-boot-order.md` — and none has been
touched since.
**The shadow is live on both devices.** `systemctl show souveraine-machined -p
FragmentPath` returns `/etc/systemd/system/souveraine-machined.service` on the
laptop *and* the phone. `/etc/systemd/system` outranks `/usr/lib/systemd/system`,
so the packaged copy — which both machines carry and `pacman -Qo` attributes to
`souveraine` — is inert. machined is the Ed25519 identity signer; every
capability token in the system descends from the unit systemd is not reading.
Nothing misbehaves today: the laptop's two copies are byte-identical. That is
what makes it dangerous. The first packaged change to that unit — the tmpfiles
socket ACL `provisioning-gaps.md` §6 still owes, ordering, hardening — lands in
a file nothing loads, and `-Syu` reports success.
**Activation is unpackaged too.** The sessiond unit ships correctly from
`PKGBUILD.prebuilt:51` to `/usr/lib/systemd/user/` on both arches, and on both
devices it is `disabled` and `active` — started by a hand-written line in a
file that lives in no repo:
```
laptop ~/.config/hypr/hyprland/execs.lua:19 systemctl --user start souveraine-sessiond.service
phone ~/.config/hypr/hyprland.lua:420 systemctl --user reset-failed …; systemctl --user restart souveraine-sessiond.service
```
Two devices, two different invocations, versioned nowhere. Reinstall either
machine and its proprioception does not come up.
The unit's `[Install] WantedBy=graphical-session.target` is vestigial and
actively harmful: the designed path is an explicit start after
`WAYLAND_DISPLAY` reaches the user manager (the unit says so in its own
comment), and `systemctl --user enable --now` is precisely the mid-session
start that locks the screen with no lock surface. The section that looks
correct to systemd convention is the one that black-screens the machine.
## The pattern already runs on the phone
`blueline-edge-sense 0.2.0-2` owns:
```
/usr/lib/systemd/user/souveraine-sessiond.service.wants/blueline-edge-sense.service
```
A device-specific, arch-specific package declaring activation against a
souveraine unit — package-owned, no enable step, no hand edit, in place since
2026-07-29. That is the shape. It needs no invention, only application.
## What is missing
1. **The four unowned files get a package.** PAM has a rail already —
`PKGBUILD.prebuilt:15` carries `backup=('etc/pam.d/souveraine-stepup')` and
installs it at `:103`; `souveraine-sessiond`'s PAM file simply never got
added. `souveraine-machined.service` is already packaged to
`/usr/lib/systemd/system/`; the `/etc/` copies are what must go, and
removing a file no package owns needs Casey's hand, not a hook.
2. **A `souveraine-provision-<device>` package per device.** Owns the `.wants`
symlinks that replace both lua lines, plus device-scoped config. `blueline`
and the laptop are the two that exist; the arch split falls out of the
package's own `arch=()`.
3. **Delete the vestigial `[Install]` section**, or make it correct. Two
activation paths where one black-screens the device is not a choice a
reader should be offered.
4. **`rootfs-overlay/etc/systemd/user/souveraine-sessiond.service` in
Pixel3Arch is a loaded gun.** Verified *not* on the phone — there is no
`/etc/systemd/user/souveraine-sessiond.service` and `FragmentPath` is the
packaged one. If a flash ever lands it, it shadows every future package
update of that unit permanently. Same question for
`rootfs-overlay/etc/pam.d/souveraine-sessiond`.
5. **`session-authority-boot-order.md`'s deploy checklist is stale and
harmful.** Its §1 still says build on-device and install to
`/usr/local/bin`, which `souveraine/CLAUDE.md` banned on 2026-07-24. Fix in
place; do not delete the doc.
## Acceptance
- `pacman -Qo` returns an owner for every `souveraine-*` file under
`/etc/pam.d`, `/etc/systemd`, and `/usr/lib/systemd` on both devices.
- `systemctl show souveraine-machined -p FragmentPath` returns the
`/usr/lib/systemd/system/` path on both devices.
- Neither `hyprland.lua` nor `execs.lua` mentions sessiond; both devices still
come up with sessiond active after a cold boot, and the lock surface is the
shell's, not the fallback PIN.
- A fresh install of either device brings up sessiond with no hand-editing.
## Connects to
`docs/provisioning-gaps.md` §4 named this requirement on 2026-07-16 —
*"installed by packaging, enabled at commission"* — for `souveraine-server`.
The packaging half landed everywhere; the commission half is the node ceremony
`FEDERATION.md` still parks, and this task is its first concrete piece.
TASK-25 (one repo, all packages) and TASK-27 (overlay is not a package) own the
*delivery* rails; TASK-28 owns authority moving mid-upgrade. This is neither —
it is who owns activation at commission time, which has had no task file. If a
future session decides it belongs inside 27, fold it there rather than leaving
two.
`SESSION-AUTHORITY-DOCTRINE` §11 (one authority) is the reason the machined
shadow matters: two copies of the signer's unit is two answers to who signs.

View file

@ -100,6 +100,7 @@ Four that are cheap relative to what they unblock:
| 23 | [culver locked-notification nudge](23-culver-locked-notification-nudge.md) | Needs `SyncBurst()` + an IdleCoordinator schedule (TASK-15). |
| 24 | [Keyboard layout rethink](24-keyboard-layout-rethink.md) | Superseded by TASK-17's reference-led Daily/Terminal Squeekboard layouts. Retained as design evidence; do not resume its Stevia patch plan. |
| 27 | [Gitea pipeline audit](27-gitea-pipeline-audit.md) | The fixes. Overlay is not a package; no `primary` branch; poisoned build sysroot. |
| 76 | [Provisioning belongs to a package](76-provisioning-by-package.md) | Five hand-placed files own no package on the two live devices, and `/etc/systemd/system/souveraine-machined.service` shadows the packaged signer unit on **both**. Activation is two unversioned lua lines. `blueline-edge-sense` already ships the correct `.wants` pattern. |
| 32 | [Pill and keyboard as owned apps](32-pill-and-osk-as-apps.md) | Keyboard now has one runtime/package owner and no dual-OSK provisioning; glass proof remains. Pill ownership and package-owned shell delivery remain open. |
| 33 | [Battery belongs to the state machine](33-battery-as-device-state.md) | Last raw feed going straight to the glass. The charge ceiling is writable today. |
| 37 | ["Back" as a first-class verb](37-navigation-back-verb.md) | Our `Gestures.qml` is already the compositor half; `can_go_back` is the dial's enabled/reason. |