diff --git a/plans/abstractions.md b/plans/abstractions.md index 117dc7af..d4a62005 100644 --- a/plans/abstractions.md +++ b/plans/abstractions.md @@ -12,6 +12,13 @@ Anything short → _Watching_ (what's missing) or _Rejected_ (why). ## Last scan +- **Date:** 2026-06-07 (radar loop, pass 15) +- **Pass 15:** added the **scanning-method note** above after `query.sx` again proved to + be merged-lib copies (lib/prolog + lib/persist in every worktree). Corrected census + surfaced `wire`×2 (content+mod) → Rejected (shared role, divergent structure: generic SX + serializer vs bespoke pipe-format under a Prolog-env string-prim constraint). events↔ + commerce integration appeared (paid tickets); acl/mod/search quiescent ~7 passes (now + API-stable). No new gate-clearer. - **Date:** 2026-06-07 (radar loop, pass 14) - **Pass 14:** filename census flagged `snapshot`×?? — but the `*/lib/persist/snapshot.sx` copies are just the merged `lib/persist` in each worktree, NOT consumers (same artifact @@ -90,6 +97,14 @@ Anything short → _Watching_ (what's missing) or _Rejected_ (why). (`lib/ocaml/baseline` only). Both early-stage, pre–Phase 2 → out of proposal scope. - Re-enumerate every pass; new loops (e.g. a future `commerce`/`identity`) auto-join. +**Scanning-method note (learned the hard way, passes 5/12/14/15):** a filename census +for *cross-subsystem* recurrence MUST restrict to each subsystem's OWN namespace — +`X/lib/X/*.sx` — never `X/lib/*/`. The merged substrate libs (`lib/prolog`, `lib/persist`, +`lib/feed`, `lib/datalog`, …) are checked out inside *every* worktree, so a naive census +reports e.g. `query.sx`/`snapshot.sx`/`rank.sx` ×N as phantom recurrences that are really +one merged file copied N times. Correct one-liner: +`for w in ; do for f in $w/lib/$w/*.sx; do basename $f .sx; done; done | sort | uniq -c | sort -rn`. + --- ## Proposed (cleared the gate) @@ -327,6 +342,14 @@ Anything short → _Watching_ (what's missing) or _Rejected_ (why). *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. +- **Shared `wire.sx` "serialization" module (×2).** Rejected pass 15: content + mod both + have a `wire.sx`, but `content/wire.sx` uses the **generic SX serializer** + (`serialize`/`parse`, full-fidelity round-trip) while `mod/wire.sx` is a **bespoke + versioned pipe-delimited line** (subset of fields, `split` hand-built over slice/len + because mod's Prolog-loaded env strips string prims). Shared role (wire format), + divergent structure + substrate constraint → not a candidate; the SX serializer is + already the shared tool for SX-substrate subsystems, and mod can't use it. (Same family + as the `api.sx` rejection above.) - **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).