Frank 2b7b0bc3cd Make the idle-lock watcher survive a clean exit, and outlive a session restart
`swayidle-lock.service` was `enabled`, in `default.target.wants/`, and **dead for eight days**:

    Active: inactive (dead) since Mon 2026-10-12 16:22:23 PDT; 1 week 1 day ago
    Duration: 2d 21h 57min   Main PID: 3181 (code=exited, status=0/SUCCESS)
    Result=success  NRestarts=0

`Restart=on-failure` cannot see a clean exit, and `swayidle -w` exits 0 on SIGTERM. So the
watcher that owns both the 5-minute idle lock and the `before-sleep` lock stopped existing, and
nothing on the box noticed. The consequence is not cosmetic: with `HandleLidSwitch=suspend` and
`HandleLidSwitchExternalPower=""` (which falls back to it), **closing the lid suspended the
machine unlocked**, because the hook that locks on sleep lived inside the unit that had died. No
alternative was running: `pgrep -c -u blankpad 'swayidle|swaylock|hyprlock|gtklock'` = 0, and
neither `autostart.kdl` launches a locker.

Three settings, each with a job:

- `Restart=always` — a supervisor must not assume it can only die badly.
- `StartLimitIntervalSec=0` — with `always`, a fast loop must never wedge the unit into `failed`;
  a lock that keeps trying beats a lock that stopped trying.
- `PartOf=graphical-session.target` — it is wanted by `default.target`, so a session restart
  brought the target back without it; now the watcher is restarted with the session.

What triggered the 16:22 exit is **unattributed**: the user journal has no entries in that window,
so all that can be said is that swayidle exited with status 0 — precisely what the old policy was
blind to. The fix does not depend on knowing the trigger, which is the point.

Verification is behavioural, per the law recorded with it: start the unit, `kill -TERM` the main
PID, and watch `NRestarts` increment with a new `MainPID` — the October event, survived. Not
performed here: starting it arms a 5-minute idle lock on a machine that has gone a week without
one, and that is Frank's call. `systemd-analyze --user verify` clean, `bats tests/` 71/71,
`kb-lint.sh omp-docs` 0, `kb-coverage.py` 0.

Refs #47
2026-10-20 17:24:32 -07:00
2026-10-15 18:18:40 -07:00

Command Center

Configuration repository for Frank's Userspace configurations (i.e. his desktop setup)

AI Disclosures:

  • Slop rating: 3/5 - Actively using, actively de-slopping, repository still mostly AI owned
  • Completeness: Unfinished, planning planned, no plan yet
  • Datacenter model/spend: Less than $5 of Deepseek 4.1 Flash
  • Local model: Qwen 3.8 27B

slop rating of 3 or higher indicates human reading is a waste of time outside of this README, and that you might as well ask an agent for help with this.

slop rating 3 indicates Frank is comfortable using this for professional use -- but barely.

The Fleet

Host Role IP
Workstation Client box (CachyOS, Niri/Wayland) —
Dankclaw Server (Podman, reverse proxy, Gitea, NPU) 192.168.0.143
Dankserver LLM inference backend 192.168.0.235

The workstation hosts the primary checkout — this repository lives at ~/.omp/ and drives the OMP agent harness.

Structure at a Glance

~/.omp/
├── agent/              # OMP harness runtime
│   ├── config.yml      # Live agent configuration
│   ├── models.yml      # Model providers (single source of truth)
│   ├── APPEND_SYSTEM.md  # System prompt extensions
│   ├── managed-skills/ # Managed skills (SKILL.md bundles)
│   ├── models.db       # Model cache
│   └── sessions/       # Persistent session state
├── dotfiles/           # stow-style env-layer packages (home-relative trees)
│   └── deploy via scripts/deploy.sh (check|adopt|sync; quarantine-and-replace)
├── omp-docs/           # Knowledge base (source of truth)
│   ├── index.md        # KB index — start here
│   ├── system/         # Fleet hardware, OS, network
│   ├── tools/          # Installed software (llama.cpp, Gitea, Caddy, niri…)
│   ├── core/           # Agent config conventions (settings, models, AGENTS.md)
│   ├── pi/             # Legacy pi-era config reference
│   ├── engineering/    # SDLC, languages, infra, skills ecosystem
│   ├── research/       # Decision-support research (not yet facts)
│   ├── references/     # OKF spec, maintenance procedures
│   ├── caddy/          # Reverse proxy configuration
│   ├── packages/       # Pi packages and extensions
│   ├── inventory/      # Userspace config census
│   ├── reports/        # Investigation reports
│   ├── log.md          # Change log
│   └── .okf/           # OKF v0.1 conformance config
├── scripts/            # Utility scripts (kb-lint.sh)
├── plugins/            # npm plugins (pi-peon, etc.)
├── puppeteer/          # Browser automation config
├── .githooks/          # Pre-commit hook
├── .gitignore          # Runtime state ignored (databases, logs, cache)
├── AGENTS.md           # Agent conventions (niri reload, keybindings)
└── README.md           # This file

What Lives Here

Config in, state out. Everything tracked is something an agent reads or writes. Runtime databases (*.db, *.sqlite), logs, caches, and session state are git-ignored — git history captures configuration changes, not agent heartbeat.

Quick Start

Task How
Read the knowledge base omp-docs/index.md — every concept linked from here
Check agent config agent/config.yml + agent/models.yml
Lint the KB scripts/kb-lint.sh (OKF v0.1 conformance)
View change log omp-docs/log.md
Run a pre-commit .githooks/pre-commit

Conventions

  • OKF v0.1 — every doc file carries YAML frontmatter with a type: field. index.md files are directory listings (no frontmatter).
  • Progressive disclosure — index.md is a landing page; drill into subdirectories for detail.
  • Verified facts — stamped with verified: when probed against the live fleet. Trust over memory.
  • Single config source — ~/.omp/agent/models.yml is the only model registry; OMP is the primary harness and there is no second copy to keep in sync.

Legacy Notes

omp-docs/pi/ and omp-docs/core/ retain general documentation about the pi-coding-agent harness (its config format, packages, skill system) for reference. OMP at ~/.omp/ is the live harness; managed skills live in ~/.omp/agent/managed-skills/.

S
Description
No description provided
Readme
83 MiB
Languages
Shell 72.9%
HTML 14%
Lua 5.6%
HIP 4.1%
CSS 2.4%
Other 1%