| … | … | @@ -309,7 +309,27 @@ OrgEventLog, and the autobee migration guard. It converts a silent fork into a l |
| 309 | 309 | 3. **Community and list URIs** for `visibility` (§11 #4). |
| 310 | 310 | 4. **Reply visibility inheritance** (§11 #5) — almost certainly inherit, but the failure mode is |
| 311 | 311 | publishing to the wrong people, so it must be explicit rather than emergent. |
| 312 | | 5. ~~**Where `STRIP_VERSION` is stamped**~~ **RESOLVED 2026-09-05: the ROOM's StateBase.** The signer |
| 312 | 5. ⚠ **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 |
| 313 | 333 | role is per-room — a signer materialises *that room's* record set — so the version that gates it |
| 314 | 334 | must be per-room too. An under-versioned peer refuses the signer role **for that room** and can |
| 315 | 335 | still sign others, which is what makes a fleet rollout possible at all: a single global stamp would |