fix(skills): correct stale guidance and widen task triggers

This commit is contained in:
Ryan Yin committed 2026-10-10 08:42:38 +08:00
1 parent 2d07dc8da5
commit a2cfa5549c
11 files changed
+99 -119

No files matched your search

+10 -14
View File
@@ -1,8 +1,9 @@
---
name: nix-config-debug
description:
Use when something in this repo is broken, such as an eval or build error, a failed activation, a
crashed service, or an unreachable host or MicroVM guest.
Use when something here is broken or stops working: an eval or build error, a failed activation, a
dead or restarting unit, a mihomo or DNS outage, an unreachable host or MicroVM guest, or a failing
CI action.
---
# Debugging this repository
@@ -25,18 +26,19 @@ bump, and the commands that destroy rollback points are in the `nix-config-updat
## 1. Localize by layer
| Layer | Symptom | Look with |
| ------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| ------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| eval | `just test` fails, an eval error | `just eval-host <host>` (already passes `--show-trace`) |
| build | build error, hash mismatch, "marked as broken" | `just build-host <host>`, then `nix log <drv>` |
| activation | the deploy fails after building | the deploy output; `journalctl -u home-manager-$USER -b` for Home Manager |
| runtime | a unit is failed or restarting | `just list-failed`, `systemctl status <unit>`, `journalctl -u <unit> -b` |
| proxy/DNS | proxied sites time out, node and rules look ok | `dig +short <site>` must return a fake-ip (`198.18.x.x`); a real IP means the system resolver bypasses `dns-hijack` — mihomo README Gotchas |
| proxy/DNS | proxied sites time out, or DNS still resolves after mihomo stops | `dig +short <site>` must return a fake-ip (`198.18.x.x`); a real IP means the resolver bypasses `dns-hijack`; on `ai` the `resolvectl dns`/`revert` hook in `hosts/idols-ai/default.nix` ties link DNS to mihomo's lifecycle and other mihomo hosts have no such hook, so read `resolvectl status` before concluding; a statically set link DNS would outlive a dead mihomo. Config and gotchas: [mihomo README](../../../modules/nixos/desktop/networking/mihomo/README.md); regenerate with `just mihomo-gen`, then restart `mihomo.service` |
| boot | errors at boot, wrong kernel | `journalctl -b -p err`; `just history` for what is booted |
| session | desktop or app misbehaves | `journalctl --user -b -p err`; the `nix-config-desktop` skill |
| remote host | anything on a Colmena host | `ssh root@<host> journalctl -b -p err`, same commands over SSH |
| MicroVM guest | guest down or unreachable | on the VM host: `systemctl status microvm@<guest>` and `microvm-tap-interfaces@<guest>`; then `br0` |
| secrets | missing or unreadable `/etc/agenix/*` | the `nix-config-secrets` skill |
| secrets | missing or unreadable `/run/agenix/<name>` | the `nix-config-secrets` skill |
| shell | nushell exits 1 with `File not found` | whether `~/.secrets/` exists on the host; the `nix-config-secrets` skill |
| CI | a GitHub Action keeps failing | `gh run list --workflow <wf>`, `gh run view <run> --log-failed` |
## 2. Read the evaluated value
@@ -73,12 +75,6 @@ to manufacture a clean tree without authorization.
## 4. Prove the fix
Re-run the exact command that failed, then `just test`, then `just build-host <host>` for every
affected host before anyone deploys. Report the evidence ("the unit is active, `just test` is
`true`"), not the intent.
## Why these rules exist
- `5ee8b728 fix(restic): use the correct systemd timer option names (#319)` - an option-name error
that only reading the evaluated value catches quickly.
- `9315055b fix(darwin): unblock home-manager activation` - an activation failure that eval and
build both passed.
affected host before anyone deploys. For a running service, confirm the live config is the one just
generated (service activation time against the file's mtime) and restart if they differ. Report the
evidence ("the unit is active, `just test` is `true`"), not the intent.
+7 -15
View File
@@ -1,8 +1,9 @@
---
name: nix-config-desktop
description:
Use when changing the Niri/Noctalia desktop, the Wayland session, input method (fcitx5), theming,
fonts, or desktop autostart in this repo.
Use when changing what the desktop shows or runs: Niri/Noctalia config, a window that is the wrong
size, garbled, or missing after a reboot, autostart, fcitx5 or vinput input, theming and fonts,
interface names a widget reads, or `$HOME` state that must survive a tmpfs root.
---
# Changing the desktop
@@ -36,7 +37,7 @@ back with git, and needs no rebuild. Only the store layer needs one.
## 1. Pick the layer
| Change | Where it lives | Applies |
| --------------------------------------------- | ------------------------------------------------------------- | ------------------------ |
| --------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------ |
| Niri compositor (binds, layout, window rules) | `home/linux/gui/niri/conf/*.kdl` | live |
| Niri per-host outputs | `hosts/<dir>/niri-hardware.kdl` | live |
| Noctalia shared baseline | `home/linux/gui/base/noctalia/config/config.toml` | live |
@@ -44,6 +45,9 @@ back with git, and needs no rebuild. Only the store layer needs one.
| Noctalia value saved by the Settings UI | `~/.local/state/noctalia/settings.toml` (not in the repo) | live, wins over the rest |
| Mozc dictionary | `home/linux/gui/base/fcitx5/mozc-config1.db` | live |
| fcitx5 profile and addons | `home/linux/gui/base/fcitx5/` | store: needs `just niri` |
| vinput (voice input) | `home/linux/gui/base/vinput/` (tag-pinned: the `fcitx5-vinput` row in WORKAROUNDS.md §Pins) | store: needs `just niri` |
| Interface a net-speed widget reads | `home/hosts/linux/<dir>/noctalia.toml` (`[widget.net_rx]`/`[widget.net_tx]` `interface`) | store: needs `just niri` |
| `$HOME` state that must survive | `hosts/<dir>/preservation.nix` (tmpfs root) | store: needs `just niri` |
| Theme (catppuccin), fonts | `home/base/core/theme.nix`, `modules/nixos/desktop/fonts.nix` | store: needs `just niri` |
| Session, portal, and systemd wiring | `modules/nixos/desktop/**`, `home/linux/gui/base/xdg/` | store: needs `just niri` |
@@ -122,15 +126,3 @@ What a screenshot cannot show:
Do not "test" with commands that act on the session the user is looking at: `niri msg action quit`,
`niri msg action power-off-monitors`, `noctalia msg dpms-off`, `noctalia msg session lock`.
## Why these rules exist
- `063c31cc refactor(noctalia): hot-reload config via out-of-store symlink` - the baseline is
out-of-store precisely so shell edits do not need a switch.
- `1546e54b chore(noctalia): move OSD and notifications to the bottom-right` and
`e93cb979 fix(noctalia): keep the bar readable in light mode` - changes that parse fine and only a
screenshot can judge.
- `495c3669 fix(xdg): order autostart apps after xdg-desktop-portal` - sandboxed apps raced the
portal at login; the fix orders the unit.
- `33383414 fix(niri): match outputs by EDID to survive connector renumbering` - match outputs by
EDID, not by connector name.
+14 -11
View File
@@ -1,8 +1,8 @@
---
name: nix-config-new-host
description:
Use when adding a NixOS, macOS, or MicroVM host in this repo, including its outputs, networking,
secrets, and eval-test wiring.
Use when adding a NixOS, macOS, or MicroVM host in this repo, or wiring an existing machine into
`outputs/`, `hostsAddr`, secrets recipients, and the eval tests.
---
# Adding a host
@@ -35,11 +35,12 @@ in [hosts/README.md](../../../hosts/README.md).
| macOS | `hosts/darwin-fern/` + `outputs/aarch64-darwin/src/fern.nix` (`darwinConfigurations`, no Colmena) |
| MicroVM guest | `hosts/k8s/k3s-test-1-worker-1/` + `outputs/x86_64-linux/src/k3s-test-1-worker-1.nix` |
A MicroVM guest is also registered in its VM host's `microvm.nix`, and is deployed with
`just microvm-deploy`. On a VM host with the `br0` bridge it also needs a `systemd.network.networks`
unit that attaches the guest's tap to `br0`; the tap name comes from the guest IP (`192.168.5.116`
to `vm116`). Some guest outputs also expose a Colmena node for evaluation or other workflows; do not
assume the physical-host deployment is done through Colmena.
A MicroVM guest is also registered in its VM host's `microvm.nix`; deploy it with the procedure in
WA-026 of [WORKAROUNDS.md](../../../WORKAROUNDS.md), not `just microvm-deploy`. On a VM host with
the `br0` bridge it also needs a `systemd.network.networks` unit that attaches the guest's tap to
`br0`; the tap name comes from the guest IP (`192.168.5.116` to `vm116`). Some guest outputs also
expose a Colmena node for evaluation or other workflows; do not assume the physical-host deployment
is done through Colmena.
## 2. Files to create or edit
@@ -60,10 +61,12 @@ assume the physical-host deployment is done through Colmena.
unused `args`: haumea passes them lazily and they are still required.
5. `vars/networking.nix` - `hostsAddr.<name> = { iface; ipv4; }` for a LAN host. That entry drives
the static address, the SSH `Host` alias used for remote builds, and `known_hosts`, so a wrong
`iface` takes the host offline at activation. Skip it for a DHCP or mobile host. If the host
enables `modules.networking.mihomo` and runs systemd-resolved, it needs a DNS takeover tied to
mihomo's lifecycle (`resolvectl dns`/`revert` in `ExecStartPost`/`ExecStopPost`, see
`hosts/idols-ai/default.nix`); a static link DNS would kill DNS when mihomo dies.
`iface` takes the host offline at activation. Skip it for a DHCP or mobile host;
`homeOnly = true` only drops the SSH alias and the local exporters, not `known_hosts` or the
scrape targets. If the host enables `modules.networking.mihomo` and runs systemd-resolved, it
needs a DNS takeover tied to mihomo's lifecycle (`resolvectl dns`/`revert` in
`ExecStartPost`/`ExecStopPost`, see `hosts/idols-ai/default.nix`); a static link DNS would kill
DNS when mihomo dies.
6. `hosts/README.md` - add the host to the inventory.
Pin service user and group ids (`service-user-ids.nix`, as on `shoryu`) before the host has state on
+4 -20
View File
@@ -33,7 +33,8 @@ rebuild and switch on every desktop.
Nothing in this flake evaluates the sync flow: no `secrets.nix` entry, no `agenix -r`, no lock bump,
so the three-step order in §2 does not apply to it. Its manifest and file list live in
`~/codes/nix-secrets/dotfiles/`; this repository carries the pointer, never the inventory. Do not
list synced paths here or copy one into a Nix module.
list synced paths here or copy one into a Nix module. The flow covers the desktops only; do not set
it up on a server or a cluster node.
`nushell-secrets.nu` already moved to `~/.secrets/nushell-secrets.nu`. It has no agenix entry and
must not get one back.
@@ -71,8 +72,8 @@ must not get one back.
| Decryption key | `age.identityPaths`: the host's SSH host key; `/persistent/etc/ssh/...` on a preservation host |
| Secret-bearing dotfiles edited in place | `~/codes/nix-secrets/dotfiles/` — private, not a flake input, no entry in `secrets.nix` |
The private repository groups the `.age` files: `desktop/` (only desktops decrypt them), `server/`
(any server), `certs/`, and `public/`.
The private repository keeps its `.age` files in `desktop/` (only desktops decrypt them), `server/`
(any server), and `certs/`; `public/` holds publishable plaintext, not `.age`.
## 2. Add or change a secret
@@ -116,10 +117,6 @@ encrypts to the recipients in `secrets.nix`, so it needs no `sudo`. `edit` passe
root `agenix` process, because `sudo` resets the environment and the invoking user's `EDITOR` would
not reach it; do not add `sudo -E` or set `EDITOR` yourself.
The repository keeps a single amended commit: `git commit --amend -a --no-edit`,
`git reflog expire --expire-unreachable=now --all`, `git gc --prune=now`, then force push. Treat
amend and force push as impactful and get authorization first.
## 4. Modes and ownership
Use one of the presets in `secrets/nixos.nix` (`noaccess`, `high_security`, `user_readable`); the
@@ -180,16 +177,3 @@ you set, an old copy gone) instead of assuming activation did it.
reads that as a local edit and reports a conflict.
- **A secret is gone after a reboot on a desktop:** it moved out of agenix and its `$HOME` directory
is not in `preservation.preserveAt`, so the tmpfs root drops it.
## Why these rules exist
- `4909f635 security: scope privileges and stop a world-readable secret copy (#335)` - the
`environment.etc` copy trap in step 3.
- `c8e76cef fix(darwin): agenix - remove non-exist secret` - a declaration left behind after its
file was deleted.
- `4211d18a` - a shared `modules/nixos/base` module included `nix-access-tokens`, which not every
host had; the reference moved to `modules/nixos/desktop/nix.nix` (core rule 4).
- `260da1ee chore: rename the nushell secret, and forbid reading decrypted secrets` - the no-reading
rule.
- The move of `nushell-secrets.nu` out of agenix - the `flake.lock` pin, not the encryption, made
each edit of a hand-edited secret cost a rebuild and switch on every desktop.
+10 -13
View File
@@ -2,8 +2,9 @@
name: nix-config-umu-game
description:
Use when installing a Windows game launcher (二次元 / gacha or any non-Steam game) on a NixOS
desktop via umu-launcher, given an installer URL or an .exe, or when such a launcher opens an
invisible, transparent, black, or empty window under Wine.
desktop via umu-launcher, given an installer URL or an .exe, when such a launcher opens an
invisible, transparent, black, or empty window under Wine, or when its download crawls behind the
proxy.
---
# Installing a Windows game launcher with umu
@@ -87,8 +88,11 @@ defaults, so set `PROTONPATH` there to pin a particular installed version across
default with FPS and frame time at the top-left; set `ENABLE_MANGOHUD=0` in `conf` to disable it,
or override `MANGOHUD_CONFIG`. Re-running `prelaunch` must be idempotent. The launcher may then
download the game body itself (tens of GB) -- that is the launcher's job, not this skill's, so
the install is **done** once the window is usable. `ENABLE_LOG=1` captures `last-run.log` when
something misbehaves.
the install is **done** once the window is usable. A crawl usually means the proxy: the launcher
probes the CDN itself and mihomo routes that probe through a distant node, so the download starts
from a far mirror; routing is in the
[mihomo README](../../../modules/nixos/desktop/networking/mihomo/README.md). `ENABLE_LOG=1`
captures `last-run.log` when something misbehaves.
## Invisible / transparent launcher window
@@ -158,8 +162,7 @@ installers honour it; try `/quiet` or `--silent` too, then fall back to the GUI.
The script also writes `~/.local/share/applications/<name>.desktop` (and a copy at
`~/Games/<name>/<name>.desktop`), so the game shows up in the desktop launcher. Under an
impermanence setup both `~/Games` and `~/.local/share/applications` must be in the host's
`preservation.preserveAt` list; in this repo `~/Games` and `.local/share/umu` already are, and
`hosts/idols-ai/preservation.nix` now persists `.local/share/applications` too.
`preservation.preserveAt` list, in `hosts/<dir>/preservation.nix`.
## Uninstall
@@ -203,13 +206,7 @@ GameMode, and `ENABLE_LOG=1` to capture the run. A dGPU wrapper still goes outsi
- Waiting for the game download before calling the install done: the launcher's own download is out
of scope here.
- On NixOS a game needing 32-bit or Vulkan needs `hardware.graphics.enable32Bit`, and Steam is a
module rather than a package -- see the `nix-config-desktop` skill.
## Prior art
`ESKAP3/umu-skeleton` (filesystem-as-game-manager, global.conf, tools), `gizmo-ds/endfield-run`
(`-exec` installer), `Septa-Serpenta-Seraph/Vesper` (umu + GAMEID notes), `joshsymonds/nix-config`
(research-first debugging), `olafkfreund/nixarchy` (NixOS gaming skill).
module rather than a package: `modules/nixos/desktop/gaming.nix`.
## Regression tests
+15 -18
View File
@@ -1,7 +1,9 @@
---
name: nix-config-update
description:
Use when updating flake inputs, bumping nixpkgs, or rolling an update out to hosts in this repo.
Use when a version changes here: upgrading or updating a package or nixpkgs, bumping or pinning a
flake input (a tag or commit, not a branch), or deploying the result to hosts, VMs, and MicroVM
guests.
---
# Updating this flake safely
@@ -31,7 +33,11 @@ deploying the result to any host.
- `git status` is clean, and you are on `main` or a fresh branch for the work. If you are on an
unrelated feature branch, stop and ask for the right branch before bumping.
- `just test` is green _before_ the update, so you have a baseline to compare against.
- `just test` is green _before_ the update, so you have a baseline to compare against. It and every
eval fetch the private `mysecrets` input over SSH; without that access they hang instead of
failing.
- Check [WORKAROUNDS.md](../../../WORKAROUNDS.md) for the inputs and recipes you are about to use;
an active row that names one of them replaces its command here.
- Enough disk for the new closures: `df -h /nix/store`. Broad nixpkgs bumps pull a lot.
- Know what will move and choose the narrowest recipe that does the job.
@@ -72,7 +78,7 @@ Treat an update as a supply-chain event.
- `lib.mkForce` overrides that silently replace existing settings;
- eval-time network access or import-from-derivation.
4. For nixpkgs-class inputs, skim the lock diff and expect broken packages and eval deprecation
warnings (see "Lessons from past updates").
warnings.
5. Write the audit conclusion into the update commit message. If an automatic recipe already made
the commit, amend it only after reviewing the diff; do not push the unaudited commit first.
@@ -85,6 +91,7 @@ Run these before any host is touched:
- `just build-host <host>` — builds the full system closure and catches broken packages or build
failures that eval misses.
- `just build-microvm <guest>` — same, for a MicroVM guest.
- `just test-vm` — the runtime security-VM check (needs `/dev/kvm`); `just test` does not run it.
- `nix flake check` — broader checks when the change touches shared code.
Cover every host you are about to deploy, and prefer building the closure over trusting a green
@@ -126,12 +133,14 @@ ssh root@<host> hostname # the host that actually answers
- Remote servers: `just shoryu [mode]`, `just shushou`, `just youko`, `just ruby`, `just kana`
- All VM hosts at once: `just lab [mode]`; any Colmena tag: `just col <tag> [mode]`
- k3s test nodes: `just k3s-test [mode]`
- MicroVM guest: `just microvm-deploy <guest> <host> <guest-ip>` — deploy guests serially and check
each one before moving on.
- MicroVM guest: `just microvm-deploy` currently fails at its activation step on the guest's
read-only `/nix/store`; WA-026 in [WORKAROUNDS.md](../../../WORKAROUNDS.md) carries the manual
path. Deploy guests serially and check each one before moving on.
Use `boot` plus a deliberate reboot for anything that can drop networking mid-flight: the VM hosts
with the `br0` bridge, and broad nixpkgs bumps. See
[hosts/README.md](../../../hosts/README.md#deploying-vm-hosts).
[hosts/README.md](../../../hosts/README.md#deploying-vm-hosts). Pause Flux sync on the k3s cluster
before changing a node's networking, and resume it once the node is back.
## 6. Verify after deploying
@@ -158,15 +167,3 @@ with the `br0` bridge, and broad nixpkgs bumps. See
would roll back to, so run them last, once the update has proven stable. `just gcroot` only lists GC
roots. The full list of hazardous recipes is in the Command Hazards section of
[AGENTS.md](../../../AGENTS.md#command-hazards).
## Why these rules exist
- `0fe12bef fix(nix): preserve default sandbox shell` - a `nix.settings` change used
`sandbox-paths`, which replaced Nix's compiled defaults (including the sandbox shell used for
legacy shebangs). Use `extra-sandbox-paths`, and verify with
`nix config show | grep sandbox-paths`.
- `125bce3b fix: cuda12.8-cuda_cudart-12.8.90 is marked as broken` and
`78fc64e1 fix(neovim): disable nixvim manpage on broken nixpkgs pin` - broken packages after a
nixpkgs bump are normal; `just build-host` finds them before a deploy does.
- `4bd463a7 chore(eval): resolve catppuccin and rust-overlay deprecation warnings` - input bumps
surface deprecation warnings that become errors in a later bump.
+13 -11
View File
@@ -3,7 +3,8 @@ name: nixpkgs-patched
description:
Use when temporarily carrying an unmerged nixpkgs pull request or commit in the personal
ryan4yin/nixpkgs fork, updating the nixos-unstable-patched branch, or consuming that branch from
this nix-config flake.
this nix-config flake, including a WORKAROUNDS.md row whose removal condition is carrying the
patch.
---
# Carrying a nixpkgs patch
@@ -25,20 +26,21 @@ Before changing either repository, confirm the remotes, branch, PR commits, and
git remote -v
git status --short
git branch --show-current
git fetch upstream nixos-unstable
git fetch origin nixos-unstable-patched
git fetch origin nixos-unstable
git fetch fork nixos-unstable-patched
gh pr view <pr> --repo NixOS/nixpkgs --json state,baseRefName,commits
```
The intended fork is `ryan4yin/nixpkgs` and the intended branch is `nixos-unstable-patched`. Confirm
those names; do not infer a remote from its position in the remote list.
The intended fork is `ryan4yin/nixpkgs` and the intended branch is `nixos-unstable-patched`. In
`~/src/nixpkgs`, `origin` is `NixOS/nixpkgs` and the fork is `fork` (or `ryan4yin`); never push the
patched branch to `origin`. Confirm the names; do not infer a remote from its position in the list.
## 2. Refresh the patched branch
Do this in the nixpkgs checkout (`~/src/nixpkgs`), preserving any existing work:
1. Save a rollback ref to the current patched tip.
2. Align the branch with the current `upstream/nixos-unstable`.
2. Align the branch with the current `origin/nixos-unstable`.
3. Cherry-pick the exact PR commit(s), using `-x` so the upstream source remains recorded.
4. Resolve conflicts deliberately and inspect the complete diff against upstream.
@@ -61,7 +63,7 @@ package use or a patched-branch lock update. For this workflow, inspect the diff
```bash
git diff --check
git log --oneline --decorate upstream/nixos-unstable..HEAD
git log --oneline --decorate origin/nixos-unstable..HEAD
```
Run package builds or tests only when the user requests them or when the selected package is needed
@@ -73,8 +75,8 @@ never imply that unrelated packages or platforms were covered.
After authorization and validation:
```bash
git push --force-with-lease origin nixos-unstable-patched
git ls-remote origin refs/heads/nixos-unstable-patched
git push --force-with-lease fork nixos-unstable-patched
git ls-remote fork refs/heads/nixos-unstable-patched
```
Then in this repository, update only the patched input and inspect the lock diff:
@@ -88,8 +90,8 @@ just build-host <affected-host>
```
The nix-config eval and host-build commands validate this configuration. They are not a reason to
build every package in the patched nixpkgs branch. Run a host build only for a host that consumes the
changed package and only when the user asks for that validation.
build every package in the patched nixpkgs branch. Run a host build only for a host that consumes
the changed package and only when the user asks for that validation.
Keep the nixpkgs fork change, lock update, and unrelated configuration changes separate. Do not run
`just niri`, `just local`, or a remote deployment from this skill; activation is a separate
+6 -6
View File
@@ -1,8 +1,9 @@
---
name: nixpkgs-review
description:
Use when reviewing an upstream NixOS/nixpkgs pull request before it is merged, including its
package changes, passthru tests, dependencies, or CI results.
Use when reviewing an upstream NixOS/nixpkgs pull request before it is merged -- a PR number or
`NixOS/nixpkgs#123` link -- including its package changes, passthru tests, dependencies, or CI
results.
---
# Reviewing nixpkgs changes
@@ -12,10 +13,9 @@ changes against a PR base and can build selected packages and passthru tests. It
way to build a package for local use or validate a nix-config lock update. For local use, build the
needed package or test directly with the project's Nix commands.
Review only the package(s) changed by the PR that are relevant to the review question. Add
`--tests` when the selected package's passthru tests are part of the review. Do not broaden a review
to unrelated packages; selecting a large source package can trigger substantial downloads and
builds.
Review only the package(s) changed by the PR that are relevant to the review question. Add `--tests`
when the selected package's passthru tests are part of the review. Do not broaden a review to
unrelated packages; selecting a large source package can trigger substantial downloads and builds.
## Choose the runner
+15 -8
View File
@@ -75,14 +75,19 @@ introduces one, and re-evaluate entries when their `Revisit` trigger comes up.
- `just eval-host <host>`, `just build-host <host>`, `just build-microvm <guest>`, and `just test`
evaluate or build without activating a system. Use these commands for previews and validation.
- `just up`, `just upp`, and `just up-nix` update flake inputs and commit the lock file. Use
`nix flake update <input>` when the update should remain uncommitted.
- `just up`, `just upp`, `just up-nix`, and `just override-pkgs <hash>` update flake inputs and
commit the lock file. Use `nix flake update <input>` when the update should remain uncommitted.
- `just niri` and `just local` activate the machine you are on through `sudo` and block on a
password prompt; the user runs them, not an agent.
- `just shoryu`, `just shushou`, `just youko`, `just lab`, and `just k3s-test` activate systems
through Colmena. Use the narrower recipe that matches the intended host scope.
password prompt; `just darwin-rollback` switches the macOS generation on the machine you are on,
and a bare `sudo systemctl restart <unit>` activates a running service the same way. The user runs
these, not an agent.
- `just shoryu`, `just shushou`, `just youko`, `just ruby`, `just kana`, `just lab`,
`just k3s-test`, and `just col <tag>` activate systems through Colmena. Use the narrower recipe
that matches the intended host scope.
- `just microvm-deploy <guest> <physical-host> <guest-ip>` installs and activates one MicroVM guest.
Deploy guests serially and check the guest Node and host services after each activation.
WA-026 currently replaces the activation step; check [WORKAROUNDS.md](./WORKAROUNDS.md) before
deploying. Deploy guests serially and check the guest Node and host services after each
activation.
- VM hosts (`shoryu`, `shushou`, `youko`) carry the `br0` bridge for their guests. Use the
`boot`-based host deployment procedure for network stack or broad nixpkgs changes; see
[hosts/README.md](./hosts/README.md#deploying-vm-hosts).
@@ -102,13 +107,15 @@ is discovered by OpenCode and compatible tools.
- [`.agents/skills/nix-config-update/SKILL.md`](./.agents/skills/nix-config-update/SKILL.md) —
updating flake inputs and rolling the result out to hosts safely.
- [`.agents/skills/nix-config-desktop/SKILL.md`](./.agents/skills/nix-config-desktop/SKILL.md) —
which layer owns a Niri/Noctalia setting, live reload vs a rebuild, and on-screen verification.
which layer owns a Niri/Noctalia, input-method, or autostart setting, live reload vs a rebuild,
and on-screen verification.
- [`.agents/skills/nix-config-secrets/SKILL.md`](./.agents/skills/nix-config-secrets/SKILL.md) —
adding, changing, or removing an agenix secret, and verifying it without reading it.
- [`.agents/skills/nix-config-new-host/SKILL.md`](./.agents/skills/nix-config-new-host/SKILL.md) —
wiring a new host into `hosts/`, `outputs/`, networking, secrets, and the eval tests.
- [`.agents/skills/nix-config-debug/SKILL.md`](./.agents/skills/nix-config-debug/SKILL.md) — mapping
a broken eval, build, activation, unit, host, or MicroVM guest to the command that localizes it.
a broken eval, build, activation, unit, proxy or DNS outage, host, MicroVM guest, or CI job to the
command that localizes it.
- [`.agents/skills/nix-config-umu-game/SKILL.md`](./.agents/skills/nix-config-umu-game/SKILL.md) —
installing a Windows game launcher via the umu installer it bundles; per-game fixes stay under
`~/Games/`.
+3 -2
View File
@@ -39,7 +39,7 @@ eval-host host:
build-host host:
nix build $".#nixosConfigurations.{{host}}.config.system.build.toplevel" --no-link --print-build-logs
# Build a MicroVM runner locally. Deploy it with microvm-deploy so the closure is copied remotely.
# Build a MicroVM runner locally. WA-026 in WORKAROUNDS.md covers how to deploy it.
[group('nix')]
build-microvm guest:
nix build $".#nixosConfigurations.{{guest}}.config.microvm.declaredRunner" --no-link --print-build-logs
@@ -210,7 +210,8 @@ reset-launchpad:
col tag mode="switch":
colmena apply {{mode}} --on '@{{tag}}' --verbose --show-trace
# Deploy one microVM guest through microvm.nix's SSH deployment workflow.
# Deploy one microVM guest through microvm.nix's SSH deployment workflow (WA-026: the
# activation step currently fails; see WORKAROUNDS.md).
# The host is the physical machine running the guest; the guest address is used for activation.
[linux]
[group('homelab')]
+2 -1
View File
@@ -36,7 +36,8 @@ just microvm-deploy <guest> <physical-host> <guest-ip>
For example, `just microvm-deploy k3s-test-1-master-3 shushou 192.168.5.116`. The recipe installs
the runner on the physical host first, then activates the guest with the microvm.nix SSH deployment
interface.
interface. WA-026 in [WORKAROUNDS.md](../../WORKAROUNDS.md) currently replaces that activation,
because the SSH switch cannot write the guest's read-only `/nix/store`.
Use `just build-microvm <guest>` to build a runner without deploying it. Preserve the guest's
`etc.img`, `var.img`, and `home.img` when updating it; they contain its identity and K3s state.