2026-05-24 23:21:02 +02:00
---
name: iso-build
description: Build the current Clawdie ISO image on the FreeBSD host from this repo, using the default tmux window workflow (`clawdie:3` / `iso` ), repo-local tmp/ caches, step-by-step preflight, and the current operator-USB validation expectations.
---
# iso-build
Use this skill for the normal FreeBSD host build path from the checked-out
`clawdie-iso` repo. This is the current repo-local operator workflow, not the
older “clone elsewhere and publish to nginx” flow.
docs: rewrite negative patterns to positive actionable instructions
Convert 'do not' / 'never' / 'avoid' / 'cannot' / 'must not' patterns
into positive 'do ABC to achieve XYZ' instructions across four key docs.
Files changed:
- AGENTS.md: role restrictions, linux constraints, formatting gate,
private workspace, scratch paths, mount discipline, source-of-truth
- BUILD.md: colibri compilation, mini-binary policy, USB flashing,
SSH-key distribution, mDNS scope, PF logging, host disk policy
- skills/iso-build/SKILL.md: build gating, CLI policy, command chaining,
tmux workflow, colibri preflight/cargo-clean timing, SDDM retention
- PLAN-OPERATOR-USB-NEXT.md: SDDM contract, package categorization,
bhyve gating, dashboard dependencies, seed checkout exclusions
Safety-critical constraints (USB whole-disk flashing, verified artifacts
only) are preserved with positive rephrasing that keeps the constraint
intact.
2026-06-21 13:13:08 +02:00
Run ISO builds only when the operator explicitly assigns one. For planning,
docs, package-list edits, or static inspection tasks, use static checks
instead of building.
2026-05-24 23:21:02 +02:00
## Current operator-USB expectations
- Default validation image size: `28G`
- Live browser: Firefox, not Chromium
- SDDM interactive login as `clawdie` ; no live autologin
- `CLAWDIESEED` exists as FAT32 slice 3 for post-flash, pre-boot seed import
docs: rewrite negative patterns to positive actionable instructions
Convert 'do not' / 'never' / 'avoid' / 'cannot' / 'must not' patterns
into positive 'do ABC to achieve XYZ' instructions across four key docs.
Files changed:
- AGENTS.md: role restrictions, linux constraints, formatting gate,
private workspace, scratch paths, mount discipline, source-of-truth
- BUILD.md: colibri compilation, mini-binary policy, USB flashing,
SSH-key distribution, mDNS scope, PF logging, host disk policy
- skills/iso-build/SKILL.md: build gating, CLI policy, command chaining,
tmux workflow, colibri preflight/cargo-clean timing, SDDM retention
- PLAN-OPERATOR-USB-NEXT.md: SDDM contract, package categorization,
bhyve gating, dashboard dependencies, seed checkout exclusions
Safety-critical constraints (USB whole-disk flashing, verified artifacts
only) are preserved with positive rephrasing that keeps the constraint
intact.
2026-06-21 13:13:08 +02:00
- Live CLI policy: ship `codex` , `pi` , `gemini` ; omit `claude` from the live image
2026-05-24 23:21:02 +02:00
- Operator editors: `mousepad` , `geany` , and `micro`
- Hardware/custom-ISO report collector: `hw-report`
- Vulkan diagnostic tool: `vulkaninfo` from `vulkan-tools` ; Zed remains deferred
until Intel+AMD Vulkan are proven on hardware
- X blanking / DPMS disabled; NumLock off
- Power policy: `powerdxx` + `C3` , not `Cmax`
- Panel/runtime checks include `mixer` ; `clipman` is intentionally dropped from
the panel pending a D-Bus root-cause (see `doc/XFCE-PANEL-BUGS-HANDOFF.md` )
- Final graphical validation requires real hardware, not bhyve/nested VM only
## Workspace names
Keep the real paths as-is, but speak about them clearly:
- `tmp/output` = output image artifacts
- `tmp/cache` = build cache
- `tmp/cache/mnt` = mounted work image
- `tmp/cache/FreeBSD-*.img` = cached memstick base image
- `tmp/packages` = fetched package archives
2026-06-02 09:00:33 +02:00
## Manifest contract
The build workflow should emit or hand off `clawdie.iso.build.v1` results under
`tmp/colibri/iso-build/` when Colibri ingestion is part of the task. The image
itself also embeds `/usr/local/share/clawdie-iso/build-manifest.json` for live
runtime inspection. See `docs/ISO-MANIFESTS.md` for the schema fields and path
conventions.
2026-05-24 23:21:02 +02:00
## Preconditions
- Run on the FreeBSD build host, from the repo root
- Prefer `tmux` for long builds
- Use an elevated shell in the tmux pane so the build command itself runs
without a `sudo` prefix
docs: rewrite negative patterns to positive actionable instructions
Convert 'do not' / 'never' / 'avoid' / 'cannot' / 'must not' patterns
into positive 'do ABC to achieve XYZ' instructions across four key docs.
Files changed:
- AGENTS.md: role restrictions, linux constraints, formatting gate,
private workspace, scratch paths, mount discipline, source-of-truth
- BUILD.md: colibri compilation, mini-binary policy, USB flashing,
SSH-key distribution, mDNS scope, PF logging, host disk policy
- skills/iso-build/SKILL.md: build gating, CLI policy, command chaining,
tmux workflow, colibri preflight/cargo-clean timing, SDDM retention
- PLAN-OPERATOR-USB-NEXT.md: SDDM contract, package categorization,
bhyve gating, dashboard dependencies, seed checkout exclusions
Safety-critical constraints (USB whole-disk flashing, verified artifacts
only) are preserved with positive rephrasing that keeps the constraint
intact.
2026-06-21 13:13:08 +02:00
- Run each command individually so failures are visible and attributable;
chain commands only when a prior success is required and verified
2026-05-24 23:21:02 +02:00
- Fetch before reporting remote state or starting a build
- If disk is tight, the image build was interrupted, or `tmp/cache/mnt` is
still mounted, use `iso-build-cleanup` first
## Default tmux workflow
This is the default operator workflow and should be treated as the normal path.
### 1. Ensure the dedicated ISO window exists
```sh
tmux list-windows -t clawdie
```
If `clawdie:3` / `iso` does not exist, create it:
```sh
tmux new-window -t clawdie:3 -n iso
```
### 2. Inspect the pane before reusing it
```sh
tmux capture-pane -pt clawdie:3.1 -S -30
ps auxww | egrep '[b]uild.sh|[s]cript -q tmp/operator-usb-.*-build.log'
```
docs: rewrite negative patterns to positive actionable instructions
Convert 'do not' / 'never' / 'avoid' / 'cannot' / 'must not' patterns
into positive 'do ABC to achieve XYZ' instructions across four key docs.
Files changed:
- AGENTS.md: role restrictions, linux constraints, formatting gate,
private workspace, scratch paths, mount discipline, source-of-truth
- BUILD.md: colibri compilation, mini-binary policy, USB flashing,
SSH-key distribution, mDNS scope, PF logging, host disk policy
- skills/iso-build/SKILL.md: build gating, CLI policy, command chaining,
tmux workflow, colibri preflight/cargo-clean timing, SDDM retention
- PLAN-OPERATOR-USB-NEXT.md: SDDM contract, package categorization,
bhyve gating, dashboard dependencies, seed checkout exclusions
Safety-critical constraints (USB whole-disk flashing, verified artifacts
only) are preserved with positive rephrasing that keeps the constraint
intact.
2026-06-21 13:13:08 +02:00
If a build is still active, preserve it — stop it deliberately or wait for
completion before reusing the pane.
2026-05-24 23:21:02 +02:00
### 3. Start clean after a failed attempt
When reusing the pane from a failed attempt:
- stop the foreground command with `Ctrl-C`
- return to repo root
- clear the pane with `Ctrl-L`
- emit a marker line so the next run is easy to identify in scrollback
Suggested marker:
```sh
echo "test build nr: $(ls tmp/operator-usb-*-build.log 2>/dev/null | wc -l | tr -d ' ') date: $(date +%d.%b.%y) ver: $(git rev-parse --short HEAD)"
```
### 4. Use the standard build command in `3:iso`
```sh
/usr/bin/script -q tmp/operator-usb-$(git rev-parse --short HEAD)-build.log ./build.sh --skip-memstick-fetch --live-default-password
```
If the operator explicitly asked for a baked SSH key, append:
```sh
--ssh-key '< public key > '
```
## Preflight
Run these before starting a build, one command at a time:
```sh
git fetch origin
git status --short --branch
git log --oneline -5
git rev-parse --short HEAD
df -h /home/clawdie /
du -xh -d 2 tmp | sort -h | tail -n 40
ls -lh tmp/output
du -xh -d 1 tmp/cache | sort -h
```
If you see stale mounts, md devices, or `work.img` still attached, stop and
switch to `iso-build-cleanup` .
2026-05-28 00:46:24 +02:00
### Colibri artifact preflight
2026-06-13 12:00:57 +02:00
The operator USB uses Colibri as its lightweight live control plane. The ISO
build stages FreeBSD-native Colibri artifacts from `/home/clawdie/ai/colibri` ;
it does **not** build Rust while the image is mounted. Validation builds should
docs: rewrite negative patterns to positive actionable instructions
Convert 'do not' / 'never' / 'avoid' / 'cannot' / 'must not' patterns
into positive 'do ABC to achieve XYZ' instructions across four key docs.
Files changed:
- AGENTS.md: role restrictions, linux constraints, formatting gate,
private workspace, scratch paths, mount discipline, source-of-truth
- BUILD.md: colibri compilation, mini-binary policy, USB flashing,
SSH-key distribution, mDNS scope, PF logging, host disk policy
- skills/iso-build/SKILL.md: build gating, CLI policy, command chaining,
tmux workflow, colibri preflight/cargo-clean timing, SDDM retention
- PLAN-OPERATOR-USB-NEXT.md: SDDM contract, package categorization,
bhyve gating, dashboard dependencies, seed checkout exclusions
Safety-critical constraints (USB whole-disk flashing, verified artifacts
only) are preserved with positive rephrasing that keeps the constraint
intact.
2026-06-21 13:13:08 +02:00
ship `colibri_daemon_enable=YES` ; the rc.d service starts after LOGIN and
completes before SDDM/XFCE are user-facing, avoiding any startup delay.
2026-05-28 00:46:24 +02:00
docs: rewrite negative patterns to positive actionable instructions
Convert 'do not' / 'never' / 'avoid' / 'cannot' / 'must not' patterns
into positive 'do ABC to achieve XYZ' instructions across four key docs.
Files changed:
- AGENTS.md: role restrictions, linux constraints, formatting gate,
private workspace, scratch paths, mount discipline, source-of-truth
- BUILD.md: colibri compilation, mini-binary policy, USB flashing,
SSH-key distribution, mDNS scope, PF logging, host disk policy
- skills/iso-build/SKILL.md: build gating, CLI policy, command chaining,
tmux workflow, colibri preflight/cargo-clean timing, SDDM retention
- PLAN-OPERATOR-USB-NEXT.md: SDDM contract, package categorization,
bhyve gating, dashboard dependencies, seed checkout exclusions
Safety-critical constraints (USB whole-disk flashing, verified artifacts
only) are preserved with positive rephrasing that keeps the constraint
intact.
2026-06-21 13:13:08 +02:00
Build Colibri on the FreeBSD/OSA host first; fall back to cross-shipping from
debby only if the native OSA build fails.
2026-05-28 00:46:24 +02:00
Run this before the ISO build:
```sh
2026-06-05 00:38:25 +02:00
cd /home/clawdie/ai/colibri
2026-05-28 00:46:24 +02:00
git fetch origin
git status --short --branch
git pull --ff-only
cargo build --workspace --release
ls -lh target/release/colibri-daemon \
target/release/colibri \
2026-06-15 18:50:16 +02:00
target/release/colibri-mcp
2026-05-28 00:46:24 +02:00
file target/release/colibri-daemon \
target/release/colibri \
2026-06-15 18:50:16 +02:00
target/release/colibri-mcp
2026-06-21 07:55:24 +02:00
# Development/validation helper. Required only when explicitly building with
# COLIBRI_STAGE_TEST_AGENT=YES; default release/prod images omit it.
if [ "${COLIBRI_STAGE_TEST_AGENT:-NO}" = "YES" ]; then
ls -lh target/release/colibri-test-agent
file target/release/colibri-test-agent
fi
2026-06-15 18:50:16 +02:00
# Optional in the staging script, but desired for this operator USB target.
if [ -x target/release/colibri-tui ]; then
ls -lh target/release/colibri-tui
file target/release/colibri-tui
else
echo "WARN: optional colibri-tui artifact is missing"
fi
2026-05-28 00:46:24 +02:00
target/release/colibri --help | head
```
Then return to the ISO repo and run syntax/preflight checks:
```sh
2026-06-05 00:38:25 +02:00
cd /home/clawdie/ai/clawdie-iso
2026-05-28 00:46:24 +02:00
git fetch origin
git status --short --branch
git pull --ff-only
sh -n build.sh
sh -n scripts/stage-colibri-iso.sh
```
docs: rewrite negative patterns to positive actionable instructions
Convert 'do not' / 'never' / 'avoid' / 'cannot' / 'must not' patterns
into positive 'do ABC to achieve XYZ' instructions across four key docs.
Files changed:
- AGENTS.md: role restrictions, linux constraints, formatting gate,
private workspace, scratch paths, mount discipline, source-of-truth
- BUILD.md: colibri compilation, mini-binary policy, USB flashing,
SSH-key distribution, mDNS scope, PF logging, host disk policy
- skills/iso-build/SKILL.md: build gating, CLI policy, command chaining,
tmux workflow, colibri preflight/cargo-clean timing, SDDM retention
- PLAN-OPERATOR-USB-NEXT.md: SDDM contract, package categorization,
bhyve gating, dashboard dependencies, seed checkout exclusions
Safety-critical constraints (USB whole-disk flashing, verified artifacts
only) are preserved with positive rephrasing that keeps the constraint
intact.
2026-06-21 13:13:08 +02:00
Important cleanup timing: **preserve Colibri artifacts until the ISO build
consumes them.** The ISO preflight/build reads from
`/home/clawdie/ai/colibri/target/release` . Clean Colibri only after the ISO
build or after deciding those artifacts are no longer needed:
2026-05-28 00:46:24 +02:00
```sh
2026-06-05 00:38:25 +02:00
cd /home/clawdie/ai/colibri
2026-05-28 00:46:24 +02:00
cargo clean
2026-06-20 14:38:03 +02:00
mkdir -p tmp/iso-build
rm -rf tmp/iso-build/*
2026-05-28 00:46:24 +02:00
```
2026-06-13 19:29:31 +02:00
`colibri-mcp` is part of the out-of-the-box operator USB. `colibri-tui` is
optional in the staging script, but desired for this operator USB target and
should be verified with the required binaries.
2026-05-28 00:46:24 +02:00
2026-06-13 12:12:34 +02:00
### Deployed-system Clawdie service boundary
2026-06-02 09:18:00 +02:00
2026-06-13 12:12:34 +02:00
`service clawdie` is reserved for installed disk/server targets, but the current
operator USB does not stage a `clawdie` rc.d service or mini-binary. The live USB
uses `colibri_daemon` directly. Add deployed-system service packaging only after
docs: rewrite negative patterns to positive actionable instructions
Convert 'do not' / 'never' / 'avoid' / 'cannot' / 'must not' patterns
into positive 'do ABC to achieve XYZ' instructions across four key docs.
Files changed:
- AGENTS.md: role restrictions, linux constraints, formatting gate,
private workspace, scratch paths, mount discipline, source-of-truth
- BUILD.md: colibri compilation, mini-binary policy, USB flashing,
SSH-key distribution, mDNS scope, PF logging, host disk policy
- skills/iso-build/SKILL.md: build gating, CLI policy, command chaining,
tmux workflow, colibri preflight/cargo-clean timing, SDDM retention
- PLAN-OPERATOR-USB-NEXT.md: SDDM contract, package categorization,
bhyve gating, dashboard dependencies, seed checkout exclusions
Safety-critical constraints (USB whole-disk flashing, verified artifacts
only) are preserved with positive rephrasing that keeps the constraint
intact.
2026-06-21 13:13:08 +02:00
the real persistent host service implementation is chosen; keep the old
Colibri-side mini-binary for reference only until then.
2026-06-02 09:18:00 +02:00
### Next build: carry the XFCE operator-USB fixes
The next operator-USB image must retain the proven XFCE/live-GUI fixes
(`PLAN-OPERATOR-USB-NEXT.md` , `doc/AMD-ASUS-XFCE-LIVE-USB-FINDINGS.md` ):
docs: rewrite negative patterns to positive actionable instructions
Convert 'do not' / 'never' / 'avoid' / 'cannot' / 'must not' patterns
into positive 'do ABC to achieve XYZ' instructions across four key docs.
Files changed:
- AGENTS.md: role restrictions, linux constraints, formatting gate,
private workspace, scratch paths, mount discipline, source-of-truth
- BUILD.md: colibri compilation, mini-binary policy, USB flashing,
SSH-key distribution, mDNS scope, PF logging, host disk policy
- skills/iso-build/SKILL.md: build gating, CLI policy, command chaining,
tmux workflow, colibri preflight/cargo-clean timing, SDDM retention
- PLAN-OPERATOR-USB-NEXT.md: SDDM contract, package categorization,
bhyve gating, dashboard dependencies, seed checkout exclusions
Safety-critical constraints (USB whole-disk flashing, verified artifacts
only) are preserved with positive rephrasing that keeps the constraint
intact.
2026-06-21 13:13:08 +02:00
- **SDDM remains the supported live display manager** — load-bearing; retain
SDDM until equivalent real-hardware proof validates any replacement for
Intel + AMD live GUI boot.
2026-06-02 09:18:00 +02:00
- **`clawdie-live-gpu` ** pre-SDDM rc.d KMS pick (conservative; NVIDIA/AMD safe).
- **Hardened USB-root power policy** (`b9290ab` ): `powerdxx` , C3 C-state default,
`hw.usb.no_suspend=1` , boot-time `power_profile` .
- Base fixes already landed: resolver bootstrap, internal-audio preference,
touchpad XInput guards, loader branding, hardware-report capture.
Real hardware remains final proof for XFCE/session/input/audio — bhyve and
static image inspection are build gates only.
2026-05-24 23:21:02 +02:00
## Choose fetch mode
Use the lightest safe flag:
- `./build.sh`
Fresh fetch of memstick + packages
- `./build.sh --skip-memstick-fetch`
Reuse the cached FreeBSD memstick image, but refresh packages
- `./build.sh --skip-fetch`
Reuse both memstick and package caches; use only when both caches are
known-good
For the current operator workflow, the default is:
```sh
./build.sh --skip-memstick-fetch --live-default-password
```
## What to watch
Normal progress moves through:
1. Fetch/update package repo
2. Prepare Clawdie-AI offline tarball
3. Prepare work image
4. Inject payload
5. Write output image
Watch for these common blockers:
- `pkg-static ... conflicts with ...`
- `Write error` while extracting a package
- `database is locked` after a package failure
- `Not a directory` under `tmp/cache/mnt/usr/local/share/clawdie-iso/...`
- `mdconfig` devices left attached after interruption
- wrong ownership on `/opt/clawdie/npm-global`
If the build is interrupted or the work image gets wedged, stop and use
`iso-build-cleanup` before retrying.
## Output checks
After a successful build:
```sh
ls -lh tmp/output
find tmp/output -maxdepth 1 -type f -ls
```
Typical artifacts are:
- raw `.img`
2026-06-14 12:04:56 +02:00
- compressed `.img.xz`
- matching `.img.xz.sha256`
2026-05-24 23:21:02 +02:00
Public/test artifact names should include the source commit suffix.
## Static image expectations
Mounted-image checks should confirm:
- `firefox` is installed on the live rootfs
- `chromium` is not installed on the live rootfs
- `codex` , `pi` , and `gemini` are present
- `claude` is absent
- `mousepad` , `geany` , and `micro` are present
- `hw-report` and its desktop launcher are present
- `hw-probe` , `smartmontools` , `lscpu` , `lsblk` , `hwstat` , and `usbhid-dump` are present
- `libinput` , `xinput` , `xrandr` , and `glxinfo` are present for input/video diagnostics
- `vulkaninfo` is present for Intel+AMD Vulkan checks before any future Zed move
to live rootfs
- `sudo` is absent
- live privileged commands use `mdo -u root ...`
- `CLAWDIESEED` exists as slice 3
- branded Start icon (`/usr/local/share/clawdie-iso/icons/clawdie-start.png` ) and
wallpaper (`/usr/local/share/clawdie-iso/wallpapers/clawdie-operator-bg.png` )
are installed
- X blanking / DPMS are disabled
- NumLock is forced off
- `powerdxx` is installed and the live policy uses `C3`
- panel checks cover `mixer` ; `clipman` is intentionally absent (dropped pending
root-cause — see `doc/XFCE-PANEL-BUGS-HANDOFF.md` )
If you plan another rebuild soon, keep:
2026-06-25 09:35:30 +02:00
- `tmp/cache/FreeBSD-15.x-RELEASE-amd64-memstick.img`
- `tmp/cache/FreeBSD-15.x-RELEASE-amd64-memstick.img.SHA256`
2026-05-24 23:21:02 +02:00
- `tmp/packages/`
- `tmp/npm-globals/`
## Retry guidance
Use these rules:
- build failed after package refresh but memstick cache is fine:
retry with `--skip-memstick-fetch`
- build failed because package cache looks wrong:
retry without `--skip-fetch`
- build failed after leaving mounts, md devices, or a large stale `work.img` :
run `iso-build-cleanup` , then retry