central/docs/PHASE-1A-5-VERIFICATION.md
Matt Johnson f7a55c3cc4 docs: add Phase 1a-5 verification report
Documents test results for:
- Gate 5: max_bytes self-loop prevention (PASS)
- Gate 6: bbox hot-reload (PASS)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-05-16 19:08:00 +00:00

83 lines
2.3 KiB
Markdown

# Phase 1a-5 Verification Report
## Gate 5: max_bytes Self-Loop Prevention
**Objective**: Verify that `max_bytes` updates to `config.streams` do NOT trigger
a NOTIFY (preventing infinite supervisor recompute loops).
**Test Procedure**:
1. Started supervisor with stream retention enabled
2. Directly updated `max_bytes` via SQL:
```sql
UPDATE config.streams SET max_bytes = 209715200 WHERE name = 'CENTRAL_META';
```
3. Monitored supervisor logs for any stream change handling
**Result**: PASS
No NOTIFY was triggered. The column-filtered trigger in `003_add_streams_table.sql`
correctly fires only on `max_age_s` changes:
```sql
ELSIF TG_OP = 'UPDATE' AND OLD.max_age_s IS DISTINCT FROM NEW.max_age_s THEN
PERFORM pg_notify('config_changed', 'streams:' || NEW.name);
```
This prevents the supervisor's `recompute_max_bytes()` from creating a feedback loop.
---
## Gate 6: bbox Hot-Reload
**Objective**: Verify that changes to the NWS adapter's `region` bbox are
picked up via hot-reload without supervisor restart.
**Test Procedure**:
1. Updated the NWS adapter's region via SQL:
```sql
UPDATE config.adapters SET settings = jsonb_set(
settings, '{region}',
'{"north": 48.0, "south": 45.0, "east": -115.0, "west": -125.0}'::jsonb
) WHERE name = 'nws';
```
2. Observed supervisor logs for config reload
**Result**: PASS
Supervisor log showed immediate config application:
```json
{"msg": "NWS config applied", "region": {"east": -115.0, "west": -125.0, "north": 48.0, "south": 45.0}}
```
The NOTIFY trigger on `config.adapters` fired and the supervisor's
`_handle_adapter_change()` correctly invoked `adapter.apply_config()`.
---
## Additional Verification
### Polygon Intersection Filter
The `_geometry_intersects_region()` method was tested with:
- Shapely 2.1.2 installed via `uv sync`
- GeoJSON geometry parsing via `shapely.geometry.shape()`
- Region box creation via `shapely.geometry.box()`
- Intersection test via `region_box.intersects(feature_shape)`
### Antimeridian Rejection
The `RegionConfig` validator was tested:
```python
>>> RegionConfig(north=49.0, south=31.0, east=-170.0, west=170.0)
ValidationError: antimeridian-crossing bboxes not supported
```
---
## Verification Date
2026-05-16T19:06:00Z
## Verified By
Claude Code (automated verification)