docs/lexicons.md: the boards as Atmosphere records, one day #217
No reviewers
Labels
No labels
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Grandiras/Ponente!217
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "issue-198-lexicons"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of #198. The issue asks that the lexicons start as a page in
docs/, not as code, and this is that page. #198 stays open as the tracker for building against Spaces once it is specified.What's on the page
app.ponente.kanban.*, owned throughkanban.ponente.app. Schemas get published (acom.atproto.lexicon.schemarecord, found through_lexicon.kanban.ponente.app) only once they're real; anything tried before then goes under.temp..CardPermissionsalready reserves to them), and what anybody may change is a record of whoever changed it. A due date is aYYYY-MM-DDstring, not adatetime. What each maps to today, including what doesn't become a record at all: the member list is the space's, and pins/board order are a private preference.doublepositions (the data model has no floats), membership as a join table, encryption at rest as a trust model rather than a feature, soft delete,Everyonevisibility, and search/calendar/for-you becoming an AppView-shaped index.Checked against the atproto docs (the data model's float rule, the
datetimeformat, lexicon publishing, the style guide's naming andrequiredadvice), the Spaces alpha announcement and proposal 0016, and against the entities (Positionis adoubleonBoard,BoardColumnandCard).CLAUDE.mdgets a router row for the page.DocumentationTestspass (reachability, Covers paths, size budget: 14,041 of 16,384 bytes).🤖 Generated with Claude Code
🤖 Reviewing this PR — the review will link the full session transcript.
🛑 Verdict: request changes — blocking issues below.
A well-researched design page, and nearly all of it verifies: the entity claims (
Positiondoubles onBoard/BoardColumn/Card,BoardKeyTID addressing,?card=integer ids,BoardMembergrant+role,BoardOrderas a private preference) match the code, and the atproto claims — NSID authority reversal tokanban.ponente.app, the_lexicon.TXT discovery record, the.temp.convention, the no-floats rule with the spec's own encode-as-strings advice, therequiredevolution rule, and singular record nouns — all check out against the current specs. The router row and Covers paths are valid.One real problem: the page's central premise is stale. The Spaces alpha went live on 2026-08-20 with a published proposal spec, so "as of September 2026 the published protocol docs do not describe it" is wrong as of merge — and the proposal answers several of the page's open questions (per-user permissioned repos rather than a board-owned repository; access control, not confidentiality). The don't-build advice survives, but the justification needs rewriting. A second, smaller sketch error: a calendar-day due date can't be a
datetime-format string.⏱ 2m 36s · 10 steps · $0.0298 · tokens: 134.5k in / 8.7k out (+177.9k cache-read) · Go: 5h 55% · wk 29% · mo 47%
📜 Full session transcript
@ -0,0 +6,4 @@## Why this is a page and not codeThe direction (#190) is that one day a board is data on the Atmosphere network rather than rows in one Postgres: a board roughly a **space**, its member list the space's members. That depends on **ATProto Spaces** — the protocol's answer to private data shared by a group — and as of September 2026 the published protocol docs do not describe it. Every record in an atproto repository today is **public**, and almost nothing a member types into a Ponente board is meant to be. So the rule is the one #198 states: **do not build against Spaces until it is specified.** What can be done is to name things now, and to stop adding shapes that will not port.The premise "as of September 2026 the published protocol docs do not describe it" is no longer true: the Atproto Spaces alpha went live on 2026-08-20 (atproto.com/blog/atproto-spaces-alpha), with the full protocol spec published as proposal 0016-permissioned-data. The advice on this page still holds — the alpha explicitly says not to run production code against it and that breaking changes will happen — but the sentence that justifies the whole page is now confidently wrong, which is the failure mode this repo's docs convention calls out.
The proposal also answers questions this page treats as open, and the answers are worth folding in:
com.atproto.simplespace, explicit member list, roles) that bears directly on theBoardMemberrow of the table.Rewriting the paragraph to acknowledge the alpha — while keeping the don't-build rule, now grounded in "alpha, breaking changes" rather than "unspecified" — would make the page true and stronger.
@ -0,0 +25,4 @@| *(a space's member list)* | — | who is on the board, and who runs it | `BoardMember` (grant + role) || *(none)* | — | a member's pins and board order (#195) | `BoardOrder` — a private preference, not a record |Record names are single nouns, per the style guide; references between records are at-uris, because an integer id means nothing outside one database. The fields are plain — a title a `string` with a length limit, a due date a `string` in `datetime` format, a colour a `string` — and few of them `required`, because a required field can never be made optional again and records outlive every schema revision.A due date cannot be a
stringindatetimeformat if it keeps the semanticsCard.DueDatedeliberately has. The lexicondatetimeformat requires a full RFC 3339 timestamp with timezone (a bare1985-04-12is listed as invalid in the spec), and there is no date-only string format — so a plain calendar day ("due on the 3rd is due on the 3rd for everyone", per the entity's own doc comment) would have to be a plainstringwith aYYYY-MM-DDconvention, not adatetime. As written, the sketch quietly trades away the all-day semantics the codebase went out of its way to keep.Both findings were right; fixed in the latest commit.
CardPermissionsalready reserves to the author). Placement, due date and assignment become records of whoever set them, and an admin's power over someone else's card becomes a decision about what to show. The encryption bullet now quotes "access control, not confidentiality" and says what that means for members whose PDS is Bluesky's.YYYY-MM-DDstring, with the reason (datetimeneeds a timestamp and a zone;Card.DueDateis aDateOnlyon purpose).🤖 Reviewing this PR — the review will link the full session transcript.
✅ Verdict: approve — no blocking issues found.
Both blockers from the previous pass are resolved. The page no longer claims Spaces is unspecified: it now correctly dates the alpha (2026-08-20), cites proposal 0016 (Permissioned Data), and grounds the don't-build rule in the alpha's instability rather than absence of a spec. The proposal's answers are folded in properly — per-member permissioned repos on each member's own PDS with a space authority (line 32), and "access control, not confidentiality" quoted for the encryption section (line 44). The due-date sketch is fixed: a plain
stringholdingYYYY-MM-DD, not adatetime, with the correct reasoning about thedatetimeformat and no date-only alternative, matchingCard.DueDate's deliberateDateOnlysemantics. I re-verified the entity claims against the code (Positiondoubles onBoard/BoardColumn/Card, TIDBoard.KeyviaBoardKey,DeletedAtsoft delete,BoardVisibility.Everyone) — all accurate. Good to merge.⏱ 0m 47s · 4 steps · $0.0056 · tokens: 29.3k in / 1.3k out (+17.4k cache-read) · Go: 5h 64% · wk 32% · mo 49%
📜 Full session transcript