Lab Architect / Ellsworth

Afternoon Brief

Monday, August 3, 2026 — Howard worked across 3 apps overnight: Contractor Closure Rate Scorecard in Inspectr+ (v4.68.0, 274 LOC), unassigned reviewer risk flag in Buildr+ provider + 16 test lines, and isDark prop-drill cleanup in Closr+’s TurnoverRiskDigestCard. DailyReportr+ received only an automated version bump — no feature code. All 4 apps hold at 0 analyzer issues for the sixth consecutive brief. The flag-but-no-badge gap in Buildr+ is the day’s sharpest code health signal.

Last Night’s Builds

Howard → Inspectr+: Contractor Closure Rate Scorecard (v4.68.0) shipped

Commit 7abcd63 — Mon Aug 3 00:22 AM PT. 274 lines added to project_detail_page.dart. Adds a per-contractor accountability panel: computes lifetime close-out rate (items closed ÷ total assigned) across all inspection items per contractor, sorts worst-first (lowest closure rate at top), and renders a closureRate percentage with grade badges A–D (A = green ≥90%, B = blue ≥75%, C = orange ≥50%, D = red <50%). An “Overdue” chip fires when a contractor has open items untouched for 14+ days. Clipboard copy produces a structured scorecard report for PM distribution. This is the first contractor-accountability view in Inspectr+ — previously, deficiency aging was visible at the item level but no cross-contractor ranking existed.

Branch: direct commit to main — Howard. TestFlight bumped to 4.67.2+20260803002301, then review bump to 4.67.3.

Howard → Buildr+: Flag unassigned submittal reviewers shipped

Commit cc7fada — Mon Aug 3 01:17 AM PT. 2 files, 24 insertions (8 logic, 16 tests). Adds reviewerMissing detection to submittal_turnaround_risk_provider.dart: when reviewedBy is blank and the due window is ≤7 days, score is boosted by 20 points total (8 + 12) and reason is set to ‘Reviewer not assigned’. Previously a blank reviewer added a flat +8 regardless of timeline; the new logic escalates urgency as the deadline approaches and gives the reason field a specific, searchable string. Test coverage added in submittal_turnaround_risk_provider_test.dart. The risk flag is now live in the model — but not yet visible as a distinct UI badge in the radar page.

TestFlight bumped to 4.4.2 (c031551).

Howard → Closr+: isDark prop-drill cleanup in TurnoverRiskDigestCard polish

Commit 24dae2c — Mon Aug 3 01:21 AM PT. 2 files, net −12/+7. Drops the three-level bool isDark constructor parameter that was prop-drilled through TurnoverRiskDigestCard, _SummaryStrip, and _RiskRow. Replaces it with context.adaptiveTextPrimary and context.adaptiveTextSecondary directly in each widget’s build() method, using the AdaptiveColors extension already available in the app. The one per-widget dark-alpha check (0.18 vs 0.10) retains Theme.of(context).brightness since no extension maps that bare double. dashboard_page.dart drops the now-unnecessary isDark: argument at the call site. This is the same pattern Closr+ applied to other cards; TurnoverRiskDigestCard was the last prop-driller in the widget stack.

TestFlight bumped to 2.32.54, then 2.32.55 (9d3b617, 6a87353).

DailyReportr+ no feature build

No nightly feature build. Only an automated version bump: bcb3563 (Lab Architect UI Polish Bot, 04:44 AM) bumping pubspec to 2.34.51. Last meaningful feature build was Katey’s context.cardBorder polish (Aug 2). The TodaySetupCard is clean and stable — the TodaySetupKickoff Checklist depth pass remains unstarted.

Codebase Health

App Issues Last 3 Commits
Buildr+ 0 c031551 bump 4.4.2 • cc7fada Flag unassigned submittal reviewers (tonight) • 15316c5 bump 4.4.1
Closr+ 0 6a87353 bump 2.32.55 • 9d3b617 bump 2.32.54 • 24dae2c isDark prop-drill cleanup (tonight)
Inspectr+ 0 169cf49 bump 4.67.3 • 03c6938 bump 4.67.2 • 7abcd63 Contractor Closure Rate Scorecard (tonight)
DailyReportr+ 0 bcb3563 bump 2.34.51 (tonight, automated) • 6226068 bump TestFlight • 059be22 cardBorder polish

Sixth consecutive brief at 0 issues across all 4 apps. Tonight’s Inspectr+ scorecard (274 LOC in one page), Buildr+ provider change (8 logic lines + 16 tests), and Closr+ widget refactor (net −5 lines) all landed without introducing any new lint or analysis issues. The 0-issue floor holds. No build should ship that moves any counter above zero.

Recurring Themes from Morning Briefs

Patterns across the Aug 1, Aug 2, and Aug 3 morning briefs that remain unbuilt or only partially addressed:

Feature Ideas + UI/Code Health Recommendations

3 ideas (1 UI/code health, 2 features). Each verified against codebase and git history before listing.

1. SubmittalReviewerBadge — Render the Risk Signal Buildr+ — UI/Code Health

Tonight’s cc7fada commit flags unassigned reviewers in SubmittalTurnaroundRisk.reason with a +20 risk score boost and the string ‘Reviewer not assigned’. But submittal_review_radar_page.dart renders the same path as plain gray text: ‘Unassigned reviewer’ — no chip, no color, no icon. The morning brief calls for a shared SubmittalRiskBadge widget. Build it: compact variant (amber chip + icon, for list rows) and expanded variant (full-width banner with reviewer-fill CTA, for detail view). Cover missing-reviewer, overdue+missing-reviewer, and reviewer-assigned states in widget tests at 375px and 320px width.

Why now: Aug 3 morning brief is the second consecutive brief to call for submittal status badge clarity. The provider logic is now live; the UI surface is the only missing layer. Confirmed: no SubmittalRiskBadge, submittal_risk_badge, or ReviewerBadge found in lib/.

Sketch: New lib/widgets/submittal_reviewer_badge.dart, ~80 LOC. SubmittalReviewerBadge({required bool reviewerMissing, required bool overdue}). Compact: Chip with Icons.person_off, amber/red background. Expanded: Container with amber left border, icon + text + “Assign Reviewer” action button. Import in submittal_review_radar_page.dart and submittal_log_page.dart where ‘Unassigned’ is now a literal. ~60 LOC tests.

2. Offline Inspection Draft Recovery Inspectr+ — Feature

Give inspectors a visible, recoverable queue for unsynced inspection notes, photos, and punch items after poor connectivity or app restarts. Right now, sync state is background behavior — users have no confirmation that a failed write is queued or lost. Build a SyncRecoveryPanel: a dismissible banner at the top of the inspection list that shows a count of unsynced draft events with retry, skip, and posted states. Draft events are stored locally with stable UUIDs; on reconnect, the panel shows “3 items pending sync” with a per-item retry/dismiss CTA. Failed items get a red chip; posted items auto-dismiss after 3 seconds.

Why now: Three consecutive morning briefs (Aug 1, Aug 2, Aug 3) have raised Inspectr+ offline reliability as the trust gap. Tonight Howard added the Contractor Closure Scorecard — an accountability feature — but sync confidence is the field-level prerequisite for that accountability data to be trusted. Confirmed: no SyncRecoveryPanel, sync_recovery, DraftRecovery, or InspectionDraft found in lib/.

Sketch: lib/services/inspection_draft_service.dartHive or sqflite store keyed by draftId (UUID). DraftEvent model: type, payload, created, retryCount. lib/widgets/sync_recovery_panel.dartAnimatedContainer, shows count + per-item retry/dismiss tiles. Riverpod syncRecoveryProvider drives rebuild on Connectivity stream. ~200 LOC total.

3. Closeout Package Completeness Matrix Closr+ — Feature

PMs must currently open every closeout record to know whether the package is truly ready for owner review. Build a dense matrix view — one row per required closeout item — with columns: spec section, responsible party, document status, and blocker. Status chips: ready missing rejected expiring. Top-right filter chips allow toggling to show only problem rows. Tap any row to navigate directly to the closeout item. This makes the full package status scannable in under 10 seconds without opening any individual record.

Why now: Aug 3 morning brief’s #1 Closr+ recommendation. The existing EvidenceChasePlan model already computes nextMissingEvidence — the matrix can use this as its missing-items source. Tonight’s isDark cleanup shows Closr+ is in a healthy, refactor-ready state. Autodesk Forma’s handover export now covers Sheets, RFIs, and Submittals with configuration options — raising the standard for what a “complete closeout package” means. Closr+ must win on pre-export completeness visibility. Confirmed: no CloseoutMatrix, closeout_matrix, PackageCompleteness, or CloseoutPackageMatrix found in lib/.

Sketch: lib/pages/closeout/closeout_completeness_matrix_page.dart, ~200 LOC. Supabase view or local join over closeout requirements + documents + owner_review_links.expires_at. Flutter DataTable or custom ListView with sticky-header row. Filter state in local Riverpod provider. Matrix reachable from closeout summary header. ~40 LOC widget tests (filter chip states, empty state).

UI Inconsistencies

Competitive Intel

Tomorrow’s Build Suggestion

Builder App Feature Rationale
Dominique Closr+ Closeout Package Completeness Matrix Closr+ tonight was a polish commit only. The EvidenceChasePlan model is 3+ weeks old with zero user-visible surface. The Completeness Matrix (idea #3) directly answers the Aug 3 morning brief’s #1 Closr+ ask and builds on existing EvidenceChasePlan infrastructure. Feature-sized task (~200 LOC), well-scoped for a single session. Last Dominique full-feature nightly: Aug 2 (Buildr+ Drawing Delta Queue). Time to rotate to Closr+.
Katey DailyReportr+ Today Setup Kickoff Checklist Katey polished TodaySetupCard on Aug 2. No DailyReportr+ feature code landed tonight. The card is clean, stable, and border-consistent — the right moment for depth rather than more polish. TodaySetupChecklist model + progress chips + daily-log prefill is a focused, well-understood task (~150 LOC). Last Katey DailyReportr+ feature: TodaySetupCard on Aug 1. Natural follow-through within the same surface.

Night after tomorrow: Buildr+ SubmittalReviewerBadge widget (idea #1) is the cleanest single-session code health task — provider is live, widget is ~80 LOC, tests are clear. Either builder can take it. Inspectr+ SyncRecoveryPanel (idea #2) is the higher-impact pick if Katey has bandwidth after DailyReportr+.