Files desk: name loose files the album list cannot show; pin the old publisher wire shape #161

Merged
void merged 2 commits from void/files-desk-loose-files into dev 2026-11-14 02:18:49 +00:00
Member

Follow-up ratatoskr:follow_up:chat-s7629-7629, item 2. Reads Eureka's #commons publisher as gamecult-ops #121 describes the old shape: loose files (no album thread), flat org.gamecult.publish.{replaces,sha256,name} keys, no info.sha256.

What the client did with that, by reading it:

  • Loose files: silent. The album list reads /threads, so a Commons holding only loose files said "No albums yet." This PR names them: looseFiles over the room's live timeline (file events with no thread root and no m.thread relation) and one line under the list: 2 files were posted outside an album and are not listed here: a.md, b.md. They are in the Timeline. It is the live timeline only, so it counts what has synced, not the whole history.
  • Flat replaces: not silent, already degrades. versions.ts reads only the nested org.gamecult.publish.replaces, so old-shape versions all show unfolded; nothing is hidden. I did not add a reader for the flat key: #121 deletes that shape and the Commons room does not exist yet, so a second reader would be a compatibility layer for events that were never posted.
  • Missing info.sha256: already tolerated. The file lists; it has no "fetched for" readers (a receipt needs the hash to verify).

Tests pin all three from the publisher-shaped events through buildAlbums/looseFiles/looseNote: loose found; roots, thread replies (by SDK root and by relation), edits and redactions not loose; singular, plural and overflow note text; flat key folds nothing; nested key folds; no hash, no readers, no crash. Mutation: dropping the m.thread relation check fails a test. 156 album tests pass.

Untested: the note in a rendered AlbumView (no DOM renderer for it); the live timeline's coverage of old history.

🤖 Generated with Claude Code

Follow-up `ratatoskr:follow_up:chat-s7629-7629`, item 2. Reads Eureka's #commons publisher as gamecult-ops #121 describes the old shape: loose files (no album thread), flat `org.gamecult.publish.{replaces,sha256,name}` keys, no `info.sha256`. What the client did with that, by reading it: - **Loose files: silent.** The album list reads `/threads`, so a Commons holding only loose files said "No albums yet." This PR names them: `looseFiles` over the room's live timeline (file events with no thread root and no `m.thread` relation) and one line under the list: `2 files were posted outside an album and are not listed here: a.md, b.md. They are in the Timeline.` It is the live timeline only, so it counts what has synced, not the whole history. - **Flat `replaces`: not silent, already degrades.** `versions.ts` reads only the nested `org.gamecult.publish.replaces`, so old-shape versions all show unfolded; nothing is hidden. I did not add a reader for the flat key: #121 deletes that shape and the Commons room does not exist yet, so a second reader would be a compatibility layer for events that were never posted. - **Missing `info.sha256`: already tolerated.** The file lists; it has no "fetched for" readers (a receipt needs the hash to verify). Tests pin all three from the publisher-shaped events through `buildAlbums`/`looseFiles`/`looseNote`: loose found; roots, thread replies (by SDK root and by relation), edits and redactions not loose; singular, plural and overflow note text; flat key folds nothing; nested key folds; no hash, no readers, no crash. Mutation: dropping the `m.thread` relation check fails a test. 156 album tests pass. Untested: the note in a rendered AlbumView (no DOM renderer for it); the live timeline's coverage of old history. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Files desk: name loose files the album list cannot show; pin the old publisher wire shape
Some checks failed
Build pull request / Build pull request (pull_request) Has been cancelled
33e31a6102
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Author
Member

Soul pass: READY, lows folded in (gating now looseNoteFor, tested; redaction refreshes the note). Known limits, not fixed: the note counts only the live timeline window (a zone view paginates nothing, so loose files older than what has synced are not counted, and the count is a floor); the timeline is mapped on every AlbumView render (fine at hundreds of events, unmeasured beyond); no rendered-component test of the note.

Soul pass: READY, lows folded in (gating now `looseNoteFor`, tested; redaction refreshes the note). Known limits, not fixed: the note counts only the live timeline window (a zone view paginates nothing, so loose files older than what has synced are not counted, and the count is a floor); the timeline is mapped on every AlbumView render (fine at hundreds of events, unmeasured beyond); no rendered-component test of the note.
Loose-files note: gating is a tested function; a redaction refreshes it
All checks were successful
Build pull request / Build pull request (pull_request) Successful in 4m37s
ed2205d6d6
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
void merged commit b13080ebd2 into dev 2026-11-14 02:18:49 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
GameCult/Ratatoskr!161
No description provided.