Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
cf44961
feat(contract): add libatomic, the canonical Atomic protobuf contract
geekgonecrazy Oct 5, 2026
193d924
docs(contract): drop draft framing; state the add-only discipline
geekgonecrazy Oct 5, 2026
615ba29
style(contract): rustfmt build.rs; clippy-allow the generated module
geekgonecrazy Oct 5, 2026
37f8b7b
feat(libatomic): add the reference handlers — the service layer over …
geekgonecrazy Oct 5, 2026
6f377e8
style(libatomic): rustfmt
geekgonecrazy Oct 6, 2026
1474467
feat(contract): wire extensions for full routing parity (add-only)
geekgonecrazy Oct 6, 2026
8960dcd
feat(vault): rank memory context handler-side + memory identity filter
geekgonecrazy Oct 6, 2026
b13a703
docs(contract): escape an HTML-looking angle bracket in a vault comment
geekgonecrazy Oct 6, 2026
3df57ef
feat(contract): wire the remaining listing, show, KG, attest, and rev…
geekgonecrazy Oct 6, 2026
4953396
feat(contract): wire the insert dry-run/tag-from-view/multi-pick and …
geekgonecrazy Oct 6, 2026
f8f1ee1
feat(contract): wire the tag/provenance/remote/push-pull/sandbox/vaul…
geekgonecrazy Oct 6, 2026
736ca34
chore: workspace lockfile for the libatomic service deps
geekgonecrazy Oct 6, 2026
4ab7c08
feat(contract): adopt the #230 merged-database APIs in the service layer
geekgonecrazy Oct 6, 2026
8059551
fix(cli): find #230 merged-database repositories with the root finder
geekgonecrazy Oct 7, 2026
2277483
feat(contract): route the full CLI command surface through the servic…
geekgonecrazy Oct 7, 2026
3193cf8
fix(client): allow result_large_err on the transport crate
geekgonecrazy Oct 7, 2026
f4398ef
fix(cli): allow result_large_err on the Status-returning stream colle…
geekgonecrazy Oct 7, 2026
9e03ace
fix(client): gate the unix-domain transport so non-unix targets compile
geekgonecrazy Oct 7, 2026
d3a49fa
fix(client): gate the socket transport imports unix-only
geekgonecrazy Oct 7, 2026
0c58fea
style(client): import order after the unix gating
geekgonecrazy Oct 7, 2026
9b3326f
docs(cli): log --all is real, not a hidden no-op
geekgonecrazy Oct 7, 2026
0e9629d
feat: compact atomic.redb through libatomic maintenance (#241)
vinceblock99 Oct 8, 2026
cc01851
atomic-wasm
geekgonecrazy Oct 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,38 @@ Human: "I can review that!"
| `EdgeFlags` | 1 byte | Bitflags: BLOCK, PSEUDO, FOLDER, PARENT, DELETED |
| `SerializedGraphEdge` | 24 bytes | Compact edge: (flags+pos, change, introduced_by) |

#### Endianness: keys that sort are big-endian, opaque values are little-endian

The storage layer encodes integers two ways, and the rule is whether the
bytes ever get sorted:

| Encoded as | Endian | Which |
|------------|--------|-------|
| **Big-endian** | BE | B-tree **keys** that are range-scanned: `encode_vertex`, `encode_inode_vertex`, `encode_position`, `encode_view_seq` (`pristine/tables.rs`) |
| **Little-endian** | LE | Values and ids only ever looked up by exact key: `SerializedGraphEdge`, and the CRDT `TrunkId`/`BranchId`/`LeafId` (`crdt/tables.rs`, `crdt/ids.rs`) |

BE is load-bearing for the keys: byte order has to match numeric order or a
range scan means nothing. The file-local INODE_GRAPH traversal depends on it —

```rust
let lo = encode_inode_vertex(inode, 0, 0, 0);
let hi = encode_inode_vertex(inode, u64::MAX, u64::MAX, u64::MAX);
for row in inode_graph.range::<&[u8; 32]>(&lo..=&hi)? { ... } // every row for one inode
```

For the LE side, sorting never happens, so byte order costs nothing and there
is no reason to pay for BE.

**The two meet in the same files**, so match the *writer*, never the
neighbours: a file that decodes graph vertex keys (BE) can also decode CRDT
ids (LE) within a few lines, and a hand-rolled `id[0..8]` slice reads the
wrong end of a LE id without any visible failure — the id just looks absent.
Decode an id with its own type's `from_bytes` (`TrunkId::from_bytes`,
`BranchId::from_bytes`, `LeafId::from_bytes`) instead of slicing by hand, so
the two sides cannot drift; a mis-decoded id is indistinguishable from an
absent one at runtime, so an `EXTERNAL`-row lookup for it is worth a
`debug_assert`.

### Hash Type Design

Following the original Atomic project, `Hash` is a **type alias** for `Merkle`:
Expand Down
Loading
Loading