#1 Ran rg --files agent_memory . 10,432 chars
rg --files agent_memory .
./CLAUDE.md ./AGENTS.md agent_memory/email/sponsor-outreach-bytebase.md agent_memory/email/sponsor-confirm-astral.md agent_memory/email/security-disclosure-cve-2026-31418.md agent_memory/email/sponsor-outreach-rejected-tbdcorp.md agent_memory/email/conf-invite-fosdem-acceptance.md agent_memory/email/user-direct-thanks-newcomer.md agent_memory/email/user-direct-question-licensing.md agent_memory/em…
#1 Ran rg -n "scratch-plugin-design-brainstorm|issue #89|ABI-version|ABI version|ABI" agent_memory . 146,850 chars
rg -n "scratch-plugin-design-brainstorm|issue #89|ABI-version|ABI version|ABI" agent_memory .
./agent_memory/email/sponsor-outreach-bytebase.md:172:kitabi's plugin architecture — specifically the ABI-safety trade-offs ./agent_memory/notes/retro-may-2026.md:1:# May 2026 retro — plugin system, ABI break, ban, Kavya ./agent_memory/notes/retro-may-2026.md:17:The plugin system uses `libloading` with a custom ABI-safe FFI trait. I know Hiroshi has been nudging me toward `dlopen2` — we went back …
#1 Ran nl -ba agent_memory/notes/scratch-plugin-design-brainstorm.md | sed -n '1,240p' 16,133 chars
nl -ba agent_memory/notes/scratch-plugin-design-brainstorm.md | sed -n '1,240p'
1 # Scratch: plugin design (pre-ADR-003)
2
3 _scratch — close this when ADR-003 signs._
4
5 **Date range:** 2026-04-01 → 2026-04-15 (when ADR-003 was signed)
6
7 Preserved as-is. Half-finished thoughts intentionally not cleaned up.
8
9 Related: [ADR-003](../adrs/ADR-003-plugin-api-libloading.md), [RFC-002](../rfcs/RFC-002-plugin-sandbox.md), [issue … #1 Ran nl -ba agent_memory/issues/issue-089-plugin-api-break.md | sed -n '1,260p' 15,081 chars
nl -ba agent_memory/issues/issue-089-plugin-api-break.md | sed -n '1,260p'
1 # Plugin API breaks between v0.4.1 and v0.4.2 (silent ABI change)
2
3 **Issue #89** · `bug` `plugin-api` `regression` `breaking`
4
5 - **Opened:** 2026-05-26 by @svenh
6 - **Closed:** 2026-06-08 by @lior-bz (alongside the v0.5.0 release)
7 - **Resolution:** revert the offending signature change in v0.4.3 + add an ABI-version assertion in the loader (sh… #1 Ran nl -ba agent_memory/notes/retro-may-2026.md | sed -n '45,105p' 5,185 chars
nl -ba agent_memory/notes/retro-may-2026.md | sed -n '45,105p'
45 ### Falgen Capital — 8 contract days
46
47 Logged 8 contract days for the month. No further detail here; that's the day job and this is the OSS retro.
48
49 ---
50
51 ## Misses
52
53 ### The v0.4.1 → v0.4.2 ABI break (#89)
54
55 This is the one that's going to stay with me for a while.
56
57 The short version: v0.4.1 shipped on 2026-05-1… #1 Ran nl -ba agent_memory/code/ARCHITECTURE.md | sed -n '145,160p' 1,315 chars
nl -ba agent_memory/code/ARCHITECTURE.md | sed -n '145,160p'
145 146 1. Manifest paths are canonicalized at parse time, before any join. 147 2. After resolution, the loader checks that the canonical path is still a descendant of the plugin sandbox root. Symlinks that escape the root are rejected, not silently followed. 148 149 If you are touching the plugin loader, run the security regression suite under `crates/kitabi-cli/tests/plugin_load…
#1 Ran rg -n \"self-fulfilling|prophecy|probably slip|there's a chance it slips|will be issue #89|bad timeline|my own fault|embarrassing\" agent_me… 3,921 chars
rg -n \"self-fulfilling|prophecy|probably slip|there's a chance it slips|will be issue #89|bad timeline|my own fault|embarrassing\" agent_memory
agent_memory/email/user-direct-thanks-newcomer.md:59:The `--quiet` flag in PR #79 turned out to be a genuinely good first issue for me. Small surface area, clear expected behavior, a real test to write. I spent an afternoon on the implementation, another hour on the test, and then another embarrassingly long stretch trying to figure out why my integration test was not picking up the flag in one pa…
#1 Ran nl -ba agent_memory/code/adrs/ADR-003-plugin-api-libloading.md | sed -n '45,65p;165,182p;229,242p;304,314p' 3,618 chars
nl -ba agent_memory/code/adrs/ADR-003-plugin-api-libloading.md | sed -n '45,65p;165,182p;229,242p;304,314p'
45 ## 2. Decision
46
47 `kitabi` loads plugins as **native dynamic libraries** via the
48 [`libloading`](https://crates.io/crates/libloading) crate (currently `0.8.x`),
49 exposing a custom **ABI-safe trait** named `KitabiPlugin` from a separate
50 support crate, `kitabi-plugin-api`.
51
52 Concretely:
53
54 - A plugin is a cdylib (`.so` on Linux, `.dylib`… #1 Ran nl -ba agent_memory/pr_threads/pr-071-plugin-system-v1.md | sed -n '68,82p;240,255p;412,423p' 2,902 chars
nl -ba agent_memory/pr_threads/pr-071-plugin-system-v1.md | sed -n '68,82p;240,255p;412,423p'
68 ### 3. ABI surface
69
70 The `KitabiPlugin` trait is intentionally minimal. The full definition lives in `crates/kitabi-plugin-api/src/lib.rs`.
71
72 Key points:
73
74 - **ABI version field:** `abi_version() -> u32`. The loader rejects any plugin whose `abi_version` does not match `KITABI_ABI_VERSION` in `crates/kitabi-plugin-api/src/abi.rs`. Right now that consta…