···11----
22-"@atmo-dev/contrail": minor
33-"@atmo-dev/contrail-sync": minor
44----
55-66-unify the per-space marker field on records as `space` everywhere. previously `listRecords` / `getRecord` HTTP responses used `space: <spaceUri>` while watch events and `WatchRecord` exposed it as `_space`. the underscored form was inconsistent with the surrounding fields (`uri`, `cid`, `did`, etc.) and forced consumers to remember which path produced which name.
77-88-**breaking.** anywhere you read `r._space` on a `WatchRecord` (or a watch event payload's `record._space` / `child._space`), rename to `r.space`. drop-in.
99-1010-```ts
1111-// before
1212-if (record._space) ...
1313-1414-// after
1515-if (record.space) ...
1616-```
1717-1818-no migration needed for `listRecords` / `getRecord` consumers — that path was already `space`.
-20
.changeset/space-uri-scheme.md
···11----
22-"@atmo-dev/contrail": minor
33-"@atmo-dev/contrail-sync": minor
44-"@atmo-dev/contrail-lexicons": minor
55----
66-77-permissioned spaces now use the `ats://` scheme instead of `at://`. tracks the [permissioned data spec](https://dholms.leaflet.pub/3mhj6bcqats2o), which floats `ats://` as a distinct scheme so spaces can't be confused with atproto record URIs at any layer (logs, query params, dispatch, error messages).
88-99-```
1010-- at://did:plc:alice/com.example.event.space/birthday
1111-+ ats://did:plc:alice/com.example.event.space/birthday
1212-```
1313-1414-what changed:
1515-- `buildSpaceUri` / `parseSpaceUri` (`@atmo-dev/contrail`) emit / accept `ats://`. anything else returns `null` from `parseSpaceUri`.
1616-- generated lexicons no longer claim `format: "at-uri"` on `spaceUri` params, on the `space` record-output field, or on `spaceView.uri` — they're plain `string`. (atproto's `at-uri` format would reject `ats://`.) regenerate committed `lexicons/generated/*` with `contrail-lex generate`; downstream `lex-cli generate` then emits `v.string()` instead of `v.resourceUriString()` for those fields.
1717-- realtime topics are unchanged in shape (`space:<uri>`), but `<uri>` is now an `ats://` URI.
1818-- record URIs (the `uri` on a record, the `appPolicyRef` field, `notifyOfUpdate` payloads) keep `at://` — those are still atproto record URIs.
1919-2020-**breaking.** anywhere you build a space URI by string concatenation (`` `at://${did}/${type}/${key}` ``), switch to `ats://` or call `buildSpaceUri()`. anywhere you persist space URIs in your own DB, migrate (`UPDATE … SET space_uri = REPLACE(space_uri, 'at://', 'ats://') WHERE space_uri LIKE 'at://%'`).
+34
packages/contrail/CHANGELOG.md
···11# @atmo-dev/contrail
2233+## 0.4.0
44+55+### Minor Changes
66+77+- 469bf65: unify the per-space marker field on records as `space` everywhere. previously `listRecords` / `getRecord` HTTP responses used `space: <spaceUri>` while watch events and `WatchRecord` exposed it as `_space`. the underscored form was inconsistent with the surrounding fields (`uri`, `cid`, `did`, etc.) and forced consumers to remember which path produced which name.
88+99+ **breaking.** anywhere you read `r._space` on a `WatchRecord` (or a watch event payload's `record._space` / `child._space`), rename to `r.space`. drop-in.
1010+1111+ ```ts
1212+ // before
1313+ if (record._space) ...
1414+1515+ // after
1616+ if (record.space) ...
1717+ ```
1818+1919+ no migration needed for `listRecords` / `getRecord` consumers — that path was already `space`.
2020+2121+- 469bf65: permissioned spaces now use the `ats://` scheme instead of `at://`. tracks the [permissioned data spec](https://dholms.leaflet.pub/3mhj6bcqats2o), which floats `ats://` as a distinct scheme so spaces can't be confused with atproto record URIs at any layer (logs, query params, dispatch, error messages).
2222+2323+ ```
2424+ - at://did:plc:alice/com.example.event.space/birthday
2525+ + ats://did:plc:alice/com.example.event.space/birthday
2626+ ```
2727+2828+ what changed:
2929+3030+ - `buildSpaceUri` / `parseSpaceUri` (`@atmo-dev/contrail`) emit / accept `ats://`. anything else returns `null` from `parseSpaceUri`.
3131+ - generated lexicons no longer claim `format: "at-uri"` on `spaceUri` params, on the `space` record-output field, or on `spaceView.uri` — they're plain `string`. (atproto's `at-uri` format would reject `ats://`.) regenerate committed `lexicons/generated/*` with `contrail-lex generate`; downstream `lex-cli generate` then emits `v.string()` instead of `v.resourceUriString()` for those fields.
3232+ - realtime topics are unchanged in shape (`space:<uri>`), but `<uri>` is now an `ats://` URI.
3333+ - record URIs (the `uri` on a record, the `appPolicyRef` field, `notifyOfUpdate` payloads) keep `at://` — those are still atproto record URIs.
3434+3535+ **breaking.** anywhere you build a space URI by string concatenation (`` `at://${did}/${type}/${key}` ``), switch to `ats://` or call `buildSpaceUri()`. anywhere you persist space URIs in your own DB, migrate (`UPDATE … SET space_uri = REPLACE(space_uri, 'at://', 'ats://') WHERE space_uri LIKE 'at://%'`).
3636+337## 0.3.0
438539### Minor Changes
···11# @atmo-dev/contrail-lexicons
2233+## 0.4.0
44+55+### Minor Changes
66+77+- 469bf65: permissioned spaces now use the `ats://` scheme instead of `at://`. tracks the [permissioned data spec](https://dholms.leaflet.pub/3mhj6bcqats2o), which floats `ats://` as a distinct scheme so spaces can't be confused with atproto record URIs at any layer (logs, query params, dispatch, error messages).
88+99+ ```
1010+ - at://did:plc:alice/com.example.event.space/birthday
1111+ + ats://did:plc:alice/com.example.event.space/birthday
1212+ ```
1313+1414+ what changed:
1515+1616+ - `buildSpaceUri` / `parseSpaceUri` (`@atmo-dev/contrail`) emit / accept `ats://`. anything else returns `null` from `parseSpaceUri`.
1717+ - generated lexicons no longer claim `format: "at-uri"` on `spaceUri` params, on the `space` record-output field, or on `spaceView.uri` — they're plain `string`. (atproto's `at-uri` format would reject `ats://`.) regenerate committed `lexicons/generated/*` with `contrail-lex generate`; downstream `lex-cli generate` then emits `v.string()` instead of `v.resourceUriString()` for those fields.
1818+ - realtime topics are unchanged in shape (`space:<uri>`), but `<uri>` is now an `ats://` URI.
1919+ - record URIs (the `uri` on a record, the `appPolicyRef` field, `notifyOfUpdate` payloads) keep `at://` — those are still atproto record URIs.
2020+2121+ **breaking.** anywhere you build a space URI by string concatenation (`` `at://${did}/${type}/${key}` ``), switch to `ats://` or call `buildSpaceUri()`. anywhere you persist space URIs in your own DB, migrate (`UPDATE … SET space_uri = REPLACE(space_uri, 'at://', 'ats://') WHERE space_uri LIKE 'at://%'`).
2222+2323+### Patch Changes
2424+2525+- Updated dependencies [469bf65]
2626+- Updated dependencies [469bf65]
2727+ - @atmo-dev/contrail@0.4.0
2828+329## 0.3.0
430531### Minor Changes
···11# @atmo-dev/contrail-sync
2233+## 0.4.0
44+55+### Minor Changes
66+77+- 469bf65: unify the per-space marker field on records as `space` everywhere. previously `listRecords` / `getRecord` HTTP responses used `space: <spaceUri>` while watch events and `WatchRecord` exposed it as `_space`. the underscored form was inconsistent with the surrounding fields (`uri`, `cid`, `did`, etc.) and forced consumers to remember which path produced which name.
88+99+ **breaking.** anywhere you read `r._space` on a `WatchRecord` (or a watch event payload's `record._space` / `child._space`), rename to `r.space`. drop-in.
1010+1111+ ```ts
1212+ // before
1313+ if (record._space) ...
1414+1515+ // after
1616+ if (record.space) ...
1717+ ```
1818+1919+ no migration needed for `listRecords` / `getRecord` consumers — that path was already `space`.
2020+2121+- 469bf65: permissioned spaces now use the `ats://` scheme instead of `at://`. tracks the [permissioned data spec](https://dholms.leaflet.pub/3mhj6bcqats2o), which floats `ats://` as a distinct scheme so spaces can't be confused with atproto record URIs at any layer (logs, query params, dispatch, error messages).
2222+2323+ ```
2424+ - at://did:plc:alice/com.example.event.space/birthday
2525+ + ats://did:plc:alice/com.example.event.space/birthday
2626+ ```
2727+2828+ what changed:
2929+3030+ - `buildSpaceUri` / `parseSpaceUri` (`@atmo-dev/contrail`) emit / accept `ats://`. anything else returns `null` from `parseSpaceUri`.
3131+ - generated lexicons no longer claim `format: "at-uri"` on `spaceUri` params, on the `space` record-output field, or on `spaceView.uri` — they're plain `string`. (atproto's `at-uri` format would reject `ats://`.) regenerate committed `lexicons/generated/*` with `contrail-lex generate`; downstream `lex-cli generate` then emits `v.string()` instead of `v.resourceUriString()` for those fields.
3232+ - realtime topics are unchanged in shape (`space:<uri>`), but `<uri>` is now an `ats://` URI.
3333+ - record URIs (the `uri` on a record, the `appPolicyRef` field, `notifyOfUpdate` payloads) keep `at://` — those are still atproto record URIs.
3434+3535+ **breaking.** anywhere you build a space URI by string concatenation (`` `at://${did}/${type}/${key}` ``), switch to `ats://` or call `buildSpaceUri()`. anywhere you persist space URIs in your own DB, migrate (`UPDATE … SET space_uri = REPLACE(space_uri, 'at://', 'ats://') WHERE space_uri LIKE 'at://%'`).
3636+337## 0.3.0
438539### Minor Changes