Guided recorded demonstration · actual operations

The useful change happened after the camera started.

The accepted baseline had no Comfort margin field or card. During the coordinated recording, the real Node-RED response Function, schema, browser code and tests were changed, built and released. Inactive build waits may later be shortened with a truthful label; no terminal, chat or completion is fabricated.

Release phaseloading
Comfort marginloading
Source revisionloading
Archive SHA-256loading

Open live workshop focus view

Actual submitted teaching request

A bounded functional edit—not a simulated chat.

In this existing Node Lab teaching project, add a Comfort margin value to the live-generated simulation. Define comfort_margin_c as the configured demo temperature limit minus the validated current temperature in Celsius. Add the calculation to the actual Node-RED data path and a clearly labelled dashboard card with units. Keep the current simulation disclosure, scenarios, source timestamps, sample IDs, health indicators, invalid-input handling and working controls.

Inspect the existing files first. Make the smallest functional change in flow/source code rather than moving nodes around. Show the diff. Check a below-limit sample, an above-limit sample, the limit itself, a malformed sample and recovery. Check the displayed value against the same server sample. Preserve the previous valid state on rejected input. Do not expose the editor or create a physical-device/AI-inference claim. Use the existing project release process and return the exact revision, check results and deployed readback. Preserve the baseline for comparison and rollback.

The downloadable Markdown remains a separate source artifact: prompt.md.

Inspectable evidence chain

Baseline, diff, checks, release.

The v2.0.0-base tag preserves the accepted before-state. These artifacts expose only sanitized project source and results—never private topology, credentials or internal conversation.

Actual sanitized functional diff

The executed source change, readable in a normal page.

baseline: 576f1a71bbc57e60b71c38d8146a41b212eca32d
functional revision: d7980d74b0e69ad85e4f11e200f667f66b54f3ce

--- accepted baseline live generator
+++ recorded live generator
@@
-temperatureC: round(24.2 + Math.sin(phase) * 1.5), thresholdC: 32,
+temperatureC: round(24.2 + Math.sin(phase) * 1.5), thresholdC: 30,

The CNC teaching limit is deliberately aligned with the retained validation
lesson before the margin is derived. Other station limits are unchanged.

--- accepted baseline Node-RED response Function
+++ recorded Comfort margin response Function
@@
-snapshot.stations = Object.values(byId).map((station) => ({
-  ...station,
-  ageMs: Math.max(0, now - Date.parse(station.observedAt))
-}));
+snapshot.stations = Object.values(byId).map((station) => {
+  const validTemperature = Number.isFinite(station.temperatureC);
+  const comfortMargin = validTemperature
+    ? Number((station.thresholdC - station.temperatureC).toFixed(1))
+    : null;
+  return {...station, comfort_margin_c: comfortMargin,
+    ageMs: Math.max(0, now - Date.parse(station.observedAt))};
+});
+const primary = snapshot.stations.find((station) => station.id === 'cnc-cell');
+snapshot.configured_demo_temperature_limit_c = primary.thresholdC;
+snapshot.validated_temperature_c =
+  Number.isFinite(primary.temperatureC) ? primary.temperatureC : null;
+snapshot.comfort_margin_c = primary.comfort_margin_c;

--- accepted baseline validation response
+++ recorded validation response
@@
-if (![22,34].includes(raw)) reject();
+if (![22,30,34].includes(raw)) reject();
@@
+validated_temperature_c: temperature,
+configured_demo_temperature_limit_c: 30,
+comfort_margin_c: Number((30 - temperature).toFixed(1)),

--- accepted baseline dashboard
+++ recorded dashboard
@@
+<span>Comfort margin</span>
+<strong data-field="comfort-margin">—</strong>

The downloadable focused diff artifact and complete linked source remain available for reproduction.

Executed fixture and state checks

Below limit22 °C → +8 °C
Above limit34 °C → −4 °C
At limit30 °C → 0 °C
Missingnull → Unavailable
MalformedHTTP 400; previous valid state preserved
RecoverySame-sample margin +2.5 °C

Source unit tests, static checks, isolated staging contract and public contract passed. The dashboard value matched the same server sample in desktop and mobile Chromium.

Actual bounded runtime

Reproducible container, private control surface.

ImagePinned Node-RED base and exact release image ID
StateHealthy project container with restart and healthcheck evidence
PersistenceNamed /data volume retained across recreation
BoundaryIsolated network, editor disabled publicly, read-only root filesystem

The linked sanitized runtime record is captured from the actual release. It contains no credentials, private hostnames, internal addresses or station identifiers.

Released functional rule

Limit minus validated temperature.

comfort_margin_c = configured_demo_temperature_limit_c - validated_temperature_c

Positive means below the chosen teaching limit, zero means exactly at the limit, negative means above it, and a missing observation returns null and displays Unavailable.

Workshop values remain live-generated emulation. This change does not connect hardware, customer data or live AI inference.