UP Build Status

Master outstanding items — updated 2026-03-10

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 — Overnight batch: Mobile responsiveness (480px + 768px breakpoints, touch targets, iOS zoom fix, horizontal-scroll tables). Performance optimization (React.lazy 9 routes, React.memo 6 dashboards, initial JS 698K→339K — 51% reduction). BQ-10 dry-run: 55 unique projects remain, 51 need SOW lines, 3 need files. Phase 8 at 75%.

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.
63
Done
7
Code Items
8
Manual SS
2
Ops/Ongoing
0
Decisions
0
SS Changes

Track A — Cert Pipeline (Revenue Impact)

IDItemStatusNotes
BQ-03 Review / invoice / send 25 generated cert packages Ready 33 PDFs + 27 HTMLs on disk. 21 UND projects need driving log data first.

Track B — Data Migration

IDItemStatusNotes
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%
ItemStatusNotes
Auth system (JWT + bcrypt + SQLite)Done10 endpoints, 8 users seeded
5-domain Caddy routingDoneworks, management, icu, report, xxx
Role architecture (7 roles)DoneDomainGuard + ProtectedRoute + role dispatch
Project list + detail + searchDoneSearch, filter, sort, group, column visibility
User management (admin)DoneFull CRUD + role/branch + password reset
45-day access rule engineDoneBackend filters in /portal/projects (inspection date + last_updated)
Branch scoping enforcementDoneFrontend BRANCH_SCOPED_ROLES + backend account mapping

Phase 2: Dashboards + Calendar ✓

9/9 — 100%
ItemStatusNotes
Dustin Morning View dashboardDoneRevenue sparklines, invoices, triage, RFIs
Jacob Morning View dashboardDoneAdminDashboard (owner minus RFIs/triage)
GOA dashboard (triage in/out counts)DoneRevenue, invoices, recent completions
Scheduler dashboardDoneInspections by weekday, open RFIs, branch-scoped
Scheduler Assistant dashboardDoneSame as scheduler, read-only
Triage dashboardDoneInbox, summary, RFIs, recently closed
SSI/Permits dashboardDoneSSI submission CRUD, "My Submissions" wired to SQLite backend
Embedded FullCalendar (behind auth)DoneFullCalendar v6 — day/week/list views, event detail panel
Calendar role-scoping (branch filter)DoneBRANCH_SCOPED_ROLES filter events by branch; ssi_permits excluded

Phase 3: Documents, Certs & Invoices ✓

8/8 — 100%
ItemStatusNotes
Document upload/download integrationDoneWired to /local/* endpoints (upload, download, list)
Cert display as HTML linksDoneLinks to /cert-gen/public/{id} in project detail
Invoice display (GOA-gated)DoneShown in project detail for FINANCIAL_ROLES
GOA resend functionalityDoneWired to cert/invoice delivery endpoints
Sched. Assistant cert emailDonePortal endpoint with branch scoping. scheduler_assistant can only deliver within their branch.
Cert/invoice delivery audit trailDoneTracked via Comm Log + audit_log.db
Post-production review queue (Jacob)DoneReviewQueue page — admin/owner/GOA access
Draft → Approval workflowDonegenerate → context (editable) → approve → bulk-send. SS "Draft" status added.

Phase 4: RFIs + Schedule Changes + Cancellations ✓

9/9 — 100%
ItemStatusNotes
RFI system (Agent + Client RFI)DoneUnified message thread + standalone /rfis page. Agent RFI: 7 categories, auto-assign. Client RFI: auto-assign to owner+admin. Cross-project view with status/direction filters, quick respond/resolve. portal_messages.py + RFIs.tsx
RFI auto-generation triggers (6)Donerfi_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 cadenceDonePOST /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 interactionDoneAuto-RFI fires sla_service.pause_clock(). Resolve updates SS RFI record (status+date+response) and resumes SLA. Escalation updates SS status to Escalated.
Schedule Change RequestsDoneCustomer-number search-as-you-type, 4 request types (reschedule/cancel/add/hold), site visit selector, rush fee warning (<24h = $400), follow-up cascade prompt, modified/withdrawn statuses. Shared ProjectLookup component.
Rush fee detection ($400 auto-flag)Donetrip-charge system + schedule change auto-detect (<24h requested_date sets is_rush)
Cancel Project flowDoneCustomer-number lookup → permit + customer# verification gate → submit. Two-path: Path A (no inspections) auto-closes + resolves RFIs. Path B (has inspections) enters review queue. CancelProject.tsx
Cancellation review queueDonePath A/B indicator in list. Admin "Review Queue" tab for Path B items. Complete-review endpoint finalizes SS status.
Portal notification system (bell/badges)DoneFull notification center: filter tabs (All/RFI/Schedule/Escalation/Cert/System), mark read, delete. Wired to schedule changes, cert delivery, messages.

Phase 5: Escalations + Unified Comms

5/5 ✓ — 100%
ItemStatusNotes
Unified project message threadDoneSingle per-project thread with 3 types (message, RFI, escalation). Replaces separate escalation + RFI interfaces. portal_messages.py + ProjectDetail thread UI.
Escalation routingDoneAuto-assigns: scheduler/sched_asst→Jacob, GOA/triage→Dustin. Escalations page rewired to unified backend.
Escalation management pageDoneCross-project view with dedicated /portal/escalations API. Category selector (schedule/documents/scope/billing/other), threaded message view, reply form, assigned_to display.
Comm Log integrationDoneAll messages/RFIs/escalations auto-write SmartSuite Comm Log entries for audit trail.
Sync status dashboard bannerDoneOwner/admin dashboard: Supabase sync + nightly backup + system health status strip.

Phase 6: WhatsApp + Field Protocol ✓

11/11 — 100%
ItemStatusNotes
WhatsApp Business API integrationDoneOpenClaw hooks bridge. whatsapp_service.py transport abstraction, 3 endpoints at /whatsapp/ (status, send-test, daily-schedule)
Darius daily schedule pushDonedaily_schedule.py background loop (6 AM ET weekdays), sends formatted inspection list via WhatsApp
Same-day route change alertsDoneHooked into calendar_sync.py + portal_schedule_changes.py review. Same-day GCal changes + approved schedule changes → WhatsApp to Darius
Schedule change/cancel alertsDoneHooked into portal_schedule_changes.py create + portal_cancel.py create → WhatsApp to Dustin
Missed appointment reporting (WhatsApp)Done
PSoW → ABSoW confirmation gateDone3 endpoints + SowGate.tsx — compare PSoW vs ABSoW, confirm, quick status. SQLite: sow_gate.db
Product-by-product inspection checklistDonechecklist_service.py + 3 endpoints (auth'd, token-gen, public). Per-product inspection items for all divisions
Photo upload via WhatsAppDonePOST /whatsapp/upload-photo, API-key auth for OpenClaw agent. Saves to /data/projects/{id}/PHOTOS/
Drive log photo capture + OCRDonePOST /whatsapp/upload-drivelog/{id}, saves to DRIVELOGS dir. OCR via existing /cert-gen/upload-drivelog
SOW completeness validationDoneGET /projects/{id}/sow-validation — 4 checks (has lines, prod days, quantities, inspectable products)
Suspended inspection trackerDone3 endpoints (suspend/resume/open). Wired into log-arrival + complete flow. 5 PM reminder + 6 PM escalation background loops. Commit b776a6a.

Phase 7: Intake Folding + SSI

3/4 — 75%
ItemStatusNotes
Fold intake into Scheduler workflowDoneIntakeWizard: 5-step flow (Type→Upload→Review→Schedule→Confirm)
Fold triage intake into unlikely.icuDoneTriageIntake: 2-path flow (existing + new). New-project path uses shared IntakeWizard (triageMode) — replaced ~190-line manual form.
SSI/Permits form workflowPartialBackend CRUD at /portal/ssi/submissions. Frontend form not built.
SSI → frozen project → auto-RFI flowDoneTrigger #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%
ItemStatusNotes
30-day failed inspection auto-detectionDone2 endpoints: full scan + dashboard widget. Checks visits >30 days old w/ no newer visit.
SLA tracking + breach alertsDonesla_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 automationDonePOST /triage/auto-transfer — combines scan + assign, dry_run default, max_transfers cap, Comm Log + portal notifications.
Payment reconciliation workflowNot Built
Audit log systemDoneaudit_service.py (SQLite) + 3 portal endpoints + AuditLog.tsx admin page. Role-scoped, filterable.
Re-inspection invoicing (v2, v3)Not Built
Mobile responsiveness passDone480px + 768px breakpoints. Touch targets (44px), iOS zoom prevention (16px inputs), horizontal-scroll tables, full-width notification dropdown, stacked stat cards.
Performance optimizationDoneReact.lazy (9 routes code-split), React.memo (6 dashboard components). Initial JS bundle 698K→339K (51% reduction). Calendar chunk (277K) loaded on-demand.

Portal User Onboarding

Production Users — 12 Accounts

2/3 — 67%
StepStatusNotes
Create 12 user accounts in portal auth DBDone2026-03-09 — All 12 users with bcrypt passwords, must_change_password=1
Draft invite emails (12)DoneHeld at /tmp/portal-invite-emails/ — awaiting send approval
Send invite emailsPendingAwaiting Dustin's go-ahead

User Roster

NameBranchRoleDomainAccount Status
Sidney KentJES - Manassasschedulerunlikely.worksCreated
Madison CarterJES - Manassasscheduler_assistantunlikely.reportCreated
Lily JacobsJES - Manassasgoaunlikely.managementCreated
James CareyJES - Manassasgoaunlikely.managementCreated
Kevin KlinefelterJES - Manassasssi_permitsunlikely.worksCreated
Julia MarketisJES - Baltimoreschedulerunlikely.worksCreated
Charity JohnsonJES - Baltimorescheduler_assistantunlikely.reportCreated
Nicole LovoJES - Baltimoregoaunlikely.managementCreated
Ryan JoynerJES - Baltimoregoaunlikely.managementCreated
Kai PerkinsGW - North Havengoaunlikely.managementCreated
Jeff CorsoGW - North Havengoaunlikely.managementCreated
Stephaney BilyardTriage (all JES)triageunlikely.icuCreated

Triage Intake Branch Requirement Done

Branch selection now required in triage new-project intake (StepReview). Existing-project path auto-detects branch from current account.

Standalone Features (Not Portal-Tied)

IDItemStatusNotes
F4 Inspection Coverage Update Done Auto-advance project status on inspection completion. 100% coverage + no RFIs → Field Complete. Partial → Partially Inspected. Coverage endpoint + config constants added.
F45 Stripe Product Catalog Sync Done 3 endpoints: status comparison, sync unsynced, sync price mismatches. Dry-run support.
F46 Cert Pipeline Pre-Fetch Done 4 endpoints: cache status, fetch (by IDs or all ready-for-cert), clear, get cached. 1-hour stale threshold.
BQ-24 Triage + Post-Production Work Queues Done 8 backend endpoints + WorkQueue.tsx page + dashboard widget. 82 post-prod items synced. Claim/unclaim/reassign/status transitions. Accessible via unlikely.xxx (admin portal).
F50 Scheduling Approval Gate Done In-situ intake → “Scheduling” status (owner/admin approval queue). 4 endpoints: queue, detail, approve (→ Scheduled + Comm Log), reject (→ On Hold + cancel visits). portal_sched_approve.py
F46b Cert PDF Formatting Polish Backlog Visual refinements to cert output
F48 NotebookLM Knowledge Base Spec'd Documentation / training tool

Manual SmartSuite UI Tasks

IDItemNotes
SS-1Add "Draft" option to Cert Status fieldDone Added in SS UI. config.py update pending (need value ID).
SS-2Add "Client Removed" option to Project Status fieldDone Added in SS UI. config.py update pending (need value ID).
BQ-04Delete Parent System fieldDone Field not found in SS data or codebase — likely already removed. Verify in SS UI.
BQ-14Aging Certs Kanban viewMay need Cert Age formula field
BQ-153 Permit reporting viewsConfig only
BQ-16Permit Expired filter on View 1Config only
BQ-20Calendar view in SSConfig only
F40Formula Field Fix BatchDone All 5 formula/rollup fields confirmed live in SS (insp_coverage_f, sow_lines_insp_r, total_sow_lines_c, cert_blocked_f, total_prod_days_r).

Ops / Ongoing (Not Code)

IDItemNotes
BQ-18SSI Paperwork session with DustinDedicated working session
BQ-21Legacy 80+ backlogUse legacy-certify skill as capacity allows

Completed

IDItemCompleted
BQ-01SmartSuite 403 fix2026-02-28
BQ-02Triage ~130 legacy records2026-03-01
BQ-17Emergency auto-calc (F2 + F3)2026-03-08
BQ-19WTR/ENC billing bug2026-03-01
F1Cert Delivery Email/cert/deliver on VPS
F5Cert Package Versioning
F6File Naming Convention
F8Stripe Invoice Automation
F9Google Calendar Syncschedule.kulu.la
F11Permit Expiration Monitoring
F16Kulu Agent (WhatsApp)OpenClaw on VPS
F45Stripe Product Catalog Sync2026-03-08 — 3 endpoints, dry-run support
F46Cert Pipeline Pre-Fetch2026-03-08 — 4 endpoints, /tmp/cert-prefetch cache
F47Cert Delivery Email (Skill)/cert/deliver
P1Portal Phase 1 Foundation2026-03-08 — 7/7 items complete
P2Portal Phase 2 Dashboards + Calendar2026-03-08 — 9/9 items (7 dashboards, FullCalendar v6, role-scoping)
B1-7Batch #1-7: Doc upload, cert links, GOA resend, audit trail, review queue, schedule changes, notifications2026-03-08 — Phase 3/4 items wired to backend
B8-14Batch #8-14: Escalations, SOW gate, SOW validation, 30-day scanner, audit log, Stripe sync, cert pre-fetch2026-03-08 — 21 new endpoints, 6 new route files
Production Days SOW Line sync (160 PRD-DAY lines)2026-03-08 — sync_production_days.py + invoice fallback
"Request Status" → "Project Status" rename2026-03-08 — Codebase-wide + SmartSuite UI
SS-old-1Production day fields in SmartSuite2026-03-08 — fields already existed (sebeofqg, sbcc60e547, total_prod_days_r)
SS-old-2Invoice "Draft" status in SmartSuite2026-03-08 — already existed (ax6gr was always "Draft", config label was wrong)
Crew Deliverable system removed2026-03-08 — Superseded by RFI system. Cert validate check #3 replaced with SOW completeness. Delete SS tables (0 records).
P4Portal Phase 4 Complete (RFIs + Sched Changes + Cancellations)2026-03-09 — 9/9 items. RFI auto-gen (6 triggers), escalation cadence (5 levels), SLA interaction, schedule changes, cancel project, notifications.
P6Portal Phase 6 Complete (WhatsApp + Field Protocol)2026-03-09 — 11/11 items. WhatsApp service (OpenClaw bridge), daily schedule push, same-day route alerts, schedule change/cancel alerts, inspection checklists, photo upload, drive log OCR, suspended inspection tracker.
F50Scheduling Approval Gate2026-03-10 — 4 endpoints, owner/admin approval for in-situ intake projects

Obsolete / Superseded

IDItemReason
BQ-11Verify @theblkhse.com emailAll email from operations@unlikely.pro
BQ-13F1 Zap brand routingZap killed; /cert/deliver handles it
BQ-22Replace F1 Zap with direct email/cert/deliver IS the replacement
F7Drive Folder StructureVPS local at /data/projects/
F39Drive Folder Auto-Createlocal_file_service.py
F10Product Deliverable EnforcementAbsorbed into Portal Phase 6 (SOW completeness)
F12RFI Escalation TimingAbsorbed into Portal Phase 4 (RFI escalation cadence)
F13Crew Deliverable EscalationAbsorbed into Portal Phase 4/5 (escalation system)
F14SOW Verification WorkflowAbsorbed into Portal Phase 6 (PSoW→ABSoW gate)
F15ChatwootReplaced by portal comms (Phase 5)
F17Customer PortalSame as BQ-23 / Portal Phase 7 intake
F18Escalation Cron JobAbsorbed into Portal Phase 8 (automation)
F38System Status UtilityBuilt as status.kulu.la
F42Project IntakeAbsorbed into Portal Phase 7
F43Trip/Schedule ZapsReplaced by Portal Phase 4 (schedule changes)
F49Field Collection PortalAbsorbed 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 transport Resolved

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.

SmartSuite Changes Needed (Manual UI)

#1 — Production day fields Resolved

Fields already exist: sebeofqg (SOW Lines), sbcc60e547 (Projects), total_prod_days_r (rollup). Config.py updated with constants.

#2 — Invoice "Draft" status Resolved

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" status Resolved

Added "Draft" option to Cert Status field (s6f8178f84) in SmartSuite UI. config.py value ID update still needed.

#4 — "Client Removed" status Resolved

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 tracking Resolved

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 backend Resolved

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).

System Stats

MetricValue
API Endpoints216
Route Files36
Portal Frontend Files47 TS/TSX
SmartSuite (Legacy PMS)7,782
SmartSuite Records~1,386
Portal Users8
Project Dirs on Disk144
Caddy Domains19
Docker Containers4
Disk Free~101 GB (52%)