All checks were successful
Check / eval (push) Successful in 3m59s
The logo was off-centre on the external when booting/shutting down docked. Both earlier diagnoses in this repo were WRONG, and that is the part worth keeping: Window.GetWidth() returns max_width (not head 0), and per-head sprites would have DUPLICATED the logo — the script plugin already builds one max_width x max_height canvas, centres every display inside it (script-lib-sprite.c:536) and draws sprites at (sprite.x - display.x), so a canvas-centred sprite is centred on every head. The arithmetic was right. The bug was TIME: every position was a top-level statement evaluated once at parse time. A head arriving/leaving mid-splash resizes the canvas, the plugin re-centres the displays, and frozen sprites end up off by (new_max - old_max)/2 on every head. One monitor never resizes the canvas — hence "only when docked". Fix: one layout(), re-run from the existing refresh callback on canvas change. The trap that cost two attempts (now a comment): in plymouth script a bare assignment inside a function writes the GLOBAL if that name already exists globally. So `canvas_width = Window.GetWidth()` updated global.canvas_width BEFORE the guard compared against it — always false, body never ran, splash rendered as a bare background, NO error logged. Isolated with a 20-line probe. Hence cw/ch. #145 rides along: a VT loads one keymap and knows nothing of per-device layouts, so the passphrase box types with the console layout — worth saying before three wrong tries on a disk you cannot read (same gap as #114, one step earlier). Fedora's mechanism does not port: ply_keymap_icon is a C widget in the two-step plugin (the script plugin has no keyboard API), fed from XKBLAYOUT in /etc/vconsole.conf, which NixOS never writes (plymouth's trace says `XKBLAYOUT: (null)`). So @LAYOUT@ is baked from services.xserver.xkb.layout like the palette — the FIRST of a comma list, since that is what the VT loads. Icon is plymouth's own keyboard.png (the same glyph Fedora shows), copied at build time so no GPL bytes enter the repo, recoloured to subtext. chmod +w after that copy: store files are 444 and recolor rewrites in place. Without it magick fails, the phase aborts, and EVERY LATER SED SILENTLY DOES NOT RUN — the theme shipped with @BG_R@ literals and I only caught it by reading the build log. Verified by render (tools/plymouth-preview.sh, real built theme): both heads centred, password dialog showing padlock + entry + keyboard icon and "us". V3 queued — only a real docked boot can resize a canvas. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Agent instructions + loop state
Everything an AI agent needs to work on Nomarchy, vendor-neutral and git-tracked. Protocol: LOOP.md. Entry point for every harness: repo-root AGENTS.md.
Instructions (how to work)
| File | Who writes | Role |
|---|---|---|
| LOOP.md | Human | One-iteration protocol (orient → pick → work → verify → commit → record) + the V0–V3 ladder |
| VERIFICATION.md | Human (agents propose) | Enforcement: preflight, honesty rules, visual protocol, hardware-blocked checks, reporting |
| DELEGATION.md | Human (agents propose) | Capability tiers, scout/runner roles, token economy, parallel fan-out |
| GOALS.md | Human (agents propose) | Pillars, quality bars, non-goals |
| CONVENTIONS.md | Human (agents propose) | How to write code/menu/state while shipping |
| THEME-DESIGN.md | Human (agents propose) | Theme/visual design instructions |
State (what's happening)
| File | Who writes | Role |
|---|---|---|
| BACKLOG.md | Both | Prioritized queue — only executable work list |
| JOURNAL.md | Agents | Append-only iteration log (read last 3–5 entries; older → JOURNAL-ARCHIVE.md) |
| MEMORY.md | Agents | Curated durable gotchas |
| HARDWARE-QUEUE.md | Agents append, human checks | On-hardware V3 tests only Bernardo can run |
Product / design docs (not a queue)
| File | Role |
|---|---|
| ../docs/VISION.md | v1.0 product themes — agents slice into BACKLOG PROPOSED |
| ../docs/ROADMAP.md | Design history + shipped log |
| ../docs/README.md | Full docs map |
Harness adapters (vendor-specific, thin)
Shared content never lives in an adapter — adapters only register/route into the files above, in whatever format their harness requires.
| Path | Harness | Role |
|---|---|---|
| ../AGENTS.md | any | Entry point (CLAUDE.md is a symlink to it) |
| ../.claude/settings.json | Claude Code | Tool permissions |
| ../.claude/agents/ | Claude Code | nomarchy-scout / nomarchy-runner role defs (contracts in DELEGATION.md) |
Do not put backlog items, vision text, or policy under an adapter directory — it is not shared with other agent runners.
Rules of thumb
- Execute from BACKLOG only (NOW → NEXT; never PROPOSED without human triage).
- Orient with GOALS + CONVENTIONS + MEMORY + last journal + BACKLOG; when the task is product-shaped, also read the relevant VISION §.
- Record lasting design in ROADMAP ✓ when something ships that future humans should know; delete the BACKLOG line.
- v1 branch is human-only — never advance from an agent session.