All checks were successful
Check / eval (push) Successful in 2m59s
SUPER+SHIFT+K → hyprctl switchxkblayout current next, rendered only
when the session layout has a comma — the same gate as the Waybar
language indicator. Bind data is a separate multiLayoutBinds list in
keybinds.nix (still one source); hyprland.nix and the rofi cheatsheet
gate on the identical condition, so bind and cheatsheet cannot drift.
`current` targets the focused keyboard, so per-device-overridden
boards (single layout) are a no-op.
Parity: hyprland/language (with the keyboard glyph) added to both
summer waybar.jsonc whole-swaps + #language in their CSS. Static JSON
cannot eval-gate, so on summer themes the module shows even with one
layout — parity-over-minimalism, deliberate. Found en route:
summer-night has an idle_inhibitor the generated bar lacks (reverse
gap) — folded into backlog item 13.
Also — agent/BACKLOG.md gains items 21-24 from Bernardo's Latitude
5410 hardware QA (waybar crash on theme switch + no respawn; nameless
network-menu rows; a no-update sys-rebuild; Back-everywhere audit),
queued ahead of everything; HARDWARE-QUEUE's snapshot re-test now
carries the "update to >= a47aa3a + relogin" precondition, since
findings 5/6 match the pre-polkit-agent behavior exactly.
Verified: V0 (flake check, both summer JSONs parse) + V1 both
directions (default single-layout build renders no bind; us,de via
extendModules renders bind AND cheatsheet row). V3 cycle check queued.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
180 lines
10 KiB
Markdown
180 lines
10 KiB
Markdown
# Journal — append-only iteration log
|
||
|
||
One entry per iteration, **newest first**. This is the loop's short-term
|
||
memory: the next session reads the last 3–5 entries to orient. Keep an
|
||
entry under ~15 lines; durable lessons go to MEMORY.md, not here.
|
||
|
||
Template:
|
||
|
||
```markdown
|
||
## YYYY-MM-DD — <task title> (<commit sha, or "no commit">)
|
||
- **Task:** which BACKLOG item (or QA sweep / bootstrap / escalation)
|
||
- **Did:** what changed, in 2–4 lines
|
||
- **Verified:** tier reached (V0/V1/V2) + the actual commands/checks run
|
||
- **Pending:** V3 queued? follow-ups filed? anything [stuck]?
|
||
- **Next suggestion:** what the following iteration should probably take
|
||
```
|
||
|
||
---
|
||
|
||
## 2026-07-04 — Keyboard cycle bind + parity (iteration #6) + Latitude triage
|
||
- **Task:** BACKLOG NOW#5; mid-iteration Bernardo delivered Latitude
|
||
5410 hardware-QA findings (the machine got a real session!).
|
||
- **Did:** `multiLayoutBinds` in keybinds.nix (SUPER+SHIFT+K →
|
||
`switchxkblayout current next`), gated in hyprland.nix AND the rofi
|
||
cheatsheet on the same comma-in-layout condition; `hyprland/language`
|
||
+ `#language` CSS added to both summer whole-swaps (shows even
|
||
single-layout there — static JSON can't gate; deliberate). Reverse
|
||
parity gap found (summer-night has idle_inhibitor, generated bar
|
||
doesn't) → folded into item 13. **Triage:** four new NOW items from
|
||
hardware: #21 Waybar crash on theme switch + no respawn (top),
|
||
#22 nameless network-menu entries, #23 `sys-rebuild` (no-update
|
||
rebuild), #24 Back-everywhere audit.
|
||
- **Verified:** V0 (JSON + flake check) + V1 both directions
|
||
(single-layout build: no bind; `us,de` via extendModules: bind + the
|
||
cheatsheet row render; summer JSONs parse).
|
||
- **Pending:** V3 cycle-bind check queued; items 21/22/24 carry V3
|
||
re-checks on the Latitude.
|
||
- **Next suggestion:** #21 (waybar crash — stability pillar, user-hit).
|
||
|
||
## 2026-07-04 — Webcam follow-ups (loop iteration #5, quick item)
|
||
- **Task:** BACKLOG NOW#7 (Bernardo asked for "a quick item").
|
||
- **Did:** template `home.packages` gains a commented "Webcam tuning"
|
||
pair (cameractrls GUI, v4l-utils CLI — bare packages, so template not
|
||
toggle, per the option-surface rule); the portal/Flatpak libcamera IR
|
||
gap is written up as a PROPOSED item with three options (recommend:
|
||
document-only now, libcamera-rule investigation when the T14s is
|
||
available). CI runs #60/#61 confirmed green (earlyoom + snapshot fix).
|
||
- **Verified:** V0 (flake check — template evals through mkFlake;
|
||
changes are comments + agent docs).
|
||
- **Next suggestion:** NOW#5 (keyboard cycle bind + summer parity) —
|
||
the last code item in NOW besides the docs pass.
|
||
|
||
## 2026-07-04 — Snapshot GUI un-broken + polkit agent (loop iteration #4)
|
||
- **Task:** BACKLOG NOW#4 — btrfs-assistant segfault.
|
||
- **Did:** re-diagnosed instead of overriding. gdb: crash is in
|
||
libbtrfsutil's *unprivileged* subvolume iteration (btrfs-progs 6.17.1;
|
||
upstream fix `886571653` post-6.17.1; symbol versions verified — not
|
||
ABI drift). VM A/B: root works (exit 0), user crashes (139). The
|
||
launcher runs it as root → GUI fine *if* pkexec can prompt — and the
|
||
distro shipped **no polkit agent** (all pkexec silently failed; the
|
||
actual root cause of "GUI is dead"). Shipped: hyprpolkitagent
|
||
(exec-once, Stylix-themed Qt), menu re-pointed to the launcher with
|
||
the fzf flow as fallback, `checks.snapshot-gui` canary (root path +
|
||
offscreen event loop on real btrfs). No btrfs-progs patch — root-side
|
||
flows don't hit the bug; the fix arrives with a lock bump.
|
||
- **Verified:** V0 + V2 (snapshot-gui check, run for real) + V1 (HM
|
||
generation renders the agent exec-once; menu bash -n).
|
||
- **Pending:** V3 queued — first on-hardware themed polkit prompt.
|
||
- **Next suggestion:** NOW#5 (keyboard cycle bind + summer parity).
|
||
|
||
## 2026-07-04 — CI is green (run #58) — item 20 main half closed
|
||
- **Task:** monitor follow-up, no code. Run #58 (the .gitea path fix)
|
||
**succeeded** — first green CI: the container recipe works on the
|
||
live runner, eval tier confirmed end to end.
|
||
- **Did:** BACKLOG item 20 reduced to its stretch (KVM runner → enable
|
||
vm-checks), moved to NEXT. Run #59 (earlyoom push) monitored.
|
||
- **Next suggestion:** NOW#4 (btrfs-assistant override attempt).
|
||
|
||
## 2026-07-04 — Memory-pressure protection shipped (loop iteration #3)
|
||
- **Task:** BACKLOG NOW#3 — default-on userspace OOM killer.
|
||
- **Did:** `modules/nixos/oom.nix`: earlyoom (mkDefault on, desktop
|
||
notifications, session-plumbing `--avoid` list, no `--prefer`) +
|
||
`systemd.oomd.enable = false`. Choice rationale: Hyprland session is
|
||
one cgroup scope → oomd's cgroup-level kill would nuke the desktop;
|
||
earlyoom is process-level. Found en route: nixpkgs default-enables
|
||
oomd *inert* (enable=true, all slice toggles false). README "beyond
|
||
the surface" note added.
|
||
- **Verified:** V0 (flake check) + **V2** — new `checks.oom-protection`
|
||
runNixOSTest, run for real: hog (chunked allocator, 686 MB peak in a
|
||
1 GB VM) SIGTERM'd by earlyoom in 0.1 s, bystander unit survived,
|
||
oomd asserted inactive. 25 s test, cheap enough for the suite.
|
||
- **Pending:** nothing hardware-specific (behavior fully VM-provable).
|
||
- **Next suggestion:** NOW#4 (btrfs-assistant override attempt). Also:
|
||
CI run #58 (the .gitea fix) was *running* at commit time — check its
|
||
outcome next tick; this push triggers #59.
|
||
|
||
## 2026-07-04 — CI fix: wrong workflow dir (correction to iteration #2)
|
||
- **Task:** Bernardo reported no run despite an active runner + shared
|
||
his compose file: the server is **Gitea** (gitea/act_runner), not
|
||
Forgejo — I'd shipped the workflow to `.forgejo/workflows/`, which
|
||
Gitea never reads. The legacy repo's `.gitea/workflows/` path was the
|
||
clue I under-weighted.
|
||
- **Did:** `git mv` → `.gitea/workflows/check.yml`; corrected the
|
||
Forgejo references in the workflow header, TESTING.md §1b, BACKLOG
|
||
item 20 (now: watch the first run; runner was never the problem);
|
||
MEMORY.md gains the Gitea-not-Forgejo line.
|
||
- **Verified:** the push of this commit is itself the test — the run
|
||
must appear; monitoring.
|
||
- **Pending:** first green run (item 20); runner-container memory
|
||
headroom is the watch-out.
|
||
|
||
## 2026-07-04 — CI checks-on-push shipped (loop iteration #2)
|
||
- **Task:** BACKLOG NOW#2 — Forgejo Actions workflow.
|
||
- **Did:** `.forgejo/workflows/check.yml` (push to main/v1 + dispatch):
|
||
flake check --no-build, theme-sync py_compile, bash -n over tracked
|
||
.sh. Scoped to the **eval tier** deliberately — API probing +
|
||
archaeology of the legacy `.gitea/workflows/check.yml` (57 runs on
|
||
this instance) showed the runner is an act_runner docker container
|
||
(no KVM/systemd), so the VM suite can't run there; a commented
|
||
`vm-checks` job documents the KVM-runner upgrade path. Legacy's
|
||
hard-won container gotchas (nixbld setup, sandbox=false for Stylix
|
||
IFD, Nix 2.31.5 pin) carried over verbatim. TESTING.md §1b added.
|
||
- **Verified:** V0 locally (same commands the workflow runs, minus the
|
||
container Nix install) + yq YAML parse. The real green run needs the
|
||
runner to be alive — **not confirmable from here** (runners API is
|
||
401 unauthenticated); watching the run after push.
|
||
- **Pending:** new `[human]` item 20 — confirm/re-register the runner;
|
||
stretch: a KVM runner unlocks the vm-checks job.
|
||
- **Next suggestion:** NOW#3 (memory-pressure protection).
|
||
|
||
## 2026-07-04 — Opt-in auto-commit shipped (loop iteration #1)
|
||
- **Task:** BACKLOG NOW#1 — auto-commit of state mutations (in-flake
|
||
state Phase 4). First autonomous /loop iteration.
|
||
- **Did:** `settings.autoCommit` live-read by nomarchy-theme-sync;
|
||
pathspec-limited commit of theme-state.json on apply/set (fires if flag
|
||
on before OR after the write → the off-toggle commits too); identity
|
||
fallback; same-value no-op; `bg` excluded. Menu: System › Auto-commit
|
||
(instant, self-gated on `.git`). Rider: `get` prints booleans as JSON
|
||
`true`/`false`, fixing the stuck "Auto timezone (on/off)" menu label.
|
||
BACKLOG numbering switched to stable IDs (no renumbering).
|
||
- **Verified:** V0 (py_compile, flake check) + V1 (HM generation builds;
|
||
generated menu `bash -n`) + a 7-assertion sandbox git-repo round-trip
|
||
(enable/set/same-value/disable/post-disable/apply/identity-fallback).
|
||
- **Pending:** V3 queued in HARDWARE-QUEUE (on-machine toggle + apply).
|
||
- **Next suggestion:** NOW#2 (CI checks-on-push) — but its runner half
|
||
may need Bernardo to register a Forgejo runner; deliver the workflow
|
||
regardless.
|
||
|
||
## 2026-07-04 — Backlog revision pass (human-requested)
|
||
- **Task:** Bernardo asked for a philosophy-aligned revision of BACKLOG.md
|
||
("I'm sure I'm forgetting important items").
|
||
- **Did:** verified guessed gaps against the tree first (GC/optimise/boot
|
||
limit + all 21 previews already ship — dropped those ideas). Added the
|
||
confirmed gaps: CI-on-push promoted to NOW#2 (agents push to main now),
|
||
memory-pressure protection NOW#3 (nothing mitigates OOM; the release
|
||
bump died to one), viewers+mime defaults #8, update/rollback UX #9,
|
||
nomarchy-doctor #10, state-file validation #11, screen recording #12,
|
||
niceties batch #13 (idle-inhibit, low-battery notify, hyprpicker), OCR
|
||
in LATER; recovery runbook folded into the docs item; zram + default
|
||
browser added to Decisions.
|
||
- **Verified:** V0 (docs-only).
|
||
- **Pending:** Bernardo to sanity-check the new NOW ordering, esp. CI at
|
||
#2 and the two new Decisions.
|
||
- **Next suggestion:** unchanged — NOW#1 (opt-in auto-commit).
|
||
|
||
## 2026-07-04 — Bootstrap the loop infrastructure (this commit)
|
||
- **Task:** create `agent/` (human-requested): LOOP/GOALS/BACKLOG/
|
||
CONVENTIONS/MEMORY/HARDWARE-QUEUE/JOURNAL, root CLAUDE.md, README +
|
||
ROADMAP pointers.
|
||
- **Did:** reworked the forward half of docs/ROADMAP.md into the tiered
|
||
BACKLOG (5 NOW / 6 NEXT / LATER / Decisions); collected every pending
|
||
on-hardware check into HARDWARE-QUEUE.md; seeded MEMORY.md from the
|
||
ROADMAP's decision records.
|
||
- **Verified:** V0 (docs-only change; `nix flake check --no-build` run to
|
||
confirm the tree still evaluates).
|
||
- **Pending:** Bernardo to sanity-read GOALS.md pillars + BACKLOG tiering
|
||
— reorder freely, the order *is* the instruction.
|
||
- **Next suggestion:** BACKLOG NOW#1 (opt-in auto-commit — Phase 4 of
|
||
in-flake state, already the agreed next step).
|