diff --git a/plans/abstractions.md b/plans/abstractions.md index 3eae629d..ff352205 100644 --- a/plans/abstractions.md +++ b/plans/abstractions.md @@ -12,7 +12,12 @@ Anything short → _Watching_ (what's missing) or _Rejected_ (why). ## Last scan -- **Date:** 2026-06-06 (radar loop, pass 4) +- **Date:** 2026-06-06 (radar loop, pass 5) +- **Pass 5:** search (+highlight/snippet) and fed-sx-m1 (+follower_graph) moved; rest + unchanged. Filename census: `api`×6, `fed`×3, then `schema/rank/query/page/explain/ + engine/batch/audit`×2. Examined the ×6 `api.sx` → Rejected (shared name, divergent + structure incl. implicit-vs-explicit-state contract). rank/batch/engine all ≤2 + + substrate/domain-divergent → no new gate-clearer. - **Pass 4:** no churn vs pass 3 (same worktrees/tmux/HEADs/adopters). Swept audit+explain surfaces: acl/mod share an append-only-log shape (→ sharpened W4 with persist/log API evidence) and a proof-explain shape (→ new W5, substrate-bound). No new gate-clearer. @@ -165,6 +170,15 @@ Anything short → _Watching_ (what's missing) or _Rejected_ (why). agent writing across `lib//**` breaks the worktree isolation that makes the fleet safe, and is rewarded for manufacturing premature/wrong abstractions. The radar is read-only by design. (This file is the alternative.) +- **Shared `api.sx` "public boundary" module (×6).** Rejected pass 4-5: every subsystem + has an `api.sx` (acl, feed, flow, mod, persist, search — a 100% filename match), but it + is a naming *convention for the public entry point*, not a shared structure. They + disagree on the most basic contract: acl/feed use **implicit module state** + (`acl/api.sx` "implicit current db", `feed/api.sx` "single mutable log") while + `persist/api.sx` threads an **explicit backend as every call's first arg**; flow's api + *builds a Scheme env*, search's api *concatenates a Haskell source string*, mod's is a + *lifecycle state-machine façade* (17 defs vs persist's 1). Same role, no common shape — + the W1 coincidental-resemblance trap. Do not re-propose on the filename. - **Dumping app-domain plumbing into `lib/guest`.** Rejected: `lib/guest` is for language-implementation plumbing. App patterns route to acl/fed-sx/persist/ substrate/host instead (see the routing rule in the briefing).