Field Upload — Pre-filled Per-Stop Links (2026-07-27)

Darius no longer types permit + customer at unlikely.pics or unlikely.pl. Both morning schedules (Rob’s 6 AM WhatsApp and Kilroy’s Telegram trial shadow) now carry per-stop tokenized links with project/permit/customer/owner embedded in the JWT claims.

What changed

  • /calendar/events?include_field_links=true (entirely-api ebc36dc) — opt-in param mints photo_upload_url (unlikely.pics, 24h TTL, field_upload_token) for every stop and pier_log_upload_url (unlikely.pl/pierlog/upload?token=…, 72h TTL, pierlog_share_token) for UND stops. Opt-in because the URLs are bearer credentials — portal calendar must leave it off.
  • daily_schedule.py + whatsapp_service.py (0ddc2e9) — Rob’s 6 AM WhatsApp now emits the pre-filled pier link for UND stops (falls back to the static unlikely.pl line if minting fails). Crews without a schedule link still use the permit+customer entry flow (unchanged).
  • Latent bug fixed: proj.get("permit_number") / .get("property_owner") were always empty — list_records_by_ids records carry raw SmartSuite field-ID keys only (config.FIELD_PERMIT etc.). Photo upload tokens had been minted with a blank permit claim since launch.
  • Kilroy cron 0212d41aee6e prompt updated to request include_field_links=true and print the links verbatim per stop; the “usual upload link / usual pin” footer is gone.

Relationships

  • routes/calendar.py → depends on → services/field_upload_token.py
  • routes/calendar.py → depends on → services/pierlog_share_token.py
  • Kilroy Daily Field Schedule cron → consumes → /calendar/events include_field_links
  • daily_schedule.py → mints → pier_log_upload_url (UND stops)