Fixes#1864.
## Problem
`PAYLOAD_TYPE_ANON_REQ` was effectively treated like `REQUEST`. The two
differ on the wire:
```
REQUEST : <dest hash 1B> <source hash 1B> <hmac 2B> <encrypted>
ANON_REQ: <dest hash 1B> <source pubkey 32B, full> <hmac 2B> <encrypted>
```
The decoders read the right bytes but surfaced the sender key as
`ephemeralPubKey`, which meant:
- `store.go`'s node indexer keys on `pubKey`/`destPubKey`/`srcPubKey`,
so ANON_REQ packets were **not** indexed — they didn't show up on a
node's packet view; and
- the packets list "details" rendered a bare `anon → <destHash>`,
throwing away the sender identity the packet actually carries.
- the detail side-view byte breakdown fell through the REQ catch-all,
mislabelling a nonexistent 1-byte "Src Hash" and placing
MAC/Encrypted-Data at the wrong offsets (`+2`/`+4` instead of
`+33`/`+35`).
## Fix
**Backend** (`cmd/ingestor` + `cmd/server` decoders)
- Surface the ANON_REQ sender key as `srcPubKey` (json) so it's indexed
and resolvable. The frontend keeps a legacy `ephemeralPubKey` reader so
packets decoded before this rename still resolve — no DB migration
needed.
- `TestDecodeAnonReqValid` now asserts the full 32-byte `srcPubKey`.
**Frontend**
- `hop-resolver.js`: new O(1) `nameForKey(pubkey)` using the existing
`pubkeyIdx` (all nodes).
- `getDetailPreview`: resolve the source pubkey to a node **name** when
known, else show the first 8 hex chars — no more bare `anon`.
- Detail side-view: explicit ANON_REQ breakdown — `Dest Hash (1B)` |
`Src Public Key (32B)` (node-linked) | `MAC @+33` | `Encrypted Data
@+35`.
- Detail header `srcLabel` falls back to the resolved ANON_REQ sender.
All rendered names are `escapeHtml`-wrapped.
## Testing
- `go test ./...` green for both `cmd/ingestor` and `cmd/server` (incl.
strengthened `TestDecodeAnonReqValid`).
- `node --check` on `packets.js`; brace/paren balance + markers verified
on `hop-resolver.js`.
- No HTML sink lines added → XSS preflight gate unaffected; every
interpolated name is escaped.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: SaarMesh-Bot <300107934+SaarMesh-Bot@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>