Lab Architect / Ellsworth
Afternoon Brief
Friday, September 25, 2026 — Seventeenth consecutive night with no nightly-branch build on any app. No feature/nightly-20260925 (Dominique) or feature/nightly2-20260925 (Katey/Howard-3) branch exists on any of the four repos, and git log --all --since="36 hours ago" is empty on all four app repos. Yesterday's reassignments (Dominique → Closr+ Procore secret, Katey → DailyReportr+ Semantics) were not picked up either. Codebase health: 0 analyzer issues on all four apps (verified on git archive main snapshots). Local main on Buildr+/Closr+/Inspectr+ is still 4/6/7 commits ahead of origin/main, unpushed since Sept 21. New finding today: Closr+ has had 25 MB of node_modules/ (1,645 files) committed to git since May 22, even though .gitignore excludes it (Recommendation #1). Correction: yesterday's brief said all 40 DailyReportr+ raw greens were in four manager pages. They actually span eight files (see UI Inconsistencies). Source note: /Volumes/Media/App Dev/ is still missing. This run used ~/Documents/Applications/<App>.
Last Night’s Builds
No nightly-branch build on any app, seventeenth night running missed
Ran a fresh git fetch origin on all four repos. There is no *nightly*2026092[45] branch on any remote, and git log --since="18 hours ago" returns nothing on main or origin/main. Today's Fountainhead morning report (morning-reports/2026-09-25.md) again shows the Ellsworth nightly build-review producer MISSING. Its log tail still ends at the Sept 6 run, and the report adds a new Hermes warning: "a previous hermes update pulled new code but did not restart running gateways." That stale gateway is a plausible cause of the builder stall and is worth checking first.
Buildr+ 4 commits unpushed · working copy off main
Local main head a7a5a03 (Sept 21) is 4 ahead / 0 behind origin/main (33c825f). The working copy is still on fix/project-card-contract-value-spacing, which has no unique work. Unchanged since yesterday.
Closr+ 6 commits unpushed · 1,645 tracked vendored files
Local main head 0925b0b (Sept 21) is 6 ahead / 0 behind origin/main (7a3ca21). The "1,645 deleted files" in git status are the node_modules/ tree that 95d07fc (Closeout Warranty QR Tags, May 22) committed. It was later removed from disk, so every git add -A in this repo would now stage a 1,645-file deletion.
Inspectr+ 7 commits unpushed
Local main head 8145093 (Sept 21) is 7 ahead / 0 behind origin/main (4140149, Sept 8). origin/main has now been silent for 17 days.
DailyReportr+ silent 11 days · working copy 105 behind main
main = origin/main = 0433f44 (Sept 14, 3.8.1 TestFlight prep). The working copy is still parked on the Aug 11 fix/owner-report-media-web branch with uncommitted WIP.
Codebase Health
| App | Analyzer Issues | Breakdown | Last 3 Commits (local main) |
|---|---|---|---|
| Buildr+ | 0 | dart analyze lib on git archive main: "No issues found!" 256 Dart files, 86 test files. Raw Colors.green: 0. Semantics: 17. Raw Color(0x…) outside the palette file: 156. |
a7a5a03 merge harden-ios-release-gate • a2873c3 merge project-card spacing fix • fac04bd source protected secrets file (unpushed) |
| Closr+ | 0 | "No issues found!" 266 Dart files, 35 test files (lowest ratio in the fleet). Raw Colors.green: 0. Semantics: 10. Repo hygiene: 1,645 vendored node_modules/ files (25 MB) tracked despite .gitignore:56. The Procore client secret is still in-app. |
0925b0b merge harden-ios-release-gate • d4c8952 gate TestFlight IPA on client IDs • ca33394 bump TestFlight 2.32.75 (unpushed) |
| Inspectr+ | 0 | "No issues found!" 177 Dart files, 66 test files. Raw Colors.green: 29 (unchanged). Semantics: 37 (highest in the fleet). |
8145093 merge Google sign-in client-ID fix • 5e0849b merge harden-ios-release-gate • 744cc12 add iOS artifact gate (unpushed) |
| DailyReportr+ | 0 | "No issues found!" 244 Dart files, 75 test files. Raw Colors.green: 40 across 8 files, against 144 uses of the AppColors.primaryGreen token. Semantics: 7 (lowest in the fleet). |
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. With no commits, nothing made health worse. The open risks are process and hygiene: 17 unpushed commits across three apps, two working copies parked off main, and a vendored JS dependency tree in Closr+'s git history.
Recurring Themes from Morning Briefs
Sources: the Sept 19, 20, and 21 morning briefs (still the newest in briefs/, with no new file for a fourth day) and today's Fountainhead morning report.
- Automation is down, not just the builders: the build-review producer has been MISSING every morning since Sept 7,
briefs/stalled after Sept 21, and today's report flags Hermes gateways that were never restarted after an update. These three stalls likely share one root cause. - Security debt carried over: Closr+'s Procore OAuth client secret in
procore_service.dartremains the highest-severity known issue. It has been assigned for 9+ nights and is still unbuilt. - Sync false-success: Inspectr+ Walk Mode can report "synced" when retries fail, and Closr+'s unknown
SyncSourcefalls back to Procore. Both are still unbuilt, and so is the Inspectr+ backoff task. - Accessibility and color consistency: the DailyReportr+ report outline (0
Semanticsindaily_report_view.dart) and the 29 Inspectr+ raw greens were yesterday's recommendations. Both are still open and remain valid. - Destructive-action recoverability: the Closr+
deleteDocument()hard delete is still unaddressed.
Feature Ideas + UI/Code Health Recommendations
3 new recommendations: 2 UI/code health and 1 feature. Each was dedup-checked today with grep over lib/ on main and with git log --all. Yesterday's three (Inspectr+ green tokens, DailyReportr+ report outline, Closr+ recoverable delete) are still open and unbuilt. They aren't repeated here.
1. Untrack Closr+'s Committed node_modules Closr+ — Code Health
git ls-tree -r origin/main lists 1,645 files under node_modules/ (pdf-lib, @pdf-lib, pako, tslib, plus .cache/wrangler/wrangler-account.json and pages.json), about 25 MB. They were added in 95d07fc (May 22) even though .gitignore:56 excludes node_modules/. The only consumer is the one-off seeding script scripts/upload_sample_documents.js, and the repo root has no package.json to reinstall from. Every Closr+ clone pays for this, and the committed wrangler cache files leak account metadata. No prior cleanup commit exists (git log --all | grep -i "node_modules\|gitignore" is empty).
Why now: the files were deleted from disk, so the Closr+ working tree shows 1,645 pending deletions. Anyone who lands the 6 unpushed commits with git add -A will commit a huge accidental-looking diff mixed in with real work. Cleaning it up deliberately and separately keeps history readable.
Sketch: Add scripts/package.json pinning pdf-lib, then run git rm -r --cached node_modules in its own commit ("chore: stop tracking vendored node_modules"). Check that node scripts/upload_sample_documents.js still runs after npm ci --prefix scripts. Add a CI or pre-commit guard that fails if git ls-files node_modules | wc -l is non-zero. Leave history rewriting out of scope.
2. Tokenize DailyReportr+ Manager-Page Greens DailyReportr+ — UI Health
DailyReportr+ defines AppColors.primaryGreen (lib/theme/app_colors.dart:9, #33CC66) and uses it 144 times. Another 40 call sites still use Material's duller Colors.green (#4CAF50): materials_manager_enhanced_view.dart 11, task_manager_enhanced_view.dart 8 (e.g. line 180 completed-check icon, 374 status color, 434/491 button backgrounds), notes_manager_enhanced_view.dart 8, equipment_manager_enhanced_view.dart 6, checklist_manager_enhanced_view.dart 4, plus 1 each in gallery_manager_enhanced_view.dart, daily_report_enhanced_wizard.dart, and widgets/item_photo_manager_field.dart. No prior token migration exists (git log --all | grep -i "colors.green\|color token\|tokeniz" is empty).
Why now: DailyReportr+ is the fleet's stalest app (11 days), and this is a mechanical, low-risk change for one night. It also mirrors yesterday's Inspectr+ recommendation, so the same guard test can protect both apps.
Sketch: Replace Colors.green → AppColors.primaryGreen, and map any .shadeNNN uses to withValues(alpha:) tints. Add a test/no_raw_material_green_test.dart that scans lib/ for (^|[^A-Za-z_])Colors\.green and fails on any match. Do a light/dark visual pass on the tasks and materials managers.
3. Submittal Attachment Bundle Buildr+ — Feature
SubmittalModel carries List<String> attachments (lib/models/submittal_model.dart:27), and submittal_detail_page.dart manages them through photo_attachments_mixin. However, reviewers and subs can only open files one at a time. There is no way to hand the full package to an architect or owner in one step. grep -rniE "ZipEncoder|package:archive|downloadAll|download all" lib and git log --all | grep -iE "zip|download all|bulk download" are both empty. share_plus and path_provider are already in pubspec.yaml.
Why now: Procore shipped a consolidated submittal-package PDF on Sept 15, and Autodesk Build already offers a download-all ZIP for submittal attachments, so a one-tap package is table stakes that Buildr+ lacks. Buildr+ has not had a nightly feature since Aug 5.
Sketch: Add the archive package and a SubmittalBundleService.build(submittal) that fetches each attachment, adds a generated 00_cover.txt (number, title, spec section, status, reviewer, due date), and writes {number}_{title}.zip to the temp dir. Add a "Share package" action in the detail page's AppBar, using SharePlus on mobile and a browser download on web. Disable it with a tooltip when there are no attachments. Tests: filename sanitizing, cover contents, and handling of a missing or failed attachment (skip it and list it in the cover sheet instead of failing the whole bundle).
UI Inconsistencies
- DailyReportr+ has two success greens: 144 call sites use
AppColors.primaryGreen(#33CC66) and 40 use MaterialColors.green(#4CAF50). The raw greens cluster in the six*_manager_enhanced_view.dartpages, so a completed task in the Tasks manager is a different green from a completed item on the dashboard (Recommendation #2). This corrects yesterday's "all 40 in four manager pages". - Inspectr+ has the same split: 29 raw
Colors.greenagainst theAppColors.greentoken, concentrated insettings/security_page.dart,admin_management_page.dart, andai_assist_dialog.dart. Unchanged since yesterday. primaryBluemeans three different colors: Closr+lib/theme/app_colors.dart:10is0xFF267B4A, which is green (kept as a "legacy API name", with 578 references). Buildr+ uses navy0xFF234B74and DailyReportr+ uses #2563EB. Unchanged.- Uneven accessibility across the fleet:
Semanticsusage ranges from 37 (Inspectr+) to 17 (Buildr+), 10 (Closr+), and 7 (DailyReportr+), even though all four apps share the same kinds of dense field-report screens. - Heavy raw hex colors outside the palette files:
Color(0x…)literals outsideapp_colors.dartnumber 284 in Inspectr+, 170 in DailyReportr+, 156 in Buildr+, and 110 in Closr+. That makes token drift like the green splits above easy to introduce. This is informational and will be a future cleanup candidate once the green migrations land.
Competitive Intel
- Autodesk Build: submittal "download all attachments" as one ZIP, and customizable per-type RFI forms date unverified. Search surfaced these as September releases: any submittal stakeholder can download all attachments as a single ZIP, and RFI forms can be customized per type and linked to Cost workflows (PCOs, budgets, contracts). The Autodesk blog returned HTTP 403 to fetch, and these items appear to come from an earlier-year "45+ September releases" post, so treat them as current capability rather than this week's news. They still inform Recommendation #3 for Buildr+. [source]
- Procore Daily Log email notifications redesigned across Web, iOS, and Android to be clearer, more actionable, and easier to scan on mobile. Relevant to DailyReportr+'s owner-report delivery. Procore's iOS Inspections sync header (time estimate plus selective download) remains the most relevant item for Inspectr+. [source]
- Bluebeam (Sept 1): expanded MCP support (now including ChatGPT/Codex), new hyperlink and bookmark workflows, and faster Studio search across Sessions and Projects with clearer review-status visibility. This is adjacent rather than core to our surface area. Fieldwire: no shipped updates found in the last ~7 days. [source]
Tomorrow’s Build Suggestion
The builders haven't run in 17 nights, so no assignment will land until the automation is fixed. Check the un-restarted Hermes gateways flagged in today's morning report first. The picks below favor small, well-scoped tasks on the two apps that have gone longest without a nightly build. Owner action before either build: push the unpushed main commits (Buildr+ 4, Closr+ 6, Inspectr+ 7). For Closr+, use git add with explicit paths, not -A, so the 1,645 node_modules deletions don't get swept in (Recommendation #1).
Dominique → Buildr+
Task: Submittal Attachment Bundle (Recommendation #3), starting from main, not the parked fix/project-card-contract-value-spacing checkout. Rationale: Buildr+ hasn't had a nightly feature since Aug 5, both Procore and Autodesk already ship this flow, and it is a self-contained change touching 2–3 files.
Katey → DailyReportr+
Task: Tokenize the 40 raw greens and add the guard test (Recommendation #2), starting from main. If time remains, start the daily_report_view.dart Semantics outline. Rationale: this is the stalest app (11 days), the change is mechanical and low-risk, and it leaves the codebase measurably cleaner (40 → 0 raw greens, locked by a test).