2026-03-10 — Scheduling approval gate: In-situ intake projects now enter “Scheduling” status (approval queue) instead of going straight to “Scheduled”. 4 new endpoints at /portal/sched-approve/ — queue listing, project detail + linked site visits, approve (→ Scheduled + Comm Log), reject (→ On Hold + cancel linked visits). Owner/admin only. Apple Creek (MIR-250638) is first project in the queue.
2026-03-10 — Domain cleanup: Removed unlikely.style from work queue routing (was wired in error). Work queue now accessible via unlikely.xxx (admin portal) only. unlikely.style freed for future use. F4 (inspection coverage auto-advance) built and deployed. Decision #2 resolved (option b: auto-advance when coverage = 100%).
2026-03-09 — Suspended inspection tracker: 3 new endpoints on routes/whatsapp.py: suspend inspection (waiting for crew photos), resume inspection (photos arrived), list open/suspended inspections. Wired into existing flow (log-arrival → open, complete → close). 2 background loops: 5 PM ET reminder to Darius about open inspections, 6 PM ET escalation to Dustin + Jacob (marks unresolved as escalated). Commit b776a6a.
2026-03-09 — Phase 6 complete (100%): WhatsApp + Field Protocol fully built. whatsapp_service.py transport abstraction (OpenClaw hooks bridge), 3 WhatsApp endpoints (status, send-test, daily-schedule). daily_schedule.py background loop (6 AM ET weekdays). Same-day route change alerts hooked into calendar_sync + schedule change review. Schedule change/cancel alerts to Dustin via WhatsApp. checklist_service.py + 3 inspection checklist endpoints (auth'd, token-gen, public). Photo upload + drive log upload via WhatsApp. 8 new endpoints total, Decision #3 (WhatsApp transport) resolved.
2026-03-09 — Phase 4 complete (100%): RFI auto-generation service (rfi_service.py) with 6 trigger functions (SSI frozen, missing drive log, missing photos, partial SOW, triage docs, cert discrepancy). Escalation cadence endpoint (POST /portal/rfi/scan-escalations) — 5-level business-day schedule (Day 1 reminder → Day 3 escalate+GOA → Day 5+ email every 2 days). SmartSuite RFI sync on resolve (status+date+response). Trigger hooks wired: portal_ssi.py (#1), triage.py (#5), cert_validate.py (#6). Inspection-based scan at POST /portal/rfi/scan. All dry_run=true by default.
2026-03-09 — Calendar wiring: Inspection detail panel buttons (Reschedule, Hold, Cancel Project, Respond to RFI) now navigate to their respective pages with pre-filled customer number + context. Shared ProjectLookup component auto-searches on mount via initialSearchTerm prop.
2026-03-09 — BQ-24 done: Triage + Post-Production Work Queues for Dustin/Jacob. 8 backend endpoints, SQLite work_queue_items table, WorkQueue.tsx page, dashboard widget. 82 post-prod items synced on first run. Accessible via unlikely.xxx (admin portal).
2026-03-09 — Phase 4 completion: All 3 remaining Phase 4 subsystems upgraded to full spec. Schedule Changes: customer-number-first lookup (search-as-you-type), 4 request types (reschedule/cancel/add/hold), rush fee detection (<24h = $400), follow-up cascade prompt, modified/withdrawn statuses. Cancellations: permit + customer# verification gate, two-path handling (Path A auto-close / Path B cert/invoice review queue), admin review queue. New standalone RFIs page at /rfis (cross-project, status/direction filters, quick actions). Escalations fixed: dedicated API, category selector, threaded messages, reply form. New shared ProjectLookup component. 3 new backend endpoints, 2 new frontend files, 4 rewrites.
2026-03-09 — Phase 8 automation: 45-day triage auto-transfer endpoint (POST /triage/auto-transfer — scan + assign in one call, dry_run default, max_transfers cap, Comm Log + notifications). SLA tracking system (sla_service.py + portal_sla.py — 3-day business-day clock, pause on Agent RFI, reset on resolve, breach/approaching scan, dashboard widget, check-projects cron endpoint). 5 new endpoints, 2 new files, hooks in portal_messages.py.
2026-03-09 — Triage intake refactor: Triage new-project intake now uses shared IntakeWizard component (triageMode prop) instead of ~190-line manual form. Backend intake endpoints accept triage flag — stages to _triage_staging/, routes to JES Triage, sets triage fields + Comm Log. 7 frontend files updated.
2026-03-09 — Phase 4+5 build: Unified project message thread (messages + RFIs + escalations in one per-project thread). Cancel project flow (3 endpoints + CancelProject.tsx). Notification center fully wired. Sync status dashboard banner. Escalations page rewired to unified backend. Notification triggers on schedule changes + cert delivery. 7 new endpoints, 2 new route files. Phase 5 complete (100%), Phase 4 at 67%.
2026-03-08 — Full audit: Every item verified against live codebase by 4 parallel agents. 5 corrections applied: Notifications center page is stub (Done→Partial), SSI form backend-only (Not Built→Partial), Drive log OCR exists (Not Built→Partial), escalation attachments schema-only (note updated), endpoint count corrected. Crew Deliverable system removed (superseded by RFI). Decision #1 resolved. All SS Changes resolved.
33 PDFs + 27 HTMLs on disk. 21 UND projects need driving log data first.
Track B — Data Migration
ID
Item
Status
Notes
BQ-10
PMS → UOps migration (~55 projects)
Ready
Dry-run complete: 55 unique projects, 51 need SOW lines (101 total), 3 need file downloads (17 files), 6 need no work. 4 duplicates to dedup before execute. Scripts: batch_migrate_pms.py, sync_pms_to_uops.py.
Track C — Portal (8 Phases)
Phase 1: Foundation ✓
7/7 — 100%
Item
Status
Notes
Auth system (JWT + bcrypt + SQLite)
Done
10 endpoints, 8 users seeded
5-domain Caddy routing
Done
works, management, icu, report, xxx
Role architecture (7 roles)
Done
DomainGuard + ProtectedRoute + role dispatch
Project list + detail + search
Done
Search, filter, sort, group, column visibility
User management (admin)
Done
Full CRUD + role/branch + password reset
45-day access rule engine
Done
Backend filters in /portal/projects (inspection date + last_updated)
rfi_service.py — 6 trigger functions + auto_create_rfi() core. SQLite + SmartSuite + notification + Comm Log + SLA pause. Hooks in portal_ssi.py, triage.py, cert_validate.py. Scan endpoint for inspection-based triggers.
RFI escalation cadence
Done
POST /portal/rfi/scan-escalations — 5 levels (Day 0 create → Day 1 reminder → Day 3 escalate+GOA → Day 5+ email q2d). SS RFI status → Escalated at L2. dry_run default.
RFI ↔ SLA interaction
Done
Auto-RFI fires sla_service.pause_clock(). Resolve updates SS RFI record (status+date+response) and resumes SLA. Escalation updates SS status to Escalated.
Backend CRUD at /portal/ssi/submissions. Frontend form not built.
SSI → frozen project → auto-RFI flow
Done
Trigger #1 in portal_ssi.py — when submission status → "submitted" with linked project, fires trigger_ssi_frozen(). Auto-RFI assigned to SSI/Permits users.
Phase 8: Automation + Polish
6/8 — 75%
Item
Status
Notes
30-day failed inspection auto-detection
Done
2 endpoints: full scan + dashboard widget. Checks visits >30 days old w/ no newer visit.
SLA tracking + breach alerts
Done
sla_service.py (SQLite) + portal_sla.py. 3-day business-day clock, pause/resume on Agent RFI, scan + dashboard + check-projects endpoints. Hooks in portal_messages.py.
45-day triage transfer automation
Done
POST /triage/auto-transfer — combines scan + assign, dry_run default, max_transfers cap, Comm Log + portal notifications.
2026-03-10 — 4 endpoints, owner/admin approval for in-situ intake projects
Obsolete / Superseded
ID
Item
Reason
BQ-11
Verify @theblkhse.com email
All email from operations@unlikely.pro
BQ-13
F1 Zap brand routing
Zap killed; /cert/deliver handles it
BQ-22
Replace F1 Zap with direct email
/cert/deliver IS the replacement
F7
Drive Folder Structure
VPS local at /data/projects/
F39
Drive Folder Auto-Create
local_file_service.py
F10
Product Deliverable Enforcement
Absorbed into Portal Phase 6 (SOW completeness)
F12
RFI Escalation Timing
Absorbed into Portal Phase 4 (RFI escalation cadence)
F13
Crew Deliverable Escalation
Absorbed into Portal Phase 4/5 (escalation system)
F14
SOW Verification Workflow
Absorbed into Portal Phase 6 (PSoW→ABSoW gate)
F15
Chatwoot
Replaced by portal comms (Phase 5)
F17
Customer Portal
Same as BQ-23 / Portal Phase 7 intake
F18
Escalation Cron Job
Absorbed into Portal Phase 8 (automation)
F38
System Status Utility
Built as status.kulu.la
F42
Project Intake
Absorbed into Portal Phase 7
F43
Trip/Schedule Zaps
Replaced by Portal Phase 4 (schedule changes)
F49
Field Collection Portal
Absorbed into Portal Phase 6
Decisions Needed (Blocking)
#1 — 45-day rule: which date?Resolved
Confirmed: inspection_date + last_updated (as portal uses) IS the business intent. Triage scan needs updating to match this approach instead of permit issue date.
#2 — Who advances status after field inspection?Resolved
Option (b) implemented as F4: auto-advance when inspection coverage = 100% + no open RFIs → Field Complete. Partial coverage → Partially Inspected. Wired into mark_inspected() + complete_inspection(). Coverage endpoint at GET /portal/inspections/coverage/{id}.
#3 — WhatsApp production transportResolved
Decided: OpenClaw hooks bridge (Option B). whatsapp_service.py provides transport abstraction layer. Phase 6 complete with this approach. Can swap to official WhatsApp Business API later if needed.
Already exists! ax6gr was always "Draft" in SmartSuite. Config.py had it mislabeled as "Invoiced." Also discovered "Not Invoiced" (xmcJK) and "Partial" (OxONn) values. Config.py corrected 2026-03-08.
#3 — Cert "Draft" statusResolved
Added "Draft" option to Cert Status field (s6f8178f84) in SmartSuite UI. config.py value ID update still needed.
#4 — "Client Removed" statusResolved
Project Status field (s115ab1815) — "Client Removed" option added in SS UI (SS-2). config.py value ID still needed. Field renamed from "Request Status" to "Project Status" (2026-03-08).
#5 — Invoice version trackingResolved
Cert Packages table already has version field (sqtnojgf) with v1.0, v1.1 etc. Invoice send_count tracked in cert-gen pipeline. Full re-inspection invoicing (v2, v3) planned for Phase 8.
Workflow Gaps
#1 — Drive log path for BQ-03 (revenue blocker) Process Gap
21 UND projects need driving logs for cert completion. /cert-gen/upload-drivelog/{id} with Claude Vision OCR exists, but no defined process for WHO gets the logs and HOW they get uploaded. This is the current blocker for BQ-03 revenue.
#2 — Payment reconciliation is unspecified Process Gap
No spec on EFT payout format, parsing, or matching algorithm. Phase 8 — not urgent, but currently a black box.
#3 — SSI county PDF generation unspecified Process Gap
Each jurisdiction has different forms. No spec on how this works. Volume is ~1-2/month so can be manual for now.
Spec Clarifications Needed
#1 — "Ready for Review" vs "Field Complete" Clarify
Portal spec uses "Ready for Review" but this status doesn’t exist in SmartSuite. "Field Complete" (43 records) is likely the same thing.
#2 — SLA clock start for multi-visit projects Clarify
Should be: SLA starts when the LAST visit covers remaining SOW and project enters Field Complete.
#3 — Notification backendResolved
Backend now has real notification endpoints (SQLite-backed). Bell polls every 30s, dropdown renders, Notifications center page functional. Built in Batch #1-7 (2026-03-08).