Changeset 712b161 in Klonkt


Ignore:
Timestamp:
08/06/2026 01:58:08 PM (5 weeks ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
58cfe5f
Parents:
621126b
git-author:
Robin <roboburr@…> (08/06/2026 01:57:59 PM)
git-committer:
roboburr <roboburr@…> (08/06/2026 01:58:08 PM)
Message:

De exporter (shaer-1a6)

ArchiveExportService bouwt het archief uit docs/EXPORT-FORMAT.md, plus een CLI
(scripts/export-archive.mjs) met een droogloop.

Alleen de eigen posts van de site, inclusief concepten. Geen sleutel, sessie,
wachtwoordhash of DM van een ander -- dit is nadrukkelijk niet de storage-zip uit
shaer-190t.

Media worden gesleuteld op de sha256 van hun bytes, zodat twee exports dezelfde
namen opleveren en dubbelen vanzelf samenvallen. Een verdwenen bestand krijgt de
derde staat uit het formaat -- 'missing', met de oorspronkelijke plek erbij -- en
wordt geteld en gemeld, nooit stil weggelaten.

Zip zonder nieuwe afhankelijkheid: store-only, gesorteerde ingangen, vaste mtime.
Zonder compressie is byte-gelijkheid geen kwestie van vertrouwen in de
instellingen van een bibliotheek. Gecontroleerd dat gewone unzip hem uitpakt en
dat de bytes er identiek uitkomen; een zelfgeschreven zip die alleen zichzelf kan
lezen is geen uitwisselformaat.

Twee dingen kwamen pas boven bij het draaien tegen echte data (beta):

  • een audio-bijlage in c2s_attachments draagt naast url ook een POSTER, en die viel er stil uit. Nu meegenomen; media op beta gingen daarmee van 2 naar 3.
  • het [[track:]]-pad raakt op beta geen enkele rij (nul audio_tracks), dus dat heeft nu een eigen test in plaats van de aanname dat het meeliep.

Een verzonnen pad in oude inhoud kan geen willekeurig bestand van de schijf het
archief in trekken: media-URL's worden binnen MEDIA_ROOT gehouden en een URL naar
een andere host wordt nooit van onze eigen schijf gelezen.

De reproduceerbaarheidseis in het formaat sloot exportedAt niet uit en sprak
zichzelf daarmee tegen; dat is rechtgezet.

15 tests, waaronder de acceptatietest uit het document: de moeilijkste post die
Klonkt kan maken (poll, bijlagen, quote, content warning, betaald). Suite 493/493.

Co-Authored-By: Claude Opus 5 <noreply@…>

Files:
3 added
1 edited

Legend:

Unmodified
Added
Removed
  • docs/EXPORT-FORMAT.md

    r621126b r712b161  
    102102| `updated` | `posts.updated_at` | omitted when equal to `published` |
    103103| `url` | `<origin>/<slug>` | the human permalink |
    104 | `attachment` | cover, inline images, `c2s_attachments` | see [Media](#media) |
     104| `attachment` | cover, inline `<img>`, `c2s_attachments` **and their `poster`**, hosted audio tracks | see [Media](#media) |
    105105| `tag` | `posts.tags`, mentions, custom emoji | `Hashtag`, `Mention`, `toot:Emoji` |
    106106| `oneOf` / `anyOf` / `endTime` | `posts.poll_json` | a poll exports as a `Question` |
     
    258258## Reproducibility
    259259
    260 Two exports of unchanged content must be **byte-identical**. That is what makes
    261 an archive verifiable and a diff meaningful.
     260Two exports of unchanged content must be **byte-identical except for
     261`manifest.exportedAt`**, which is by definition the moment of export. Everything
     262else — every post file, every media file, and the `files` checksum map — must
     263match. That is what makes an archive verifiable and a diff meaningful: if the
     264checksum map is equal, nothing changed.
    262265
    263266- JSON: keys sorted, two-space indent, LF, trailing newline.
Note: See TracChangeset for help on using the changeset viewer.