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/).
- Don't manufacture certainty: this is the strongest theme, now four briefs running. It covered sync receipts (Sept 27),
_markSynced(Sept 29), and queue honesty (Oct 3). Today it extends to drawing provenance: an invented "Rev. 0" and a failed lookup that looks like "no references". Today's ideas are the first in this theme that target code users can actually reach, so two of them are promoted (Recommendations #1 and #2). - Drawings/plan context across apps: all three of today's ideas involve drawings (Buildr+ snapshot revision, Inspectr+ references, DailyReportr+ sheet reference). This continues the Sept 29 Inspectr+ "no revision field on
DrawingReference" finding. The morning brief also keeps the scope narrow: label existing data correctly and capture a lightweight reference, without building plan sync. - Morning-brief dedup is improving: the Oct 4 brief explicitly checked its ideas against reachable UI after yesterday's rejections. This afternoon's
git log --allandgit greponmainconfirmed all three are new. - Automation stall: 26 nights. The morning sources still check only the retired review producer and not the builder launch jobs.
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
- Inspectr+ theming in
DrawingReferenceChips: it passesbool isDarkthrough 28 times and hand-builds its surface from rawColors.white/Colors.grey/Colors.black(15 uses). Meanwhileapp_extensions.dartalready providescontext.isDark,adaptiveSurface,cardBorder, andcardShadows. 53 Inspectr+ files still callTheme.of(context).brightness == Brightness.darkdirectly. This is the sameisDarkprop-drilling that Katey's Aug 2 and Aug 3 polish passes removed from DailyReportr+ and Closr+. Recommendation #1 fixes this widget; the other 52 files are a good follow-up for a builder's second slot. - Empty vs. failed states look identical: Inspectr+ references hide on error (Recommendation #1), and the DailyReportr+ admin Reports page shows "No Reports Yet" after a failed load (still held). Inspectr+'s
SyncOutboxBanneris the only good example. A shared "couldn't load + Retry" pattern would make all four apps consistent. - Revision label copy: Buildr+ shows
"<number> Rev. <n>"for both drawing revisions and snapshots, but snapshots fill in values that were never recorded ("Unlinked Rev. 0"; Recommendation #2). - Carried over, unchanged (no commits): Buildr+ uses a custom
Icons.arrow_back_iosback button on 9 reachable pages. The Inspectr+ gallery opens on photo 1 regardless of which thumbnail was tapped. The DailyReportr+ "Today" pill looks tappable but isn't. RawColors.green: DailyReportr+ 40, Inspectr+ 29, Buildr+ 0, Closr+ 0. Sync indicators differ in all four apps.
Competitive Intel
- Quiet week for shipped, in-scope features. Procore's releases from Sept 24 to Oct 4 are Datagrid/Control Tower, Private Space, Acumatica PO export, and iOS/Android 2026.0923 bug fixes (camera autofocus, markup visibility, and dark-mode Safety Card rendering). All were reported Sept 28 to Oct 3 or are outside our scope. already reported Sept 28, Sept 30, Oct 3 [source] [releasebot]
- Bluebeam on mobile, iOS 1.32 (Aug 25): photo attachments on markups and a combined history/comments timeline, fully offline with automatic sync. Offline changes show as pending until reconnection. This is the benchmark for Recommendation #1: make the unavailable state visible instead of hiding it. out of the 7-day window; already reported in September [source]
- Procore Drawings: Current Drawings is determined by the uploaded revisions, and the viewer lets you step between older and newer revisions, with Change History. Revision identity is treated as a fact, never a placeholder (Recommendation #2). current capability, not dated (via morning brief) [source]
- Fieldwire: the product-updates page's newest entries are from June 2026 (editable submittal numbers, Primavera P6 import). The blueprint workflow extracts sheet numbers and auto-links callouts, which is the heavy version of Recommendation #3. no in-window ship found; current capability [updates] [blueprint]
- Not used: search summaries described a Procore "October General Enhancements" and an Explore feed "available Oct 13, 2026". Those dates are in the future or match items already reported Oct 2, so they're excluded. No dated PlanGrid or Autodesk Construction Cloud ship was found for the last 7 days.
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).