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.

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

Competitive Intel

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