Read the analysis cache before refusing a pass, and own the cache root

Opening a recording while the session that recorded it was still live never reached
``stored_result()``, so the panel reported no result over a recording whose result was on
disk. The guard now follows the cache read, results move to the app's derived-data root
(swept at startup, the old in-recording root ignored), and the panel states which of the
four no-result states it is in, with the pass's own reason.
Verified: apps/studio 462/0/18, shared 431/0/1, autocal 358, ui_check 628/0, both gates
clean, real-GL snapshots per state.
This commit is contained in:
ykcheungab
2026-10-04 16:53:50 +08:00
parent 1aa454311f
commit a92a2ba237
14 changed files with 1138 additions and 170 deletions
@@ -354,6 +354,10 @@ class ArrowPanel(QFrame):
if name in ("flow", "depth")
)
note = t(plan.note_key, fields=names)
elif plan.note_reason:
# A line that names a cause ("the pass failed: …") takes the reason the
# producer recorded; a line that does not mention one is unaffected.
note = t(plan.note_key, reason=plan.note_reason)
else:
note = t(plan.note_key)
if modes != self._modes or note != self._plan_note: