Commit graph

372 commits

Author SHA1 Message Date
Sam & Claude
86b218ac6c fix(build): correct the disk-cleanup paths to real build artifacts
The one-liner's `output/FreeBSD-*.img` matched nothing — OUTPUT_DIR is
tmp/output, the built image is clawdie-*.img, and the cached memstick lives in
tmp/cache (FreeBSD-*-memstick.img). Replace with `tmp/packages tmp/cache
tmp/output` — clears bundled packages, all caches (incl. work.img + the cached
memstick), and built outputs; all regenerable, all under repo-local tmp/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 12:24:51 +02:00
2d2a757646 docs(build): add cleanup one-liner, /tmp note, mother-build PLANNED marker 2026-06-21 12:17:57 +02:00
1c427bb93b docs(build): record OSA disk policy and mother-build rationale (Sam & Codex) 2026-06-21 12:12:29 +02:00
aa364c3b01 Merge pull request 'feat(pkg): FreeBSD hermes runtime baseline — ffmpeg, py311-pillow, python311' (#86) from feat/freebsd-hermes-runtime-pkgs into main 2026-06-21 10:28:54 +02:00
Sam & Claude
47757da758 feat(pkg): FreeBSD hermes runtime baseline — ffmpeg, py311-pillow, python311
Tier 1 of the hermes out-of-the-box dependency sweep. hermes is a Python/uv app
(requires-python >=3.11,<3.14) whose venvs use --system-site-packages, so system
py311-* pkgs satisfy compiled deps without building.

- ffmpeg: hermes runtime baseline (installer) + voice-transcription/media skills.
- py311-pillow: Pillow is a hermes CORE dependency; the --system-site-packages
  venv picks up the prebuilt system pkg (no source build).
- python311 explicit (python3 = 3.11 after the default flip); python312 stays.
- Fix the stale "python312 owns python3" comment.

Covers hermes core + telegram gateway + voice. Tier 2 (discord-voice libsodium/
opus, astro vips, ollama/llama-cpp) pending confirmation of default integrations.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 10:26:30 +02:00
6d6a3c4ca1 Merge pull request 'feat(operator): python3=3.11 default on FreeBSD + image-render/screenshot skill' (#85) from feat/freebsd-image-render-skill into main 2026-06-21 10:14:37 +02:00
Sam & Claude
7ee7c55bed feat(operator): python3=3.11 default on FreeBSD + image-render/screenshot skill
Stop fighting FreeBSD's PYTHON_DEFAULT=3.11: make python3 resolve to 3.11
(python312 stays installed and available as python3.12 for anything needing
newer). This also makes Pillow trivial — py311-pillow imports on plain python3,
so the image-render/screenshot skill needs no version gymnastics.

- build.sh: python3/python symlink → 3.11 (prefer python3.11, else lowest).
- pkg-list-live-operator.txt: add py311-pillow.
- clawdie-join-hive.sh: advertise image-render when `python3 -c import PIL`
  works, and screenshot when $DISPLAY is set.
- BUILD.md: short note (python3=3.11; python3.12 available; image-render via
  py311-pillow).

Validated: sh -n build.sh + join-hive clean; markdown gate clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 10:08:07 +02:00
fdb6b912ac Merge pull request 'docs: document Python 3.11/3.12 coexistence with FreeBSD defaults' (#84) from docs/python-311-coexistence into main
Reviewed-on: #84
2026-06-21 09:37:56 +02:00
940404d612 docs: document Python 3.11/3.12 coexistence with FreeBSD defaults
FreeBSD pkg repos build against PYTHON_DEFAULT=3.11, so system packages
(git, libinput, npm-node24) pull python311 as transitive deps. We keep
python312 as the application Python — it wins the python3 symlink via
sort -V. Document this in BUILD.md, build.sh, package lists, and
bootstrap.html so the dual-version reality is explicit and intentional.
2026-06-21 09:36:28 +02:00
b892a9c64e Merge pull request 'fix/colibri-test-agent-stage-mode' (#83) from fix/colibri-test-agent-stage-mode into main
Reviewed-on: #83
2026-06-21 08:13:14 +02:00
5cd0d6d3f0 docs(colibri): describe test-agent staging as explicit build mode (Sam & Codex) 2026-06-21 08:11:39 +02:00
14248b6a20 feat(colibri): gate test-agent staging by build mode (Sam & Pi)
Add COLIBRI_STAGE_TEST_AGENT with dev/release defaults so validation builds can include colibri-test-agent while production/release operator USB images omit it by default. Keep poudriere guidance test-friendly and document binary roles in BUILD.md.\n\nValidation: sh -n build.sh scripts/stage-colibri-iso.sh live/operator-session/colibri-live-rebuild; ./scripts/check-format.sh; ./scripts/test-release-gate.sh; build.cfg default/override checks.
2026-06-21 07:55:24 +02:00
a1f8efd7bf Merge pull request 'docs: release 0.11.0 ISO builder handoff' (#82) from docs/release-0.11.0-handoff into main
Reviewed-on: #82
2026-06-21 07:08:39 +02:00
Sam & Claude
d02f8b1423 docs: release 0.11.0 ISO builder handoff for the FreeBSD build host
Concise, release-specific handoff for codex/osa: repo state at unified 0.11.0
(commits + tags), the release-channel build command, the release-gate clean-tree
requirement (iso/colibri/clawdie-ai/zot), and the two caveats for this build —
colibri ships as raw FreeBSD binaries (poudriere/Phase 4 deferred until
mother-build) and CI is dormant (validate via local gates, not forge checks).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 07:07:55 +02:00
7f55770746 Merge pull request 'fix(packages): align agent jail package list with bootstrap (Sam & Pi)' (#81) from fix/issue-70-agent-jail-packages into main
Reviewed-on: #81
2026-06-20 22:32:31 +02:00
5625bf9786 fix(packages): align agent jail package list with bootstrap (Sam & Pi)
Add an agent-jail section to pkg-list-jails.txt mirroring Colibri agent-jail-bootstrap.sh, include python312, and use npm-node24 instead of generic npm. This satisfies issue #70 acceptance and resolves the npm package-name drift in favor of the node24-tied package.\n\nValidation: ./scripts/check-format.sh; sh -n build.sh; git diff --check
2026-06-20 22:31:32 +02:00
ec2a73d267 Merge pull request 'release/iso-0.11.0' (#80) from release/iso-0.11.0 into main
Reviewed-on: #80
2026-06-20 22:26:22 +02:00
Sam & Claude
c5fdb57b78 docs(poudriere): colibri port license is MIT (was AGPLv3 reference)
Match the colibri relicense (AGPL-3.0 -> MIT, same as layered-soul) in the
build-server doc's port key-facts.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 22:06:18 +02:00
Sam & Claude
d8927de671 release: bump Clawdie version to 0.11.0 (unify clawdie-iso + colibri)
- build.cfg: ISO_VERSION 0.10.0 -> 0.11.0; reword the version note — clawdie-iso
  and colibri now share one unified Clawdie release version (zot/clawdie-ai stay
  provenance in build-manifest.json).
- CHANGELOG: [0.11.0] entry (date in EU format DD.mon.YYYY per AGENTS rule)
  covering the versioning unify, operator-session hardening, poudriere
  build-server scripts, and the duplicate-port retirement.

colibri Cargo.toml + port DISTVERSION bump to 0.11.0 lands in the colibri repo
(separate branch). Tags held until both bumps merge.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 21:52:52 +02:00
8fa6e1f3ca Merge pull request 'cleanup: retire duplicate Colibri port; colibri repo owns it' (#79) from cleanup/colibri-owns-the-port into main
Reviewed-on: #79
2026-06-20 21:39:20 +02:00
Sam & Claude
d9a469a418 cleanup: retire duplicate Colibri port; colibri repo owns it
The canonical Colibri FreeBSD port lives in the colibri repo
(packaging/freebsd/port/sysutils/colibri), kept with the code it builds and
guarded by a CARGO_CRATES drift check in colibri CI. The copy here was a
divergent duplicate (wrong LICENSE=MIT vs AGPLv3, CARGO_BUILD=no skeleton that
could not build, different binary set) that the drift check could not protect.

- delete ports/sysutils/colibri/ (no longer maintained here)
- build.sh release gate: fail if ports/sysutils/colibri/ reappears, pointing at
  the canonical location — keeps the cleanup structural, not just one-time
- docs/POUDRIERE-BUILD-SERVER.md + scripts/poudriere/README.md: state colibri
  owns the port, copy it into the ports tree, this repo keeps no duplicate

Validation: build.sh sh -n clean; release-gate self-test passes; guard fires on
a reintroduced dir; markdown gate clean. Nothing references the deleted path.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 21:37:47 +02:00
2eb2ae06b4 Merge pull request 'cleanup(tmp): remove Clawdie-owned host tmp paths (Sam & Pi)' (#78) from cleanup/prebuild-tmp-and-stale-prs into main
Reviewed-on: #78
2026-06-20 21:15:37 +02:00
65015b0c70 cleanup(tmp): remove Clawdie-owned host tmp paths (Sam & Pi)
Broaden prebuild cleanup by documenting project-local tmp policy, syncing the hardened wallpaper/join-hive helpers, moving vault/no-blank scratch under runtime/cache dirs, and keeping release-gate scratch under repo tmp.\n\nValidation: ./scripts/check-format.sh; sh -n build.sh live/operator-session/clawdie-join-hive.sh live/operator-session/clawdie-wallpaper-gen.sh live/operator-session/clawdie-vault-fetch live/operator-session/clawdie-noblank-guard.sh scripts/test-release-gate.sh; ./scripts/test-release-gate.sh; clawdie-wallpaper-gen output test under repo tmp.
2026-06-20 21:07:05 +02:00
42930b2b52 Merge pull request 'fix(ports): use MASTER_SITES for Forgejo, not GH_ACCOUNT' (#77) from fix/colibri-port-forgejo into main 2026-06-20 17:36:09 +02:00
dd0fbb1fed fix(ports): use MASTER_SITES for Forgejo, not GH_ACCOUNT
- Replace GH_ACCOUNT+GH_PROJECT with MASTER_SITES pointing at
  code.smilepowered.org/clawdie/colibri/archive/
- Fix distinfo to match Forgejo archive naming (v0.0.1.tar.gz)
2026-06-20 17:35:53 +02:00
02897574e2 Merge pull request 'feat(ports): add sysutils/colibri FreeBSD port skeleton (v0.0.1)' (#76) from feat/colibri-freebsd-port into main 2026-06-20 17:35:19 +02:00
92b3ebacdd feat(ports): add sysutils/colibri FreeBSD port skeleton (v0.0.1)
- Makefile: USES=cargo, installs daemon + client + MCP + probe + inventory
- distinfo: SHA256 of v0.0.1 tarball from Forgejo
- files/: colibri_daemon.in + colibri_bridge.in rc.d scripts
- Port needs: colibri repo tagged v0.0.1 (done), CARGO_CRATES generation
  on FreeBSD (make cargo-crates), and a FreeBSD pkg build test
2026-06-20 17:34:47 +02:00
352a1d6da9 Merge pull request 'combined/iso-poudriere-livepower' (#75) from combined/iso-poudriere-livepower into main
Reviewed-on: #75
2026-06-20 17:24:36 +02:00
Sam & Claude
5c5ed57abe docs(live-power): document C3 wake-safety invariant; tidy rcorder block
clawdie_live_power is a one-shot boot script that applies the power_profile
C-state policy once (FreeBSD's power_profile is nostart and otherwise only
runs on a devd AC-line transition). Comment-only clarification — no behavior
change:

- Move the PROVIDE/REQUIRE/BEFORE/KEYWORD rcorder block to the top (convention;
  rcorder scans the whole file, so behavior is identical).
- Document scope explicitly: this selects a CPU C-state/freq profile ONLY —
  never suspend/sleep/blank/DPMS (screen-blank is the separate no-blank stack).
- Record the wake-safety invariant: both AC (0x01) and battery (0x00) branches
  are safe because rc.conf pins performance_cx_lowest AND economy_cx_lowest to
  C3, so neither can select a deeper C-state that breaks USB resume. Guard-rail
  for future editors: do not deepen on the live USB.

sh -n clean; rcorder tags intact.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 17:22:28 +02:00
Sam & Claude
95c0cf879f docs(poudriere): point port section at canonical colibri port; fix MIT→AGPLv3
The inline Makefile example claimed LICENSE=MIT (wrong — colibri is
AGPL-3.0-only) and duplicated what now lives canonically in
colibri/packaging/freebsd/port/. Replace the snippet with a pointer + the
corrected key facts (license, binaries shipped, generated files).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 17:22:28 +02:00
Sam & Claude
8437b6e237 docs(poudriere): retarget plan to mother-build + pkg.clawdie.si; mark done work
v1.0.0 → v2.0.0. Fix stale references and cross resolved items from pending:

- Target: ML350p Gen8 (retired/boot-looping) → mother-build FreeBSD VPS.
- Repo URL: pkg.clawdie.home.arpa → pkg.clawdie.si (signed). Client config now
  uses signature_type pubkey + ships the public key; points at the
  clawdie-repo.conf.in template.
- Phase 1: drop iLO/IPMI/10.0.0.2 boot path (provider-specific now).
- Phase 2/4: marked SCRIPTED — implemented by scripts/poudriere/.
- Phase 6 (bhyve): marked DONE — the ISO-boot test gate already exists
  (scripts/bhyve-test.sh + run-bhyve-test.sh + bhyve-pf-allow.sh).
- Jail/tree example names aligned to the scripts (clawdie-amd64 / clawdie).
- Timeline rebuilt with real status; ML350p sizing kept only as labeled
  reference numbers. .home.arpa LIVE-USB hostname refs left intact (not stale).

Validation: prettier@3 --check '**/*.md' clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 17:22:28 +02:00
Sam & Claude
2dac2d108d feat(poudriere): lean scripts for first-party pkg.clawdie.si build server
Turns the manual Phase 2–3 runbook (docs/POUDRIERE-BUILD-SERVER.md) into
repeatable, idempotent steps for the mother-build host — the package half of
the trusted supply chain (layered-soul HIVE-ONBOARDING §10).

- poudriere-setup.sh: verify-then-act setup. Validates root, FreeBSD version
  format, pkg/openssl, and that the ZFS pool exists BEFORE acting; then installs
  poudriere, generates the repo signing key (0400), writes poudriere.conf (only
  if absent), and creates the build jail + ports tree. Re-running skips anything
  already present.
- poudriere-build.sh: validates jail, ports tree, and each origin (category/name
  + Makefile present) before `poudriere bulk`; repo is signed automatically via
  PKG_REPO_SIGNING_KEY.
- clawdie-repo.conf.in: client repo template (signature_type pubkey) + the
  first-party-only priority note.
- README.md: the three-step flow and conventions.

Style matches live/operator-session/hw-report: POSIX sh, set -u, fixed PATH,
strict arg parsing, minimal checks (only what is acted upon). Host provisioning
(ZFS/base/network) stays in the runbook — these assume a FreeBSD host with a
pool. sh -n clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 17:22:28 +02:00
05842a533d Merge pull request 'sync(visuals): hardened panel indicator + wallpaper on join from layered-soul' (#74) from sync/iso-visuals-hardening into main
Reviewed-on: #74
2026-06-20 12:17:33 +02:00
45cc57365f sync(visuals): hardened panel indicator + wallpaper on join from layered-soul 2026-06-20 12:16:11 +02:00
9989d5dd31 Merge pull request 'fix(desktop): match Exec path to installed binary (drop .sh suffix)' (#73) from fix/desktop-join-hive-exec into main 2026-06-20 11:41:24 +02:00
a2a0c15c3d fix(desktop): match Exec path to installed binary (drop .sh suffix)
Build installs /usr/local/bin/clawdie-join-hive (no .sh).
Desktop Exec had the .sh suffix — launcher would fail silently.
One-character fix: drop .sh from Exec line.
2026-06-20 11:40:55 +02:00
81a4d7eaa7 Merge pull request 'feat(visuals): panel indicator + identity wallpaper + join-hive launcher' (#72) from feat/iso-visuals into main
Reviewed-on: #72
2026-06-20 11:00:18 +02:00
1f7e94fa4c feat(visuals): panel indicator + identity wallpaper + join-hive launcher 2026-06-20 10:59:07 +02:00
3c4d02a904 Merge pull request 'fix(xfce): replace noisy autostart with start-here note (Sam & Codex)' (#71) from fix/start-here-autostart into main
Reviewed-on: #71
2026-06-20 08:37:28 +02:00
35e5c1d954 fix(xfce): replace noisy autostart with start-here note (Sam & Codex) 2026-06-20 08:24:18 +02:00
30257ad383 Merge pull request 'fix(vault): bake Vaultwarden endpoint defaults into ISO (Sam & Pi)' (#69) from fix/vault-endpoint-defaults into main
Reviewed-on: #69
2026-06-20 07:28:39 +02:00
e70ea171b3 fix(vault): bake Vaultwarden endpoint defaults into ISO (Sam & Pi)
Stage a non-secret /usr/local/etc/colibri/provider.env with the Clawdie Vaultwarden endpoint so operators only add BW bootstrap credentials. Also teach clawdie-vault-fetch to honor BW_SERVER and fail closed if an existing bw login points at a different server.\n\nChecks: sh -n live/operator-session/clawdie-vault-fetch scripts/stage-colibri-iso.sh; ./scripts/check-format.sh; git diff --check; COLIBRI_REPO=/home/clawdie/ai/colibri scripts/stage-colibri-iso.sh <tmp>
2026-06-20 07:27:51 +02:00
14bd7f5255 Merge pull request 'fix(vault-fetch): tolerate 'already logged in' at bw config server' (#68) from fix/vault-fetch-bw-config-when-logged-in into main
Reviewed-on: #68
2026-06-20 07:10:49 +02:00
Sam & Claude
81114491f5 fix(vault-fetch): tolerate 'already logged in' at bw config server
bw config server refuses with 'Logout required before server config update'
when the CLI is already authenticated. The helper treated that as fatal
(exit 1), which broke every repeat run on an already-logged-in host — exactly
the 'refresh .env from vault' case the helper exists for.

The bw login block already tolerates 'already logged in'; mirror that for
bw config: capture stderr/stdout and tolerate 'logout required' /
'already configured' / 'already set', failing only on a real error.

Verified on domedog: fixed helper runs cleanly from the logged-in state
(previously exited 1 at the config step).

Checks: sh -n; git diff --check; ./scripts/check-format.sh (prettier clean).

Co-Authored-By: Hermes & Sam <hello@clawdie.si>
2026-06-20 07:06:44 +02:00
761c9cf9bf Merge pull request 'Vaultwarden secrets + live seed import (5 review concerns addressed)' (#67) from feat/vault-seed-fetch-fixed into main 2026-06-19 18:36:32 +02:00
Sam & Claude
df783f2a59 fix(vault): wire seed bootstrap → vault-fetch path + harden agent dir validation
Address the 5 review concerns on the secrets-out-of-the-box feature:

1. Seed↔fetch path alignment: _seed_split_env routes BW_* creds out of .env
   into ~/.config/vault-bootstrap.env (SEED_VAULT_BOOTSTRAP_REL), the path
   clawdie-vault-fetch actually reads — so 'seed bootstrap → fetch out of
   the box' now lines up without an explicit --bootstrap arg.
2. Drop unused COLLECTION_ID from clawdie-vault-fetch. Items are fetched by
   name via 'bw get password', which is fail-closed on ambiguity; document
   that item names must be unique in the visible vault.
3. Agent dir validation: _seed_agent_name_ok rejects leading-dot dirs
   (.Spotlight-V100, .fseventsd) and traversal; _seed_agent_has_payload
   requires a recognized payload so an empty/stray dir can't become active.
4. No phantom homes: extra agent dirs stage under /var/db/clawdie/seed/<agent>
   only — _seed_stage_agent never writes a home or SSH keys.
5. Bootstrap file mode enforcement: clawdie-vault-fetch now stat-checks the
   bootstrap file and refuses group/world-readable unless
   VAULT_ALLOW_INSECURE_BOOTSTRAP is set.

Also renames _seed_import_env → _seed_merge_env + _seed_split_env and adds
_seed_key_ok to guard env var names.

Checks: sh -n on vault-fetch/live-seed/build.sh; git diff --check;
./scripts/check-format.sh (prettier clean); 5 concerns verified present.

Co-Authored-By: Hermes & Sam <hello@clawdie.si>
2026-06-19 18:24:55 +02:00
Sam & Claude
1af0e62942 Wire encrypted secrets: Vaultwarden fetch + per-agent seed import
Two parallel, additive paths so a host gets its secrets out of the box;
the manual setup wizard stays the floor (no config = no-op).

clawdie-vault-fetch (new): language-neutral bw bridge. Reads a 0600
~/.config/vault-bootstrap.env, pulls keys from the agent-secrets
collection (item name = env var name, value in password field, so no jq),
prints KEY=VALUE or --write-env upserts 0600. Exit codes distinguish
skip (3, no bootstrap) / broken (1) / no bw (4). Pinned
@bitwarden/cli@2026.5.0 for offline bundling; staged in
configure_live_operator_session.

clawdie-live-seed: extend the CLAWDIESEED FAT32 importer from the
authorized_keys allowlist to a per-agent directory convention —
/<agent>/ with env (merged 0600), harness.toml (pi|zot|local), soul/
(staged), ssh/authorized_keys. Live USB single-agent (first dir = active);
extra dirs staged + flagged for deployed multi-agent. Optional
consume-and-shred. Import core is unit-testable via CLAWDIE_SEED_TEST.

README rewritten to document the per-agent contract and the operator
decision to allow plaintext secrets on the seed (seeded sticks are
secret-bearing media; 0600 landing + shred mitigations).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 17:27:01 +02:00
c905e7a31c Merge pull request 'build(iso): upgrade FreeBSD Python 3.11 -> 3.12' (#66) from upgrade-to-python-3-12 into main 2026-06-17 16:17:05 +02:00
79ea3b4590 build(iso): drop py311-only extras from Python 3.12 lane 2026-06-17 14:56:38 +02:00
e2e74e8418 build(iso): upgrade FreeBSD Python 3.11 -> 3.12
Standardize the ISO on the agreed Python 3.12 floor (operator + Hermes +
Claude consensus; see layered-soul/docs/TOOLCHAIN.md).

- pkg lists: python311->python312, py311-{pip,aider_chat,pillow}->py312-*
- build.sh: derive the installed python3.N for the python3/python symlink so a
  future bump needs only a pkg-list change, never an edit here
- shell-deploy.sh: create the Aider venv with 'python3 -m venv' (resolves via
  the symlink) instead of a hardcoded python3.11
- import-clawdie-skills.sh: python3 fallback instead of python3.11
- BUILD.md: doc references

Aider kept (bumped, not dropped): redundant coding tooling is intentional per
the agent matrix.

Pre-merge gate: confirm FreeBSD pkg coverage on osa —
  pkg search '^py312-aider_chat' '^py312-pygobject'
(common modules pillow/pip are safe).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 14:38:20 +02:00