OverviewFilesCommitsIssuesDocsReleasesPeers

favela-markdown commits / b3e6708

spec: reconcile #43's four amendments — dialect versioning is the one still missing
STRIP_VERSION (per-room, concurrency) and per-record dialect (history) are not alternatives. The projection is derived on read, so every sign re-strips every record: a dialect bump rewrites the whole atproto history, identically on every peer. Both are needed, and strip(source) needs a dialect argument. wiki-links: shipped. source-optional: superseded by the markdown pivot. unknown-syntax-to-literal-text: stated but not normative and untested. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
b3e67082994e6826d64953cf1858e7004b3e3677
by plankatron <fleeky@gmail.com> · 2026-09-05T22:57:43.000Z

Changed files (2) +33 -1

spec/library.md +21 -1
……@@ -309,7 +309,27 @@ OrgEventLog, and the autobee migration guard. It converts a silent fork into a l
3093093. **Community and list URIs** for `visibility` (§11 #4).
3103104. **Reply visibility inheritance** (§11 #5) — almost certainly inherit, but the failure mode is
311311 publishing to the wrong people, so it must be explicit rather than emergent.
3125. ~~**Where `STRIP_VERSION` is stamped**~~ **RESOLVED 2026-09-05: the ROOM's StateBase.** The signer
3125. ⚠ **Where `STRIP_VERSION` is stamped — RESOLVED 2026-09-05, but it is only HALF the answer.**
313 hyper-social #43 (2026-08-11) decided **per-record `dialect` versioning** and it was never
314 written. The two are not alternatives:
315
316 | | guards against | scope |
317 |---|---|---|
318 | `STRIP_VERSION` | two peers on different strips signing one room ⇒ **fork** | concurrency, per room |
319 | per-record `dialect` | a record authored under v1 being re-stripped under v2 | **history**, per record |
320
321 ⛔ **The projection is derived on read, so every sign re-strips every record.** Bump the dialect
322 and every historical post's `app.bsky.feed.post` silently changes — the whole atproto history
323 rewrites itself, identically on every peer, which is precisely what `STRIP_VERSION` guarantees and
324 precisely what makes it insufficient alone. That is `record-vocabulary.md` §8's *"never re-encode a
325 record you did not author"* — applied to yourself, over time.
326
327 **Both are needed.** A record states the dialect it was authored under; `strip()` takes it as an
328 argument rather than being a single global function; the room's `STRIP_VERSION` continues to gate
329 who may sign. ⚠ `lib/strip.js` currently exports `strip(source)` with **no dialect parameter**, so
330 this is a signature change, not an addition.
331
332 Original resolution follows: **the ROOM's StateBase.** The signer
313333 role is per-room — a signer materialises *that room's* record set — so the version that gates it
314334 must be per-room too. An under-versioned peer refuses the signer role **for that room** and can
315335 still sign others, which is what makes a fleet rollout possible at all: a single global stamp would
spec/markdown-strip.md +12 -0
……@@ -212,6 +212,18 @@ facets that land on the wrong characters only for non-ASCII authors.
212212
213213## 9. Open
214214
2150. ⛔ **Per-record `dialect` versioning — decided 2026-08-11 (hyper-social #43), never written.**
216 Every rule in this document is normative *for one dialect*, and §2.1 says adding an extension is a
217 spec change "because it changes the bytes of every record that uses it". It does worse than that:
218 because the projection is derived on read, a dialect bump **re-strips every record ever written**.
219 A record must therefore state the dialect it was authored under, and `strip()` must take it as an
220 argument. See `library.md` §11 #5. This is a **signature change** to the shipped `strip(source)`.
221
2220b. **"Unknown syntax degrades to literal text" — decided 2026-08-11 (#43), stated but not
223 normative.** §2 makes the function total and the implementation's fallback branches do emit
224 literal text, but there is no rule saying so and **no vector covering it**, so it is untested
225 behaviour rather than a guarantee.
226
2152271. **Grapheme counting for the bsky projection** is specified in `record-vocabulary.md` §4.3 but the
216228 segmentation algorithm is not pinned. It must be, for the same determinism reason.
2172292. **Embed extraction order** (§3.5) is asserted to be source order but not otherwise specified;