Fixes#1147
## What
Re-orders the node-detail sections in **both** the side panel and the
full
node detail page. New sequence matches operator mental order
(identity → what this node SAID → who heard it → relay topology → meta):
1. Identity (name, role, badges)
2. Map + QR (full page) / Public key (side panel)
3. Overview (Last Heard, First Seen, Total Packets, etc.)
4. **Recent Packets** ← lifted from bottom
5. Heard By (observers)
6. Neighbors
7. Paths Through This Node
8. Clock Skew (hidden until populated)
## Why
"What did this node originate?" is the most-asked operator question at
the
node-detail surface. Previously Recent Packets was the LAST section in
both
views — operators had to scroll past Clock Skew, Heard By, Neighbors,
and
Paths just to see the node's own activity. Section B4 of the
node-analytics review flagged this as P1.
## Changes
- `public/nodes.js`: pure template re-order in two render paths
(full-page `loadFullNode`, side-panel `renderDetail`). No data,
styling, or behavior changes — same DOM ids, same CSS classes,
same content per section.
- `test-issue-1147-section-order-e2e.js`: new Playwright test that
loads a node detail page (and the side panel) against the fixture
DB and asserts `Recent Packets` index in DOM order is **before**
`Paths Through This Node`, `Heard By`, and `Neighbors` for both
surfaces.
- `.github/workflows/deploy.yml`: wired the new E2E into the
existing `e2e-test` job.
## TDD trail
- Red commit: `c0829fd` — adds failing E2E (Recent Packets is last).
- Green commit: `29cdb22` — re-orders the templates, test passes.
## Browser verified
E2E assertion added: `test-issue-1147-section-order-e2e.js:84` (full
page) and `:115` (side panel). Local Chromium can't run on this host
(libc reloc), so verification is via CI; server-side `grep` of rendered
`/nodes.js` confirms the new section order in both code paths.
## Preflight
All hard gates pass (PII, branch scope, red commit, CSS vars,
self-fallback, LIKE-on-JSON, sync migration). All warning gates pass.
---------
Co-authored-by: kpaclawbot <bot@kpaclawbot.local>