Commit graph

427 commits

Author SHA1 Message Date
14dd2baa98 fix(iso): remove remaining real IPs, add -F robustness, prettier format, known_hosts note 2026-06-24 11:25:18 +02:00
dee76991de fix(iso): remove real IPs from image, install mother key for daemon user, de-obfuscate docs
Three blockers fixed from review of fix/ootb-mother-mcp:

1. Real Tailscale IP removed from image/repo.
   - external-mcp.json uses "mother" host alias (resolved by SSH config).
   - Key path: /var/db/colibri/.ssh/mother-mcp (daemon user home).
   - The real IP lives only on the offline seed (ssh/config), never in
     the repo or the shipped image.

2. Cross-user key access fixed.
   - The daemon runs as colibri (home /var/db/colibri), not clawdie.
   - Seed importer now installs SSH material to both clawdie AND
     colibri homes (same seed material, same key, separate ~/.ssh).
   - build.sh dev convenience also copies to both homes.
   - clawdie-live-seed.README.txt already documents the seed layout.

3. Doc fully de-obfuscated.
   - All m0th3r/c0l1br1/n0d3_r3g1st3r → mother/colibri/node_register.
   - All real IPs → <mother-tailscale-ip> placeholder.
   - Removed Step 2 (manual external MCP) + Step 3 (register) — both
     are now baked into the ISO.
   - Removed trailing "colibri-mcp" remote command from examples
     (hardened wrapper rejects non-allowlisted commands).
2026-06-24 11:19:21 +02:00
3fd3bc7560 fix(iso): pre-configure mother MCP OOTB + fix docs
Two changes so the USB connects to mother on first boot with no manual steps:

1. stage-colibri-iso.sh: external-mcp.json is now pre-configured with the
   mother server entry (colibri@100.72.229.63, no remote command — the
   hardened wrapper starts colibri-mcp in stdio MCP mode). Previously
   staged as empty {}; the operator had to create it manually or run
   clawdie-enable-mother.

2. provider.env now includes COLIBRI_MCP_EXTERNAL_CALL=1 by default
   (already set on osa; missing from the ISO defaults).

3. SETUP-USB-TO-MOTHER.md: removed Step 3 (manual external-mcp.json),
   fixed the diagram to match the hardened wrapper (no remote command),
   corrected the server name from "m0th3r"/"c0l1br1" to the real names.

The SSH key, config, and known_hosts still come from the CLAWDIESEED
seed partition — the image carries no secrets. Without the seed the
connection fails gracefully.
2026-06-24 11:04:36 +02:00
790bd45601 fix(build): point agent-harness reference to AGENTS.md 2026-06-24 10:47:29 +02:00
6bd82eab26 Merge pull request 'mother: drop duplicate scripts from iso (canonical = colibri) + docs → hive_nodes' (#129) from iso-drop-mother-dup into main
Reviewed-on: #129
2026-06-24 10:18:42 +02:00
4298389f13 mother: drop duplicate scripts from iso; canonical = colibri; docs → hive_nodes
The mother MCP scripts were copied into clawdie-iso (packaging/mother/) AND
colibri. The iso copies drifted: node-register-mcp on iso main was the old,
SQL-injectable version (E'${HOST_ESCAPED}' string interpolation) using
usb_nodes — while colibri #161 carries the reviewed, parameterized (psql -v
:'var') hive_nodes version.

One canonical home: colibri. Remove packaging/mother/ from the iso (nothing in
the iso build references it), redirect the two doc path references to the colibri
repo, and align the docs to hive_nodes (matching the colibri schema rename).

Supersedes #127 (which only renamed docs and conflicted after the iso copies
landed). Doc-only + file removals; markdown gate green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 10:10:09 +02:00
eac844e239 Merge pull request 'feat/tailscale-vault-autojoin' (#128) from feat/tailscale-vault-autojoin into main
Reviewed-on: #128
2026-06-24 10:02:10 +02:00
a03c4a6b54 fix(build): rename osa-mother-2026 → mother-mcp in key paths 2026-06-24 09:18:12 +02:00
d001b46b34 feat(mother): add node-register MCP tool for USB hw-probe registration
New packaging/mother/node-register-mcp accepts JSON-RPC tools/call,
inserts hw_profile into mother_hive.usb_nodes, and returns the row
with auto-derived capabilities (derive_capabilities trigger fires).

Requires one-time PostgreSQL setup on mother:
  CREATE ROLE colibri WITH LOGIN;
  GRANT CONNECT ON DATABASE mother_hive TO colibri;
  GRANT INSERT, UPDATE ON usb_nodes TO colibri;
  GRANT USAGE ON SEQUENCE usb_nodes_id_seq TO colibri;

Also updates docs to reflect 0.12 daemon behavior: hw-probe is
collected by the daemon (not the agent) and passed via CLAWDIE_HW_PROFILE
env var. COLIBRI_AUTOSPAWN_ARGS default is binary-dependent (zot->rpc,
others->--mode json).
2026-06-24 09:07:48 +02:00
7c4975cfcf Merge pull request 'build: track Pi @latest + record resolved pi_version in manifest' (#126) from pi-latest-tracking into main
Reviewed-on: #126
2026-06-24 02:01:02 +02:00
fdbd6b152f build: track Pi @latest, record resolved version in build-manifest
The image shipped a hard pin (@earendil-works/pi-coding-agent@0.78.0) while
'pi upgrade' on hosts had moved to 0.80.2, so builds lagged. Switch Pi to the
@latest dist-tag so every image bundles the newest Pi.

To keep the floating spec traceable, record the version that actually got
fetched in build-manifest.json as pi_version, derived from the bundled tarball
name (earendil-works-pi-coding-agent-<version>.tgz) after fetch+install.
fetch-npm-globals.sh now also echoes the resolved tarball so the build log
shows the version a dist-tag resolved to.

Other globals (bw) stay pinned. Image is node24, compatible with current Pi
(the legacy-node20 dist-tag is for node20 only).

Verified: fetch resolves @latest → 0.80.2; version extraction matches npm.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 01:59:29 +02:00
f3a719ab2c Merge pull request 'docs: rename 'fake-agent' → 'sample-agent'' (#125) from rename-sample-agent into main 2026-06-24 00:38:06 +02:00
52200c88c5 Merge pull request 'docs: harness-neutral cleanup + restore green markdown gate' (#124) from docs-harness-neutral-cleanup into main 2026-06-24 00:37:58 +02:00
da3f06f7da docs: rename 'fake-agent' → 'sample-agent' (matches colibri test rename)
Harness-neutral, lighter wording for the optional local test-double agent
(colibri-test-agent), matching the colibri-side fake→sample rename. Only the
two references that named it 'fake-agent' (build.cfg comment, AGENTS.md
staging note); the unrelated /tmp/fake-usb example path in FIRSTBOOT.md is a
different context and left as-is.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 18:20:55 +02:00
6275fee97e docs: harness-neutral cleanup + restore green markdown gate
Pi-era residue in current-tense docs/strings (CHANGELOG history left intact):
- ONBOARDING-SIMPLIFICATION: COLIBRI_AUTOSPAWN_PI -> COLIBRI_AUTOSPAWN; 'Pi
  agent' -> 'agent'.
- clawdie-join-hive.sh: user-facing 'Pi agent is live' / 'no Pi agent' ->
  harness-neutral (default agent is now zot).
- clawdie-live-seed.README.txt: COLIBRI_AUTOSPAWN_PI -> COLIBRI_AUTOSPAWN.
- stage-colibri-iso.sh provider.env.sample: the AUTOSPAWN_ARGS example showed
  '--mode json' (invalid for the zot default); note the default is
  harness-derived (zot -> rpc, pi -> --mode json).

Also restore the markdown format gate: 5 docs from the 0.12.0 work were
prettier-dirty, so ./scripts/check-format.sh was already failing on main (the
gate was red and unenforced — same pattern as the colibri build break).
prettier --write brings them to style; gate is green again. No prose changes
in those 5 — formatting only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 18:08:58 +02:00
29ff8bd3bd Merge pull request 'feature/0.12.0' (#123) from feature/0.12.0 into main
Reviewed-on: #123
2026-06-23 16:55:40 +02:00
d7f583cb8f docs: USB→mother MCP setup — step-by-step guide with real hosts
5 steps from nothing to working: SSH key + config → enable
external MCP → register mother server → install hw-probe →
restart daemon. Uses real hosts (osa.smilepowered.org at
100.72.229.63, USB as clawdie-usb) with l33t placeholder keys.
ASCII architecture diagram showing persistent SSH child process,
JSON-RPC over stdin/stdout, mother-side forced-command wrapper.

Includes: end-to-end test, future autospawn flow, and
troubleshooting table for all common failure modes.
2026-06-23 16:46:18 +02:00
4372f2125f docs: USB→mother MCP connection plan — 5 steps
USB can connect to mother right now with 0.11 daemon —
colibri_external_mcp_call_tool is already in the tools list.
Just needs: SSH key, external-mcp.json, COLIBRI_MCP_EXTERNAL_CALL=1,
hw-probe installed, and daemon restart.

Architecture: USB spawns 'ssh colibri@mother colibri-mcp' as
persistent child process, JSON-RPC over stdin/stdout. Mother-side
wrapper strips forced-command layer. One SSH connection for
daemon lifetime.

Missing: node_register MCP tool on mother (needs implementation),
auto-key from seed partition (planned for 0.12 ISO build).
2026-06-23 15:31:37 +02:00
11e016686e Merge pull request 'docs: security baseline — live USB boot checklist' (#122) from feature/0.12.0 into main
Reviewed-on: #122
2026-06-23 15:26:20 +02:00
180abbab39 docs: security baseline — live USB boot checklist
Cross-reference from OSA audit (2026-06-23): SSH hardening,
MCP socket, firewall, listening ports, service accounts,
external MCP servers. Each check has command + expected output.

OSA exceptions documented: password auth kept for dev access.
USB should be stricter — key-only SSH, no 0.0.0.0 bindings.

Skill saved: security-audit-clawdie (freebsd category)
2026-06-23 15:24:37 +02:00
3adf4f2af8 Merge pull request 'feature/0.12.0' (#121) from feature/0.12.0 into main
Reviewed-on: #121
2026-06-23 14:21:34 +02:00
f5b4326731 docs: GIS plan — 6 steps with diagrams + Blender render service
Each step has diagrams, input/output schemas, test cases.
Added Step 6: mother-blender-render — photorealistic 3D via
Blender on mother node. USB requests renders via MCP, same
pattern as build-colibri.sh. 1 GiB Blender stays on mother;
light nodes get PNGs back. ~30h total implementation estimate.
2026-06-23 14:16:28 +02:00
95deca5f1d docs: GIS integration plan — real property dome overlay
GURS WFS endpoints for parcel boundaries, address lookup, and
spatial data (CC BY 4.0, free). Google 3D Tiles for photorealistic
backgrounds (paid). Four-phase plan: address → parcel → dome
placement → site-specific BOM. All Slovenian data sources
documented with endpoint URLs and coordinate systems.
2026-06-23 14:06:25 +02:00
d769fe0387 docs: Blender vs geodesic-dome-mcp capability comparison
Records the decision to use a pure-Python geodesic dome tool
(6KB, numpy+Pillow) instead of Blender (1 GiB, 53 packages).
OSA registered as first node in mother_hive PostgreSQL with
real hardware profile: 12GB RAM, no GPU, geodesic_dome_mcp=true.

This document serves as a capability baseline — any node that
can run Python can generate dome wireframes and structural BOMs.
2026-06-23 13:48:59 +02:00
bcab969ef7 Merge pull request 'feature/0.12.0' (#120) from feature/0.12.0 into main
Reviewed-on: #120
2026-06-23 13:39:50 +02:00
e75bd57e0b xfce: 4K 6V geodesic dome farm wallpapers (AI-generated)
Two variants of a photorealistic 6V frequency geodesic dome
encapsulating an organic farm at golden hour. Generated via
OpenRouter (google/gemini-2.5-flash-image, upscaled to 3840x2160).

The existing clawdie-operator-bg remains as the default — these
are alternatives the operator can select.
2026-06-23 13:04:35 +02:00
71a61c1d1e xfce: geodesic 2V wallpaper — unified logo on desktop background
Replace the filled gradient triangle with the geodesic 2V logo:
outer triangle + inverted inner triangle at midpoints. Cyan
on dark gradient. SVG + 2560x1440 PNG render.
2026-06-23 12:49:14 +02:00
7cc4c57b1c xfce: geodesic 2V logo for Start button
Replace the filled gradient triangle with the unified geodesic
logo — outer triangle + inverted inner triangle at midpoints.
SVG + 48px + 64px PNG renders. Cyan on transparent, inherits
panel background.
2026-06-23 12:48:17 +02:00
d274b21cf7 feat: unified geodesic logo — inverted medial triangle
Replace the dot-in-triangle (docs) and plain △ (landing) with a
unified geodesic 2V subdivision logo. Both sites now use the same
geometric mark: a large triangle with an inverted inner triangle
whose vertices touch the midpoints of the outer sides.

Reflects geodesic dome design — Class I, Frequency 2 subdivision.
2026-06-23 12:42:12 +02:00
6df52c5278 fix: remove operator banner from production, fix lang switcher
- OperatorBanner is ISO-only (shows when hostname !== clawdie.si)
- Production site at clawdie.si should never show it
- Replace broken emoji flags (🇬🇧🇸🇮) with clean EN/SI text labels
2026-06-23 12:15:13 +02:00
2f2f7dcd3e docs: add Forgejo release tag link to ISO version badge
Footer now links to https://code.smilepowered.org/clawdie/clawdie-iso/releases/tag/v0.XX.0
when built with ASTRO_ISO_VERSION set.
2026-06-23 12:05:35 +02:00
fdd0d260d0 feat: version-aware docs built + staged on ISO
- Copy Astro landing page source into docs/website/ (20K, no node_modules)
- Add ISO version badge to LandingBody.astro (only shown when
  ASTRO_ISO_VERSION is set during build)
- Add build_and_stage_docs() to build.sh: builds the Astro site with
  the ISO version, stages output at /usr/local/share/clawdie-iso/docs/
- Skips gracefully when node/npm unavailable
- On the booted USB: open docs/index.html to see version-matched docs
2026-06-23 11:58:03 +02:00
6173e185ec docs(seed): document dual-purpose mother-mcp key for Forgejo + mother MCP
- Update ssh/config example to show mother-mcp key with both Host entries
  (mother MCP and code.smilepowered.org with IdentitiesOnly yes)
- Add dedicated mother-mcp section explaining the key serves two roles:
  1. MCP calls to mother (command=colibri-mcp,restrict)
  2. Git pull from Forgejo as a read-only deploy key
- Note that read-only is sufficient and limits blast radius
- Update START-HERE.txt to mention git pull works OOTB with seeded key
2026-06-23 11:36:10 +02:00
cc5ced46d4 refactor: rename COLIBRI_AUTOSPAWN_PI → COLIBRI_AUTOSPAWN
Harness-neutral naming (the "PI" was historical — zot is now default):
- COLIBRI_AUTOSPAWN_PI    → COLIBRI_AUTOSPAWN
- COLIBRI_PI_BINARY       → COLIBRI_AUTOSPAWN_BINARY
- COLIBRI_AUTOSPAWN_PI_ARGS → COLIBRI_AUTOSPAWN_ARGS

Default binary: zot (deepseek-v4-pro, ~25 providers, Telegram bot).
2026-06-23 11:13:47 +02:00
76f82565e3 feat: hermes-bsd source snapshot + zot harness + telegram token
- Stage hermes-bsd as shallow clone in /home/clawdie/ai/ (next to colibri/zot)
- Switch default harness from pi to zot (COLIBRI_PI_BINARY=zot)
- Add TELEGRAM_BOT_TOKEN placeholder to provider.env and sample
- Removes stale zot-rpc-driver blocker comment (colibri#143 resolved)
2026-06-23 11:07:54 +02:00
d41248e0e9 Merge pull request '0.12.0: hw-probe + model fixes + mother MCP infra' (#119) from feature/0.12.0 into main
Reviewed-on: #119
2026-06-23 10:53:08 +02:00
7300fec1e2 0.12.0: hw-probe + model fixes + mother MCP infra
Combined from three feature branches:
- feature/hw-probe-agent-bootstrap: JSON hardware probe (clawdie-hw-probe),
  remove desktop icon, update START-HERE.txt
- chore/0.12.0-model-fix-bump: deepseek-v4-pro model names, version 0.12.0
- feature/mother-mcp-infra: build-colibri.sh MCP tool, colibri-mcp-ssh wrapper
2026-06-23 10:49:38 +02:00
0a1ae19e6a Merge pull request 'chore: fix model names + bump version to 0.12.0' (#118) from chore/0.12.0-model-fix-bump into main
Reviewed-on: #118
2026-06-23 09:02:17 +02:00
555418f740 chore: fix model names + bump version to 0.12.0
- seed README: claude-opus-4-8 → deepseek-v4-pro (example harness.toml)
- provider.env.sample: DEEPSEEK_MODEL deepseek-chat → deepseek-v4-pro
- ISO_VERSION: 0.11.0 → 0.12.0
2026-06-23 08:50:29 +02:00
bbf154b571 Merge pull request 'docs: drop sudo from flash commands, append sync' (#117) from docs/canonical-flash-oneliner into main
Reviewed-on: #117
2026-06-23 07:16:39 +02:00
4bc9779512 Merge pull request 'feature/ublock-origin-preinstall' (#116) from feature/ublock-origin-preinstall into main
Reviewed-on: #116
2026-06-23 07:14:37 +02:00
4ee66eb45c build: lock networkmgr package after mdo repack
pkg lock prevents pkg upgrade from replacing the repacked
networkmgr (mdo-based) with upstream (sudo-dependent).
Run inside the chroot while devfs is still mounted.
2026-06-23 07:12:47 +02:00
380a589b11 xfce: reduce language widget scale to 50%, reorder panel tray
CPU graph now comes before the systray (NetworkManager + volumeicon),
followed by the keyboard layout switcher and clock. Language widget
display-scale reduced from 60 to 50 (was still too large).
2026-06-23 07:02:03 +02:00
3ef31687d9 build: pre-stage uBlock Origin + disable default-browser check on live ISO
Places uBlock Origin XPI in Firefox's distribution/extensions
directory during ISO build. Also sets DontCheckDefaultBrowser via
policies.json — Firefox is the only browser on the USB so the
popup is pointless.

Firefox auto-installs the extension on first launch with no
internet required on the booted USB.
2026-06-23 06:55:18 +02:00
bb5460427d docs: drop sudo from flash commands, append sync
All decompress-and-write one-liners now share the same form:
  xz -dc ...img.xz | of=/dev/sdX bs=4M status=progress conv=fsync && sync

- sudo removed (operator runs as root on USB stick)
- && sync appended to all image-write commands
- /dev/zero wipe commands unchanged
- build.sh echo updated to match
2026-06-23 06:41:58 +02:00
af83717524 Merge pull request 'feat(seed): outbound SSH client material for hands-free node→mother' (#115) from seed-ssh-client-material into main
Reviewed-on: #115
2026-06-22 20:26:07 +02:00
800658b47c docs: drop sudo from flash commands, append sync
All decompress-and-write one-liners now share the same form:
  xz -dc ...img.xz | of=/dev/sdX bs=4M status=progress conv=fsync && sync

- sudo removed (operator runs as root on USB stick)
- && sync appended to all image-write commands
- /dev/zero wipe commands unchanged
- build.sh echo updated to match
2026-06-22 20:24:25 +02:00
862af0583b feat(seed): outbound SSH client material for hands-free node->mother
The baked mother key (build/mother-ssh-key) puts a private key in the image,
which only works for a non-published personalized stick. The offline FAT32
seed is the correct home for per-node secrets.

Teach the importer to install outbound SSH client material from an agent's
ssh/ dir into the agent home:
  - config       -> ~/.ssh/config       (0600)
  - known_hosts* -> ~/.ssh/known_hosts* (0644, merged + de-duped)
  - <name>.pub   -> ~/.ssh/<name>.pub   (0644)
  - <name>       -> ~/.ssh/<name>        (0600, any other file = private key)
authorized_keys stays inbound-only via _seed_install_authorized_keys.

This closes the 'without manual key exchange' gap: known_hosts pins mother's
host key so the first node->mother connect does not prompt, and the private
client key rides on the offline seed instead of the base image — so the
published image stays secret-free. Supersedes the baked-key path (#112),
which can retire once this is validated on hardware.

Verified offline (CLAWDIE_SEED_TEST): correct perms (key 0600, pub/known_hosts
0644, config 0600, .ssh 0700) and idempotent known_hosts merge across re-runs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 09:55:56 +02:00
48418af783 Merge pull request 'build: fail-fast release gate for baked mother SSH key' (#114) from release-gate-mother-key into main
Reviewed-on: #114
2026-06-22 09:54:20 +02:00
80dcbfef2e build: fail-fast release gate for baked mother SSH key
The image-assembly guard (build/mother-ssh-key, #113) refuses to copy the
mother key into a release image, but only after a full build run. Add the
same check to check_release_gate so a BUILD_CHANNEL=release build with the
key present on the host aborts in seconds, not after fetch/build/assemble.

The assembly-time guard stays as defense in depth.

(BUILD_CHANNEL already defaults to dev in build.cfg:17, so no change needed
there.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 09:53:36 +02:00