Changelog
Activity Tracking, Glass, and the Calendar Scrubber
The headline is Activity Tracking — a new Daily Progress report that pulls the live daily-report feed into an expandable work-breakdown tree, each line showing where the work stands against plan (Completed, Ahead, Behind, Not Started) and its trend, with parents rolling up from their children. Alongside it, the whole map surface gets a pass: the frosted-glass look is now one shared recipe applied across every panel, the rail, the scrubber, dropdowns, and portfolio cards; the timeline gains a real calendar date-picker that marks drone-flight days; and scrubbing finally behaves — the aerial hides the instant you grab the handle and only reveals the correct new date when you let go.
- NewActivity Tracking: a new Daily Progress report on the live daily-report feed — an expandable work-breakdown tree where each activity shows status (Completed / Ahead / Behind / Not Started) and trend, and parents roll up by weight from their children
- NewGlass design system: the frosted-glass recipe (scrim + blur + shadow) is tokenized and applied consistently across panels, the global rail, the scrubber, the legend, dropdown menus, and portfolio cards
- NewTimeline calendar: a new date-picker popover with drone-flight days marked by a darker frame; jump straight to any flight date
- NewScrubbing hides the drone aerial the moment you grab the handle (even when cached) and reveals only the correct new-date image on release — no more flash of the stale aerial
- NewThe scrubber resizes to clear the QC drawer when it opens and never covers the Info button
- NewReference layers: clicking one opens an info panel showing its name and color swatch
- NewFeeder names resolved on the map
- NewNew shared DropdownMenu, Modal, and SecondaryNav primitives; the account menu’s Sign out is now legible in both tones with a neutral hover
- NewBottom-of-map chrome (Info button, zoom controls, timeline) aligned on a single baseline; satellite stays put while scrubbing so the map never goes fully blank
- NewNew default login panorama, higher-resolution pano processing, and a hardened pano-processing script
- FixQC side panel de-blued: metric labels adopt the site-progress type styling, “People” renamed to “Details”, Scope capitalized, and a divider under each subsection
- FixMV feeders visible from zoom 12; tightened layers-panel spacing under the view picker; calendar-icon spacing in the scrubber
- ChoreRoadmap trimmed to active work; added the View-on-Map plan and the collaborative user-access model spec under docs/Projects/
Sign-In, Live Projects, and the Map Agent
Construct 3 gets real per-user authentication: you sign in with your own Cognito credentials and the app routes to the matching environment’s data, with sessions that refresh themselves and a true sign-out. Projects are no longer a hardcoded list — they load live and account-wide from ClearSky. A floating AI agent can drive the map by voice of chat, a native view primitive captures layer presets, and the layers panel now only shows what a project actually has.
- NewReal per-user Cognito sign-in with per-environment data routing; refresh-token rotation for long-lived sessions; sign-out is now a true logout; accounts list cached for instant re-login
- NewThe Cognito session is the single access gate — the separate app-level gate code is retired
- NewProjects are live-wired account-wide from ClearSky; the static project list is sunset and env + torque-tube gating consolidated
- NewMap AI agent: floating Agent panel with client-executed tools, project-scoped chat, block disambiguation, and framed fly-to
- NewViews: native view primitive built on a layerset model
- NewLayers panel: rows hide when the project has no data for them (Elevation, Observations, Panoramas); reference-layer and observation checkboxes render in the layer’s own color; layer toggle shown as a check
- NewPersistent light/dark theme toggle shared across home, portfolio, and account
- NewCompliance record detail page; staged password→account sign-in flow; unified dark subnav across reports and records; top-left info chrome and panel alignment polish
- NewScrubber timeline derives its horizon from plan data and extends to plan end; mountain plays from project start
- RefactorMapCanvas decomposed into focused hooks; ClearSky tokens minted in-process (dropped the server-to-server hop); identity-scoped client caches and a same-origin MVT tile proxy
- FixReference Layers folder toggle no longer desyncs from its child layers after switching projects
- FixBlock labels unified on one parser (killed a duplicate selected label); empty geo_uuid no longer cached; "Inverter" pluralized; compliance-records self-fetch origin derived from the request
- ChoreDocs reorganized into reference + Projects/, AUTH.md rewritten, README added; orphaned modules, public assets, and the dead pin-icon system purged
Home, Account, Portfolio
The home page loads all projects account-wide and groups them into Construction, Development, and Service grids. Navigation moves to a collapsible left rail. The QC dashboard is wired to real observation data, the site mountain doubles as a timelapse control, and inspection detail pages are now accessible from records.
- NewHome: account-wide project loader with phase-grouped grids (Construction, Development, Service); MasTec added to portfolio
- NewTop navigation bar replaces the left-side rail; GlobalSidebar and HomeTopbar reskinned
- NewSite mountain: tap to toggle timelapse, hover to reveal play/pause; as-of date label; verified observations shown grey on the map
- NewQC dashboard: three-status sparklines, priority donut, 12-month close-out bar chart, Last 30 Days panel, granularity picker, all on live observation data
- NewPile installation report: S-curve progress chart and daily throughput bars, added as a report tab
- NewInspection detail page: compliance records, sign-off status, full field breakdown
- NewReport tabs, context menu, AI chat, QC drawer deep-link, chart polish
- NewInfoPanel: readable titles for all element layer types; default position no longer obscures the sidebar rail
- NewC3 design: type scale overhaul, white subnav bar, --c3l-status-* and --c3l-priority-* token families, shared ObsStatusBadge / PriorityBadge / SortChevron primitives
- RefactorComponent model Tracks A and B complete: InfoPanel, LayersPanel, MapCanvas, MapStage decomposed into focused hooks; MapSession context; 7 data hooks migrated to SWR; mapRef split-brain resolved
- FixError boundaries applied to every surface; 9+ exhaustive-deps violations resolved; latest-ref writes moved from render into useEffect
- FixRecords: subnav locked to top of viewport; paginator visible during refetch; Inspection chip on observation detail now navigates correctly
- FixAbortController replaces cancelled flags across fetch hooks; DEM URL route returns gracefully when no DEM exists; QC priority badge hidden when unset
Inspection and Observation Records
Observations and inspections become working surfaces, not just lists. Each row opens a detail page with a full activity timeline, inline images, and a share button. Column filters query Construct directly so results are paginated and accurate, and the project QC config is cached so repeated filtering does not refetch it.
- NewObservation detail page: activity timeline with inline images, thumbnails, dated lightbox, multi-assignee, multi-notifier, share button
- NewRecords tables: clickable rows, sortable columns, status visuals
- NewInspection filters push all params upstream (inspection_key, name, group, scope, sub-scope, status, sign-off); single paginated query, real totals
- NewObservation filters push into the qc_issues search body (ID, QC type, reporter, deficiency, defect, assignee, description, inspection ID, status, priority)
- NewScope, Sub-Scope, and QC Type filters sourced from the live project QC config; Status, Priority, and Sign-off move into column headers; filter-pill rows removed
- NewQC Settings: live scope and subscope lookups, Configuration and Inspection Templates pages
- NewAccount settings screen; role picker on the sign-in screen
- NewInfoPanel: count / percent toggle on block Production rows
- RefactorShared project-detail / qc_config cache reduces repeated fetches across QC surfaces; observation-detail fetch shared between map drawer and records detail page
- FixCross-project data leak on the observation detail surface
- FixPortfolio: cards held until open-issues count resolves, zero-actual card state, sign-in WebGL context leak
- FixInfoPanel expand / collapse: no flashing across feature changes, state unified across layouts
- FixMap: selected date seeded from shared flight cache; map-reuse change that broke home-to-project navigation reverted
Portfolio Mountains
The home page becomes a wall of mountain charts. Each project card shows the site progress mountain as of its last aerial flight with Plan, Delta, and Actual at a glance. Projects sort into Construction, Development, and Service tabs, and the company name, tabs, and account controls consolidate into a single top strip.
- NewPortfolio: mountain chart cards replace the project list; Plan / Delta / Actual as of each project's last flight; whole card navigates into the project
- NewPhase tabs (Construction / Development / Service) wired to real project status; off-tab cards do not mount
- NewSingle black top strip: company name, phase tabs, account and settings controls
- NewSettings section added under General in /settings
- RefactorShared progressChart module backs both the site panel and portfolio cards with one series engine and one chart component
- ChoreDonut archived as DonutSummary for the internal demo; removed from the live panel
QC Deep-linking
Selecting a QC observation now scrolls the map so the element is never hidden behind a panel. Renew Energy joins as a new account with four projects.
- NewQC observation selection: focus ring and viewport offset so the selected element is not occluded by the panel
- NewRenew Energy account: four projects (Agave, Apollo, Helios, Sol)
- NewLogin dropdown is scrollable for large account lists
- RefactorisPlaying lifted to MapCanvas; TimeScrubber and Timelapse share one copy of play state
- ChoreDead sign-in page removed; version bump tooling simplified
Foundation
Initial numbered release. Establishes the core map experience: the digital twin layer stack, the floating layers panel, the time scrubber, ortho imagery, row-number labels, reference layer overlays, and the C3 design system across both the dark map surface and the light reports surface.
- NewDraggable floating LayersPanel; agent button always visible; map clicks do not collapse panels
- NewRow-number chips at each tracker head; label extraction works across project call signs
- NewLayer name click toggles visibility; zoom slider range correct at layer boundary
- NewSite info panel opens by default at low zoom; InfoPanel extended to feeders with element_progress BOM rows
- NewReference layers: ALTA surveys, easements, utility lines via GeoJSON proxy to avoid tile coordinate mismatches
- NewPanorama layer: pano pins on the map, click opens image, pool refreshes each session
- NewOrtho imagery via TiTiler COG proxy; presigned URL resolved at runtime, not hardcoded
- NewC3 Light design system tokenized (23 --c3l-* custom properties); reports surface migrated
- NewQC observation drawer: counts per module, inspection details, open issues badge
- FixLogin screen reuses one WebGL context for the pano background; previously leaked a context per visit
- FixOrtho date-match: initial load was picking the page-1 date on multi-page flight lists
- FixMap camera initializes from the active project, not a hardcoded constant; fixes blank aerial on first load
- RefactorSingle source of truth for the displayed ortho URL; add-before-remove swap eliminates blank frames during date transitions