docs(plan): mark step 7 done, with what landed beyond the original scope

The plan still said "Scoped 2026-08-27, not started" for work that is
complete and validated against S3 — the first thing a reviewer reads,
describing the PR as unwritten.

Records the two pieces that were not in the original scoping: the memory
cache moving to content keying (it was still file-keyed, so identical
content held two RAM entries), and the engine binding a run to the flags
it started with. Also that `.transcoded/` legitimately persists where
external mounts exist, since hash-less callers have no content identity
— absence is only expected elsewhere.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Edouard Vanbelle
2026-08-30 22:24:11 +02:00
parent 4baee0a1fb
commit ba6fe49c71
+19 -1
View File
@@ -1409,7 +1409,25 @@ hardcoded SQL). New sources bolt on independently.
after, step 5 lands at scale; per-row HEADs do not survive a 4×
row count.
7. **`ImageTranscodeService`** — same shape, `kind = 'transcode'`,
no new table. **Scoped 2026-08-27, not started.** The service does
no new table. **Done 2026-08-30**, validated on a snapshot restore
against S3: 13 cached transcodes imported, 5 `.skip` markers
collapsing to 3 negative rows (three of them named the same content),
`file_gone` exercised with a synthetic id, and every deletion
preceded by a byte-for-byte readback.
Two things landed beyond the three pieces below. The memory cache is
now keyed by content as well, not just the durable tier — it was
still `{file_id}:{ext}`, so identical content held two RAM entries
and the second file missed. And `run_or_resume` binds a run to the
flags it started with, so a paused `?repair=true` import can no
longer resume as import-only.
Still local-disk, deliberately: hash-less callers (external mounts)
have no content identity, so they keep `.transcoded/` and it will
not disappear on installs that have them. Absence is only expected
elsewhere.
*Original scoping, for the record.* The service does
not currently write the derived tier at all, which is the same gap
`persist_rendered` closed for thumbnails, and it must be closed
before `transcode_import` can converge.