Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2444 commits
Select commit Hold shift + click to select a range
91c7140
feat(apps/windows): FleetAPIPage at web parity (W7 admin)
atulmgupta Jun 13, 2026
b15449a
Merge branch 'auto/p/p2-windows__pages__admin__FleetAPIPage.prompt.md…
atulmgupta Jun 13, 2026
4917f1b
chore(runner): mark p2-windows/pages/admin/FleetAPIPage.prompt.md done
atulmgupta Jun 13, 2026
c18f095
feat(apps/windows): GDPRExportPage at web parity (W7 admin)
atulmgupta Jun 13, 2026
b47e55c
Merge branch 'auto/p/p2-windows__pages__admin__GDPRExportPage.prompt.…
atulmgupta Jun 13, 2026
0191687
chore(runner): mark p2-windows/pages/admin/GDPRExportPage.prompt.md done
atulmgupta Jun 13, 2026
435c957
feat(apps/windows): LiveSignalInspectorPage at web parity (W7 admin)
atulmgupta Jun 13, 2026
8f38ff0
Merge branch 'auto/p/p2-windows__pages__admin__LiveSignalInspectorPag…
atulmgupta Jun 13, 2026
8a75855
chore(runner): mark p2-windows/pages/admin/LiveSignalInspectorPage.pr…
atulmgupta Jun 13, 2026
1ccd3fa
feat(apps/windows): RbacMatrixPage at web parity (W7 admin)
atulmgupta Jun 13, 2026
73952bc
Merge branch 'auto/p/p2-windows__pages__admin__RbacMatrixPage.prompt.…
atulmgupta Jun 13, 2026
a5dfe4a
chore(runner): mark p2-windows/pages/admin/RbacMatrixPage.prompt.md done
atulmgupta Jun 13, 2026
3be8ad4
chore(runner): mark p2-windows/pages/admin/SecretRotationPage.prompt.…
atulmgupta Jun 13, 2026
acfc145
feat(apps/windows): IngestXRayPage at web parity (W7 admin)
atulmgupta Jun 13, 2026
fb6acb7
Merge branch 'auto/p/p2-windows__pages__admin__IngestXRayPage.prompt.…
atulmgupta Jun 13, 2026
bdfc58e
chore(runner): mark p2-windows/pages/admin/IngestXRayPage.prompt.md done
atulmgupta Jun 13, 2026
6e88a65
feat(apps/windows): RedisSignalViewerPage at web parity (W7 admin)
atulmgupta Jun 13, 2026
c98356e
Merge branch 'auto/p/p2-windows__pages__admin__RedisSignalViewerPage.…
atulmgupta Jun 13, 2026
2a4b1e4
chore(runner): mark p2-windows/pages/admin/RedisSignalViewerPage.prom…
atulmgupta Jun 13, 2026
21e814d
feat(apps/windows): TeslaOrdersPage at web parity (W7 admin)
atulmgupta Jun 13, 2026
1900e7a
chore(runner): mark p2-windows/pages/admin/SlowQueriesPage.prompt.md …
atulmgupta Jun 13, 2026
d4802ac
chore(runner): mark p2-windows/pages/admin/SystemPage.prompt.md done
atulmgupta Jun 13, 2026
ecb2053
Merge branch 'auto/p/p2-windows__pages__admin__TeslaOrdersPage.prompt…
atulmgupta Jun 13, 2026
be4004c
chore(runner): mark p2-windows/pages/admin/TeslaOrdersPage.prompt.md …
atulmgupta Jun 13, 2026
d8b7cfc
chore(runner): mark p2-windows/pages/admin/SecurityAccessPage.prompt.…
atulmgupta Jun 13, 2026
886c935
chore(runner): mark p2-windows/pages/admin/TeslaFeatureFlagsPage.prom…
atulmgupta Jun 14, 2026
c057f9f
feat(apps/windows): UsersPage at web parity (W7 admin)
atulmgupta Jun 14, 2026
41be963
Merge branch 'auto/p/p2-windows__pages__admin__UsersPage.prompt.md' i…
atulmgupta Jun 14, 2026
cc53a52
chore(runner): mark p2-windows/pages/admin/UsersPage.prompt.md done
atulmgupta Jun 14, 2026
21d84e1
chore(runner): mark p2-windows/pages/analytics/LifetimeStatsPage.prom…
atulmgupta Jun 14, 2026
3fc0fe3
chore(runner): mark p2-windows/pages/analytics/AnalyticsPage.prompt.m…
atulmgupta Jun 14, 2026
8c3d548
feat(apps/windows): FleetComparePage at web parity (W7 analytics)
atulmgupta Jun 14, 2026
f24524b
Merge branch 'auto/p/p2-windows__pages__analytics__FleetComparePage.p…
atulmgupta Jun 14, 2026
13963b9
chore(runner): mark p2-windows/pages/analytics/FleetComparePage.promp…
atulmgupta Jun 14, 2026
f38cf46
feat(apps/windows): MileagePage at web parity (W7 analytics)
atulmgupta Jun 14, 2026
5b0b8fc
Merge branch 'auto/p/p2-windows__pages__analytics__MileagePage.prompt…
atulmgupta Jun 14, 2026
8d938c5
chore(runner): mark p2-windows/pages/analytics/MileagePage.prompt.md …
atulmgupta Jun 14, 2026
e12c475
feat(apps/windows): StatisticsPage at web parity (W7 analytics)
atulmgupta Jun 14, 2026
e8653e6
Merge branch 'auto/p/p2-windows__pages__analytics__StatisticsPage.pro…
atulmgupta Jun 14, 2026
b770e09
chore(runner): mark p2-windows/pages/analytics/StatisticsPage.prompt.…
atulmgupta Jun 14, 2026
3bb58cb
feat(apps/windows): PeriodComparePage at web parity (W7 analytics)
atulmgupta Jun 14, 2026
d2d881c
Merge branch 'auto/p/p2-windows__pages__analytics__PeriodComparePage.…
atulmgupta Jun 14, 2026
fe605d8
chore(runner): mark p2-windows/pages/analytics/PeriodComparePage.prom…
atulmgupta Jun 14, 2026
b1c8de0
feat(apps/windows): BatteryCellsPage at web parity (W7 battery)
atulmgupta Jun 14, 2026
5cf0260
Merge branch 'auto/p/p2-windows__pages__battery__BatteryCellsPage.pro…
atulmgupta Jun 14, 2026
072385d
chore(runner): mark p2-windows/pages/battery/BatteryCellsPage.prompt.…
atulmgupta Jun 14, 2026
9ec5b38
feat(apps/windows): BatteryHealthPage at web parity (W7 battery)
atulmgupta Jun 14, 2026
4009b03
Merge branch 'auto/p/p2-windows__pages__battery__BatteryHealthPage.pr…
atulmgupta Jun 14, 2026
5268927
chore(runner): mark p2-windows/pages/battery/BatteryHealthPage.prompt…
atulmgupta Jun 14, 2026
72bdd56
feat(apps/windows): SleepEfficiencyPage at web parity (W7 battery)
Copilot Jun 14, 2026
4b26c77
Merge branch 'auto/p/p2-windows__pages__battery__SleepEfficiencyPage.…
atulmgupta Jun 14, 2026
d5743b9
chore(runner): mark p2-windows/pages/battery/SleepEfficiencyPage.prom…
atulmgupta Jun 14, 2026
9b33eaf
feat(apps/windows): PowerFlowDashboardPage at web parity (W7 battery)
atulmgupta Jun 14, 2026
d65dcea
Merge branch 'auto/p/p2-windows__pages__battery__PowerFlowDashboardPa…
atulmgupta Jun 14, 2026
573cf00
chore(runner): mark p2-windows/pages/battery/PowerFlowDashboardPage.p…
atulmgupta Jun 14, 2026
7468772
feat(apps/windows): ChargingHeatmapPage at web parity (W7 charging)
atulmgupta Jun 14, 2026
87f9f62
Merge branch 'auto/p/p2-windows__pages__charging__ChargingHeatmapPage…
atulmgupta Jun 14, 2026
760a7bc
chore(runner): mark p2-windows/pages/charging/ChargingHeatmapPage.pro…
atulmgupta Jun 14, 2026
3137864
feat(apps/windows): TeslaChargingHistoryPage at web parity (W7 charging)
atulmgupta Jun 14, 2026
df0f33f
Merge branch 'auto/p/p2-windows__pages__charging__TeslaChargingHistor…
atulmgupta Jun 14, 2026
659cb5e
chore(runner): mark p2-windows/pages/charging/TeslaChargingHistoryPag…
atulmgupta Jun 14, 2026
88205c7
feat(apps/windows): GlancePage at web parity (W7 dashboard)
atulmgupta Jun 14, 2026
d0319b5
Merge branch 'auto/p/p2-windows__pages__dashboard__GlancePage.prompt.…
atulmgupta Jun 14, 2026
d1314fc
chore(runner): mark p2-windows/pages/dashboard/GlancePage.prompt.md done
atulmgupta Jun 14, 2026
68f01f3
feat(apps/windows): ChargingListPage at web parity (W7 charging)
atulmgupta Jun 14, 2026
5d4c698
Merge branch 'auto/p/p2-windows__pages__charging__ChargingListPage.pr…
atulmgupta Jun 14, 2026
dce6bc2
chore(runner): mark p2-windows/pages/charging/ChargingListPage.prompt…
atulmgupta Jun 14, 2026
3e102ec
feat(apps/windows): DrivetrainHealthPage at web parity (W7 driving)
atulmgupta Jun 14, 2026
c964809
feat(apps/windows): RouteEfficiencyPage at web parity (W7 driving)
atulmgupta Jun 14, 2026
20835f7
Merge branch 'auto/p/p2-windows__pages__driving__DrivetrainHealthPage…
atulmgupta Jun 14, 2026
445e66f
chore(runner): mark p2-windows/pages/driving/DrivetrainHealthPage.pro…
atulmgupta Jun 14, 2026
f36a22b
Merge branch 'auto/p/p2-windows__pages__driving__RouteEfficiencyPage.…
atulmgupta Jun 14, 2026
7aa1ae2
chore(runner): mark p2-windows/pages/driving/RouteEfficiencyPage.prom…
atulmgupta Jun 14, 2026
b96c116
feat(apps/windows): DrivingDynamicsPage at web parity (W7 driving)
atulmgupta Jun 14, 2026
e178158
Merge branch 'auto/p/p2-windows__pages__driving__DrivingDynamicsPage.…
atulmgupta Jun 14, 2026
92e7b3c
chore(runner): mark p2-windows/pages/driving/DrivingDynamicsPage.prom…
atulmgupta Jun 14, 2026
5160afb
feat(apps/windows): NavigationRoutePage at web parity (W7 maps)
atulmgupta Jun 14, 2026
91247fd
Merge branch 'auto/p/p2-windows__pages__maps__NavigationRoutePage.pro…
atulmgupta Jun 14, 2026
e43fbf6
chore(runner): mark p2-windows/pages/maps/NavigationRoutePage.prompt.…
atulmgupta Jun 14, 2026
967ddc8
feat(apps/windows): MapOverviewPage at web parity (W7 maps)
atulmgupta Jun 14, 2026
ebe6223
Merge branch 'auto/p/p2-windows__pages__maps__MapOverviewPage.prompt.…
atulmgupta Jun 14, 2026
2e93487
chore(runner): mark p2-windows/pages/maps/MapOverviewPage.prompt.md done
atulmgupta Jun 14, 2026
2efdfe0
feat(apps/windows): GeofencesPage at web parity (W7 maps)
atulmgupta Jun 14, 2026
dad6c86
Merge branch 'auto/p/p2-windows__pages__maps__GeofencesPage.prompt.md…
atulmgupta Jun 14, 2026
cf50dd1
chore(runner): mark p2-windows/pages/maps/GeofencesPage.prompt.md done
atulmgupta Jun 14, 2026
8c4f59c
feat(apps/windows): AlertsListPage at web parity (W7 notifications)
atulmgupta Jun 14, 2026
22d8d40
Merge branch 'auto/p/p2-windows__pages__notifications__AlertsListPage…
atulmgupta Jun 14, 2026
00e928f
chore(runner): mark p2-windows/pages/notifications/AlertsListPage.pro…
atulmgupta Jun 14, 2026
12848f1
feat(apps/windows): SqlPlaygroundPage at web parity (W7 power-user)
atulmgupta Jun 14, 2026
2ca73e7
Merge branch 'auto/p/p2-windows__pages__power-user__SqlPlaygroundPage…
atulmgupta Jun 14, 2026
efe3390
chore(runner): mark p2-windows/pages/power-user/SqlPlaygroundPage.pro…
atulmgupta Jun 14, 2026
6a13af7
feat(apps/windows): AuditLogPage at web parity (W7 notifications)
atulmgupta Jun 14, 2026
d8f8f50
Merge branch 'auto/p/p2-windows__pages__notifications__AuditLogPage.p…
atulmgupta Jun 14, 2026
64183fc
chore(runner): mark p2-windows/pages/notifications/AuditLogPage.promp…
atulmgupta Jun 14, 2026
8ee7047
feat(apps/windows): AlertStudioPage at web parity (W7 notifications)
atulmgupta Jun 14, 2026
672a377
Merge branch 'auto/p/p2-windows__pages__notifications__AlertStudioPag…
atulmgupta Jun 14, 2026
6e302be
chore(runner): mark p2-windows/pages/notifications/AlertStudioPage.pr…
atulmgupta Jun 14, 2026
ca52a11
feat(apps/windows): SafetyPage at web parity (W7 settings)
atulmgupta Jun 14, 2026
0240d5b
Merge branch 'auto/p/p2-windows__pages__settings__SafetyPage.prompt.m…
atulmgupta Jun 14, 2026
576269c
chore(runner): mark p2-windows/pages/settings/SafetyPage.prompt.md done
atulmgupta Jun 14, 2026
a8a1180
feat(apps/windows): IncidentTimelinePage at web parity (W7 system)
atulmgupta Jun 14, 2026
e04225d
Merge branch 'auto/p/p2-windows__pages__system__IncidentTimelinePage.…
atulmgupta Jun 14, 2026
011d172
chore(runner): mark p2-windows/pages/system/IncidentTimelinePage.prom…
atulmgupta Jun 14, 2026
993b833
feat(apps/windows): ChatbotPage at web parity (W7 system)
atulmgupta Jun 14, 2026
1ad4385
Merge branch 'auto/p/p2-windows__pages__system__ChatbotPage.prompt.md…
atulmgupta Jun 14, 2026
4b0632c
chore(runner): mark p2-windows/pages/system/ChatbotPage.prompt.md done
atulmgupta Jun 14, 2026
f01bfa5
chore(runner): mark p2-windows/pages/system/TeslaAccountPage.prompt.m…
atulmgupta Jun 14, 2026
9ddea41
feat(apps/windows): LiveSignalMonitorPage at web parity (W7 telemetry)
atulmgupta Jun 14, 2026
58014d1
Merge branch 'auto/p/p2-windows__pages__telemetry__LiveSignalMonitorP…
atulmgupta Jun 14, 2026
d74e9fe
chore(runner): mark p2-windows/pages/telemetry/LiveSignalMonitorPage.…
atulmgupta Jun 14, 2026
cf5b14c
feat(apps/windows): SignalExplorerPage at web parity (W7 telemetry)
atulmgupta Jun 14, 2026
0a09ebb
Merge branch 'auto/p/p2-windows__pages__telemetry__SignalExplorerPage…
atulmgupta Jun 14, 2026
7e3def8
chore(runner): mark p2-windows/pages/telemetry/SignalExplorerPage.pro…
atulmgupta Jun 14, 2026
e2304d6
feat(apps/windows): SignalDiffPage at web parity (W7 telemetry)
atulmgupta Jun 14, 2026
3ee8d9a
Merge branch 'auto/p/p2-windows__pages__telemetry__SignalDiffPage.pro…
atulmgupta Jun 14, 2026
06f91af
chore(runner): mark p2-windows/pages/telemetry/SignalDiffPage.prompt.…
atulmgupta Jun 14, 2026
a29e1c3
feat(apps/windows): SignalGapDetectorPage at web parity (W7 telemetry)
atulmgupta Jun 14, 2026
c408ab4
Merge branch 'auto/p/p2-windows__pages__telemetry__SignalGapDetectorP…
atulmgupta Jun 14, 2026
1023c6a
chore(runner): mark p2-windows/pages/telemetry/SignalGapDetectorPage.…
atulmgupta Jun 14, 2026
fb84f01
feat(apps/windows): VehicleListPage at web parity (W7 vehicles)
atulmgupta Jun 14, 2026
9efe09b
Merge branch 'auto/p/p2-windows__pages__vehicles__VehicleListPage.pro…
atulmgupta Jun 14, 2026
ba2c8ba
chore(runner): mark p2-windows/pages/vehicles/VehicleListPage.prompt.…
atulmgupta Jun 14, 2026
09f754a
chore(runner): mark p2-windows/pages/watch/WatchFacePage.prompt.md done
atulmgupta Jun 14, 2026
4a4277a
feat(apps/windows): DrivesListPage at web parity (W7 driving)
atulmgupta Jun 14, 2026
d82ef42
Merge branch 'auto/p/p2-windows__pages__driving__DrivesListPage.promp…
atulmgupta Jun 14, 2026
95ef9b7
chore(runner): mark p2-windows/pages/driving/DrivesListPage.prompt.md…
atulmgupta Jun 14, 2026
55778bc
feat(apps/windows): PrivacyPage at web parity (W7 settings)
atulmgupta Jun 14, 2026
2652456
Merge branch 'auto/p/p2-windows__pages__settings__PrivacyPage.prompt.…
atulmgupta Jun 14, 2026
448c0e3
chore(runner): mark p2-windows/pages/settings/PrivacyPage.prompt.md done
atulmgupta Jun 14, 2026
6716678
chore(runner): skip GrafanaPanelPage (user-sanctioned; persistent emp…
atulmgupta Jun 14, 2026
6140f45
feat(apps/windows): DataRepairPage at web parity (W7 system)
atulmgupta Jun 14, 2026
893e24b
Merge branch 'auto/p/p2-windows__pages__system__DataRepairPage.prompt…
atulmgupta Jun 14, 2026
e4590b0
chore(runner): mark p2-windows/pages/system/DataRepairPage.prompt.md …
atulmgupta Jun 14, 2026
e62f1f9
chore(runner): normalize EOL for clean worktree base (25 files)
atulmgupta Jun 14, 2026
60fb8db
feat(apps/windows): GuardModePage at web parity (W7 vehicle-systems)
atulmgupta Jun 14, 2026
17837e0
Merge branch 'auto/p/p2-windows__pages__vehicle-systems__GuardModePag…
atulmgupta Jun 14, 2026
b20ea1a
chore(runner): mark p2-windows/pages/vehicle-systems/GuardModePage.pr…
atulmgupta Jun 14, 2026
06df3d7
feat(apps/windows): StateMachineDebuggerPage at web parity (W7 system)
atulmgupta Jun 14, 2026
2b2a5e0
Merge branch 'auto/p/p2-windows__pages__system__StateMachineDebuggerP…
atulmgupta Jun 14, 2026
a59e92f
chore(runner): mark p2-windows/pages/system/StateMachineDebuggerPage.…
atulmgupta Jun 14, 2026
6af4596
feat(apps/windows): ExplorePage at web parity (W7 explore)
atulmgupta Jun 14, 2026
d2a427b
Merge branch 'auto/p/p2-windows__pages__explore__ExplorePage.prompt.m…
atulmgupta Jun 14, 2026
a88ed93
chore(runner): mark p2-windows/pages/explore/ExplorePage.prompt.md done
atulmgupta Jun 14, 2026
b588aa5
feat(apps/windows): SystemStatusPage at web parity (W7 system)
atulmgupta Jun 14, 2026
e6d207e
Merge branch 'auto/p/p2-windows__pages__system__SystemStatusPage.prom…
atulmgupta Jun 14, 2026
56bf148
chore(runner): mark p2-windows/pages/system/SystemStatusPage.prompt.m…
atulmgupta Jun 14, 2026
4f2dbe6
chore(windows): unmark 20 lost-casualty page bodies for re-run
atulmgupta Jun 15, 2026
0e08bd4
chore(windows): unmark 20 lost-casualty page bodies for re-run
atulmgupta Jun 15, 2026
da4938d
chore(runner): normalize EOL for clean worktree base (4 files)
atulmgupta Jun 15, 2026
4c93b98
chore(runner): mark p2-windows/pages/admin/SecretRotationPage.prompt.…
atulmgupta Jun 15, 2026
439d8d1
feat(apps/windows): FleetTelemetryCoveragePage at web parity (W7 admin)
atulmgupta Jun 15, 2026
e321929
feat(apps/windows): DiskForecastPage at web parity (W7 admin)
atulmgupta Jun 15, 2026
56ac9ec
Merge branch 'auto/p/p2-windows__pages__admin__DiskForecastPage.promp…
atulmgupta Jun 15, 2026
230470a
chore(runner): mark p2-windows/pages/admin/DiskForecastPage.prompt.md…
atulmgupta Jun 15, 2026
a61253c
Merge branch 'auto/p/p2-windows__pages__admin__FleetTelemetryCoverage…
atulmgupta Jun 15, 2026
0be674b
chore(runner): mark p2-windows/pages/admin/FleetTelemetryCoveragePage…
atulmgupta Jun 15, 2026
549d5f6
chore(runner): mark p2-windows/pages/admin/LiveLogsPage.prompt.md done
atulmgupta Jun 15, 2026
e823b13
feat(apps/windows): BackupRestorePage at web parity (W7 admin)
atulmgupta Jun 15, 2026
99246fa
Merge branch 'auto/p/p2-windows__pages__admin__BackupRestorePage.prom…
atulmgupta Jun 15, 2026
7083941
chore(runner): mark p2-windows/pages/admin/BackupRestorePage.prompt.m…
atulmgupta Jun 15, 2026
ef0a13c
chore(runner): mark p2-windows/pages/admin/SlowQueriesPage.prompt.md …
atulmgupta Jun 15, 2026
a84e045
chore(runner): mark p2-windows/pages/admin/SecurityAccessPage.prompt.…
atulmgupta Jun 15, 2026
f86f741
chore(runner): mark p2-windows/pages/admin/TeslaFeatureFlagsPage.prom…
atulmgupta Jun 15, 2026
5a87e7e
chore(runner): mark p2-windows/pages/admin/SystemPage.prompt.md done
atulmgupta Jun 15, 2026
35707eb
feat(apps/windows): TeslaRegionPage at web parity (W7 admin)
atulmgupta Jun 15, 2026
3c888e7
Merge branch 'auto/p/p2-windows__pages__admin__TeslaRegionPage.prompt…
atulmgupta Jun 15, 2026
0a00ec4
chore(runner): mark p2-windows/pages/admin/TeslaRegionPage.prompt.md …
atulmgupta Jun 15, 2026
b348cf5
feat(apps/windows): ActionBuilder at web parity (W7 automations)
atulmgupta Jun 15, 2026
023f907
Merge branch 'auto/p/p2-windows__pages__automations__ActionBuilder.pr…
atulmgupta Jun 15, 2026
e97fac2
chore(runner): mark p2-windows/pages/automations/ActionBuilder.prompt…
atulmgupta Jun 15, 2026
7d9ac22
feat(apps/windows): VampireDrainPage at web parity (W7 battery)
atulmgupta Jun 15, 2026
8cb7ca4
feat(apps/windows): LifetimeStatsPage at web parity (W7 analytics)
atulmgupta Jun 15, 2026
a02ab31
Merge branch 'auto/p/p2-windows__pages__battery__VampireDrainPage.pro…
atulmgupta Jun 15, 2026
6d6f4b0
chore(runner): mark p2-windows/pages/battery/VampireDrainPage.prompt.…
atulmgupta Jun 15, 2026
825b539
Merge branch 'auto/p/p2-windows__pages__analytics__LifetimeStatsPage.…
atulmgupta Jun 15, 2026
90df7fd
chore(runner): mark p2-windows/pages/analytics/LifetimeStatsPage.prom…
atulmgupta Jun 15, 2026
b6aacbf
feat(apps/windows): AnalyticsPage at web parity (W7 analytics)
atulmgupta Jun 15, 2026
f4bd3d0
Merge branch 'auto/p/p2-windows__pages__analytics__AnalyticsPage.prom…
atulmgupta Jun 15, 2026
91db3d6
chore(runner): mark p2-windows/pages/analytics/AnalyticsPage.prompt.m…
atulmgupta Jun 15, 2026
b2c680e
feat(apps/windows): AnomalyDashboardPage at web parity (W7 diagnostics)
atulmgupta Jun 15, 2026
f410b7c
Merge branch 'auto/p/p2-windows__pages__diagnostics__AnomalyDashboard…
atulmgupta Jun 15, 2026
f42ae1c
chore(runner): mark p2-windows/pages/diagnostics/AnomalyDashboardPage…
atulmgupta Jun 15, 2026
eb6b098
feat(apps/windows): SpeedProfilePage at web parity (W7 driving)
atulmgupta Jun 15, 2026
ecdfa2f
Merge branch 'auto/p/p2-windows__pages__driving__SpeedProfilePage.pro…
atulmgupta Jun 15, 2026
283a8c4
chore(runner): mark p2-windows/pages/driving/SpeedProfilePage.prompt.…
atulmgupta Jun 15, 2026
fb81351
feat(apps/windows): RoadmapPage at web parity (W7 system)
atulmgupta Jun 15, 2026
2fb7d17
Merge branch 'auto/p/p2-windows__pages__system__RoadmapPage.prompt.md…
atulmgupta Jun 15, 2026
c695f53
chore(runner): mark p2-windows/pages/system/RoadmapPage.prompt.md done
atulmgupta Jun 15, 2026
50f82a1
chore(runner): mark p2-windows/pages/system/TeslaAccountPage.prompt.m…
atulmgupta Jun 15, 2026
c7ca746
feat(apps/windows): SearchPage at web parity (W7 system)
atulmgupta Jun 15, 2026
11bb2d9
Merge branch 'auto/p/p2-windows__pages__system__SearchPage.prompt.md'…
atulmgupta Jun 15, 2026
a42aba9
chore(runner): mark p2-windows/pages/system/SearchPage.prompt.md done
atulmgupta Jun 15, 2026
bf8e330
feat(apps/windows): WatchFacePage at web parity (W7 watch)
atulmgupta Jun 15, 2026
99c2553
Merge branch 'auto/p/p2-windows__pages__watch__WatchFacePage.prompt.m…
atulmgupta Jun 15, 2026
94ddd57
chore(runner): mark p2-windows/pages/watch/WatchFacePage.prompt.md done
atulmgupta Jun 15, 2026
46d8608
feat(apps/windows): SecurityAccessPage at web parity (W7 admin)
atulmgupta Jun 15, 2026
9f4eecb
feat(apps/windows): TeslaFeatureFlagsPage at web parity (W7 admin)
atulmgupta Jun 12, 2026
8c8a12f
feat(apps/windows): SlowQueriesPage at web parity (W7 admin)
atulmgupta Jun 12, 2026
bcb941f
feat(apps/windows): SecretRotationPage at web parity (W7 admin)
atulmgupta Jun 13, 2026
252c9b7
feat(apps/windows): SystemPage at web parity (W7 admin)
atulmgupta Jun 12, 2026
1ab8249
feat(apps/windows): compose REST data layer into shell page factories
atulmgupta Jun 15, 2026
b75a7a9
chore(windows): unmark TeslaAccountPage + LiveLogsPage for re-run
atulmgupta Jun 15, 2026
8041ecf
chore(runner): normalize EOL for clean worktree base (9 files)
atulmgupta Jun 15, 2026
c07603c
feat(apps/windows): LiveLogsPage at web parity (W7 admin)
atulmgupta Jun 15, 2026
eba6899
feat(apps/windows): TeslaAccountPage at web parity (W7 admin)
atulmgupta Jun 15, 2026
716e3f0
feat(apps/windows): TeslaSync logo in title bar (replace generic glyph)
atulmgupta Jun 15, 2026
7295ad9
feat(windows): wire app-wide theme system (5 accents x 7 modes)
atulmgupta Jun 15, 2026
7a1f41d
fix(windows): give every nav route a distinct icon glyph
atulmgupta Jun 15, 2026
0f8f144
fix(windows): make drive rows open the detail page with live data
atulmgupta Jun 15, 2026
38502c9
fix(windows): wire 12 more pages to their live data feeds
atulmgupta Jun 15, 2026
5cc2955
fix(windows): wire 15 more pages to live data feeds (batch 2)
atulmgupta Jun 15, 2026
2854508
fix(windows): wire 18 more pages to live data feeds (batch 3)
atulmgupta Jun 15, 2026
03c80cb
fix(windows): wire 8 more pages incl. main Analytics + Notifications …
atulmgupta Jun 15, 2026
e88f902
fix(windows): wire ChargeDetail + TripDetail to live data feeds
atulmgupta Jun 15, 2026
f51148a
fix(windows): wire 7 more nav pages to live data (batch 5)
atulmgupta Jun 15, 2026
4ccc7d8
fix(windows): wire 6 more pages incl. extra-dep ctors (batch 6)
atulmgupta Jun 15, 2026
5993082
feat(windows): mount full Appearance/General/Advanced surfaces in Set…
atulmgupta Jun 15, 2026
6e41223
fix(windows): LiveSignalInspector uses the live signals table source
atulmgupta Jun 16, 2026
28cca4e
fix(windows): wire Helix page to live AI settings source
atulmgupta Jun 16, 2026
60b9d2d
feat(windows): real data widgets on the Dashboard command center
atulmgupta Jun 16, 2026
62602e7
fix(windows): wire dead page actions, remove non-functional dashboard…
Copilot Jun 16, 2026
ebe8565
fix(windows): register SafetySettingsPage route so the Settings-group…
Copilot Jun 16, 2026
f5be1de
feat(windows): wire automation card pin toggle to /pinned (web useTog…
Copilot Jun 16, 2026
9ed9f97
fix(windows): remove duplicate page heading + add per-group nav icon …
Copilot Jun 16, 2026
eb65794
fix(windows): cap bar-chart bar width so sparse data doesn't render a…
Copilot Jun 16, 2026
0284af1
feat(windows): enrich default dashboard with Digital Twin, Battery Fo…
Copilot Jun 16, 2026
9c3a7a4
fix(windows): unblock parity gates — refine placeholder patterns + no…
Copilot Jun 16, 2026
38a3255
windows parity: PowerFlowDashboard (18 units done, gates green)
Copilot Jun 16, 2026
3186175
windows parity: App.tsx route table (147 route units done, gates green)
Copilot Jun 16, 2026
f725abe
windows parity: GlancePage (12 units done, gates green)
Copilot Jun 16, 2026
7cc3a51
windows parity: AnomalyDashboard (10 units done, gates green)
Copilot Jun 16, 2026
b1bd406
windows parity: QuickStatsPage (9 units done, gates green)
Copilot Jun 16, 2026
1392673
windows parity: DashboardPage + DashboardsPage (10 units done, gates …
Copilot Jun 16, 2026
4279d7a
windows parity: DriveScore + BatteryHealth + ChargingDetail + Statist…
Copilot Jun 16, 2026
e540fee
windows parity: 7 string-complete pages (Efficiency, SharedDrive, Fle…
Copilot Jun 16, 2026
907b1c3
windows parity: 14 string-complete pages auto-verified (826/1754, 47%)
Copilot Jun 16, 2026
2c12fbe
windows parity: sweep 91 string-complete pages auto-verified (1447/17…
Copilot Jun 16, 2026
d151188
windows parity: robust string extraction fixes false-negatives, +8 pa…
Copilot Jun 16, 2026
cd4ce36
windows parity: translation-prefix fix, +12 admin/util pages (1606/17…
Copilot Jun 16, 2026
e60e6dd
windows parity: app-wide string recheck closes shared-component false…
Copilot Jun 16, 2026
0bb6358
windows parity: decode C# unicode escapes, +5 files (em-dash/ellipsis…
Copilot Jun 16, 2026
5656c00
windows parity: LEDGER COMPLETE 1747 done + 7 blocked = 1754/1754
Copilot Jun 16, 2026
42c8156
fix(apps): web-parity chrome — sidebar favorites+groups, backend them…
atulmgupta Jun 16, 2026
d6e6808
fix(apps): sync unit preference from backend /settings (web useUnits …
atulmgupta Jun 16, 2026
3013110
chore(parity): record live-visual chrome units in the windows ledger
atulmgupta Jun 16, 2026
21fab63
fix(apps): honour the unit preference on the Live Map page
atulmgupta Jun 16, 2026
243b8da
fix(apps): honour the unit preference on the Climate Control page
atulmgupta Jun 16, 2026
c2825d4
fix(apps): ambient unit preference so every page honours the account …
atulmgupta Jun 16, 2026
b3ba60d
fix(apps): convert Driving Dynamics coach efficiency + distance to ac…
atulmgupta Jun 16, 2026
23a02da
Revert "fix(apps): convert Driving Dynamics coach efficiency + distan…
atulmgupta Jun 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
7 changes: 7 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,10 @@ Dockerfile* text eol=lf
# generic case for any other proto we may vendor.
*.proto binary


# P1/S10 — generated i18n resources are written with LF by
# apps/shared/i18n/generators/gen-i18n.ts. Keep them LF on every checkout so the
# gen-i18n drift gate (-Check) doesn't false-positive on Windows (autocrlf=true).
apps/android/app/src/main/res/**/strings.xml text eol=lf
apps/windows/Strings/**/Resources.resw text eol=lf
apps/apple/**/*.xcstrings text eol=lf
66 changes: 66 additions & 0 deletions .github/prompts/_page_map.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
1|Dashboard|dashboard|DashboardPage
2|VehicleDetail|vehicles|VehicleDetailPage
3|Vehicles|vehicles|VehicleListPage
4|Charging|charging|ChargingListPage
5|ChargeDetail|charging|ChargingDetailPage
6|ChargingCurve|charging|ChargingCurvePage
7|CostAnalysis|charging|CostAnalysisPage
8|Drives|driving|DrivesListPage
9|DriveDetail|driving|DriveDetailPage
10|DriveScore|driving|DriveScorePage
11|DrivingDynamics|driving|DrivingDynamicsPage
12|DrivetrainHealth|driving|DrivetrainHealthPage
13|Efficiency|driving|EfficiencyPage
14|SpeedProfile|driving|SpeedProfilePage
15|RegenEfficiency|driving|RegenEfficiencyPage
16|RouteEfficiency|driving|RouteEfficiencyPage
17|Energy|battery|EnergyPage
18|BatteryHealth|battery|BatteryHealthPage
19|BatteryCells|battery|BatteryCellsPage
20|BatteryDegradation|battery|BatteryDegradationPage
21|EnergyFlow|battery|EnergyFlowPage
22|VampireDrain|battery|VampireDrainPage
23|ProjectedRange|battery|ProjectedRangePage
24|SleepEfficiency|battery|SleepEfficiencyPage
25|Analytics|analytics|AnalyticsPage
26|Statistics|analytics|StatisticsPage
27|Compare|analytics|ComparePage
28|Mileage|analytics|MileagePage
29|WeeklyDigest|analytics|WeeklyDigestPage
30|Timeline|analytics|TimelinePage
31|LiveMap|maps|MapOverviewPage
32|Geofences|maps|GeofencesPage
33|Locations|maps|LocationsPage
34|NavigationRoute|maps|NavigationRoutePage
35|TemperatureImpact|maps|TemperatureImpactPage
36|ClimateControl|vehicle-systems|ClimateControlPage
37|TirePressure|vehicle-systems|TirePressurePage
38|Maintenance|vehicle-systems|MaintenancePage
39|SoftwareUpdates|vehicle-systems|SoftwareUpdatesPage
40|SafetySettings|vehicle-systems|SafetySettingsPage
41|MediaPlayer|vehicle-systems|MediaPlayerPage
42|Alerts|notifications|AlertsPage
43|AlertStudio|notifications|AlertStudioPage
44|Notifications|notifications|NotificationsPage
45|Settings|settings|SettingsPage
46|SignalExplorer|telemetry|SignalExplorerPage
47|SignalLogViewer|telemetry|SignalLogViewerPage
48|SignalDiff|telemetry|SignalDiffPage
49|SignalGapDetector|telemetry|SignalGapDetectorPage
50|LiveSignalMonitor|telemetry|LiveSignalMonitorPage
51|MQTTInspector|telemetry|MQTTInspectorPage
52|Admin|admin|AdminPage
53|DevTools|admin|DevToolsPage
54|APIKeys|admin|APIKeysPage
55|ApiLogs|admin|ApiLogsPage
56|FleetAPI|admin|FleetAPIPage
57|SecurityAccess|admin|SecurityAccessPage
58|BackupRestore|admin|BackupRestorePage
59|SystemStatus|system|SystemStatusPage
60|DataExport|system|DataExportPage
61|DataRepair|system|DataRepairPage
62|Commands|system|CommandsPage
63|Chatbot|system|ChatbotPage
64|Changelog|system|ChangelogPage
65|Roadmap|system|RoadmapPage
66|ChargingHeatmap|charging|ChargingHeatmapPage
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
# ADR-0092 — Telemetry hot/cold topology: Timescale-hot always-on, ClickHouse-cold profile-gated (confirms ADR-0090)

- Status: **Proposed**
- Date: 2026-06-04
- Deciders: Platform Architecture, Telemetry Storage owners
- Consulted: Ingest/Writer team, Analytics/Alerts team, Deployment/Helm owners
- Informed: All Phase-2 migration authors, Phase-6 cold-tier + CDC owners
- Template: MADR-Lite (`docs/adr/0000a-template-lite.md`)

> **MADR-Lite note.** This is a **confirmation / scoping** decision, not a fresh
> trade-off. ADR-0090 already chose the hybrid two-tier topology and is
> **Accepted**. This ADR pins the **Phase-1 baseline scope** of that decision so
> Phase 2 and Phase 6 build against a fixed seam. It therefore uses the light
> template (context, decision, consequences, related decisions) rather than the
> full option-scoring form.

---

## Context and Problem Statement

ADR-0006 ratified TimescaleDB **provisionally** and deferred the durable choice
to doc-15 (`planning/40-storage-compute/15-time-series-storage.md`). **ADR-0090
(Accepted) supersedes ADR-0006** with a **two-tier hybrid**:

- **Hot tier — TimescaleDB (always on).** Serves Q1/Q3 (single-vehicle charts,
the last-15-minute alert hot path) and all OLTP JOINs.
- **Cold tier — ClickHouse (profile-on for fleet+ tiers only).** Serves Q2/Q4
(multi-year rollups, fleet-wide degradation analytics).
- **Wiring — Postgres-WAL CDC → Redpanda → ClickHouse**, target CDC lag ≤ 60s
p95, **never on the synchronous ingest path**.

Three forces hardened ADR-0090 and are **not re-opened here**:

1. **H24** — Timescale multi-node was removed in 2.14, so a single Timescale node
caps the fleet-wide analytics path; the cold tier exists to lift that cap.
2. The **"no re-platform at 10k vehicles"** directive — the fleet path must scale
without a storage migration.
3. The **AGPL self-host pillar** — a one-vehicle self-host must come up with a
single command and must never be forced to run ClickHouse.

The open question this ADR closes is **not** "which stores" (ADR-0090 settled
that) but **"what does Phase 1 ship, and where is the cold-tier seam?"** Without
pinning this, Phase-2 migrations could target the wrong store and a single-vehicle
self-host could be saddled with an idle ClickHouse + Redpanda + CDC stack.

## Decision Outcome

**Confirm ADR-0090; scope Phase 1 to "hot-tier + CDC-seam-ready."**

1. **Phase 2 builds the two-layer store (`raw_signals` + `canonical_signals`)
on TimescaleDB only.** No cold-tier tables are created in Phase 1/2. (The
two-layer table shape itself is owned by Phase-1 prompt 01 / ADR-0091 and is
out of scope here.)

2. **The cold tier is profile-gated and default OFF.** Phase 6 builds the
ClickHouse schema **and** the CDC consumer, activated only by a dedicated
**`cold-tier` deployment profile** (Compose profile / Helm value, default
disabled). A 1-vehicle self-host therefore never instantiates ClickHouse,
Redpanda, or the CDC writer.

3. **CDC is off the synchronous hot path (H24 invariant).** The cold path is
Postgres logical replication → Redpanda → cold writer. It is **not** in the
ingestor or `ts-writer` synchronous path: hot writes never block on cold
availability. The cold-tier failure mode is annotated **`FAIL_OPEN_DEGRADED`**
— losing CDC/Redpanda/ClickHouse degrades **analytics freshness only** and
**never** stalls or fails a hot write.

4. **The cold seam is designed now, built later.** Phase 1 fixes the contract of
the seam — the CDC source (logical-replication slot on `canonical_signals` /
`raw_signals`), the Redpanda topic, and the cold-writer consumer contract — so
Phase 6 can implement against a stable interface. No cold code ships in Phase 1.

5. **The CDC-lag SLO number (≤ 60s p95) is owned by the TL-register
(Phase-1 prompt 06)** and is **measured via OTel (H10)**. This ADR records the
target's existence and ownership but defers the authoritative number and its
alerting to the register.

### Decision in one line

> Ship the hot tier (Timescale, always-on) and the two-layer store on it in
> Phase 2; design the cold seam now but gate ClickHouse + CDC behind a default-OFF
> `cold-tier` profile built in Phase 6, with CDC permanently off the hot write path.

## Consequences

- ✅ **Self-host stays one-command-up.** Default profile = hot tier only; no
ClickHouse/Redpanda/CDC for a single-vehicle deployment.
- ✅ **Fleet path uncapped.** The cold tier lifts the single-node Timescale
analytics cap (H24) for fleet+ tiers without a re-platform.
- ✅ **Hot writes are never coupled to cold availability** (`FAIL_OPEN_DEGRADED`);
a stuck/absent ClickHouse degrades analytics freshness only.
- ✅ **Stable seam for Phase 6.** The CDC topic + cold-writer contract are fixed in
Phase 1, so Phase 6 implements against a known interface.
- ➖ **Two stores at fleet+.** Operators on fleet tier run and observe both
Timescale and ClickHouse (plus Redpanda + CDC).
- ➖ **CDC lag on cold analytics.** Fleet-wide rollups trail real time by the CDC
lag (target ≤ 60s p95, owned by the TL-register); acceptable for Q2/Q4 (rollups
/ degradation), never used for the alert hot path (Q1/Q3 stay on the hot tier).

## Confirmation

- Phase-2 migrations create `raw_signals` / `canonical_signals` on TimescaleDB
only; no ClickHouse DDL appears in Phase 1/2 (migration review).
- The `cold-tier` profile is **absent or disabled by default** in Compose and Helm
values; enabling it is the only way ClickHouse/Redpanda/CDC instantiate
(`helm template` / `docker compose config` review).
- The ingestor and `ts-writer` synchronous paths contain **no** call that blocks on
ClickHouse/Redpanda/CDC (writer review + a failure-injection test asserting hot
writes succeed with the cold tier down).
- The CDC-lag SLO is registered and OTel-measured in the Phase-1 prompt-06
TL-register, not hard-coded here.

## Related Decisions

- **ADR-0090** — Time-series storage hybrid (Timescale + ClickHouse), **Accepted**
— *confirmed, not re-decided,* by this ADR.
- **ADR-0006** — TimescaleDB (provisional) — *superseded* by ADR-0090; recorded
here for lineage.
- **ADR-0017** — Two-layer signal store — the layers placed by this topology.
- **ADR-0091** — Telemetry two-layer store is the system of record (Phase-1
prompt 01) — defines the table shape that lives on the hot tier here.
- **ADR-0342** — Collector topology — upstream of the ingest path referenced by
the hot-path invariant.
- **ADR-0345** — Retention — governs hot-tier compression/retention and the
cold-tier horizon the CDC seam ultimately feeds.

## Out of Scope

- The two-layer table DDL / shape (Phase 2 / ADR-0091).
- The ClickHouse schema and the CDC consumer implementation (Phase 6).
- The authoritative CDC-lag SLO number and its alert wiring (Phase-1 prompt 06
TL-register).

## Notes

The ADR-0090 / ADR-0006 / ADR-0017 / ADR-0342 / ADR-0345 documents, the
`docs/adr/0000a-template-lite.md` template, and `planning/40-storage-compute/15-time-series-storage.md` §9
cited above were referenced from the Phase-1 prompt brief; the corresponding
files are not yet present in the repository at authoring time. Reviewers should
reconcile these citations against the canonical `docs/adr/` set before moving the
status from **Proposed** to **Accepted**. No proto, SQL, or Kotlin was touched by
this docs-only change.
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
# ADR-0093 — Ingestor normalization is taxonomy-driven (registry over hand-coded `when`)

- Status: **Proposed**
- Date: 2026-06-04
- Deciders: Platform Architecture, Ingest/Normalize owners
- Consulted: Telemetry Storage owners, Analytics/Alerts (taxonomy) team
- Informed: All Phase-4 normalizer authors, Phase-3 event-shape owners
- Template: MADR-Lite (`docs/adr/0000a-template-lite.md`)

> **MADR-Lite note.** This is a **single-axis structural** decision — *how* the
> normalizer scales from 3 canonical branches to the full ~40-signal taxonomy —
> not a multi-store trade-off. The recommendation is clear and the alternatives
> are degenerate (keep hand-coding N branches). It therefore uses the light
> template (context, decision, consequences, related decisions) rather than the
> full option-scoring form.

---

## Context and Problem Statement

Today the ingestor normalizer
(`backend/services/ingestor/src/main/kotlin/io/otelog/ingestor/normalize/SignalNormalizer.kt`)
is a hand-coded `when (signal.kind)` with **three** canonical branches —
`vehicle.odometer_km`, `vehicle.battery.state_of_charge_pct`, and
`vehicle.speed_mps` — plus a `vendor.*` catch-all. Each canonical branch
**hand-writes its own** range/finiteness validation and its own per-event
mapping. Unknown-and-not-vendor kinds are dropped.

The full canonical taxonomy is **~40 signals** (doc-08 §4), populated into
`packages/contract-events/proto/io/otelog/signals/v1/canonical_signals.proto` by
the alerts taxonomy program (`alerts/phase-2-signal-taxonomy`). Each signal is
described by a `SignalDescriptor` carrying its canonical name, SI unit,
value-kind, validation bounds, and `privacy_class`.

**The problem.** Scaling the current pattern to ~40 signals means ~40 hand-coded
`when` branches. That would:

- **Re-implement validation ~40 times** (range + finiteness copied per branch),
inviting drift and copy bugs.
- **Drift from the taxonomy** — the proto descriptor (SI unit, bounds,
value-kind, `privacy_class`) and the normalizer's per-branch literals become
two sources of truth that must be hand-kept in sync.
- **Force a code change for every taxonomy addition**, even when the descriptor
already fully specifies the new signal's mapping.

We must record, before Phase 4 implements the scale-out, **which model the
normalizer follows**.

## Decision Outcome

**Adopt a registry-driven, taxonomy-keyed normalizer.** Retire the per-kind
canonical `when` for canonical signals; keep the `vendor.*` catch-all and the
drop-unknown rule unchanged.

1. **Introduce a `CanonicalSignalRegistry` (framework-free, `:domain:*` — H31).**
The registry is the in-memory projection of the
`canonical_signals.proto` descriptors, keyed by canonical `kind`:

```
kind → SignalDescriptor { si_unit, value_kind, min, max, finiteness, privacy_class }
```

It is **pure Kotlin** with no proto/framework imports. The proto read happens
in an **adapter** (`:adapter:*`) that hydrates the registry at startup; the
domain registry never sees a generated proto type. This preserves the H31
domain-purity boundary.

2. **`SignalNormalizer` becomes a generic, descriptor-driven mapping:**
- validate the envelope (unchanged);
- **look up `signal.kind` in the registry**;
- if found → apply **one generic validator** parameterized by the
descriptor (`min`/`max`/`finiteness`/`value_kind`) and emit the
canonical-sample event (Phase 3 shape) carrying the canonical kind, the SI
value, and the descriptor's `privacy_class`;
- if not found **but** `vendor.*` → **vendor passthrough (unchanged)**;
- if not found **and** not `vendor.*` → **drop (unchanged, H14
drop-unknown)**.

3. **Validation is unified here; event-shape reconciliation is deferred to
Phase 3.** The three existing per-signal typed events (`VehicleSeenEvent`,
battery, speed) may be **kept as promoted typed events fed alongside the
generic sample** *or* subsumed — that reconciliation is **Phase 3's** call.
But the **validation logic must be unified now**: one generic
descriptor-driven validator, not per-branch copies. No branch may keep its
own private range/finiteness check after Phase 4.

### Decision in one line

> Drive normalization from the `SignalDescriptor` registry built from
> `canonical_signals.proto` — one generic validator + mapping keyed on `kind` —
> so the ~40-signal taxonomy scales without ~40 hand-coded `when` branches; keep
> the `vendor.*` catch-all and drop-unknown rule, and read the proto only in an
> H31 adapter that hydrates a framework-free domain registry.

## Consequences

- ✅ **Scales to N signals.** Adding a taxonomy signal is a descriptor entry in
`canonical_signals.proto`, not a new normalizer branch — no ingestor code
change for a well-described signal.
- ✅ **One validation path.** Range/finiteness/value-kind checks live in a single
generic validator parameterized by the descriptor; no per-branch duplication
to drift.
- ✅ **Taxonomy is the single source of truth.** The proto descriptors (SI unit,
bounds, value-kind, `privacy_class`) drive runtime behavior directly; the
normalizer can no longer silently disagree with the taxonomy.
- ✅ **`vendor.*` and drop-unknown semantics preserved.** Unknown-but-`vendor.*`
still passes through; unknown-and-not-`vendor.*` is still dropped (H14).
- ➖ **A registry hydration step is added.** Startup must build the registry from
the proto descriptors before the normalizer serves traffic; a missing/partial
registry is a startup-fail, not a per-event surprise.
- ➖ **Init-order gotcha (`by lazy`).** A sealed/enum registry with an **eager**
`val ALL = listOf(...)` companion can NPE on class-init ordering (repo memory:
sealed type + eager `val ALL = listOf(...)` → init-order NPE). Phase 4 **must**
use `val ALL by lazy { ... }` (and lazy descriptor collections generally) so
the list is materialized after all members are initialized.
- ➖ **H31 adapter boundary must hold.** The proto descriptor read lives in an
`:adapter:*` hydrator; the `:domain:*` registry + validator stay framework-free.
A domain type importing a generated proto class is a boundary violation.
- ➖ **Event-shape reconciliation still pending.** Whether the three typed events
are kept-alongside or subsumed is **deferred to Phase 3**; Phase 4 ships the
unified validator + generic sample regardless of that outcome.

## Confirmation

- Phase-4 `SignalNormalizer` contains **no per-canonical-kind `when` branch**
with an inline range/finiteness check; the canonical path is a single
registry lookup + generic validator (code review + a test asserting two
different canonical kinds traverse the same validator).
- The `CanonicalSignalRegistry` and its validator carry **no framework/proto
imports** (H31 module-boundary lint / dependency check); the proto read is in
an adapter hydrator.
- The registry's eager collection is materialized via **`by lazy`**, verified by
a registry-init test that touches `ALL` from a cold class load without NPE.
- `vendor.*` passthrough and the drop-unknown branch are preserved (parametrized
normalizer tests: a `vendor.*` kind passes through, an unknown non-vendor kind
drops).
- Each emitted canonical sample carries the descriptor's `privacy_class`
(ADR-0331) and the SI value (ingest test).

## Related Decisions

- **ADR-0814** — Vertical-slice per-signal pattern — this ADR **generalizes** it:
the per-signal shape it established is now driven by the descriptor registry
rather than re-coded per slice.
- **ADR-0331** — `privacy_class` carried on the signal — the registry surfaces
`privacy_class` from the descriptor so the emitted sample carries it.
- **ADR-0091** — Two-layer store is the system of record (Phase-1 prompt 01) —
the canonical sample the registry-driven normalizer emits lands in
`canonical_signals`; its vendor passthrough lands in `raw_signals`.
- **Alerts taxonomy program** (`alerts/phase-2-signal-taxonomy`) — owns the
`SignalDescriptor` fields the registry consumes; this ADR makes that taxonomy
the runtime source of truth for normalization.

## Out of Scope

- Implementing the registry, the generic validator, or the hydration adapter
(Phase 4 / normalizer scale-out).
- The canonical-sample event shape and the typed-event reconciliation
(kept-alongside vs subsumed) — Phase 3.
- Any change to the proto, SQL, or Kotlin source (this is a docs-only ADR draft).

## Notes

The `SignalNormalizer.kt`, `canonical_signals.proto`, the
`alerts/phase-2-signal-taxonomy` README, the
`docs/adr/0000a-template-lite.md` template, and ADR-0814 / ADR-0331 cited above
were referenced from the Phase-1 prompt brief; the corresponding files are not
all present in the repository at authoring time. Reviewers should reconcile
these citations against the canonical `backend/services/ingestor`,
`packages/contract-events`, and `docs/adr/` sets before moving the status from
**Proposed** to **Accepted**. The `by lazy` init-order note is drawn from repo
memory (sealed type + eager `val ALL = listOf(...)` → init-order NPE) and must
be honored by the Phase-4 implementation. No proto, SQL, or Kotlin was touched
by this docs-only change.
Loading
Loading