field-status: desk-review exclusion + date-word parsing (2026-08-06)
Context: Dustin reported a “disconnect” in Darius↔Kilroy closeouts. Tracing
showed the closeout chain itself healthy (scope check → /whatsapp/eod-closeout
→ F4 auto-advance; 8 of 9 recent closeouts already Invoiced/Closed). The noise
came from /whatsapp/field-status (routes/whatsapp.py).
Two bugs fixed (entirely-api 149d73d):
- PPDR desk reviews leaked into scheduled/pending. The endpoint built its
scheduled set from ALL site_visits with no desk-review filter — unlike
/calendar/events which has
exclude_desk_reviews. The 7/30–31 VAB desk-review cluster (11 projects, Virginia Beach triage) showed in Kilroy’s EOD summaries as “Scheduled but no field confirmation received” — phantom field stops. Fix mirrors routes/calendar.py detection: visit-level SV_INSPECTION_METHOD = Desk Review excluded outright; no-method visits fall back to project-level FIELD_REVIEW_TYPE (‘in_progress’ raw / ‘Desk Review’ resolved). date=todaytaken literally → empty board. Now resolves today/tomorrow/yesterday in ET; other non-ISO strings → 422.
Tests: tests/test_field_status_endpoint.py (5). Suite 459 passed. Deployed (api+worker+scheduler rebuilt) and live-verified: 7/31 pending went 5 → 0, 7/30 went 7 → 1 (the 1 is real: MAN-9153, 11800 Bristolwood Terrace, Laurel — Field Inspection still ‘Scheduled’ since 7/30, no closeout).
Same session, Kilroy side (~/.hermes): all 13 cron prompts + SOUL.md
rewritten from the inline -H "X-API-Key: $(grep ...)" curl idiom (hardline-
blocked by the Hermes terminal tool since 7/23 — every cron burned blocked
retries first) to the working two-step KEY=$(grep ...) && curl -H "X-API-Key: $KEY" form; stale “TRIAL NOTE / shadowing Rob” headers replaced with
production framing. jobs.json edited under the cron flock; scheduler re-reads
per tick, no gateway restart needed. Backup:
~/.hermes/cron/jobs.json.bak-20260806-preKEYfix.
Addendum (same day, 753e3aa): held projects are now annotated instead of
listed as awaiting-update — pending_no_update entries carry status: "on_hold" + on_hold: true + explicit note; summary splits pending (true
pendings) from new on_hold count. Kilroy EOD cron prompt + SOUL.md render
the ⏸ postponed/on-hold category. Motivated by MAN-9153 (Bristolwood Terrace,
postponed 7/30, hold follow-up 2026-09-18 — Shepherd will resurface it).