v0.15.1
Two new harnesses, and the machinery that made them cheap to add. pond now ingests letta-code and grok-build (xAI's grok CLI) sessions, bringing the registry to twelve harnesses, eleven of them auto-discovered. Both adapters were requested by Kyle Little (#170, #171), who runs letta as the orchestrator over codex, pi, claude-code, omp and grok workers, and were the first picked by the roadmap's reaction ordering. Both were built end to end from a new add-adapter playbook and a shared conformance harness - the second one needed zero edits to either, which was the bar the playbook had to meet. Every adapter now carries a docs/adapters/<name>.md spec with an 11-row decision table and a Last verified date against a named upstream version, so "does pond still read this format?" has a written answer instead of a guess.
Upgrading: the new adapters are registered but not enabled on an existing install - pond sync never enables anything as a side effect. Run pond adapters discover (or re-run pond init) once; it finds ~/.letta/transcripts and ~/.grok/sessions and adds them to your config. A relocated LETTA_TRANSCRIPT_ROOT or GROK_HOME is configured as an explicit path.
🎉 New Features
- adapter: add grok-build (#179) (28bc262)
- Reads
~/.grok/sessions/<encoded-cwd>/<session-uuid>/updates.jsonl(GROK_HOMEhonored). Project resolves fromsummary.json's recorded cwd, then the bucket's.cwdsidecar, then the decoded bucket name - the three places grok writes it, in the order they are trustworthy. Tool calls become an assistant call plus a tool result under onecall_id, with both failure modes and an interrupted call covered by the fixture; plans, hook events, image blocks and everyx.ai/*extension ride the lossless carrier rather than being dropped. - Subagent lineage: grok records the parent->child link only parent-side (
subagents/<child>/meta.json), so the adapter builds the map once and stores each child's meta in its own session - a child restored on its own re-emits the sidecar, which is what makes the per-session round trip exact. Forks,/rewindand compaction are all appends in 1.0.x (measured: the pre-rewind file is a byte prefix of the post-rewind file), so freshness is a bounded tail peek. - Fixture: 15 sessions self-captured in a sandbox on macOS and on Windows 11, model
grok-4.6, swept clean. Verified against grok-build 1.0.5 and the xai-org/grok-build v1.0.6 source snapshot.
- Reads
- adapter: add letta-code (#177) (29aadc4)
- Reads the
lettaCLI's client-side transcripts at~/.letta/transcripts/<agent>/<conversation>/transcript.jsonl(LETTA_TRANSCRIPT_ROOThonored). Session identity is the path and the project is the agent id; message ids are position-derived because letta's ownletta-msg-<n>ids are process-scoped and repeat inside one conversation. Atool_callrow that carries result fields yields both the call and its result under the samecall_id. - Native restore replays every captured record byte-for-byte into the source layout; foreign restore reconstructs under letta's own sanitized alphabet. Verified against letta-code 0.30.30.
- Reads the
- make adapter addition routine - add-adapter skill, conformance harness, contributor flow (#173) (295c6cc)
/add-adapter(.agents/skills/add-adapter/SKILL.md) is a two-phase playbook: spec the format from the upstream writer code and capture a sandboxed self-capture fixture, then implement from the spec. Its centerpiece is an 11-row decision table (identity, project, ordering, tool correlation, provenance, lineage, non-capture, restore face, freshness oracle, Windows) with each row tied to the spec rule that makes it binding.- One conformance harness for every adapter: clean ingest counts, every searchable row inside the brand scope, re-sync is a no-op (each session skipped fresh, by id), and a round trip in the mode the adapter declares - with a first-difference diff on failure. Retrofitted onto oh-my-pi, opencode, claude-ai-export, claude-code and pi-coding-agent, which surfaced that pi honestly reports
Foreignfor v4/SQLite-origin sessions no released pi can read; that is now a declared downgrade rather than a silent pass. - A guard test keeps
src/adapter/import-isolated from the store's write path, commit discipline and query plans, which is why "fmt, clippy--all-targets,cargo testgreen" is the whole bar for an adapter PR.CONTRIBUTING.md, the README's Supported harnesses table withLast verifieddates, and spec 6.9 (format archaeology lives indocs/adapters/) round out the contributor flow.
📚 Documentation
- readme: name grok-build in the auto-discovered harness list (8c532da)
🧹 Chores
- kache caching architecture (per-job k27 prefixes, bulk pull warm-up, kache 0.15.0) (#176) (dd51e9d)
- The hosted Windows gate drops from 17.8-19.5 min to 12.4 min (9m 6s of moon time) at a 99.6% hit rate with zero per-hit S3 round trips: each job now has its own key-schema-tagged prefix, bulk-pulled in one 45 s pass before cargo starts, so the 287 MB
lanceunit that used to time out kache's 3 s demand ceiling and recompile on every run is restored instead. The remote lives in committed.github/kache/*.tomlfiles selected byKACHE_CONFIGand asserted at bootstrap, which is what let both legs move to kache 0.15.0 and its under-keying fix. Windows release builds go from ~64 min cold to ~20 min warm. The plan with every measurement isdocs/plans/2608-24-ci-caching-architecture.md.
- The hosted Windows gate drops from 17.8-19.5 min to 12.4 min (9m 6s of moon time) at a 99.6% hit rate with zero per-hit S3 round trips: each job now has its own key-schema-tagged prefix, bulk-pulled in one 45 s pass before cargo starts, so the 287 MB
Full Changelog: v0.15.0...v0.15.1