## Summary
`POST /api/packets` is broken on every v3-schema install — which is the
default since #1289. The handler issues two writes against legacy v2
column names and silently swallows the observation insert's error,
returning `200 OK` with `id>0` while persisting zero observation rows.
## Root cause
`cmd/server/routes.go:1225-1235` (pre-fix) used the v2 schema shape:
```go
INSERT INTO transmissions (... path_json ...) // path_json removed in v3
INSERT INTO observations (transmission_id, observer_id,
observer_name, snr, rssi, timestamp) // v2 columns
// timestamp written as RFC3339 text; v3 wants unix INTEGER
// second Exec's error was discarded
```
v3 schema (`cmd/ingestor/db.go:289-304`): `observations.observer_idx
INTEGER` (FK `observers.rowid`), `observations.timestamp INTEGER` (unix
epoch), `path_json` lives here not on `transmissions`.
Reporter [@EldoonNemar](https://github.com/EldoonNemar) called this out
precisely in #1196 — both the schema mismatch and the divergence between
the test harness (which uses the v3 shape) and the handler (v2 shape).
## Fix
`cmd/server/routes.go`:
- `transmissions` insert: drop `path_json` column.
- Observer resolution: `INSERT OR IGNORE INTO observers (id, name, ...)`
then `SELECT rowid` — mirrors the ingestor resolver at
`cmd/ingestor/db.go:778,906`.
- `observations` insert: write `observer_idx INTEGER` + `timestamp =
time.Now().Unix()`; `path_json` moved here.
- **Propagate both insert errors** (transmission + observation) as `500`
instead of swallowing them.
## TDD
| Step | Commit | Result |
| ----- | ------- | ------ |
| RED | `46d25389` | Test fails on master: `id=0` because the
transmissions insert references a column not present in v3. |
| GREEN | `dae57d67` | Test passes; round-trip persists the observation
with `observer_idx` resolved from the seeded `obs1` row and a unix-epoch
`timestamp`. |
Local repro:
```
# RED on the test commit alone:
$ go test -run TestPostPacketPersistsV3Schema -count=1 .
--- FAIL: TestPostPacketPersistsV3Schema (0.03s)
routes_test.go:4755: expected transmission id > 0, got 0
(body: {"id":0,"decoded":{...}})
FAIL
# GREEN on HEAD:
$ go test -run TestPostPacketPersistsV3Schema -count=1 .
ok github.com/corescope/server 0.037s
```
## Scope
Two files, both in `cmd/server/`:
- `cmd/server/routes.go` (+38/-12) — handler rewrite
- `cmd/server/routes_test.go` (+66) — round-trip regression test
No public API signature changes. No DB schema changes (consumes the
existing v3 schema correctly).
Closes#1196