mirror of
https://github.com/zvx-echo6/central.git
synced 2026-05-21 18:14:44 +02:00
83 lines
2.3 KiB
Markdown
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)
|