Latest Chapter provenance: one derived line naming the actor class #152
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Parent
Spec #135.
What to build
Looking at a Latest Chapter, the owner cannot tell where it came from — their own hand, a Reader's report, or a machine read — and so cannot judge whether to trust it before acting on it. This ticket adds one line beside the number on the Series detail page naming the actor class behind the current value.
Derived, never recorded. No history table, no attribution column, no migration, and none is coming. Three classes, all read from state the system already keeps:
Acquisition does not survive as a distinct actor. Acquisition stamps the check timestamp exactly as a Poll does, so the two are indistinguishable the moment it finishes. Accepted deliberately: the only case where the difference is actionable — acquired once and never read again — is already the unchecked filter, and telling them apart would need the column this declines to add.
A history table was designed and dropped, and should not be re-proposed: a per-Series timestamped table is one column away from the log this project forbids, it would duplicate "the current value is a human's" with a second writer that eventually disagrees, and no owner question needs the past — the Poll re-establishes the number, and distrust of a Reader is already the durable, self-healing Sighting-disagreement counter.
Placement is deliberate: the detail page only, owner-only by route. No list-row field (a row has two lines), no new filter name, no landing figure — an actor class is context for a Series you are already looking at, never a population to sweep.
Acceptance criteria
Blocked by
Landed on
spec-135as a--no-ffmerge ofticket/152-latest-chapter-provenance(a4491ba).Implemented: one
Provenancefield onseriesDetailView, derived insideseriesDetailView(store.AdminSeries)where every other judgement on that page already happens - "correction" when the correction stamp stands, else "sighting" when a Reader raised it, else "machine read" when any check stamp exists, else "" and the line is not rendered at all. Rendered inside theseries-detail-metafragment beside the chapter number, so it re-renders with the number it describes and can never be left describing the previous value.No new column, table or migration, and no store, SQL or projection change: all three inputs were already on
store.AdminSeriesafter #149.A Series whose value came from an Acquisition reads as a machine read, deliberately - an Acquisition stamps
latest_checked_atexactly as a Poll does, so the two are indistinguishable the moment it finishes, the only actionable case (acquired once, never read again) is already the unchecked filter, and telling them apart would need the column this spec declines to add. That is recorded in one comment at the derivation.Privacy invariant preserved: the Sighting class is surfaced anonymously through the existing
RaisedByReader bool. No Reader id was added to the view, and the admin projection still never selectslatest_raised_by-ReaderCountremains the only figure crossing the privacy boundary.Tests: a table test over the derivation covering all four states including correction-outranks-sighting, plus a router test asserting the line reaches the rendered detail page and appears nowhere in the rendered Series list.
The full backend suite is green on the merged base: 585 tests, 10 packages.
No concerns handed back.