No reviewers
Labels
No labels
area:ai
area:ci-cd
area:notifications
area:observability
area:public-pages
backlog
bug
duplicate
enhancement
help wanted
invalid
question
type:decision
type:feature
type:infra
type:maintenance
type:security
v1.0.1
v1.1.0
v1.2.0
v1.3.0
v2.0.0
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
rbrooks/WeatherBot!107
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/v1.4.0-phase1"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
First phase of the v1.4.0 codebase-health milestone. Two independent findings, disjoint file sets.
#57 (F-18) — ORM index metadata sync + dashboard-dedup NULL gap
The drift was broader than the six indexes the audit enumerated —
alembic revision --autogeneratealso flagged mismatches on six further tables. The models now reproduce the live DB exactly, so autogenerate on a clean head yields a genuinely empty diff (verified against a live-schema Postgres).sent_alerts(location_id, nws_alert_id, expires),locations(nws_state, enabled),sent_forecasts(sent_date), andnotification_deliveries(sent_alert_id + compositeix_notification_deliveries_due).ai_summary_policies,product_freshness,public_alert_pages,public_tokens,redirect_tokens): models now declare the nameduq_*constraint + non-uniqueix_*index that the DB actually has. Model metadata only — no schema change.uq_sent_alerts_dashboard_dedup (nws_alert_id, location_id) WHERE channel_id IS NULLcloses the dashboard-dedup NULL gap (Postgres NULL semantics left dashboard-only rows undeduped at the DB level), plus a(location_id, channel_id)hot-path index. Note: the SELECT-then-insert dedup is already race-safe under the scheduler'smax_instances=1; the index formalizes the invariant and guards a future multi-instance deployment (a savepoint-basedIntegrityErrorhandler would be the follow-up if concurrency is ever introduced).alembic/script.py.mako— it was never committed, soalembic revisionfailed on any fresh clone; that's what blocked the empty-diff acceptance check in the first place.env.py: documented theALTER TYPE ADD VALUEsingle-transaction pitfall (0007) for future authors.#69 (F-30) — UI consistency pass
Mechanical front-end cleanup:
✕→✕encoding fix,confirm()parity onremoveSub, double-submit guards on five more handlers, standardized user-facing errors onto inline error divs (all ~22alert()error sites, via a sharedshowInlineErrorhelper — broader than the 7 the audit listed, fulfilling item 4's intent),aria-labels on icon-only remove buttons, defined-token fix for--color-accent, and deletion of the dead/unreachableafterSwapJSON block (an unescaped-innerHTML hazard if revived).Testing (dev-server Postgres)
alembic revision --autogenerate→ empty diff ✓upgrade head✓Closes #57, #69
🤖 Generated with Claude Code