NanoClaw

NanoClaw lays durable host-coordination state under channel growth

NanoClaw proposes durable host-coordination state and a Mattermost installation skill while a macOS updater repair replaces symlink-sensitive path comparisons with realpath checks.

← Back to homeOriginal source ↗

nanocoai/nanoclaw PR #3508 is the inspected primary source: “feat(db): durable host-coordination state and the seams that will consume it.” The related records below were inspected as supporting context rather than independent confirmation.

The facts

- nanocoai/nanoclaw PR #3508 was created 2026-08-24T22:27:41Z and was open at inspection; its title is “feat(db): durable host-coordination state and the seams that will consume it.” - nanocoai/nanoclaw PR #3507 was created 2026-08-24T17:27:20Z and was open at inspection; its title is “feat(channels): add Mattermost installation skill.” - nanocoai/nanoclaw PR #3506 was created 2026-08-24T15:46:06Z and was open at inspection; its title is “fix(update): make the transaction controller correct on macOS hosts.” - The repository reported 30611 stars, 968 open issues, default branch main, and last push 2026-08-24T22:27:23Z. - The latest tagged-release baseline checked was v2.3.0 published 2026-08-24T11:45:32Z.

What changed

nanocoai/nanoclaw PR #3508 reports: Dormant groundwork for making host restarts safe. Today every coordination fact lives in process memory, so a restart kills approval waiters, resets delivery retry counts (a poison message retries forever across a crash loop), loses stop/respawn intent after "rebuild applied", and lets a stale finish() stomp a fresh container. This lands the durable homes and the seams, all inert — no behavior changes anywhere. What's in here **Migration 024 + src/db/coordination.ts** — durable homes for the host's in-memory coordination state: host_instances (process lease), session_claims (incarnation CAS fencing + durable respawn_after_stop stop intent), delivery_attempts (backoff bookkeeping; delivered stays mailbox-side), wake_signals (durable wake intent). Shadow state — no writers yet; portable SQL, caller-supplied ISO clocks. **src/reconcile.ts** — the contract for per-session reconciliation replacing the global 60s sweep tick: reconcileSession + ReconcileQueue (keyed, coalescing, addAfter, resync loss floor). Types only. **src/request-wake.ts** — one chokepoint for wake intent; pure delegation to wakeContainer, byte-equivalent until the durable rows become authoritative. **src/liveness.ts** — LivenessSource, the single activity seam; default impl is today's heartbeat-file stat extracted verbatim. **src/workspace-contract.ts** — workspace-composer inputs contract: data reachable through the central DB only, never the host's filesystem. **NANOCLAW_INSTALL_ID** — env identity override for installs whose checkout path is not a stable identity; label-safe charset; unset = sha1(cwd), byte-identical. **Runner: NANOCLAW_HEARTBEAT_PATH** — deployment-configurable heartbeat location, read per call; unset = today's path.

nanocoai/nanoclaw PR #3507 reports: Type of Change [x] **Feature skill** - adds a channel or integration (source code changes + SKILL.md) [ ] **Utility skill** - adds a standalone tool (code files in.claude/skills/ /, no source changes) [ ] **Operational/container skill** - adds a workflow or agent skill (SKILL.md only, no source changes) [ ] **Fix** - bug fix or security fix to source code [ ] **Simplification** - reduces or simplifies source code [ ] **Documentation** - docs, README, or CONTRIBUTING changes only Description Adds the main-branch /add-mattermost skill while keeping channel runtime code on the channels branch. The skill deterministically discovers and reuses a configured or healthy local Mattermost server before prompting, and offers an optional persistent Team Edition + PostgreSQL evaluation stack. The bundled local stack is hardened for development use: Mattermost binds only to loopback, container images are version-pinned, PostgreSQL gates startup on a health check, and setup generates a private database credential instead of committing a default password. The setup also verifies canonical SiteURL/WebSocket-origin behavior. Validation completed: skill quick validation passes skill conformance suite passes (177 tests) executable discovery detects the running local Mattermost instance bundled Compose configuration parses successfully This remains a draft because @nanoco/chat-adapter-mattermost@0.1.0 must be published before a complete fresh-clone application test can pass. For Skills [x] SKILL.md contains instructions, not inline code (code goes

nanocoai/nanoclaw PR #3506 reports: Type of change [x] **Fix** - bug fix or security fix to source code What Six fixes making the /update-nanoclaw transaction controller correct on macOS hosts (and one shared-code defect that also bites Linux fallback mode). Every defect was hit live while updating a real macOS install — the cutover took seven attempts, each failure one of these. The reproduction you can run right now On any Mac, on a clean checkout of main: Four cases fail with Update state contains mismatched or unsafe paths. Cause: state-path safety compares path.resolve spellings, but os.tmpdir() and /var are symlinks into /private on macOS — one side records the symlinked spelling, the other the real one, and every equality check refuses a perfectly matched state. Linux CI never sees it. The fixes 1. **ENOBUFS** — the command runner used Node's 1 MiB default maxBuffer; a repo whose pnpm test prints more kills validate as spawnSync pnpm ENOBUFS before the tests are judged. Raised to 64 MiB. 2. **Symlinked-path refusal** — comparisons, the loadState lookup, and the prune unsafe-root guard canonicalize through realpath, with a nearest-existing-ancestor fallback so a cleaned-up stage worktree still compares equal. 3. **Snapshot not re-runnable** — a retried cutover re-snapshots into the prior attempt's directory and copyFileSync cannot overwrite files copied read-only (git packs are 0444). The copy now builds

Why it matters

Channel growth and self-update both depend on host-owned durable state; transient process memory cannot be the authority for coordination or repair. The operator test is whether the system remains bounded and its receipts still describe the action after failure, retry or restart.

Current

The primary record was open when captured on 2026-08-25. The tagged-release baseline was v2.3.0 published 2026-08-24T11:45:32Z. Repository metadata, full source bodies, current pull requests and issues, releases, Google News, Hacker News, Lobsters, Metamesh and the rendered ClawCharts row were inspected. ClawCharts selected the subject; it did not prove the claim.

Evidence

The primary URL is https://github.com/nanocoai/nanoclaw/pull/3508. Supporting records are https://github.com/nanocoai/nanoclaw/pull/3507 and https://github.com/nanocoai/nanoclaw/pull/3506. Source bodies, timestamps and states are preserved in the daily evidence bundle. Test counts and reproductions remain attributed to their authors unless identified as independently rerun.

Source boundary

Open work is described as open, closed work as closed, and operator reports as reports. A pull request is evidence of proposed or reviewed direction, not proof of a shipped release. Search residue, package mirrors and historically published source spines were excluded.

Operator take

Give coordination state a versioned schema, keep channel setup outside core patches, and make updater path identity canonical before claiming success. Preserve a before-state receipt, make the smallest reversible change, and verify the original failure independently.

Caveat

Public project records are mutable. Status, scope and evidence can change after publication. This brief records the inspected state and does not authorize changes to a reader’s deployment.

Source inspected; source state, environment and release boundary remain explicit.