feat(fof-layer4): supersedes_post_id field on Post

Adds an optional supersedes_post_id pointer to Post for the
"re-issue with narrower access" path. Author publishes a new post
that references an earlier one; receivers can render "this is a
re-issued version of an earlier post" + offer to view the original.

Covered by PostId = BLAKE3(Post) — receivers can verify it wasn't
forged by anyone but the author.

#[serde(default)] for back-compat; existing posts deserialize with
None. All existing Post construction sites bulk-updated to set the
field to None.

Storage::get_post returns None for the field today; a follow-up can
add a dedicated column if/when receivers need to render the
pointer. The author-side re-issue helper that creates posts with
this field set comes in the Tauri/UI slice — the wire shape is in
place now.

148 tests pass (no regressions).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Scott Reimers 2026-05-14 16:29:55 -06:00
parent c2f2203331
commit fdbf97f2d7
11 changed files with 50 additions and 0 deletions

View file

@ -196,6 +196,7 @@ pub fn build_profile_post(
attachments: vec![],
timestamp_ms,
fof_gating: None,
supersedes_post_id: None,
}
}
@ -465,6 +466,7 @@ mod tests {
attachments: vec![],
timestamp_ms,
fof_gating: None,
supersedes_post_id: None,
};
// Apply. Auto-scan should fire and store the unwrapped V_me.
@ -534,6 +536,7 @@ mod tests {
attachments: vec![],
timestamp_ms,
fof_gating: None,
supersedes_post_id: None,
};
apply_profile_post_if_applicable(&s, &post, Some(&VisibilityIntent::Profile)).unwrap();