{
    "schema_version": "1.0",
    "status": "verified",
    "verified_at": "2026-10-18T13:49:55Z",
    "public_release": {
        "version": "v2.0.0",
        "commit": "f610caa4f51e3e7a49de8906a17c90311a4b7b42",
        "demo_url": "https://teachthecompany.com/node-lab/",
        "repository_url": "https://github.com/finnandreh/node-lab",
        "source_archive_url": "https://teachthecompany.com/node-lab/source/node-lab-source-v2.0.0.zip",
        "source_archive_sha256": "4bf707ec031e10fc048b4f1782a578835cea0594e2d44c44299aebcceec84954"
    },
    "telemetry": {
        "provenance": "emulated",
        "runtime": "Node-RED",
        "backend_generated": true,
        "sample_cadence_seconds": 1.5,
        "observation_window_seconds": 61,
        "first_server_sequence": 253,
        "last_server_sequence": 294,
        "freshness_pause_verified": true
    },
    "change": {
        "before_commit": "576f1a71bbc57e60b71c38d8146a41b212eca32d",
        "after_commit": "f610caa4f51e3e7a49de8906a17c90311a4b7b42",
        "requirement_no": "Legg til Comfort margin som valgt temperaturgrense minus validert temperatur i samme serverprøve, vis verdien i dashboardet, og bevar validering, scenarioer og tilgangsgrenser.",
        "requirement_en": "Add Comfort margin as the selected temperature limit minus validated temperature from the same server sample, display it in the dashboard, and preserve validation, scenarios and access boundaries.",
        "summary_no": "Codex la til Comfort margin i Node-RED-flyten, API-et, telemetriskjemaet og dashboardet, og justerte CNC-eksempelets temperaturgrense og grensetest fra 32 °C til 30 °C. Manglende temperatur gir null og vises som Unavailable.",
        "summary_en": "Codex added Comfort margin to the Node-RED flow, API, telemetry schema and dashboard, and aligned the CNC example temperature limit and boundary fixture from 32 °C to 30 °C. Missing temperature returns null and displays as Unavailable.",
        "tests": [
            {
                "name": "12 source unit tests",
                "status": "passed"
            },
            {
                "name": "32 independent public feature checks",
                "status": "passed"
            },
            {
                "name": "9 saved telemetry-schema snapshots",
                "status": "passed"
            },
            {
                "name": "Desktop, mobile and focused-dashboard browser verification",
                "status": "passed"
            },
            {
                "name": "Docker health, restart and persistence cycle",
                "status": "passed"
            }
        ]
    },
    "security": {
        "public_editor_denied": true,
        "public_admin_denied": true
    },
    "metrics": [
        {
            "name_no": "Uavhengige funksjonskontroller",
            "name_en": "Independent functional checks",
            "value": "32/32",
            "unit": "kontroller",
            "scope_no": "Offentlig funksjonsmatrise for Comfort margin, scenarioisolasjon, feiltilstand og gjenoppretting.",
            "scope_en": "Public feature matrix for Comfort margin, scenario isolation, fault state and recovery.",
            "observed_at": "2026-10-18T13:42:21Z",
            "source": "https://teachthecompany.com/node-lab/capture/"
        },
        {
            "name_no": "Validerte skjemaprøver",
            "name_en": "Validated schema snapshots",
            "value": "9/9",
            "unit": "prøver",
            "scope_no": "Lagrede telemetriprøver validert mot skjemaet med Ajv draft 2020-12.",
            "scope_en": "Saved telemetry snapshots validated against the schema with Ajv draft 2020-12.",
            "observed_at": "2026-10-18T13:42:21Z",
            "source": "https://teachthecompany.com/node-lab/source/telemetry.schema.json"
        },
        {
            "name_no": "Serversekvens",
            "name_en": "Server sequence",
            "value": "253–294",
            "unit": "prøver",
            "scope_no": "Ny anonym observasjon over 61 sekunder av normal-scenarioet; sekvens og servertid avanserte.",
            "scope_en": "New anonymous 61-second observation of the normal scenario; sequence and server time advanced.",
            "observed_at": "2026-10-18T13:49:55Z",
            "source": "https://teachthecompany.com/node-lab/api/live?scenario=normal"
        },
        {
            "name_no": "Generatorintervall",
            "name_en": "Generator interval",
            "value": 1.5,
            "unit": "sekunder",
            "scope_no": "Konfigurert intervall for backend-genererte, emulerte verkstedprøver.",
            "scope_en": "Configured interval for backend-generated emulated workshop samples.",
            "observed_at": "2026-10-18T13:49:55Z",
            "source": "https://teachthecompany.com/node-lab/api/info"
        },
        {
            "name_no": "Kildeenhetstester",
            "name_en": "Source unit tests",
            "value": "12/12",
            "unit": "tester",
            "scope_no": "Avgrensede enhetstester for den publiserte Comfort margin-endringen.",
            "scope_en": "Bounded unit tests for the published Comfort margin change.",
            "observed_at": "2026-10-18T13:42:21Z",
            "source": "https://teachthecompany.com/node-lab/capture/change-validation.json"
        }
    ],
    "evidence_urls": [
        {
            "label": "Kjørende Node Lab",
            "url": "https://teachthecompany.com/node-lab/"
        },
        {
            "label": "Fokusert dashboard",
            "url": "https://teachthecompany.com/node-lab/?view=workshop"
        },
        {
            "label": "Lesbar beviskjede",
            "url": "https://teachthecompany.com/node-lab/capture/"
        },
        {
            "label": "Akseptert endringskrav",
            "url": "https://teachthecompany.com/node-lab/capture/prompt.md"
        },
        {
            "label": "Funksjonell kildeforskjell",
            "url": "https://teachthecompany.com/node-lab/capture/comfort-margin.diff"
        },
        {
            "label": "Valideringsresultat",
            "url": "https://teachthecompany.com/node-lab/capture/change-validation.json"
        },
        {
            "label": "Utrullet readback",
            "url": "https://teachthecompany.com/node-lab/capture/change-readback.json"
        },
        {
            "label": "Sanitert Docker-bevis",
            "url": "https://teachthecompany.com/node-lab/capture/docker-evidence.json"
        },
        {
            "label": "Offentlig kildecommit",
            "url": "https://github.com/finnandreh/node-lab/commit/f610caa4f51e3e7a49de8906a17c90311a4b7b42"
        },
        {
            "label": "Kildearkiv v2.0.0",
            "url": "https://teachthecompany.com/node-lab/source/node-lab-source-v2.0.0.zip"
        }
    ]
}
