Skip to content

[bug·design·P2] Every new snapshot declaration re-asks for theses it was already given #539

Description

@atomchung

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions