Lab Architect / Ellsworth

Afternoon Brief

Sunday, October 4, 2026 — Twenty-sixth consecutive night with no nightly-branch build on any app. There is no feature/nightly-20261004 or feature/nightly2-20261004 branch, and git log --all --since="36 hours ago" is empty on all four app repos. Codebase health: 0 analyzer issues on all four apps. Unlike yesterday, all three morning ideas survived verification. They target reachable code and none has shipped before. Two of them are small honesty fixes and are now Recommendations #1 and #2. The Inspectr+ bug is worse than the morning brief described: when the lookup fails, the whole references card disappears, including its + Add button.

Last Night’s Builds

No nightly-branch build on any app, twenty-sixth night running missed

Ran git fetch origin --prune on all four repos. No new nightly branches exist; the newest on any remote are still feature/nightly-20260908 and feature/nightly2-20260909. The held assignments (Dominique → Buildr+ Deletes That Wait for the Server; Katey → DailyReportr+ reports_page.dart rework) went unclaimed for a seventh day. Today's morning brief again reports the nightly-review artifacts MISSING with Hermes UP, and again says nothing about the 00:15 and 01:15 builder jobs. ~/memory/last-nightly-build.md (the builder coordination file) was last updated Aug 5.

Buildr+ 4 commits unpushed · working copy off main

Local main head a7a5a03 (Sept 21) is 4 ahead / 0 behind origin/main (33c825f, Sept 18). The working copy is still on fix/project-card-contract-value-spacing. Unchanged.

Closr+ 6 commits unpushed · tracked node_modules

Local main head 0925b0b (Sept 21) is 6 ahead / 0 behind origin/main (7a3ca21). git status still lists 1,648 changed paths, nearly all deleted-but-tracked node_modules/ files. Unchanged.

Inspectr+ 7 commits unpushed

Local main head 8145093 (Sept 21) is 7 ahead / 0 behind origin/main (4140149, Sept 8). origin/main has had no new commits for 26 days.

DailyReportr+ silent 20 days · working copy off main

main = origin/main = 0433f44 (Sept 14, 3.8.1 TestFlight prep). The working copy is still on the Aug 11 fix/owner-report-media-web branch with modified tracked files.

Codebase Health

App Analyzer Issues Unimported files Breakdown Last 3 Commits (local main)
Buildr+ 0 16 "No issues found!" New today: an RFI drawing snapshot captured with no linked drawing is saved as drawingNumber: 'Unlinked', revisionNumber: 0 (rfi_drawing_snapshot_page.dart:104-106). The card renders displayLabel as "Unlinked Rev. 0" (drawing_snapshot_model.dart:106), and legacy rows with no revision_number deserialize as Rev. 1 (:55). It's reachable from RFI detail (rfi_detail_page.dart:723, 766), and no test covers DrawingSnapshot. Still open: the producer-less offline queue, 10 unguarded onDismissed deletes, and the 6 owner-retired pages. a7a5a03 merge harden-ios-release-gate • a2873c3 merge project-card spacing fix • fac04bd source protected secrets file (unpushed)
Closr+ 0 12 "No issues found!" Nothing new today. Still open: the producer-less offline queue and unfed AppHeader sync chip, the isExpiringSoon boundary gap, the silent portfolio catch (_), tracked node_modules/, and the Connected Sources retire/restore decision. 0925b0b merge harden-ios-release-gate • d4c8952 gate TestFlight IPA on client IDs • ca33394 bump TestFlight 2.32.75 (unpushed)
Inspectr+ 0 18 "No issues found!" New today: DrawingReferenceChips (lib/widgets/drawing_reference_chips.dart:29-33) maps both loading and error to SizedBox.shrink(). A failed lookup removes the whole card, including the + add-reference chip, so the user can't tell it failed and can't add a reference. It's mounted twice on the reachable inspection_item_page.dart (:1127, :1341), with 0 tests. The same widget passes isDark through 28 times instead of using context.isDark/context.cardShadows from app_extensions.dart. Still open: the tapped-photo bug and 29 raw Colors.green. 8145093 merge Google sign-in client-ID fix • 5e0849b merge harden-ios-release-gate • 744cc12 add iOS artifact gate (unpushed)
DailyReportr+ 0 11 "No issues found!" Confirmed today: there's no sheet/drawing reference anywhere in the activity model (grep sheet_?ref|sheetNumber|drawing_?ref returns 0 hits, and nothing in git log --all). DailyReportActivityDocument keeps the original JSON map, so a new optional key is safe for older reports. Still open: the admin reports retry loop, the duplicated _buildReportCard with its fake "1 activity" badge, the eager Reports list, and 40 raw Colors.green. 0433f44 prepare 3.8.1 TestFlight • 2495d04 merge keyboard-recovery fix • 7253e65 stop keyboard recovery stranding text field (pushed)

Analyzer counts: Buildr+ 0 · Closr+ 0 · Inspectr+ 0 · DailyReportr+ 0, from dart analyze lib on fresh git archive main snapshots (after flutter pub get --offline) in /private/tmp/afternoon-brief-20261004/. These match the morning brief's fresh flutter analyze. Unimported-file counts (57 total) are carried from Oct 2. No commits landed on any main, so they can't have changed.

Recurring Themes from Morning Briefs

Sources: the Oct 4, Oct 3, and Oct 1 morning briefs (briefs/).

Feature Ideas + UI/Code Health Recommendations

There are 3 recommendations: 2 UI/code health items and 1 feature, all taken from today's morning brief after verification on main. For dedup, git log --all -i --grep and -S on each keyword found no prior work beyond the original 80431e2 (Buildr+ Offline Drawing Snapshot, v3.22.0), which introduced the ?? 0. Reachability was confirmed by finding importers and call sites for each target widget. The held items from Sept 28 to Oct 3 still rank ahead of these. #1 and #2 are each about an hour of work and suit a builder's second slot.

1. Drawing References That Admit Failure Inspectr+ — UI/Code Health (error state + theme cleanup)

On the inspection-item page, DrawingReferenceChips shows nothing while loading and nothing on error. On data it shows a card with the references (or "No drawing references yet") and a + chip for adding one. If getDrawingReferences fails (offline, expired session, Cloudflare error), the card disappears entirely. The inspector sees no references, can't tell the lookup failed, and loses the only add-reference entry point on that screen.

Why now: it's in today's morning brief, and the code confirms a worse version (the add button is lost too). Bluebeam's mobile app makes offline state visible through Pending Updates (intel below). This also clears the most theme-inconsistent widget in Inspectr+ (see UI Inconsistencies).

Sketch: keep the card frame in all three states. Loading: the header plus a small LinearProgressIndicator. Error: the header, "Couldn't load drawing references. Check your connection." and a Retry button that calls ref.invalidate(drawingReferencesProvider(inspectionItemId)). Keep the + chip enabled so a reference can still be added. Show no raw $e. In the same change, replace the 28 isDark parameters and the hand-rolled Colors.white/grey/black gradient and shadow with context.isDark, context.adaptiveSurface, and context.cardShadows. Add 4 widget tests (data, empty, error shows retry and add, retry re-fetches) using a provider override. Analyzer must stay at 0.

2. Stop Calling an Unlinked Snapshot “Rev. 0” Buildr+ — UI/Code Health (copy + model honesty)

When an RFI snapshot is captured without a linked drawing, the RFI evidence list shows the bold label "Unlinked Rev. 0". Revision 0 is a real revision number on many sets, so this states a plan revision that was never recorded. Older snapshots missing revision_number show as "Rev. 1". RFIs are where an architect needs drawing provenance to be accurate.

Why now: it's in today's morning brief, and Procore's drawing viewer distinguishes current from obsolete revisions (cited there). The fix is a few lines, user-visible, and has no tests covering it today.

Sketch: make DrawingSnapshotModel.revisionNumber an int?. Have fromJson keep a missing value as null (no ?? 1), and have capture pass linkedDrawing?.revisionNumber (no ?? 0). Change displayLabel to "$drawingNumber Rev. $n" when linked, and to "Drawing not linked" when drawingNumber == 'Unlinked' or the revision is null. Keep writing revision_number as-is for linked snapshots; don't touch the Cloudflare media transport. Add model tests for linked, unlinked, and legacy-missing cases, plus one widget test on the snapshot card.

3. Optional Sheet Reference on a Work Activity DailyReportr+ — Feature

A daily-report activity records name, crew, quantity, and photos, but not where on the plans the work happened. An optional free-text sheet reference ("A-201", "S-3.1 grid C/4") next to each activity gives an architect reading the report or PDF precise plan context. It doesn't turn DailyReportr+ into a drawing manager.

Why now: it's in today's morning brief. Fieldwire's plan workflow extracts sheet numbers and links callouts (cited there). The lightweight version covers the daily-report use case without plan sync. It also fits the cross-app drawing-context theme above.

Sketch: add an optional sheet_reference key to the activity JSON. DailyReportActivityDocument already round-trips original, so old reports load unchanged. Add one optional text field in the manual form and the wizard activity step. Render it as a small "Sheet A-201" caption in the saved report and the PDF activity row, and hide it when empty. Tests: old JSON loads without the key, manual and wizard saves keep it, and PDF export includes it. Don't add plan pickers or sync. Build it after the held reports_page.dart rework.

UI Inconsistencies

Competitive Intel

Tomorrow’s Build Suggestion

This is the twenty-sixth night without builders. The assignments stay held (seventh day). Queue change: today's Recommendations #1 and #2 are added as second-slot items. Each is small, user-visible, and adds tests. Owner actions before either build: check the 00:15 and 01:15 builder launch jobs, push the unpushed main commits (Buildr+ 4, Closr+ 6, Inspectr+ 7), and make the one-line Connected Sources decision. For Closr+, stage explicit paths rather than using git add -A.

Dominique → Buildr+

Task: Deletes That Wait for the Server (Sept 28 Recommendation #1). If time remains, do Recommendation #2 (the "Drawing not linked" snapshot label, with model tests). Rationale: Buildr+ hasn't had a nightly feature since Aug 5. Both fixes stop the app from reporting things that didn't happen, and both are reachable from the main project and RFI flows.

Katey → DailyReportr+

Task: a single reports_page.dart rework: Admin Reports That Admit Failure, then the shared ReportSummaryCard without the fake "1 activity" badge, then a lazy SliverList. Rationale: it's the stalest app (20 days on main), and all three fixes target one reachable file. Recommendation #3 (sheet reference) comes after it. Queued next for whichever builder frees up first: Inspectr+ Drawing References That Admit Failure (Recommendation #1), then the Inspectr+ tapped-photo fix, then Inspectr+ Save & Add Next (Oct 3).