| … | … | @@ -29,9 +29,8 @@ that path is the contract. |
| 29 | 29 | Hello. |
| 30 | 30 | ``` |
| 31 | 31 | |
| 32 | | JSON in the fence rather than YAML, because `audience: no` parsing as `false` is a privacy bug |
| 33 | | rather than a curiosity. One file rather than a sidecar, because one durable human-readable |
| 34 | | artifact is the property worth keeping. |
| 32 | JSON in the fence, not YAML — `audience: no` parsing as `false` is a privacy bug. One file, not a |
| 33 | sidecar. |
| 35 | 34 | |
| 36 | 35 | ## Usage |
| 37 | 36 | |
| … | … | @@ -168,24 +167,19 @@ favela-markdown lint <file> [--room KIND] # frontmatter, reach, directives, m |
| 168 | 167 | `--room` is `public | followers | members | dm`. `project` and `explain` are declared but **not |
| 169 | 168 | implemented** — both need a projection target. |
| 170 | 169 | |
| 171 | | ## The two properties that govern everything |
| 170 | ## Properties |
| 172 | 171 | |
| 173 | | **Mutable** — a post is a file that can be rewritten. The content hash changes on every edit, so |
| 174 | | the rkey is the stable identity and the hash is not. Anything addressing a post by its hash breaks |
| 175 | | the first time someone fixes a typo. |
| 172 | | | | |
| 173 | |---|---| |
| 174 | | **mutable** | a post is a file that can be rewritten; the rkey is the stable identity, never the hash | |
| 175 | | **extensible** | new extensions never migrate old records; projections are derived on read | |
| 176 | | **total** | every function returns on bad input; nothing here throws | |
| 176 | 177 | |
| 177 | | **Extensible** — a new extension never migrates old records, because projections are derived on |
| 178 | | read. |
| 178 | Unknown frontmatter keys are preserved and sorted after `CANONICAL_KEYS`, so adding a field does |
| 179 | not change the bytes of records that predate it. |
| 179 | 180 | |
| 180 | | ## Why this exists |
| 181 | | |
| 182 | | atproto became favela's canonical P2P path by default rather than by decision. That pulled MST |
| 183 | | derivation, DAG-CBOR byte-exactness, lexicon field ceilings and blob CIDs sealed inside signed |
| 184 | | records into a network that only ever wanted to *interface* with atproto. That machinery is useful |
| 185 | | at the bridge layer; none of it belongs underneath every full peer. |
| 186 | | |
| 187 | | A full peer needs: parse markdown, one file per record, replicate. No MST, no DAG-CBOR, no |
| 188 | | byte-exact CIDs — those are the bridge's problem. |
| 181 | Scope: parse markdown, one file per record. No MST, no DAG-CBOR, no byte-exact CIDs — those belong |
| 182 | to the bridge layer, not under every peer. |
| 189 | 183 | |
| 190 | 184 | ## Specs |
| 191 | 185 | |