# Graph real-event refresh timer correction evidence

Status: complete; A/B real-signal target proof and operator acceptance passed
Type: evidence
Updated: 2026-07-26
Parent: work/tickets/ticket-graph-follow-newest-across-all-zoom-levels.md

## Result

Real Graph zoom and pan interactions no longer replace the screen's repeating
GUI update timer. Both controls render the next persisted one-minute datalog
record after task-button signals at 24, 12, 6, 3, and 1 hour zoom. Pan Left
continues rendering publications while holding the inspected historical
viewport, and Pan Right reattaches and resumes exact newest following.

The target qualification path is
`GraphTempScreenEventHandler` with the production `GX_SIGNAL(...,
GX_EVENT_CLICKED)` task-button cases. It does not call
`performZoomPanButtonAction()` directly.

## Root cause and correction

Graph starts `TIME_EVENT_TIMER` as a repeating timer. Its real zoom/pan
callbacks called the generic `refreshIdleTimer()`, which restarted the same
widget/timer ID as a one-shot idle timer. Chart publication continued, but the
Graph handler stopped polling `gChartDataSequence`.

The correction:

- updates only `S_GraphTemp.Cache.returnToMainMarkTime` on Graph interaction;
- leaves the repeating GUI timer unchanged;
- applies the Graph-specific interaction mark to task buttons and graph-area
  selection;
- routes RAM review commands through the real Graph `GX_SIGNAL` cases;
- adds a repeatable live harness that waits for later persisted records and
  checks publication/render parity, follow state, viewport edge, pan hold, and
  reattachment.

## Build and software gates

- Debug S-record SHA-256:
  `D3D3615586FD522A9472504EAB55BC8A6F4955956AAE3229CCD397A0AD1A1EAF`
- Debug ELF SHA-256:
  `3F312FB090CE928883CB007C40E7780B40825B735ACEF7529378B18A95428902`
- Isolated e2 studio clean Debug build and production-name package: PASS.
- Stable/versioned S-record and ELF identities: byte-identical.
- Repository `script/check-*.ps1`: PASS, `20/20`.
- Focused graph check: PASS, `13/13` source invariants and `5/5` modeled
  zoom levels.
- Live harness syntax validation: PASS.

## Controller B real-event proof

Controller B `1751219`, J-Link `69660123`:

| Zoom | Sequence before -> after | Newest before -> after | Final edge lag |
| ---: | ---: | ---: | ---: |
| 24 h | `10 -> 12` | `301834140 -> 301834200` | `0 s` |
| 12 h | `12 -> 14` | `301834200 -> 301834260` | `0 s` |
| 6 h | `14 -> 16` | `301834260 -> 301834320` | `0 s` |
| 3 h | `16 -> 18` | `301834320 -> 301834380` | `0 s` |
| 1 h | `18 -> 20` | `301834380 -> 301834440` | `0 s` |

- Pan Left: publication/render `30 -> 32`; chart newest
  `301834740 -> 301834800`; viewport high held at `301831200`.
- Pan Right: reattached, then publication/render `34 -> 36`; chart newest and
  viewport high advanced together to `301834920`.
- Cache: `2.62 s` total, `1.78 s` traversal, `1,543 / 1,538` records
  scanned/selected.
- CID/status: protocol `6`, CID-valid `1`, representative read `0`, system
  errors `0`, dropped logs `0`.
- SanDisk/WD, MID `0x03`, OEM/application `SD`, product `SS08G`, revision
  `8.0`, serial `2540634245`, manufacturing date `2024-05`.
- Raw CID: `035344535330384780976F0085018507`.
- The abnormal lane starts remain `86 / 86 / 1`; no format, initialization,
  card replacement, or media repair occurred.

## Controller A real-event proof

Controller A `1751136`, J-Link `69664082`:

| Zoom | Sequence before -> after | Newest before -> after | Final edge lag |
| ---: | ---: | ---: | ---: |
| 24 h | `8 -> 10` | `301835160 -> 301835220` | `0 s` |
| 12 h | `10 -> 12` | `301835220 -> 301835280` | `0 s` |
| 6 h | `12 -> 14` | `301835280 -> 301835340` | `0 s` |
| 3 h | `14 -> 16` | `301835340 -> 301835400` | `0 s` |
| 1 h | `16 -> 18` | `301835400 -> 301835460` | `0 s` |

- Pan Left: publication/render `18 -> 20`; chart newest
  `301835460 -> 301835520`; viewport high held at `301833000`.
- Pan Right: reattached, then publication/render `20 -> 22`; chart newest and
  viewport high advanced together to `301835580`.
- Cache: `2.71 s` total, `1.87 s` traversal, `1,607 / 1,606` records
  scanned/selected.
- CID/status: protocol `6`, CID-valid `1`, representative read `0`, system
  errors `0`, dropped logs `0`.
- SanDisk/WD, MID `0x03`, OEM/application `SD`, product `SS08G`, revision
  `8.0`, serial `2540634244`, manufacturing date `2024-05`.
- Raw CID: `035344535330384780976F0084018559`.

CID is identity evidence, not proof of authenticity.

## Evidence locations

- A identity/cache:
  `work/evidence/hpt-log-store-circular-mirror/controller-a/graph-timer-fix-20260726/`
- A live summary:
  `work/evidence/hpt-log-store-circular-mirror/controller-a/graph-timer-fix-20260726/live-real-event/qualification-summary.json`
- B identity/cache and five-zoom captures:
  `work/evidence/hpt-log-store-circular-mirror/controller-b/graph-timer-fix-20260726/`
- B pan summary:
  `work/evidence/hpt-log-store-circular-mirror/controller-b/graph-timer-fix-20260726/live-real-event-pan-final/qualification-summary.json`

## Operator handoff

Both controls run the identical hash-locked image. Final captures show the
Graph active at one-hour zoom, `followNewest=true`, publication/render
sequences equal, and zero edge lag:

- A: publication/render `30 / 30`, newest/viewport high `301835820`, right
  edge label `11:17`.
- B: publication/render `66 / 66`, newest/viewport high `301836000`, right
  edge label `11:20`.

The interaction mark was refreshed immediately before these captures. The
normal five-minute no-interaction return-to-main behavior remains intentional;
reopen Graph if review begins after that interval.

## Operator disposition

PASS on 2026-07-26. The owner observed that the Graph advances while zooming
in and explicitly called the correction good. This disposition applies to the
live-refresh defect; it does not expand or replace separate USB export
qualification.
