diff --git a/apps/control-station/src/components/system/TelemetrySeries.tsx b/apps/control-station/src/components/system/TelemetrySeries.tsx index cdf5608..b303742 100644 --- a/apps/control-station/src/components/system/TelemetrySeries.tsx +++ b/apps/control-station/src/components/system/TelemetrySeries.tsx @@ -10,10 +10,11 @@ export function lineSegments(values: Array, ceiling?: number): st const finite = values.filter((value): value is number => value !== null && Number.isFinite(value)); if (!finite.length) return []; const maximum = Math.max(ceiling ?? 0, ...finite, 1), denominator = Math.max(1, values.length - 1); + const minimum = Math.min(0, ...finite), span = maximum - minimum; const segments:string[]=[];let segment:string[]=[]; values.forEach((value,index)=>{ if(value===null||!Number.isFinite(value)){if(segment.length)segments.push(segment.join(' '));segment=[];return;} - segment.push(`${(index/denominator*100).toFixed(2)},${(36-Math.max(0,Math.min(maximum,value))/maximum*34).toFixed(2)}`); + segment.push(`${(index/denominator*100).toFixed(2)},${(36-(Math.min(maximum,value)-minimum)/span*34).toFixed(2)}`); }); if(segment.length)segments.push(segment.join(' ')); return segments; diff --git a/apps/control-station/test/boardMonitor.test.mjs b/apps/control-station/test/boardMonitor.test.mjs index 0a508ea..5fa3a2b 100644 --- a/apps/control-station/test/boardMonitor.test.mjs +++ b/apps/control-station/test/boardMonitor.test.mjs @@ -17,6 +17,7 @@ test('archive gaps break the plot instead of manufacturing zero or connecting mi assert.equal(result.length,2); assert.match(result[0],/^0.00,8.80 25.00,5.40$/); assert.deepEqual(segments([null,NaN,null]),[]); + assert.notEqual(segments([-10,0,10])[0].split(' ')[0].split(',')[1],segments([-10,0,10])[0].split(' ')[1].split(',')[1]); }); test('HTTP media framing survives every byte boundary and refuses oversized frames',()=>{ const output=[],receive=frames((kind,bytes)=>output.push([kind,[...bytes]])); diff --git a/docs/audits/2026-09-08-node-runtime-and-system-monitor.md b/docs/audits/2026-09-08-node-runtime-and-system-monitor.md index 0cc63ba..bb576ef 100644 --- a/docs/audits/2026-09-08-node-runtime-and-system-monitor.md +++ b/docs/audits/2026-09-08-node-runtime-and-system-monitor.md @@ -98,3 +98,40 @@ are 25% and 15% of one core respectively. An initial PostgreSQL install suppress automatic creation of an unrelated default cluster through a temporary supported postgresql-common configuration drop-in, removed on installer exit. Acquisition is protected by the existing package preinst guard and is not a test action. + + +## R18 staging and current boundary + +2026-09-08: source commits f0802d2 and e57511f; Node package provenance is +f0802d2, the K1 manifest ordering correction is e57511f. No runtime files were +added by the latter correction. Node Debian SHA-256: +`515dbc6d0ed5f7065db59c54ae759e3b03b89dfceb0c0249e241cc0c598d6b71`. +K1 public Debian SHA-256: +`c30091b02fe16d5bc9f810c2ba7f0a7d6033f5dd67d8520a59187ea783394f4c`. +The immutable owner release directory is `mission-core-node-20260908-r18`. +Local/remote hashes match; artifact inspection admits 102 Node and 185 K1 files, +no private application key or symlinks. APT simulation: two package upgrades, +13 new dependency packages, zero removals. Existing bindings/records/authority +are retained by the package lifecycle. The installer is open in the owner's +Ubuntu session and awaits local sudo. Installed predecessors are still Node +0.8.14 and K1 0.1.13; do not report R18 as installed on this evidence. + +Validation: frontend typecheck, 812 frontend unit tests, Node Go packages, +15 focused Python monitor/local-carrier/package-lifecycle tests, and 10 existing +remote media tests passed. Node and Core production builds passed. The final +plot correction separately verifies negative values remain distinct from zero. +Private evidence lives in the experiment directory with SHA-256 manifest, +UTC/monotonic probe records and operator notes, outside normal Git. + +The canonical Core service was restarted through its exact launchd process +group and recovered `/api/health`; new listener PID 57378, no backend on 8765. +Browser QA confirms the Rover detail entry, empty-history state, and normal / +expanded workspace modes. Escape does not resize the pre-existing outer Fleet +workspace; no new keyboard behavior was added there. Data selector/time-window +and installed telemetry UI checks remain pending the first real replicated +sample. The temporary native probe already verifies actual viewer rendering. + +Pending owner sudo: installed service/version checks, socket-only cluster, +archive growth, measured collector overhead, Core durable ACK/backfill, and +browser QA with real telemetry. A new physical K1 scan and critical scenarios +remain operator qualification, not an automatically exercised acceptance step.