geth/docs/roadmap.md

968 lines
48 KiB
Markdown
Raw Normal View History

2026-05-15 15:08:20 +02:00
# Roadmap
This roadmap is intended to be checkable. Each item should either be completed
with tests/docs or split into smaller items before implementation.
Status markers:
- `[ ]` Not started
- `[~]` In progress
- `[x]` Done
2026-07-05 17:21:59 +02:00
For deployment-readiness work that cuts across feature areas, see
[`docs/production-readiness-roadmap.md`](production-readiness-roadmap.md).
## Long-Term Goal: Distributed Homelab Overlay
Goal: evolve geth into a distributed, fault-tolerant homelab overlay runtime in
the spirit of NetBird/Tailscale, while preserving geth's core invariants: Iroh
is the only remote geth transport, discovery is untrusted, SSH keys are trust
anchors rather than transport keys, and authorization remains resource-scoped
and capability-based.
This is a long-term product direction, not a claim about the current prototype.
The target is a usable personal/family/lab mesh that can survive intermittent
nodes, changing network locations, partial discovery failures, and offline
admin devices without depending on one always-online coordination server.
- `[ ]` Distributed overlay control plane.
Acceptance criteria:
- `[ ]` Overlay membership, virtual IP assignment, route advertisements,
node capabilities, and revocations are represented as signed replicated
resource data.
- `[ ]` The control plane has documented conflict semantics for concurrent
joins, renames, IP conflicts, route changes, and revocations.
- `[ ]` Nodes can converge from static sigchain publication, peer live-sync,
and Iroh-connected peers without requiring a central coordinator.
- `[ ]` Stale or partitioned nodes are detectable in `geth overlay status`
and `geth sync status --json`.
- `[ ]` Fault-tolerant peer and path selection.
Acceptance criteria:
- `[ ]` Nodes maintain multiple candidate addresses from Iroh relays, local
discovery, imported peer cards, and static publication.
- `[ ]` Packet routing retries healthy paths and backs off failed paths
without granting trust from discovery metadata.
- `[ ]` Relay use, direct connections, LAN discovery, and path failures are
visible in human and JSON status output.
- `[ ]` Integration tests simulate peer restart, address rotation, relay-only
connectivity, and temporary peer unavailability.
- `[ ]` Production overlay routing features.
Acceptance criteria:
- `[ ]` Overlay supports stable virtual IPv4 addressing with collision
detection and operator-visible remediation.
- `[ ]` Subnet-router resources can advertise selected LAN routes with
explicit capabilities and revocation behavior.
- `[ ]` Exit-node routing is modeled as an explicit resource and requires
dedicated capabilities.
- `[ ]` MTU selection, packet size limits, and fragmentation/drop behavior
are documented and tested.
- `[ ]` Homelab DNS and service discovery.
Acceptance criteria:
- `[ ]` Nodes can publish signed names and service records into replicated
resource metadata.
- `[ ]` A local resolver or hosts-file integration can expose overlay names
without requiring global DNS changes.
- `[ ]` DNS/service data is separated from untrusted LAN discovery and can be
explained through auth/keychain state.
- `[ ]` Revoked nodes and stale records disappear from the trusted view after
verified sync.
- `[ ]` Cross-platform operational polish.
Acceptance criteria:
- `[ ]` Linux TUN setup documents required user-service permissions,
`CAP_NET_ADMIN`, and distro-specific recovery steps.
- `[ ]` macOS release builds document required entitlements and user-service
launch behavior.
- `[ ]` Windows builds package or clearly locate Wintun and install a
per-user daemon task.
- `[ ]` `geth guide overlay` contains an end-to-end two-machine smoke test
for each supported platform class.
- `[ ]` Security and auditability bar for overlay use.
Acceptance criteria:
- `[ ]` Every packet-forwarding, subnet-routing, exit-node, DNS, and service
discovery operation has an explicit resource/capability check.
- `[ ]` `auth explain` can answer why a node may or may not route packets,
advertise a subnet, use an exit node, or publish a service name.
- `[ ]` Bearer secrets can invite limited overlay access without granting
trust graph mutation rights.
- `[ ]` The docs state what properties geth provides today and avoid claims
equivalent to Keyhive/BeeKEM, WireGuard, NetBird, or Tailscale unless those
properties are actually implemented and tested.
2026-05-22 01:24:55 +02:00
## Prototype Viability Closure Plan
These are the remaining gaps that must close before the prototype is a smooth
end-to-end test target for the intended personal mesh use cases.
Implementation order:
2026-05-22 14:28:44 +02:00
1. `[x]` Close remote authorization and replicated-state safety gaps.
Acceptance criteria:
- `[x]` Add initial two-daemon tests proving denied remote pubsub publish,
remote pipe listen, and SSH admin shell requests do not mutate serving
node state.
- `[x]` Add initial two-daemon tests proving unsigned replicated
keychain/auth operations are rejected and not imported.
- `[x]` Add initial two-daemon tests proving invalidly signed replicated
keychain/auth operations are rejected and not imported.
- `[x]` Add tests proving conflicting replicated keychain/auth records do
not mutate trust/resource state.
2026-05-22 14:28:44 +02:00
- `[x]` Improve `auth explain` diagnostics enough for operators to
distinguish discovered-only peers, missing endpoint bindings, missing
grants, matching grants, revocations, and bearer access.
2026-05-22 14:33:46 +02:00
2. `[x]` Replace bootstrap sync transports with Iroh-native backends where the
pinned APIs are stable.
Acceptance criteria:
2026-05-22 14:33:46 +02:00
- `[x]` CAS uses `iroh-blobs` or has a documented pinned blocker.
- `[x]` KV uses Iroh Documents or has a documented pinned blocker.
- `[x]` Pubsub uses `iroh-gossip` or has a documented pinned blocker.
- `[x]` `geth status` reports the current bootstrap backend, target crate,
target version, and blocker for CAS, KV, and pubsub.
2026-05-22 14:41:09 +02:00
3. `[x]` Polish file sync reconciliation.
Acceptance criteria:
2026-05-22 14:41:09 +02:00
- `[x]` Add a safe three-way apply path for non-conflicting
create/update/delete/rename changes.
2026-05-22 14:41:09 +02:00
- `[x]` Keep ambiguous changes as durable conflicts.
- `[x]` Add two-root integration coverage.
2026-05-22 14:54:00 +02:00
4. `[x]` Replace JSON document state with durable Automerge documents.
Acceptance criteria:
2026-05-22 14:54:00 +02:00
- `[x]` Store Automerge documents durably.
- `[x]` Sync Automerge changes over Iroh.
- `[x]` Gate document sync with resource authorization.
2026-05-22 14:55:31 +02:00
5. `[x]` Harden DB sync for real cr-sqlite usage.
Acceptance criteria:
2026-05-22 14:55:31 +02:00
- `[x]` Add a real cr-sqlite-enabled two-node integration test, or document
a precise blocker if the extension is unavailable in CI/dev.
2026-05-22 14:55:31 +02:00
- `[x]` Decide and document whether CAS-backed DB snapshots/batches are part
of the prototype.
2026-05-22 15:00:09 +02:00
6. `[x]` Finish operational first-run polish.
Acceptance criteria:
2026-05-22 15:00:09 +02:00
- `[x]` README has a two-machine walkthrough for the main smoke tests.
- `[x]` CLI recovery errors tell operators the next command to run.
- `[x]` JSON sync status is script-friendly for stale/failed peer detection.
2026-05-23 02:40:03 +02:00
- `[x]` Shell completions are generated from the Clap command tree for
bash, zsh, fish, PowerShell, and elvish.
- `[x]` Completion installation examples are available through
`geth guide completions`.
2026-05-22 15:01:02 +02:00
- `[x]` Two-node operator-flow test coverage.
2026-05-22 01:24:55 +02:00
Acceptance criteria:
- `[x]` A two-daemon test covers owner-rooted init, peer-card exchange,
2026-05-22 01:24:55 +02:00
enrollment request submission, owner approval, `geth sync now`, and
`geth sync status`.
- `[x]` A two-daemon test proves approved keychain/auth state reaches the
2026-05-22 01:24:55 +02:00
enrolled node without using the old one-off `node enroll sync` shortcut.
- `[x]` Tests assert unsigned replicated keychain/auth records do not mutate
local trust or resource state.
- `[x]` Tests assert invalidly signed replicated keychain/auth records do not
mutate local trust or resource state.
- `[x]` Tests assert conflicting replicated keychain/auth records do not
mutate local trust or resource state.
2026-05-22 01:24:55 +02:00
- `[~]` Remote authorization enforcement audit.
Acceptance criteria:
2026-05-22 16:55:33 +02:00
- `[x]` Every remote mutable operation has an explicit resource capability
check before mutating local state or opening a host service, or is
documented as a signed-log import / owner-reviewed enrollment exception.
- `[x]` A test-backed remote guard matrix documents the expected guard for
each remote operation and fails if mutating/service-opening operations rely
on discovery alone.
2026-05-22 01:24:55 +02:00
- `[ ]` Tests cover denied and allowed paths for CAS, KV, DB, document,
pubsub, pipe, SSH proxy/admin shell, SSH cert metadata, and revocations.
- `[x]` Initial two-daemon denied-mutation coverage exists for remote pubsub
publish, remote pipe listen, and SSH admin shell.
2026-05-22 14:28:44 +02:00
- `[x]` `auth explain` output can explain discovered-only peers, missing
2026-05-22 01:24:55 +02:00
endpoint bindings, missing grants, matching grants, revocations, and bearer
access.
- `[x]` Iroh-native backend replacement.
2026-05-22 01:24:55 +02:00
Acceptance criteria:
2026-05-22 14:33:46 +02:00
- `[x]` CAS fetch/provider paths use `iroh-blobs` or a documented pinned
2026-05-22 01:24:55 +02:00
equivalent instead of bootstrap control-ALPN blob transfer.
2026-05-22 14:33:46 +02:00
- `[x]` KV metadata and entries replicate through Iroh Documents or a
2026-05-22 01:24:55 +02:00
documented pinned equivalent.
2026-05-22 14:33:46 +02:00
- `[x]` Pubsub wakeups/presence use `iroh-gossip` or a documented pinned
2026-05-22 01:24:55 +02:00
equivalent.
2026-05-22 14:33:46 +02:00
- `[x]` Fallback/stub behavior remains clearly marked where APIs are not yet
2026-05-22 01:24:55 +02:00
pinned.
2026-06-16 02:53:35 +02:00
- `[x]` Upgrade `geth-iroh` to stable `iroh 1.0.0` with matching `iroh-blobs 0.103.0`,
`iroh-docs 0.101.0`, and `iroh-gossip 0.101.0` without introducing a
second daemon endpoint.
2026-05-22 01:24:55 +02:00
2026-05-22 15:01:02 +02:00
- `[x]` File sync reconciliation polish.
2026-05-22 01:24:55 +02:00
Acceptance criteria:
2026-05-22 14:41:09 +02:00
- `[x]` `cas root apply` has a richer three-way base/local/remote reconcile
2026-05-22 01:24:55 +02:00
path for safe updates and deletes.
2026-05-22 14:41:09 +02:00
- `[x]` Ambiguous changes continue to produce durable conflicts instead of
2026-05-22 01:24:55 +02:00
overwriting local files.
2026-05-22 14:41:09 +02:00
- `[x]` Tests cover create/update/delete/rename application across two local
2026-05-22 01:24:55 +02:00
roots.
2026-05-22 14:54:00 +02:00
- `[x]` Durable Automerge documents.
2026-05-22 01:24:55 +02:00
Acceptance criteria:
2026-05-22 14:54:00 +02:00
- `[x]` Document state is stored as durable Automerge data, not only JSON
2026-05-22 01:24:55 +02:00
last-writer-wins state.
2026-05-22 14:54:00 +02:00
- `[x]` Sync exchanges durable Automerge state over the protected Iroh
control path and merges received Automerge documents.
- `[x]` Resource authorization gates remote document reads and writes.
2026-05-22 01:24:55 +02:00
2026-05-22 15:00:09 +02:00
- `[x]` Operational first-run polish.
2026-05-22 01:24:55 +02:00
Acceptance criteria:
2026-05-22 15:00:09 +02:00
- `[x]` README has a complete two-machine walkthrough for owner init,
2026-05-22 01:24:55 +02:00
enrollment, grants, sync status, SSH cert request/approval, SSH proxy, KV,
CAS/file-root, and DB/document smoke tests.
2026-05-22 15:00:09 +02:00
- `[x]` CLI errors for stale peer cards, missing endpoint bindings, missing
2026-05-22 01:24:55 +02:00
grants, unavailable relays, unavailable service managers, and unsupported
platform features tell the operator what command to run next.
2026-05-23 01:17:30 +02:00
- `[x]` `geth init --help` and `geth guide <topic>` explain owner setup,
enrollment, key roles, service installation, and smoke-test workflows from
the binary itself.
2026-05-22 15:00:09 +02:00
- `[x]` `geth sync status --json` is sufficient for scripts to detect stale
2026-05-22 01:24:55 +02:00
peers and failed streams.
2026-05-15 15:08:20 +02:00
## Phase 0: Bootstrap
Goal: establish a compiling single-binary local runtime with local state, local
control, local CAS, service installation, and written architecture decisions.
- `[x]` Single `geth` binary with daemon and control modes.
Acceptance criteria:
- `cargo run -p geth -- init` initializes a temp `GETH_HOME`.
- `cargo run -p geth -- daemon run` starts one local daemon.
- No `gethd` or `gethctl` binaries exist in the workspace.
- `[x]` Local daemon control socket.
Acceptance criteria:
- Control request/response types roundtrip through JSONL serialization.
- `geth status` and `geth node id` talk to a running daemon.
- Control decoding treats input as untrusted and returns structured errors.
- `[x]` Local metadata store and identity.
Acceptance criteria:
- SQLite migrations are idempotent.
- Agent identity persists across repeated opens of the same `GETH_HOME`.
- Store schema includes resources, auth/keychain logs, CAS, peers, modules,
SSH cert requests, certificates, and revocations.
- `[x]` Local filesystem CAS.
Acceptance criteria:
- `geth cas add/hash/has/get/list` work through the daemon.
- Blob paths use BLAKE3 hashes under `cas/blobs/<aa>/<bb>/<hash>`.
- Unit or integration tests verify bytes roundtrip unchanged.
- `[x]` User service installer.
Acceptance criteria:
- `geth daemon service print --manager systemd|launchd|windows-task` prints
the expected user-level service definition or command.
- Linux install targets a systemd user unit, not a system service.
- macOS install targets a launchd user agent.
- Windows install targets a per-user scheduled task.
- Tests verify generated definitions do not target privileged system services.
- `[x]` GitHub CI, security, and release automation.
Acceptance criteria:
- `[x]` CI runs formatting, clippy, docs, check, and deterministic workspace
tests on Linux, macOS, and Windows.
2026-05-29 15:27:45 +02:00
- `[x]` Cross-platform jobs keep `GETH_TEST_SKIP_IROH=1` for deterministic
host-networking behavior.
- `[x]` Ubuntu CI has a required Iroh integration job covering live
daemon-to-daemon bootstrap, peer control, sync, native modules, pipe
forwarding, SSH proxy handshakes, and overlay ALPN authorization.
- `[x]` RustSec advisory scanning runs on pull requests, pushes, manual
dispatch, and a weekly schedule.
- `[x]` CodeQL and dependency review workflows are present for GitHub-native
security scanning.
- `[x]` Release workflow builds Linux, macOS, and Windows archives for `v*`
tags and manual dispatch.
- `[x]` Dependabot is configured for Cargo and GitHub Actions updates.
- `[x]` Bootstrap docs and ADRs.
Acceptance criteria:
- README explains what geth is and what it is not.
- Architecture docs state Iroh-only remote communication and SSH trust role.
- ADRs cover single binary, Iroh-only transport, resources, auth, SSH, CAS,
synchronized structures, service installation, and SSH certificate flows.
2026-05-15 15:08:20 +02:00
## Phase 1: Iroh Foundation
Goal: make the daemon own a real Iroh endpoint and establish authenticated
geth-to-geth connections without granting trust from discovery alone.
2026-05-16 01:54:00 +02:00
- `[x]` Pin and compile Iroh dependencies.
Acceptance criteria:
- `iroh` is added only after APIs are pinned and `cargo check --workspace`
passes.
- `geth-iroh` exposes endpoint startup/shutdown wrappers.
- Docs note exact crate versions and any API assumptions.
2026-05-16 01:54:00 +02:00
- `[x]` Daemon-owned Iroh endpoint.
Acceptance criteria:
- The daemon creates one shared Iroh endpoint on startup.
- `geth status --json` reports endpoint status and EndpointID.
- Endpoint identity is bound to agent/node identity in local metadata.
- Restarting the daemon preserves higher-level node identity.
2026-05-16 03:17:45 +02:00
- `[x]` Built-in relay policy and configuration.
2026-05-16 02:06:28 +02:00
Acceptance criteria:
2026-05-16 03:17:45 +02:00
- Config can select disabled, default Iroh relays, and staging relays.
2026-05-16 02:06:28 +02:00
- The intended product default uses relays unless explicitly disabled.
- `geth status --json` reports the selected relay mode.
- Tests cover config parsing and endpoint builder relay-mode selection.
2026-05-16 14:28:38 +02:00
- `[x]` Custom relay maps.
2026-05-16 03:17:45 +02:00
Acceptance criteria:
- Config can define and select named custom relay maps.
- Invalid relay URLs fail config validation with clear errors.
- Status output identifies the selected custom relay map without exposing
unrelated config.
2026-05-16 14:33:45 +02:00
- `[x]` Iroh LAN address discovery.
2026-05-16 02:06:28 +02:00
Acceptance criteria:
2026-05-16 14:33:45 +02:00
- Config can enable or disable Iroh local-network discovery.
- The daemon registers Iroh's local mDNS-like discovery service when enabled.
- `geth status --json` reports whether local-network discovery is enabled.
2026-05-18 17:05:43 +02:00
- `[x]` Signed peer-card LAN discovery payloads.
2026-05-16 14:33:45 +02:00
Acceptance criteria:
2026-05-18 04:03:52 +02:00
- `[x]` Manual `geth peer export/import/list` can exchange signed peer cards
and store them as untrusted candidates.
2026-05-18 12:09:50 +02:00
- `[x]` Exported daemon peer cards include Iroh EndpointID plus available
relay/direct address candidates.
2026-05-18 17:05:43 +02:00
- `[x]` The daemon can advertise and discover signed geth peer cards over LAN
2026-05-16 14:33:45 +02:00
discovery.
2026-05-18 04:03:52 +02:00
- `[x]` Imported peer cards are stored only as untrusted peer candidates.
- `[x]` Discovered EndpointIDs do not grant module access without keychain/auth
2026-05-16 02:06:28 +02:00
validation.
2026-05-16 03:37:51 +02:00
- `[x]` Protocol/router scaffold.
Acceptance criteria:
- ALPN constants are registered through one module router.
- Unknown ALPNs are rejected explicitly.
- Tests cover registration collisions and unknown protocol handling.
2026-05-16 14:24:21 +02:00
- `[x]` Peer cards.
Acceptance criteria:
- A peer card contains node ID, agent ID, endpoint candidates, timestamp, and
signature metadata.
2026-05-18 04:03:52 +02:00
- Peer-card signatures cover deterministic canonical payloads and reject
tampered endpoint candidates.
- Peer cards are stored in `peer_cards`.
- Invalid or unsigned peer cards do not update trust state.
2026-05-16 14:24:21 +02:00
- `[x]` Untrusted discovery backend trait.
Acceptance criteria:
- Discovery returns candidate peer cards only.
- No discovery result grants capabilities or trust.
- `auth explain` can distinguish "discovered" from "trusted".
2026-05-18 17:01:50 +02:00
- `[x]` Basic authenticated peer connection.
2026-05-18 12:09:50 +02:00
Acceptance criteria:
- `[x]` `geth peer ping <node-id>` dials another node over Iroh using an
imported signed peer card.
- `[x]` The remote side validates the caller's signed peer card and stores it
as a candidate only.
- `[x]` The ping response records negotiated ALPN and remote endpoint
identity.
2026-05-18 17:01:50 +02:00
- `[x]` The remote side proves an agent/node binding before protected module
2026-05-18 12:09:50 +02:00
access.
2026-05-18 17:01:50 +02:00
- `[x]` Protected module handlers reject requests that only know an
2026-05-18 12:09:50 +02:00
EndpointID and lack resource capabilities.
2026-05-15 15:08:20 +02:00
2026-05-18 22:17:27 +02:00
- `[x]` Authorized sync status summary.
Acceptance criteria:
- `[x]` The daemon can ask an imported peer for sync stream watermarks over
the protected Iroh control ALPN.
- `[x]` The serving peer validates the caller's signed peer card against the
observed Iroh EndpointID before returning watermarks.
- `[x]` The serving peer only includes streams where the caller already has
the relevant resource capability.
- `[x]` Background live-sync skips per-module pulls when the authorized remote
watermark has not advanced.
- `[x]` `geth sync status` reports last local attempt, success, cursor,
import/rejection counts, and error for each recorded peer stream.
- `[x]` `geth sync now [node]` triggers the same best-effort sync pass that
background live sync uses.
2026-05-18 22:17:27 +02:00
- `[x]` Tests verify unauthorized streams are omitted from summary output.
- `[x]` Tests verify persisted stream health is exposed in local sync status.
2026-05-18 22:17:27 +02:00
2026-05-15 15:08:20 +02:00
## Phase 2: Trust And Authorization
Goal: replace stubs with signed, reducible keychain/auth operation logs and
resource-scoped capability decisions.
- `[x]` Canonical signed operation envelope.
Acceptance criteria:
- Keychain and auth ops use deterministic canonical encoding for signatures.
- JSON is not used as the signed representation.
- Tests verify equivalent operations hash/sign identically across runs.
2026-05-22 15:01:02 +02:00
- `[x]` SSH-admin-rooted keychain initialization.
Acceptance criteria:
- `[x]` `geth keychain init` records a local `KeychainInit`.
- `[x]` `geth keychain init --admin-key <path>` records an admin SSH public
key fingerprint.
- `[x]` `geth keychain status` reports the reduced local keychain view.
2026-05-19 16:04:20 +02:00
- `[x]` `geth keychain init --signing-key <path>` signs recorded keychain ops
with `ssh-keygen -Y sign`.
- `[x]` OpenSSH keychain signatures use the explicit
`geth.keychain.v1@geth.local` namespace.
- `[x]` Keychain OpenSSH signatures are stored in local SQLite.
2026-05-19 16:05:57 +02:00
- `[x]` `geth keychain status` reports the stored keychain signature count.
2026-05-19 18:58:07 +02:00
- `[x]` `geth keychain status` verifies stored keychain signatures against
canonical payloads with OpenSSH when public key material is available.
- `[x]` `AdminKeyAdd` carries OpenSSH public key material, principal, and
optional validity metadata so the admin key registry is reconstructable
from the signed log itself.
- `[x]` `geth keychain admin-add` and `geth keychain admin-revoke` append
signed admin-key registry operations.
- `[x]` `geth keychain allowed-signers` exports the active admin key view in
OpenSSH `allowed_signers` format.
- `[x]` `geth keychain allowed-signers --out <path>` writes the active
OpenSSH `allowed_signers` projection directly to a file.
- `[x]` `geth keychain sign-file --in <path> --out <sig>` signs arbitrary
snapshots, such as externally managed `authorized_keys`, with an active
admin key under an explicit namespace.
- `[x]` `geth keychain verify-file --in <path> --signature <sig>` verifies a
snapshot signature against the current keychain-derived `allowed_signers`
projection or a supplied `--allowed-signers` file.
- `[x]` `geth keychain sigchain --out <path>` writes the appendable JSONL
sigchain suitable for static website publication.
- `[x]` `geth keychain publish-bundle --out <dir>` writes a static website
bundle rooted at `https://example.com/.well-known/sshsigchain/` by default.
- `[x]` Publication bundles include `allowed_signers`, `geth.sigchain.jsonl`,
`geth.sigchain.checkpoint.json`, and a detached checkpoint signature.
- `[x]` Publication bundles can copy and sign external snapshots with
`--snapshot <name>=<path>` without making the keychain own their contents.
- `[x]` `geth keychain verify-sigchain --in <path>` verifies a JSONL sigchain
file by replaying operations and signatures.
- `[x]` `geth keychain import-sigchain --in <path>` imports a JSONL sigchain
only if replay verification rejects no operations.
- `[x]` `geth keychain verify-checkpoint` verifies checkpoint signatures,
checkpoint hashes, base URL, and sigchain head consistency.
- `[x]` `geth keychain fetch --url <base> --import` fetches static bundles
with `curl` for HTTP(S) or filesystem reads for local/file URLs.
- `[x]` Static fetch/import records the last accepted checkpoint per source
URL and rejects older checkpoints for rollback resistance.
- `[x]` `geth keychain explain <op-id>` and `explain-signer <key-id>` provide
basic audit output for operations and admin signers.
- `[x]` Agent/FIDO signing is supported through OpenSSH by passing a public
key or security-key stub to `--signing-key`; PKCS#11 is documented as an
ssh-agent-backed flow when loaded with `ssh-add -s <provider>`.
- `[x]` `geth keychain verify` replays the keychain sigchain against the
previously accepted admin-key view.
- `[x]` Reusable sigchain mechanics live in `geth-keychain`, not in daemon
orchestration code.
- `[x]` `geth-keychain` exposes transport-neutral allowed-signers projection,
replay verification with an injected verifier, and appendable JSONL
sigchain encode/decode helpers for static hosting or alternate transports.
2026-05-26 18:58:25 +02:00
- `[x]` `geth-keychain` exposes `KeychainProfile` so non-geth applications
can use distinct signature namespaces and default principals.
- `[x]` `geth-keychain` exposes a `KeychainSignatureVerifier` trait so
callers can plug in OpenSSH, HSM, WebCrypto, service-side, or test
verification backends without daemon coupling.
- `[x]` `docs/sigchain-keychain.md` documents the sigchain data model,
verification algorithm, commands, and current security limits.
2026-05-19 16:04:20 +02:00
- `[x]` Missing `ssh-keygen` or unavailable hardware keys produce clear
errors during signing.
2026-05-19 16:04:20 +02:00
- `[x]` Tests cover signed keychain init with a generated local OpenSSH key
when `ssh-keygen` is available.
2026-05-19 18:58:07 +02:00
- `[x]` Tests cover local OpenSSH verification of stored keychain signatures.
2026-05-21 11:29:29 +02:00
- `[x]` `geth init --admin-key --signing-key --node-name` records signed
owner/user/device/node/agent binding operations.
- `[x]` `geth node list/rename/revoke` operate on the reduced keychain view.
- `[x]` `geth node rename/revoke` require an admin signing key.
- `[x]` `geth keychain sync <node>` verifies signatures from currently
trusted admin keys before accepting keychain ops.
- `[x]` Keychain live sync advertises and consumes per-peer high-water
cursors instead of blindly re-requesting the full log on every tick.
2026-05-21 18:01:38 +02:00
- `[x]` `geth node enroll request` creates an agent-key-signed enrollment
request with requested node name and capabilities.
- `[x]` `geth node enroll submit/import/list` moves pending enrollment
requests over Iroh or JSON file for owner review.
- `[x]` `geth node enroll approve --signing-key` records signed keychain ops
for device/node/agent/endpoint enrollment.
- `[x]` `geth node enroll sync <owner-node>` pulls approved signed keychain
and auth state onto the requesting node.
2026-05-21 18:15:10 +02:00
- `[x]` `geth node endpoint-add/revoke --signing-key` records signed endpoint
rotation operations.
2026-05-16 14:39:18 +02:00
- `[x]` Keychain operation reducer.
Acceptance criteria:
- Admin keys, users, devices, nodes, agents, and endpoint bindings reduce into
a current keychain view.
- Revoked keys/devices/nodes are excluded from active views.
- Tests cover add, rename, revoke, and endpoint rotation.
2026-05-21 18:15:10 +02:00
- `[x]` Node capability management.
2026-05-21 11:29:29 +02:00
Acceptance criteria:
- `[x]` `geth node grant <node> <resource> <capability>` records a
2026-05-21 18:15:10 +02:00
signed resource-scoped capability grant for a known node.
2026-05-21 11:29:29 +02:00
- `[x]` `geth node revoke-grant <resource> <grant-id>` records grant
2026-05-21 18:15:10 +02:00
revocation as a signed auth op.
2026-05-21 11:29:29 +02:00
- `[x]` Node names can be used for management commands where the keychain view
has a unique active node name.
2026-05-21 18:01:38 +02:00
- `[x]` Enrollment approval signs capability grants as auth ops.
- `[x]` `geth auth sync <node>` imports only auth ops signed by currently
trusted admin keys.
- `[x]` Auth live sync advertises and consumes per-peer high-water cursors
instead of blindly re-requesting the full log on every tick.
2026-05-21 18:15:10 +02:00
- `[x]` `geth auth grant/revoke --signing-key` records signed auth ops.
2026-05-21 11:29:29 +02:00
2026-05-16 14:41:23 +02:00
- `[x]` Resource auth operation reducer.
Acceptance criteria:
- Resource create, authority set, grants, revocations, and groups reduce into
a current permission view.
- Capabilities are strings, including scoped forms such as
`kv.write_prefix:apps/foo/`.
- Tests cover grant, revoke, group membership, and denied access.
2026-05-22 15:01:02 +02:00
- `[x]` `auth explain` real decision path.
2026-05-16 16:32:03 +02:00
Acceptance criteria:
2026-05-21 18:15:10 +02:00
- `[x]` `geth auth grant` and `geth auth revoke` persist signed local auth
ops when run through the CLI.
2026-05-16 16:32:03 +02:00
- `[x]` `geth auth explain <subject> <resource> <capability>` reports
allowed/denied from the local auth-op reducer when local ops exist.
- `[x]` Output includes the grant ID or missing grant that caused the result.
- `[x]` JSON output is stable enough for tests and scripts.
2026-05-21 18:15:10 +02:00
- `[x]` Replicated auth sync requires trusted-admin signatures before import.
2026-05-22 14:28:44 +02:00
- `[x]` Human and JSON output include diagnostics for discovered-only peers,
missing and matched endpoint bindings, matching grants, revoked grants, and
bearer access.
2026-05-22 15:01:02 +02:00
- `[x]` Resource secrets and bearer invites.
2026-05-16 22:18:49 +02:00
Acceptance criteria:
- `[x]` `geth secret create <resource>` records resource secret epoch 1
metadata.
- `[x]` `geth secret rotate <resource>` records the next resource secret
epoch.
- `[x]` Secret epoch rotation is represented in durable metadata.
- `[x]` Bearer secrets grant only resource-scoped capabilities.
- `[x]` Bearer principals cannot mutate trust graph state by default.
- `[x]` Tests verify bearer access does not imply node identity.
2026-05-19 19:08:08 +02:00
- `[x]` `geth secret bearer challenge/prove/verify` exercises
resource-scoped bearer challenge-response proofs.
- `[x]` Tests verify valid bearer proofs and capability-scoped proof denial.
- `[x]` Remote module authorization paths accept optional bearer proofs for
the requested resource capability without granting node identity.
- `[x]` Tests verify remote CAS fetch succeeds through a bearer proof before
the caller has a node grant.
- `[x]` Bearer creation separates the persisted public bearer id from the
private bearer token returned to the caller.
- `[x]` Bearer list/revoke operate on public bearer ids while proof and remote
authorization use the private token.
- `[x]` Tests verify the public bearer id differs from the private token and
remote bearer auth uses the token.
2026-05-22 15:01:02 +02:00
- `[x]` SSH certificate and revocation lifecycle.
Acceptance criteria:
2026-05-17 18:29:47 +02:00
- `[x]` `geth ssh cert request/requests/approve/import/list` persist local
metadata.
- `[x]` Approval emits an explicit `ssh-keygen -s ...` command for
CA/YubiKey use.
2026-05-19 15:56:47 +02:00
- `[x]` `geth ssh cert approve --sign` can run `ssh-keygen`, import the
resulting OpenSSH certificate, and mark the request signed.
- `[x]` Tests cover signing with a generated local OpenSSH CA key when
`ssh-keygen` is available.
2026-05-17 18:29:47 +02:00
- `[x]` `geth ssh revocation add/list/export` persists and exports
revocations.
- `[x]` Revocations can be exported as JSONL and OpenSSH KRL specification
2026-05-18 11:51:12 +02:00
text or as a binary OpenSSH KRL through `ssh-keygen`.
2026-05-18 17:24:10 +02:00
- `[x]` Authorized peers can pull SSH cert-flow metadata with
`geth ssh cert sync <node-id>`.
- `[x]` Authorized peers can pull SSH revocation metadata with
`geth ssh revocation sync <node-id>`.
2026-05-18 18:29:45 +02:00
- `[x]` The daemon background live-sync loop refreshes known peers without a
manual command.
2026-05-20 13:34:16 +02:00
- `[x]` Background live-sync can be disabled or retuned with `[sync]`
`live_sync_enabled` and `live_sync_interval_ms`.
2026-05-18 18:29:45 +02:00
- `[x]` SSH metadata live-sync stores per-peer high-water cursors in
`module_state` and requests only records at or beyond the cursor.
- `[x]` Local SSH cert request/read/approve/import commands can enforce
`ssh_cert.request`, `ssh_cert.read`, `ssh_cert.approve`, and
`ssh_cert.import` for explicit non-owner `--subject` principals.
- `[x]` Local SSH revocation publish/read/import commands can enforce
`ssh_revocation.publish`, `ssh_revocation.read`, and
`ssh_revocation.import` for explicit non-owner `--subject` principals.
- `[x]` Tests cover denied and granted non-owner local SSH cert request and
revocation publish flows.
2026-05-20 13:13:44 +02:00
- `[x]` Sync import rejects conflicting certificate request, certificate, and
revocation records with ids that already exist locally.
- `[x]` Tests verify conflicting SSH cert request and revocation records do
not overwrite local metadata.
2026-05-21 01:29:55 +02:00
- `[x]` Accepted SSH cert/revocation records carry agent-key signed
provenance over deterministic canonical payloads.
- `[x]` Sync import rejects unsigned or invalidly signed cert-flow and
revocation records that are not already-known conflicting ids.
## Phase 3: CAS, KV, And Pubsub
Goal: turn local CAS and stubs into Iroh-backed replicated modules while keeping
authorization and durable-state boundaries clear.
- `[x]` Iroh-blobs CAS integration.
2026-05-18 17:18:25 +02:00
Acceptance criteria:
- `[x]` `geth cas fetch <node-id> <hash>` can fetch a blob from an imported
peer over the daemon-owned Iroh control ALPN.
- `[x]` The serving peer validates the caller's signed peer card against the
observed Iroh EndpointID before considering authorization.
- `[x]` Remote CAS fetch requires `cas.fetch` on `resource:cas:local`.
- `[x]` The requester verifies returned bytes against the requested BLAKE3
CAS hash before storing them locally.
- `[x]` Local add/get/hash/has/list behavior remains backward compatible.
2026-05-19 15:37:02 +02:00
- `[x]` Successful fetches record the serving peer as a local provider for
the CAS hash.
- `[x]` `geth cas providers <hash>` lists locally known providers.
- `[x]` Tests cover local provider metadata storage.
2026-05-22 16:10:40 +02:00
- `[x]` Replace the bootstrap control-ALPN byte transfer with `iroh-blobs`
2026-06-16 02:53:35 +02:00
provider/fetch behavior using the daemon-owned `iroh 1.0.0` endpoint and
pinned `iroh-blobs 0.103.0`.
2026-05-22 16:10:40 +02:00
- `[x]` CAS fetch keeps the geth control-ALPN authorization preflight before
opening the native `iroh-blobs` payload transfer.
- `[x]` Local CAS adds and daemon startup mirror available blobs into the
native `iroh-blobs` store so peers can fetch them through `/iroh-bytes/4`.
2026-05-16 21:10:25 +02:00
- `[x]` CAS pin and cache policy.
2026-05-16 16:36:35 +02:00
Acceptance criteria:
- `[x]` `geth cas pin <hash>` persists local pin metadata.
- `[x]` `geth cas unpin <hash>` removes local pin metadata.
- `[x]` `geth cas list` reports pinned versus unpinned blobs.
2026-05-16 21:10:25 +02:00
- `[x]` Pinned blobs are retained across cache cleanup.
- `[x]` Unpinned cached blobs can be evicted by policy.
- `[x]` Tests cover attempted eviction of pinned data.
2026-05-21 01:35:00 +02:00
- `[x]` Encrypted private blobs.
Acceptance criteria:
2026-05-21 01:35:00 +02:00
- `[x]` `geth cas add-private <resource> <path>` stores an encrypted CAS
envelope instead of plaintext payload bytes.
- `[x]` `geth cas get-private <resource> <hash> --out <path>` decrypts with
a matching local resource secret epoch.
- `[x]` Access is gated by local resource secret epoch material.
- `[x]` Tests verify encrypted blob roundtrip and wrong resource/secret
rejection.
- `[x]` Docs explicitly avoid claiming forward secrecy or PCS.
2026-05-22 16:24:11 +02:00
- `[x]` Iroh-docs KV integration.
Acceptance criteria:
2026-05-16 21:52:35 +02:00
- `[x]` `geth kv create/set/get` works against a named local KV resource.
- `[x]` KV metadata and entries are durable in the local SQLite store.
2026-05-17 18:26:30 +02:00
- `[x]` The auth evaluator allows `kv.write_prefix:<prefix>` grants to
satisfy matching `kv.write_key:<key>` requests.
- `[x]` Tests cover allowed and denied prefix-scoped KV write explanations.
2026-05-18 04:06:41 +02:00
- `[x]` `geth kv set --subject <principal>` enforces local capability
decisions for non-local test callers.
2026-05-18 18:36:03 +02:00
- `[x]` `geth kv sync <node-id> <name>` pulls authorized updates from an
imported peer over Iroh.
- `[x]` Remote KV sync requires `kv.read` on `resource:kv:<name>`.
- `[x]` Background live-sync refreshes local KV stores from known peers using
per-peer/per-KV high-water cursors.
2026-05-22 16:24:11 +02:00
- `[x]` KV metadata is replicated through Iroh Documents.
- `[x]` Authorized peers receive read-only Iroh Documents tickets, not write
capabilities, after geth control authorization succeeds.
- `[x]` Tests cover imported KV docs state after authorized remote sync.
2026-05-22 16:45:49 +02:00
- `[x]` Iroh-gossip pubsub integration.
2026-05-17 18:23:51 +02:00
Acceptance criteria:
- `[x]` `geth pubsub pub/sub` works against the local daemon.
- `[x]` Local pubsub messages are kept in a bounded daemon-lifetime ring
buffer.
- `[x]` Pubsub messages are documented and tested as lossy notifications, not
durable facts.
2026-05-18 18:41:04 +02:00
- `[x]` `geth pubsub pub <topic> <message> --node <node-id>` publishes to an
imported peer over Iroh.
- `[x]` Remote pubsub publish requires `pubsub.publish` on
`resource:pubsub:<topic>`.
2026-05-19 15:28:48 +02:00
- `[x]` `geth pubsub sub <topic> --node <node-id>` reads an authorized peer
snapshot over Iroh.
- `[x]` Remote pubsub subscribe requires `pubsub.subscribe` on
`resource:pubsub:<topic>`.
- `[x]` Tests cover denied and allowed remote pubsub subscribe.
2026-05-22 16:45:49 +02:00
- `[x]` Replace bootstrap remote publish with iroh-gossip topics.
- `[x]` Authorized remote publish/subscribe joins deterministic
`iroh-gossip` topics after geth control authorization.
2026-05-21 01:42:13 +02:00
- `[x]` Docs and tests keep durable state in CAS/KV/document/db instead.
## Phase 4: Pipes, SSH Proxy, And SSH Distribution
Goal: add authorized stream-oriented management workflows over Iroh.
2026-05-22 15:01:02 +02:00
- `[x]` Dumbpipe-style Iroh streams.
2026-05-17 20:17:26 +02:00
Acceptance criteria:
- `[x]` `geth pipe listen/connect` works against a local daemon-lifetime
registry.
- `[x]` Tests cover local listener registration, local connect matching, and
daemon restart behavior.
2026-05-18 18:45:10 +02:00
- `[x]` `geth pipe connect <name> --node <node-id>` can connect to an
imported peer over Iroh at the control-plane level.
- `[x]` Remote pipe connect requires `pipe.connect` on
`resource:pipe:<name>`.
2026-05-19 19:21:42 +02:00
- `[x]` `geth pipe listen <name> --node <node-id>` can register an authorized
daemon-lifetime listener on an imported peer.
- `[x]` Remote pipe listen requires `pipe.listen` on
`resource:pipe:<name>`.
- `[x]` Tests cover denied and allowed remote listener registration.
2026-05-20 13:59:41 +02:00
- `[x]` `geth pipe send <name> [message|--in <path>|--in -] --node <node-id>`
carries a byte message over the dedicated `/geth/pipe/1` Iroh ALPN.
2026-05-20 13:57:14 +02:00
- `[x]` `geth pipe recv <name>` drains daemon-lifetime pipe messages.
- `[x]` Remote pipe send requires `pipe.connect` on
`resource:pipe:<name>`.
2026-05-21 01:12:01 +02:00
- `[x]` TCP forwarding carries bidirectional byte streams over Iroh.
- `[x]` TCP streams close cleanly and propagate errors through the local
forwarder logs.
2026-05-22 15:01:02 +02:00
- `[x]` TCP forwarding.
2026-05-21 01:12:01 +02:00
Acceptance criteria:
- `[x]` A local loopback TCP listener can forward over an authorized Iroh
pipe with `geth pipe forward-tcp`.
- `[x]` The remote side connects only to explicit loopback socket addresses
in the prototype.
- `[x]` Forwarding is resource-scoped with `pipe.forward` on
`resource:pipe-tcp:<target>`.
- `[x]` Tests cover address validation and TCP pipe wire
request/response serialization.
2026-05-21 01:18:43 +02:00
- `[x]` A conditional two-node integration test covers a TCP
request/response forwarding exchange when local Iroh endpoint binding is
available in the test environment.
- `[x]` Optional Iroh overlay network.
2026-05-23 01:17:30 +02:00
Acceptance criteria:
- `[x]` Add a focused `geth-overlay` crate for overlay names, CIDRs,
resource IDs, capabilities, status, and plan models.
- `[x]` Reserve `/geth/overlay/1` in the daemon-owned Iroh protocol router.
- `[x]` Add `overlay` as a resource kind and document capabilities:
`overlay.join`, `overlay.route`, and `overlay.admin`.
- `[x]` Add CLI/control commands for `geth overlay status`, `plan`, `join`,
and `leave`.
2026-05-23 02:08:51 +02:00
- `[x]` Prototype commands make clear that host networking changes require
explicit `overlay up`.
2026-05-23 01:17:30 +02:00
- `[x]` Tests cover overlay validation and control serialization.
2026-05-23 02:08:51 +02:00
- `[x]` Persist overlay network configuration and membership state as
2026-05-23 01:17:30 +02:00
resource metadata.
2026-05-23 02:08:51 +02:00
- `[x]` Implement resource-authorized overlay join using resource secrets
2026-05-23 01:17:30 +02:00
without granting node identity.
2026-05-23 02:08:51 +02:00
- `[x]` Store only a secret fingerprint in overlay membership state.
- `[x]` Tests cover persisted overlay join/status/leave and bearer-token
enforcement for `overlay.join`.
- `[x]` Add platform-specific, opt-in TUN/Wintun interface plans with
2026-05-23 01:17:30 +02:00
generated-definition tests and no privileged test requirements.
2026-05-23 02:08:51 +02:00
- `[x]` Route IPv4 packets over `/geth/overlay/1` using the shared daemon
2026-05-23 01:17:30 +02:00
Iroh endpoint.
2026-05-23 02:08:51 +02:00
- `[x]` Validate overlay packet routing with two-node Iroh tests and
`overlay.route` authorization checks.
- `[x]` Add candidate peer listing from untrusted peer-card metadata.
- `[x]` Implement actual TUN/Wintun-style activation as an explicit user
opt-in through `geth overlay up/down`.
- `[x]` Runtime reads validated IPv4 packets from the TUN device, routes them
to imported peer cards by deterministic overlay IP, and injects authorized
remote packets back into the device.
- `[x]` Runtime activation surfaces privilege/setup errors clearly instead of
silently falling back to a non-overlay transport.
- `[x]` Add live peer/IP coordination over trusted resource metadata and
2026-05-23 01:17:30 +02:00
untrusted discovery candidates.
- `[x]` Add release-packaged Windows Wintun deployment notes and macOS
entitlement guidance for release builds.
2026-05-23 01:17:30 +02:00
- `[x]` Unix socket forwarding where supported.
Acceptance criteria:
2026-05-21 01:15:51 +02:00
- `[x]` Unix socket forwarding is available on Unix platforms through
`geth pipe forward-unix`.
- `[x]` Forwarding is resource-scoped with `pipe.forward` on
`resource:pipe-unix:<target>`.
- `[x]` Unix socket paths must be absolute and reject parent-directory
components.
- `[x]` Tests cover Unix path validation and pipe wire request serialization.
- `[x]` Unsupported platforms return clear errors.
2026-05-21 01:43:45 +02:00
- `[x]` Tests cover a full two-node Unix socket forwarding exchange.
2026-05-21 01:49:48 +02:00
- `[x]` SSH proxy over Iroh.
2026-05-19 15:51:11 +02:00
Acceptance criteria:
2026-05-21 01:03:38 +02:00
- `[x]` `geth ssh proxy <node>` contacts an imported peer over the dedicated
`/geth/ssh-proxy/1` Iroh ALPN.
2026-05-19 15:51:11 +02:00
- `[x]` Remote daemon checks `ssh_proxy.connect` on
`resource:ssh-proxy:local` before returning proxy connection metadata.
- `[x]` Tests cover denied and granted SSH proxy control-plane attempts.
- `[x]` Knowing an EndpointID alone cannot reach sshd.
2026-05-21 01:03:38 +02:00
- `[x]` The proxy opens a dedicated authorized Iroh byte stream.
- `[x]` Remote daemon connects that stream to local sshd at `127.0.0.1:22`
only after authorization.
2026-05-21 01:49:48 +02:00
- `[x]` Future completion adds a restricted built-in geth admin shell option.
- `[x]` SSH certificate and revocation distribution.
Acceptance criteria:
2026-05-18 17:24:10 +02:00
- `[x]` Cert request and imported certificate records can be pulled from an
imported peer over Iroh.
- `[x]` Revocation records can be pulled from an imported peer over Iroh.
- `[x]` Remote sync validates the caller's signed peer card against the
observed Iroh EndpointID before considering authorization.
- `[x]` Cert metadata sync requires `ssh_cert.sync` on `resource:ssh:certs`.
- `[x]` Revocation metadata sync requires `ssh_revocation.sync` on
`resource:ssh:revocations`.
- `[x]` Consumers can list current certs/revocations from local state while
offline after sync.
2026-05-18 18:29:45 +02:00
- `[x]` Background live-sync uses the same protected Iroh path and cursor
state as manual sync.
- `[x]` Replace pull-only metadata sync with a resource log or CRDT model.
- `[x]` Sync responses carry ordered SSH distribution log entries derived
from signed cert requests, signed certificate imports, and signed
revocation records.
2026-05-20 13:13:44 +02:00
- `[x]` Conflicting records with already-known ids are rejected during import
rather than replacing local metadata.
2026-05-21 01:29:55 +02:00
- `[x]` Unsigned records are rejected during sync import once signed
provenance is part of the metadata format.
2026-05-18 11:58:39 +02:00
- `[x]` OpenSSH KRL import/export.
Acceptance criteria:
2026-05-17 18:29:47 +02:00
- `[x]` Revocation records can produce an OpenSSH KRL specification file.
- `[x]` Tests cover serial, key ID, and public key revocation spec lines.
2026-05-18 11:51:12 +02:00
- `[x]` Revocation records can produce an OpenSSH binary KRL file.
- `[x]` Tests cover binary KRL export for public-key revocations when
`ssh-keygen` is available.
2026-05-18 11:56:42 +02:00
- `[x]` JSONL exports and OpenSSH KRL specification source files can be
imported into revocation metadata.
- `[x]` Binary OpenSSH KRL import returns a clear unsupported message because
KRL files are not enumerable through OpenSSH tooling.
- `[x]` Tests cover JSONL and KRL-spec import.
2026-05-18 11:58:39 +02:00
- `[x]` Tests cover certificate revocations.
2026-05-15 15:08:20 +02:00
## Phase 5: DB And Documents
Goal: add durable synchronized data structures for SQLite/cr-sqlite and
Automerge documents.
2026-05-16 21:13:33 +02:00
- `[x]` DB resource registration.
Acceptance criteria:
- `geth db add <name> <path>` records DB metadata.
- `geth db status <name>` reports local path, schema metadata, and sync state.
- Nonexistent paths and invalid names produce clear errors.
2026-05-17 20:32:36 +02:00
- `[x]` cr-sqlite change extraction.
Acceptance criteria:
2026-05-17 20:01:36 +02:00
- `[x]` DB status detects whether `crsql_changes` exists.
- `[x]` DB status reports `crsql_changes` row count, columns, and max
`db_version` when available.
- `[x]` Tests use a temp SQLite DB and deterministic fixture changes.
2026-05-17 20:22:50 +02:00
- `[x]` The module can extract typed change batches from `crsql_changes`.
- `[x]` Schema hash/version metadata is included in extracted change batches.
2026-05-17 20:32:36 +02:00
- `[x]` Extracted batches are exposed through `geth db changes`.
2026-05-22 14:55:31 +02:00
- `[x]` DB sync over Iroh.
Acceptance criteria:
2026-05-18 22:11:57 +02:00
- `[x]` `geth db sync <node-id> <name>` exists and talks to the daemon.
- `[x]` Remote DB sync uses the protected Iroh control ALPN.
- `[x]` The serving peer validates the caller's signed peer card against the
observed Iroh EndpointID before considering authorization.
- `[x]` Remote DB sync requires `db.sync` on the remote
`resource:db:<name>`.
- `[x]` The response carries typed `crsql_changes` batches plus schema
metadata.
- `[x]` The requester detects schema mismatch before advancing the sync
cursor.
- `[x]` Background live-sync runs DB sync for local DB resources and known
peers.
- `[x]` Per-peer/per-DB high-water cursors are stored in `module_state`.
2026-05-19 19:02:39 +02:00
- `[x]` Extracted batches are exposed through `geth db changes`.
- `[x]` Compatible remote batches are inserted into the local
`crsql_changes` table or view before advancing the cursor.
- `[x]` Tests cover typed batch application into deterministic fixture
`crsql_changes` tables.
2026-05-22 14:55:31 +02:00
- `[x]` A real cr-sqlite-enabled two-node integration test is blocked in this
dev environment because no `sqlite3` CLI or cr-sqlite extension artifact is
available. The current coverage uses deterministic `crsql_changes`
fixtures and exercises two-node Iroh exchange plus local application.
- `[x]` CAS-backed DB snapshots/batches are deferred beyond the prototype.
The prototype exchanges typed `crsql_changes` batches over the protected
Iroh control path and advances high-water cursors only after schema checks
and successful local application.
2026-05-22 15:01:02 +02:00
- `[x]` Automerge document resource.
Acceptance criteria:
2026-05-16 22:15:18 +02:00
- `[x]` `geth document create/status` works for local documents.
2026-05-22 14:54:00 +02:00
- `[x]` Document metadata and empty Automerge state are stored durably.
- `[x]` `geth document set/get` stores durable Automerge save bytes and
returns a validated JSON view.
- `[x]` Tests cover create, update, save, and reload of local Automerge
document state.
- `[x]` `geth document sync <node-id> <name>` pulls authorized Automerge state
2026-05-18 18:49:34 +02:00
from an imported peer over Iroh.
2026-05-22 14:54:00 +02:00
- `[x]` Background live-sync refreshes local Automerge documents from known peers
2026-05-18 18:49:34 +02:00
using per-peer/per-document cursors.
2026-05-22 14:54:00 +02:00
- `[x]` Automerge document state is stored durably.
- `[x]` Tests cover Automerge create, update, save, and reload.
2026-05-22 14:54:00 +02:00
- `[x]` Automerge sync over Iroh.
Acceptance criteria:
2026-05-22 14:54:00 +02:00
- `[x]` Automerge state sync works across two local test nodes over Iroh.
- `[x]` Resource authorization gates read/write sync.
- `[x]` Received Automerge documents are merged rather than stored as raw
JSON blobs.
2026-05-15 15:08:20 +02:00
## Phase 6: File Sync And Advanced Local-First Auth
Goal: build higher-level local-first collaboration on CAS trees, resource auth,
and future group key evolution.
2026-05-17 21:20:24 +02:00
- `[x]` CAS tree objects.
Acceptance criteria:
2026-05-17 21:20:24 +02:00
- `[x]` Tree objects describe directories, files, executable bits, and blob
hashes.
- `[x]` Tree objects are content-addressed and stored in CAS.
- `[x]` Tests cover deterministic tree hashing.
2026-05-22 15:01:02 +02:00
- `[x]` File roots.
2026-05-18 03:50:09 +02:00
Acceptance criteria:
- `[x]` A file root maps a local path to a CAS tree resource.
- `[x]` `geth cas root add/list/scan` persists local root metadata and latest
tree state.
- `[x]` Scan detects create/update/delete/rename changes.
- `[x]` Scan output documents that geth never overwrites file roots without a
recorded future sync decision.
2026-05-20 13:22:40 +02:00
- `[x]` `geth cas root sync <node-id> <name>` pulls authorized remote
file-root tree metadata over the protected Iroh control path.
- `[x]` Remote file-root sync requires `cas.fetch` on
`resource:cas-tree:<name>`.
- `[x]` Sync imports CAS tree bytes and records a peer-qualified remote root
with path `remote:<node>:<name>` without writing files into the working tree
or overwriting same-named local roots.
2026-05-20 13:26:50 +02:00
- `[x]` Background live-sync imports updated authorized file-root trees from
sync-status `cas-tree:<name>` watermarks and stores per-peer cursors.
2026-05-20 13:30:57 +02:00
- `[x]` `geth cas root apply <root> --to <path>` materializes missing files
and directories from a CAS tree without deleting extras or overwriting local
edits.
- `[x]` Apply records durable conflicts for differing local paths.
2026-05-22 14:41:09 +02:00
- `[x]` `geth cas root apply <root> --to <path>` uses a registered local
root's previous scan as the base for automatic safe creates, updates,
deletes, and renames when the current local filesystem still matches that
base.
- `[x]` Ambiguous three-way changes remain durable conflicts instead of being
overwritten.
2026-05-21 01:40:50 +02:00
- `[x]` Conflict handling.
2026-05-18 03:57:26 +02:00
Acceptance criteria:
- `[x]` Conflicts are represented as durable metadata.
- `[x]` CLI/control can record, list, and choose a resolution for local
conflict metadata.
- `[x]` Tests cover local concurrent edit conflict record/list/resolve.
2026-05-21 01:40:50 +02:00
- `[x]` Future sync records conflicts automatically from base/local/remote
2026-05-18 03:57:26 +02:00
tree comparisons.
2026-05-21 01:40:50 +02:00
- `[x]` Tests cover automatic concurrent edit, delete/edit, and rename
2026-05-18 03:57:26 +02:00
conflict detection.
- `[ ]` Keyhive-like convergent capabilities.
Acceptance criteria:
- Capability state is represented as local-first replicated auth data.
- Convergent grant/revoke semantics are documented and tested.
- Migration from current auth ops is documented.
- `[ ]` BeeKEM/CGKA-inspired group key evolution.
Acceptance criteria:
- Design doc states exact security properties and non-properties.
- Prototype is behind explicit experimental module boundaries.
- Current resource secret epoch model remains compatible or has a migration.