Privacy boundary
Public design leaf. Synthetic fixtures only.
What a user hits
They declare their holdings, and the review asks them to state a thesis for each position. They write them.
Next time they declare holdings, they are asked for the same theses again. The ones they already wrote do not carry over.
Why
A snapshot-derived cycle id is ticker#<as_of>#<seq> — the declaration's own date is part of the identity. So every new declaration mints new cycle ids for the same continuously-held positions, and missing_thesis_positions correctly reports that none of them has a thesis: the theses on file are bound to the previous as_of's ids.
The engine is not wrong about anything here. Each id honestly names what it names. Nothing joins the two generations of ids for a position the user never stopped holding.
Scope, established rather than assumed
Observed on a plain second declaration with no refresh involved, so this predates and is unaffected by #530 and #531. It is a property of snapshot-derived identity, not of the book-update lane.
Why it belongs on the payoff line, not the correctness line
Nothing is computed wrongly and nothing is lost from disk. What is lost is the user's work: they answered, and the product asks again as if they had not. That is the same defect class as #429 — attention collected, nothing kept — and it lands on the most effortful thing a review asks for.
It also compounds with the finding behind the review-payoff work: a user whose second review repeats the first review's conclusion and re-asks its questions has no evidence the product remembers them at all.
Fix shape (not decided)
The load-bearing question is what identity a continuously-held, snapshot-declared position should carry across declarations — the current as_of-derived id is right for "this is what was declared on this date" and wrong for "this is the position I have held since March". A relink is one shape; a stable per-position identity with the declaration date as an attribute rather than a component is another.
Decide it with #536 and #532: all three are the same question in different clothes — what survives an adoption, and what is the identity it survives against.
Acceptance criteria
Refs #429, #532, #536, #486.
Privacy boundary
Public design leaf. Synthetic fixtures only.
What a user hits
They declare their holdings, and the review asks them to state a thesis for each position. They write them.
Next time they declare holdings, they are asked for the same theses again. The ones they already wrote do not carry over.
Why
A snapshot-derived cycle id is
ticker#<as_of>#<seq>— the declaration's own date is part of the identity. So every new declaration mints new cycle ids for the same continuously-held positions, andmissing_thesis_positionscorrectly reports that none of them has a thesis: the theses on file are bound to the previousas_of's ids.The engine is not wrong about anything here. Each id honestly names what it names. Nothing joins the two generations of ids for a position the user never stopped holding.
Scope, established rather than assumed
Observed on a plain second declaration with no refresh involved, so this predates and is unaffected by #530 and #531. It is a property of snapshot-derived identity, not of the book-update lane.
Why it belongs on the payoff line, not the correctness line
Nothing is computed wrongly and nothing is lost from disk. What is lost is the user's work: they answered, and the product asks again as if they had not. That is the same defect class as #429 — attention collected, nothing kept — and it lands on the most effortful thing a review asks for.
It also compounds with the finding behind the review-payoff work: a user whose second review repeats the first review's conclusion and re-asks its questions has no evidence the product remembers them at all.
Fix shape (not decided)
The load-bearing question is what identity a continuously-held, snapshot-declared position should carry across declarations — the current
as_of-derived id is right for "this is what was declared on this date" and wrong for "this is the position I have held since March". A relink is one shape; a stable per-position identity with the declaration date as an attribute rather than a component is another.Decide it with #536 and #532: all three are the same question in different clothes — what survives an adoption, and what is the identity it survives against.
Acceptance criteria
Refs #429, #532, #536, #486.