field-lane-v2

Notes

  • 2026-09-05 Phase 1 shipped (entirely-api edb3c3f): field is Darius’s job board — the API posts one card per stop at 6 AM (services/field_lane.py, announcer bot token) and threads photo / pier-log / Vision / note / closeout / follow-up / still-open events under it; tomorrow preview + empty days are one top-level post. notify(‘darius’|‘field’) goes to the lane first, Kilroy webhook routes are fallback only. Retired: ‘Done at X? YES/NO/NOSHOW’ 10-min prompt, Kilroy 4 PM Tomorrow Preview cron. Go-live gate: invite @unlikely_professional to field. Spec /home/claude/FIELD_LANE_SPEC_2026-09-05.md; Phase 2 = API-side field intent listener, Phase 3 = Hermes keep-or-fold.
  • 2026-09-07: go-live gate cleared (announcer bot invited to field, membership verified, test card posted+deleted). Sunday 6 AM fire had failed not_in_channel and the dedup swallowed the Kilroy fallback (0 stops that day) — fixed on master a7c2751. Phase 2 scaffold on branch claude/field-lane-phase2: services/field_intents.py (dictation-tolerant schedule/upload_link/closeout/note matcher), services/field_listener_app.py (Socket Mode listener, THIRD read-only Slack app, replies via field_lane), field_inspection.request_follow_up shared by the unlikely.pics button and the listener, compose service field-listener, FIELD_LISTENER_SETUP.md. Not merged/deployed until Phase 1 holds for a week; needs Dustin to create the unlikely-field Slack app. Handoff: /home/claude/HANDOFF_FIELD_LANE_PHASE2_2026-09-07.md
  • 2026-09-10 (Dustin ruling): Dustin’s field stops now post to field alongside Darius’s as one time-ordered run, and every stop card is @-tagged with its inspector (config.TECH_SLACK_IDS from SLACK_USER_ID_DUSTIN / SLACK_USER_ID_DARIUS) so Dustin vs Darius stops read apart in the one channel. Applies to the 6 AM cards, the 7:30 PM tomorrow preview, partial-failure fallbacks (per tech: Darius → Kilroy field route, Dustin → Slack DM) and the EOD still-open thread lines. Bulk/DM/SMS text uses the plain first name. entirely-api eb4a201, 10 new tests in tests/test_field_lane.py. Open follow-up: field_schedule_change still refuses change prompts for Dustin-assigned visits. First live tagged card: NLC-9000 (1600 Loudoun Dr, Haymarket) posted 2026-09-10 for Dustin’s 12 PM footing inspection.
  • 2026-09-14: the field listener no longer carries its own stop qualifier; field_listener_app.list_field_stops adapts daily_schedule.list_field_stops (both route techs, visit_id on every shared stop, inspector tag on mixed days). entirely-api bafaa16. The listener container is rebuilt but idle until Dustin adds FIELD_LISTENER_APP_TOKEN / FIELD_LISTENER_BOT_TOKEN and invites @unlikely-field to field. The portal’s route-change prompt now names the visit’s tech instead of always Darius (entirely-portal 280f1b1).