Files
lab-rv32i-freertos-c-diagno…/json/card_source.json
T

1343 lines
44 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"$schema": "../../../tools/card-layouts/schemas/card-source.schema.json",
"schema": "esc-card-source.v1",
"card": {
"id": "mpabi-freertos-c-12-diagnostics",
"series": "freertos-c",
"series_title": "FreeRTOS C",
"number": "12",
"count": "15",
"slug": "diagnostics",
"title": "Assertions, hooks and runtime diagnostics",
"topic": "healthy evidence and four isolated expected-fail fixtures",
"project": "Freestanding C nad FreeRTOS",
"subject": "Informatyka",
"level": "Rok 2 · L12 · RV32I/Hazard3",
"revision_date": "2026-07-19T00:00:00+02:00",
"status": "Gotowa",
"version": "v00.01",
"uuid": "b059cd72-9dac-523e-8658-2be46dd4558d",
"author": "M. Pabiszczak",
"year": "2026"
},
"generated": {
"tex": "doc/generated/main.tex",
"html": "web/index.html",
"html_css": "web/style.css",
"html_tree_inspector": false,
"react_app": true
},
"render_dictionary": false,
"viewpoints": [
{
"id": "A1",
"label": "CONTEXT",
"subtitle": "diagnostic boundaries",
"status": "enabled",
"target_label": "fig:a1-context"
},
{
"id": "A2",
"label": "STRUCTURE",
"subtitle": "evidence and fault records",
"status": "enabled",
"target_label": "fig:a2-structure"
},
{
"id": "A3",
"label": "DISPATCH",
"subtitle": "raw hook signatures",
"status": "unavailable",
"reason": "Raw C hook signatures are explicit and add no separate binding model."
},
{
"id": "A4",
"label": "APPLICATION",
"subtitle": "single diagnostic topology",
"status": "unavailable",
"reason": "The application boundary and object topology are already distinct in A1 and A2."
},
{
"id": "A5",
"label": "FLOW",
"subtitle": "healthy E01-E06",
"status": "enabled",
"target_label": "fig:a5-flow"
},
{
"id": "A6",
"label": "STATE",
"subtitle": "one terminal per run",
"status": "enabled",
"target_label": "fig:a6-state"
},
{
"id": "A7",
"label": "RUNTIME",
"subtitle": "stack, tasks and identity",
"status": "enabled",
"target_label": "fig:a7-runtime"
},
{
"id": "A8",
"label": "PATTERNS",
"subtitle": "no new pattern",
"status": "unavailable",
"reason": "This card teaches diagnostic contracts rather than a reusable structural pattern."
}
],
"debug_strategies": {
"code.contracts": {
"id": "code.contracts",
"kind": "code",
"action": "open",
"expected_observations": [
"three kernel diagnostics enabled",
"bounded records and static stacks"
],
"assertions": [
"hooks do not allocate or block",
"fixture selector is set after startup"
],
"evidence_fields": [
"config macro",
"hook signature",
"record field",
"code_ref"
],
"prerequisites": [
"FC01-FC11 complete"
],
"layout": [
"FreeRTOSConfig",
"records",
"main fixture switch"
],
"commands": [
"rg -n 'configASSERT|MALLOC_FAILED|STACK_OVERFLOW|g_fc12_fixture' include src scripts"
]
},
"run.healthy": {
"id": "run.healthy",
"kind": "run",
"action": "replay",
"expected_observations": [
"E01-E06 in order",
"heartbeat in deadline",
"healthy PASS"
],
"assertions": [
"watermark is bounded",
"task count is at least three",
"task SP values differ"
],
"evidence_fields": [
"event",
"tick",
"HWM",
"task count",
"SP",
"digest"
],
"prerequisites": [
"clean Hazard3 RAM",
"fixture 0"
],
"layout": [
"bounded trace",
"experiment",
"terminal"
],
"commands": [
"make sim",
"print g_fc12",
"print g_fc12_events"
]
},
"run.fixtures": {
"id": "run.fixtures",
"kind": "run",
"action": "replay",
"expected_observations": [
"one expected terminal",
"committed fault record",
"no healthy PASS"
],
"assertions": [
"selector survives because it is set at main",
"fixture and hook numbers match"
],
"evidence_fields": [
"fixture",
"hook",
"line",
"task",
"SP",
"committed"
],
"prerequisites": [
"GDB stop at main",
"one selector from 1 to 4"
],
"layout": [
"fixture branch",
"hook",
"fault record"
],
"commands": [
"make sim-fixtures",
"break main",
"set variable g_fc12_fixture=1"
]
},
"code.identity": {
"id": "code.identity",
"kind": "code",
"action": "open",
"expected_observations": [
"required C symbols in ELF",
"source and artifact hashes are pinned"
],
"assertions": [
"no C++ or unwind metadata",
"diagnostic boundaries remain visible"
],
"evidence_fields": [
"source blob",
"ELF SHA256",
"image SHA256",
"symbol"
],
"prerequisites": [
"built artifact"
],
"layout": [
"ABI",
"artifact",
"symbols"
],
"commands": [
"make check-abi",
"riscv64-unknown-elf-nm build/task01_diagnostics/prog.elf"
]
},
"run.identity": {
"id": "run.identity",
"kind": "run",
"action": "replay",
"expected_observations": [
"required C symbols in ELF",
"three identical healthy logs"
],
"assertions": [
"no C++ or unwind metadata",
"source and artifact hashes are pinned"
],
"evidence_fields": [
"source blob",
"ELF SHA256",
"image SHA256",
"digest"
],
"prerequisites": [
"built artifact"
],
"layout": [
"ABI",
"artifact",
"three processes"
],
"commands": [
"make check-abi",
"make check-determinism"
]
}
},
"template": "templates/karta-klasyczna.json",
"title_block": {
"category": "KARTA PRACY · INFORMATYKA",
"prepared_by": "M. Pabiszczak",
"prepared_on": "2026-07-19T00:00:00+02:00",
"title": "Assertions, hooks and runtime diagnostics",
"url": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/c3027314-85a4-5e4a-af13-0939c7467a62",
"repository_url": "https://zsl-gitea.mpabi.pl/edu-freertos-c/lab-rv32i-freertos-c-diagnostics",
"url_host_uuid": "dce7fb9d-7b2f-5d49-96a2-3a30d3070b84",
"url_domain": "mpabi.pl",
"doc_uuid": "c3027314-85a4-5e4a-af13-0939c7467a62",
"revision": "v00.01",
"issued_on": "2026-07-19T00:00:00+02:00",
"series": "FREERTOS-C-12",
"document_type": "karta pracy",
"tool": "card-layouts",
"show_qr": true,
"show_repository_qr": true,
"height_cm": 2.6,
"repeat_on_every_page": true,
"replace_front_matter": true
},
"front_page_scope": {
"title": "Cel karty",
"content_tex": "Uczeń rozróżnia asercję, hook kernela i monitor aplikacyjny oraz zachowuje wystarczający dowód, aby wskazać zamierzony terminal bez fałszywego PASS.",
"scope_title": "Zakres karty",
"scope_content_tex": "Jeden zdrowy przebieg mierzy heartbeat, stack high-water mark, snapshot tasków i dwa stosy. Cztery izolowane fixture'y dowodzą ścieżek ASSERT, MALLOC, STACK i DEADLINE.",
"scope_table": {
"headers": [
"Lekcja",
"Task",
"Najważniejsza idea",
"Priorytet",
"Status",
"Version"
],
"rows": [
{
"chapter": "FC12",
"task": "Task01",
"idea_tex": "healthy evidence and four isolated expected-fail fixtures",
"priority": "główny",
"status": "ready",
"version": "v00.01",
"key": true
}
]
}
},
"side_margin_tree_layout": {
"columns": [
{
"id": "zawodowe",
"label": "TECH",
"side": "left",
"tree": "WE -> EK -> KW",
"description": "Dowody runtime."
},
{
"id": "ogolne",
"label": "OG",
"side": "right",
"tree": "WE -> EN -> KW",
"description": "Model FreeRTOS C."
}
]
},
"learning_effects": {
"FC12.EN01": {
"bloom_level": "Analiza",
"label": "Diagnostic boundaries",
"text": "Uczeń rozróżnia asercję, hook kernela, historyczny watermark i monitor deadline.",
"assessment_criteria": [
"FC12.KW01"
]
},
"FC12.EK01": {
"bloom_level": "Zastosowanie",
"label": "Healthy and fault replay",
"text": "Uczeń odtwarza E01-E10 i wiąże każdy terminal z zatwierdzonym rekordem.",
"assessment_criteria": [
"FC12.KW01"
]
}
},
"assessment_criteria": {
"FC12.KW01": {
"text": "Healthy PASS; four intended fault terminals; bounded evidence; deterministic artifact identity.",
"learning_effects": [
"FC12.EN01",
"FC12.EK01"
]
}
},
"educational_requirements": {
"FC12.WE01": {
"text": "Diagnozowanie stanu i kontrolowanych awarii aplikacji FreeRTOS C.",
"label": "healthy evidence and four isolated expected-fail fixtures",
"learning_effects": [
"FC12.EN01",
"FC12.EK01"
],
"learning_tree": {
"schema": "we-learning-tree.v1",
"policy": "Każda aktywna kotwica wskazuje kod lub checkpoint.",
"ogolne": [
{
"effect_ref": "FC12.EN01",
"display": "EN LOCAL RTOS.12",
"source": "LOCAL",
"official": "RTOS",
"local": "12",
"kind": "EN",
"tree_id": "FC12.WE01.OG.LOCAL.RTOS.12",
"text": "Uczeń rozróżnia asercję, hook kernela, historyczny watermark i monitor deadline.",
"kw": [
{
"criterion_ref": "FC12.KW01",
"display": "KW LOCAL RTOS.12",
"source": "LOCAL",
"kind": "KW",
"official": "RTOS",
"local": "12",
"text": "Łączy kod, diagram i zweryfikowany dowód."
}
]
}
],
"zawodowe": [
{
"effect_ref": "FC12.EK01",
"display": "EK LOCAL RTOS.12",
"source": "LOCAL",
"official": "RTOS",
"local": "12",
"kind": "EK",
"tree_id": "FC12.WE01.TECH.LOCAL.RTOS.12",
"text": "Uczeń odtwarza E01-E10 i wiąże każdy terminal z zatwierdzonym rekordem.",
"kw": [
{
"criterion_ref": "FC12.KW01",
"display": "KW LOCAL RTOS.12",
"source": "LOCAL",
"kind": "KW",
"official": "RTOS",
"local": "12",
"text": "Łączy kod, diagram i zweryfikowany dowód."
}
]
}
]
}
}
},
"debug_checkpoints": {
"schema": "stem-debug-checkpoints.v1",
"semantics": "deterministic-replay",
"artifact": {
"source": "src/tasks/task01_diagnostics.c",
"source_git_blob": "6b8adec8d639109cf128b069c1e470a5b40688a0",
"elf": "build/task01_diagnostics/prog.elf",
"hazard3_elf_sha256": "167e558385843f8d45110de5a22496251828b44bcac37939689c42038b1b1427",
"hazard3_image": "build/task01_diagnostics/prog.bin",
"hazard3_image_sha256": "21b95ac5978140ca6e3b962c9b3715b0bfab76caa862fdd163f24c818a9f9e9e"
},
"targets": {
"hazard3-sim": {
"adapter": "hazard3-reset-load-replay.v1",
"baseline": "restart-backend",
"clean_ram": true
}
},
"items": {
"task01.configured": {
"event_id": "E01",
"stop": {
"symbol": "fc12_checkpoint_committed",
"offset": 0,
"condition": "$a0 == 1"
},
"verify": {
"expressions": [
{
"expr": "g_fc12_event_count",
"equals": 1
},
{
"expr": "g_fc12_events[0].value",
"equals": 2
}
]
}
},
"task01.worker-ran": {
"event_id": "E02",
"stop": {
"symbol": "fc12_checkpoint_committed",
"offset": 0,
"condition": "$a0 == 2"
},
"verify": {
"expressions": [
{
"expr": "g_fc12_events[1].value",
"equals": 21
}
]
}
},
"task01.heartbeat": {
"event_id": "E03",
"stop": {
"symbol": "fc12_checkpoint_committed",
"offset": 0,
"condition": "$a0 == 3"
},
"verify": {
"expressions": [
{
"expr": "g_fc12.heartbeat",
"equals": 1
}
]
}
},
"task01.watermark": {
"event_id": "E04",
"stop": {
"symbol": "fc12_checkpoint_committed",
"offset": 0,
"condition": "$a0 == 4"
},
"verify": {
"expressions": [
{
"expr": "g_fc12.high_water > 0 && g_fc12.high_water < 256",
"equals": 1
}
]
}
},
"task01.snapshot": {
"event_id": "E05",
"stop": {
"symbol": "fc12_checkpoint_committed",
"offset": 0,
"condition": "$a0 == 5"
},
"verify": {
"expressions": [
{
"expr": "g_fc12.task_count >= 3",
"equals": 1
}
]
}
},
"task01.pass": {
"event_id": "E06",
"stop": {
"symbol": "fc12_checkpoint_committed",
"offset": 0,
"condition": "$a0 == 6"
},
"verify": {
"expressions": [
{
"expr": "g_fc12_pass",
"equals": 1
},
{
"expr": "g_fc12_event_count",
"equals": 6
},
{
"expr": "g_fc12.worker_sp != g_fc12.diagnostics_sp",
"equals": 1
}
]
}
},
"task01.assert-hook": {
"event_id": "E07",
"stop": {
"symbol": "fc12_fault_committed",
"offset": 0,
"condition": "$a0 == 1"
},
"verify": {
"expressions": [
{
"expr": "g_fc12_fault.fixture",
"equals": 1
},
{
"expr": "g_fc12_fault.hook",
"equals": 1
},
{
"expr": "g_fc12_fault.committed == 0xFC12FA17",
"equals": 1
}
]
}
},
"task01.malloc-hook": {
"event_id": "E08",
"stop": {
"symbol": "fc12_fault_committed",
"offset": 0,
"condition": "$a0 == 2"
},
"verify": {
"expressions": [
{
"expr": "g_fc12_fault.fixture",
"equals": 2
},
{
"expr": "g_fc12_fault.hook",
"equals": 2
},
{
"expr": "g_fc12_fault.committed == 0xFC12FA17",
"equals": 1
}
]
}
},
"task01.stack-hook": {
"event_id": "E09",
"stop": {
"symbol": "fc12_fault_committed",
"offset": 0,
"condition": "$a0 == 3"
},
"verify": {
"expressions": [
{
"expr": "g_fc12_fault.fixture",
"equals": 3
},
{
"expr": "g_fc12_fault.hook",
"equals": 3
},
{
"expr": "g_fc12_fault.sp != 0",
"equals": 1
}
]
}
},
"task01.deadline-hook": {
"event_id": "E10",
"stop": {
"symbol": "fc12_fault_committed",
"offset": 0,
"condition": "$a0 == 4"
},
"verify": {
"expressions": [
{
"expr": "g_fc12_fault.fixture",
"equals": 4
},
{
"expr": "g_fc12_fault.hook",
"equals": 4
},
{
"expr": "g_fc12_fault.sp != 0",
"equals": 1
}
]
}
}
}
},
"sections": [
{
"title": "A1 — Diagnostic boundaries",
"order": 10,
"content_kind": "prose",
"asset_page_mode": "one-per-page",
"page_orientation": "portrait",
"content_tex": "The application measures health; the kernel calls bounded hooks; the simulator preserves source, ELF and terminal evidence.",
"assets": [
{
"path": "assets/a1-context.png",
"html_path": "assets/a1-context.svg",
"source_path": "assets/a1-context.puml",
"caption": "A1 CONTEXT — application, kernel hooks and evidence.",
"label": "fig:a1-context",
"alt": "A1 · diagnostic boundaries",
"kind": "diagram",
"width": 1.0,
"page_grid": {
"columns": 1,
"rows": 1,
"page_width": 660,
"page_height": 760,
"overview": true,
"step_tiles": {
"application": 1,
"kernel": 1,
"fixtures": 1,
"hazard3": 1,
"committed": 1
}
},
"interactive": {
"kind": "uml-class",
"storage_key": "fc12-a1-context",
"title": "A1 · diagnostic boundaries",
"task": {
"id": "task01",
"label": "Task01 · healthy run and fault fixtures"
},
"block": {
"id": "a1",
"label": "A1 CONTEXT",
"description": "Application monitoring, kernel hooks and Hazard3 evidence have explicit responsibilities."
},
"phases": [
{
"id": "boundaries",
"label": "DIAGNOSTIC BOUNDARIES",
"steps": [
{
"id": "application",
"number": 1,
"label": "application owns heartbeat policy",
"mode": "CODE",
"strategy_ref": "code.contracts",
"svg_label": "01",
"code_ref": "src/tasks/task01_diagnostics.c:162",
"description": "application owns heartbeat policy",
"evidence": "bounded deadline monitor"
},
{
"id": "kernel",
"number": 2,
"label": "kernel owns assert and hook dispatch",
"mode": "CODE",
"strategy_ref": "code.contracts",
"svg_label": "02",
"code_ref": "include/FreeRTOSConfig.h:20",
"description": "kernel owns assert and hook dispatch",
"evidence": "three configured diagnostics"
},
{
"id": "fixtures",
"number": 3,
"label": "fixtures are isolated at main",
"mode": "CODE",
"strategy_ref": "code.contracts",
"svg_label": "03",
"code_ref": "src/tasks/task01_diagnostics.c:227",
"description": "fixtures are isolated at main",
"evidence": "selector 0..4"
},
{
"id": "hazard3",
"number": 4,
"label": "Hazard3 runs one clean image",
"mode": "CODE",
"strategy_ref": "code.contracts",
"svg_label": "04",
"code_ref": "scripts/run_fixtures.sh:14",
"description": "Hazard3 runs one clean image",
"evidence": "GDB selects after C startup"
},
{
"id": "committed",
"number": 5,
"label": "evidence is committed before PASS",
"mode": "RUN",
"event_id": "E06",
"strategy_ref": "run.healthy",
"svg_label": "05",
"code_ref": "src/tasks/task01_diagnostics.c:192",
"snapshot_ref": "task01.pass",
"description": "evidence is committed before PASS",
"evidence": "six ordered events"
}
]
}
]
}
}
]
},
{
"title": "A2 — Evidence and hook contracts",
"order": 20,
"content_kind": "prose",
"asset_page_mode": "one-per-page",
"page_orientation": "portrait",
"content_tex": "The experiment owns task handles and health values; evidence records form a bounded trace; a fault record freezes fixture, hook, line/task and SP.",
"assets": [
{
"path": "assets/a2-structure.png",
"html_path": "assets/a2-structure.svg",
"source_path": "assets/a2-structure.puml",
"caption": "A2 STRUCTURE — experiment, trace, fault and static storage.",
"label": "fig:a2-structure",
"alt": "A2 · evidence records",
"kind": "diagram",
"width": 1.0,
"page_grid": {
"columns": 1,
"rows": 1,
"page_width": 660,
"page_height": 760,
"overview": true,
"step_tiles": {
"experiment": 1,
"events": 1,
"fault": 1,
"storage": 1,
"fault-record": 1
}
},
"interactive": {
"kind": "uml-class",
"storage_key": "fc12-a2-structure",
"title": "A2 · evidence records",
"task": {
"id": "task01",
"label": "Task01 · healthy run and fault fixtures"
},
"block": {
"id": "a2",
"label": "A2 STRUCTURE",
"description": "Healthy measurements and terminal faults use separate, commit-last records."
},
"phases": [
{
"id": "records",
"label": "RECORDS AND STORAGE",
"steps": [
{
"id": "experiment",
"number": 1,
"label": "DiagnosticsExperiment owns health data",
"mode": "CODE",
"strategy_ref": "code.contracts",
"svg_label": "01",
"code_ref": "include/task01_diagnostics.h:33",
"description": "DiagnosticsExperiment owns health data",
"evidence": "handles, ticks, HWM and SP"
},
{
"id": "events",
"number": 2,
"label": "DiagnosticsEvidence is commit-last",
"mode": "CODE",
"strategy_ref": "code.contracts",
"svg_label": "02",
"code_ref": "include/task01_diagnostics_model.h:6",
"description": "DiagnosticsEvidence is commit-last",
"evidence": "sequence/event/tick/value"
},
{
"id": "fault",
"number": 3,
"label": "DiagnosticFault freezes terminal data",
"mode": "CODE",
"strategy_ref": "code.contracts",
"svg_label": "03",
"code_ref": "include/task01_diagnostics.h:23",
"description": "DiagnosticFault freezes terminal data",
"evidence": "fixture/hook/line/task/SP"
},
{
"id": "storage",
"number": 4,
"label": "worker and monitor own static stacks",
"mode": "CODE",
"strategy_ref": "code.contracts",
"svg_label": "04",
"code_ref": "src/tasks/task01_diagnostics.c:25",
"description": "worker and monitor own static stacks",
"evidence": "distinct TCB and stack arrays"
},
{
"id": "fault-record",
"number": 5,
"label": "fault publication exposes committed marker",
"mode": "RUN",
"event_id": "E07",
"strategy_ref": "run.fixtures",
"svg_label": "05",
"code_ref": "src/tasks/task01_diagnostics.c:91",
"snapshot_ref": "task01.assert-hook",
"description": "fault publication exposes committed marker",
"evidence": "0xFC12FA17"
}
]
}
]
}
}
]
},
{
"title": "A5 — Healthy replay",
"order": 50,
"content_kind": "prose",
"asset_page_mode": "one-per-page",
"page_orientation": "portrait",
"content_tex": "A worker publishes bounded work and a heartbeat. A lower-priority diagnostics task then records the historical stack watermark, task snapshot and final invariant result.",
"assets": [
{
"path": "assets/a5-flow.png",
"html_path": "assets/a5-flow.svg",
"source_path": "assets/a5-flow.puml",
"caption": "A5 FLOW — E01 to E06 healthy evidence.",
"label": "fig:a5-flow",
"alt": "A5 · healthy replay",
"kind": "diagram",
"width": 1.0,
"page_grid": {
"columns": 1,
"rows": 1,
"page_width": 660,
"page_height": 760,
"overview": true,
"step_tiles": {
"configured": 1,
"worker-ran": 1,
"heartbeat": 1,
"watermark": 1,
"snapshot": 1,
"pass": 1
}
},
"interactive": {
"kind": "uml-sequence",
"storage_key": "fc12-a5-flow",
"title": "A5 · healthy replay",
"task": {
"id": "task01",
"label": "Task01 · healthy run and fault fixtures"
},
"block": {
"id": "a5",
"label": "A5 FLOW",
"description": "The healthy path publishes six ordered events from configuration through verified PASS."
},
"phases": [
{
"id": "healthy",
"label": "HEALTHY E01E06",
"steps": [
{
"id": "configured",
"number": 1,
"label": "diagnostics enabled",
"mode": "RUN",
"event_id": "E01",
"strategy_ref": "run.healthy",
"svg_label": "01",
"code_ref": "src/tasks/task01_diagnostics.c:233",
"snapshot_ref": "task01.configured",
"description": "diagnostics enabled",
"evidence": "stack check level 2"
},
{
"id": "worker-ran",
"number": 2,
"label": "worker performs bounded work",
"mode": "RUN",
"event_id": "E02",
"strategy_ref": "run.healthy",
"svg_label": "02",
"code_ref": "src/tasks/task01_diagnostics.c:152",
"snapshot_ref": "task01.worker-ran",
"description": "worker performs bounded work",
"evidence": "value 21"
},
{
"id": "heartbeat",
"number": 3,
"label": "worker publishes heartbeat",
"mode": "RUN",
"event_id": "E03",
"strategy_ref": "run.healthy",
"svg_label": "03",
"code_ref": "src/tasks/task01_diagnostics.c:156",
"snapshot_ref": "task01.heartbeat",
"description": "worker publishes heartbeat",
"evidence": "heartbeat = 1"
},
{
"id": "watermark",
"number": 4,
"label": "diagnostics measures watermark",
"mode": "RUN",
"event_id": "E04",
"strategy_ref": "run.healthy",
"svg_label": "04",
"code_ref": "src/tasks/task01_diagnostics.c:181",
"snapshot_ref": "task01.watermark",
"description": "diagnostics measures watermark",
"evidence": "0 < HWM < 256"
},
{
"id": "snapshot",
"number": 5,
"label": "diagnostics snapshots task table",
"mode": "RUN",
"event_id": "E05",
"strategy_ref": "run.healthy",
"svg_label": "05",
"code_ref": "src/tasks/task01_diagnostics.c:182",
"snapshot_ref": "task01.snapshot",
"description": "diagnostics snapshots task table",
"evidence": "task count at least 3"
},
{
"id": "pass",
"number": 6,
"label": "all healthy invariants pass",
"mode": "RUN",
"event_id": "E06",
"strategy_ref": "run.healthy",
"svg_label": "06",
"code_ref": "src/tasks/task01_diagnostics.c:192",
"snapshot_ref": "task01.pass",
"description": "all healthy invariants pass",
"evidence": "PASS plus deterministic digest"
}
]
}
]
}
}
]
},
{
"title": "A6 — Healthy and expected-fail terminals",
"order": 60,
"content_kind": "prose",
"asset_page_mode": "one-per-page",
"page_orientation": "portrait",
"content_tex": "Fixture selection occurs at main after startup. Each failing branch commits one typed record and must not reach the healthy PASS.",
"assets": [
{
"path": "assets/a6-state.png",
"html_path": "assets/a6-state.svg",
"source_path": "assets/a6-state.puml",
"caption": "A6 STATE — healthy PASS versus four isolated terminals.",
"label": "fig:a6-state",
"alt": "A6 · terminal states",
"kind": "diagram",
"width": 1.0,
"page_grid": {
"columns": 1,
"rows": 1,
"page_width": 660,
"page_height": 760,
"overview": true,
"step_tiles": {
"select": 1,
"healthy-terminal": 1,
"assert-hook": 1,
"malloc-hook": 1,
"stack-hook": 1,
"deadline-hook": 1
}
},
"interactive": {
"kind": "uml-class",
"storage_key": "fc12-a6-state",
"title": "A6 · terminal states",
"task": {
"id": "task01",
"label": "Task01 · healthy run and fault fixtures"
},
"block": {
"id": "a6",
"label": "A6 STATE",
"description": "A run has exactly one terminal: healthy PASS or one selected expected fault."
},
"phases": [
{
"id": "terminal",
"label": "ONE TERMINAL PER RUN",
"steps": [
{
"id": "select",
"number": 1,
"label": "select fixture only after main",
"mode": "CODE",
"strategy_ref": "code.contracts",
"svg_label": "01",
"code_ref": "scripts/run_fixtures.sh:18",
"description": "select fixture only after main",
"evidence": "BSS cannot erase selector"
},
{
"id": "healthy-terminal",
"number": 2,
"label": "fixture 0 reaches healthy PASS",
"mode": "RUN",
"event_id": "E06",
"strategy_ref": "run.healthy",
"svg_label": "02",
"code_ref": "src/tasks/task01_diagnostics.c:198",
"snapshot_ref": "task01.pass",
"description": "fixture 0 reaches healthy PASS",
"evidence": "normal terminal"
},
{
"id": "assert-hook",
"number": 3,
"label": "assert fixture commits hook 1",
"mode": "RUN",
"event_id": "E07",
"strategy_ref": "run.fixtures",
"svg_label": "03",
"code_ref": "src/tasks/task01_diagnostics.c:100",
"snapshot_ref": "task01.assert-hook",
"description": "assert fixture commits hook 1",
"evidence": "fixture=1 hook=1"
},
{
"id": "malloc-hook",
"number": 4,
"label": "malloc fixture commits hook 2",
"mode": "RUN",
"event_id": "E08",
"strategy_ref": "run.fixtures",
"svg_label": "04",
"code_ref": "src/tasks/task01_diagnostics.c:100",
"snapshot_ref": "task01.malloc-hook",
"description": "malloc fixture commits hook 2",
"evidence": "fixture=2 hook=2"
},
{
"id": "stack-hook",
"number": 5,
"label": "stack fixture commits hook 3",
"mode": "RUN",
"event_id": "E09",
"strategy_ref": "run.fixtures",
"svg_label": "05",
"code_ref": "src/tasks/task01_diagnostics.c:100",
"snapshot_ref": "task01.stack-hook",
"description": "stack fixture commits hook 3",
"evidence": "fixture=3 hook=3"
},
{
"id": "deadline-hook",
"number": 6,
"label": "deadline fixture commits hook 4",
"mode": "RUN",
"event_id": "E10",
"strategy_ref": "run.fixtures",
"svg_label": "06",
"code_ref": "src/tasks/task01_diagnostics.c:100",
"snapshot_ref": "task01.deadline-hook",
"description": "deadline fixture commits hook 4",
"evidence": "fixture=4 hook=4"
}
]
}
]
}
}
]
},
{
"title": "A7 — Runtime proof",
"order": 70,
"content_kind": "prose",
"asset_page_mode": "one-per-page",
"page_orientation": "portrait",
"content_tex": "The watermark is a historical minimum of unused stack, not current consumption. Three clean simulations must emit identical healthy evidence.",
"assets": [
{
"path": "assets/a7-runtime.png",
"html_path": "assets/a7-runtime.svg",
"source_path": "assets/a7-runtime.puml",
"caption": "A7 RUNTIME — stack, task snapshot, terminal record and identity.",
"label": "fig:a7-runtime",
"alt": "A7 · runtime proof",
"kind": "diagram",
"width": 1.0,
"page_grid": {
"columns": 1,
"rows": 1,
"page_width": 660,
"page_height": 760,
"overview": true,
"step_tiles": {
"stacks": 1,
"hwm": 1,
"tasks": 1,
"fault-sp": 1,
"abi": 1,
"determinism": 1
}
},
"interactive": {
"kind": "uml-class",
"storage_key": "fc12-a7-runtime",
"title": "A7 · runtime proof",
"task": {
"id": "task01",
"label": "Task01 · healthy run and fault fixtures"
},
"block": {
"id": "a7",
"label": "A7 RUNTIME",
"description": "Runtime evidence connects the two task stacks, historical watermark, bounded task snapshot, fault SP and exact artifact identity."
},
"phases": [
{
"id": "runtime",
"label": "RUNTIME EVIDENCE",
"steps": [
{
"id": "stacks",
"number": 1,
"label": "worker and diagnostics SP differ",
"mode": "RUN",
"event_id": "E06",
"strategy_ref": "run.identity",
"svg_label": "01",
"code_ref": "src/tasks/task01_diagnostics.c:190",
"snapshot_ref": "task01.pass",
"description": "worker and diagnostics SP differ",
"evidence": "two task stacks"
},
{
"id": "hwm",
"number": 2,
"label": "watermark remains inside declared bounds",
"mode": "RUN",
"event_id": "E04",
"strategy_ref": "run.identity",
"svg_label": "02",
"code_ref": "src/tasks/task01_diagnostics.c:178",
"snapshot_ref": "task01.watermark",
"description": "watermark remains inside declared bounds",
"evidence": "0 < HWM < 256"
},
{
"id": "tasks",
"number": 3,
"label": "system snapshot contains all active tasks",
"mode": "RUN",
"event_id": "E05",
"strategy_ref": "run.identity",
"svg_label": "03",
"code_ref": "src/tasks/task01_diagnostics.c:179",
"snapshot_ref": "task01.snapshot",
"description": "system snapshot contains all active tasks",
"evidence": "task_count >= 3"
},
{
"id": "fault-sp",
"number": 4,
"label": "fault record preserves stack pointer",
"mode": "RUN",
"event_id": "E09",
"strategy_ref": "run.fixtures",
"svg_label": "04",
"code_ref": "src/tasks/task01_diagnostics.c:97",
"snapshot_ref": "task01.stack-hook",
"description": "fault record preserves stack pointer",
"evidence": "SP != 0"
},
{
"id": "abi",
"number": 5,
"label": "ELF exposes every diagnostic boundary",
"mode": "CODE",
"strategy_ref": "code.identity",
"svg_label": "05",
"code_ref": "scripts/check_abi.sh:17",
"description": "ELF exposes every diagnostic boundary",
"evidence": "hooks, checkpoints and task APIs"
},
{
"id": "determinism",
"number": 6,
"label": "three clean processes agree",
"mode": "RUN",
"event_id": "E06",
"strategy_ref": "run.identity",
"svg_label": "06",
"code_ref": "scripts/check_determinism.sh:12",
"snapshot_ref": "task01.pass",
"description": "three clean processes agree",
"evidence": "identical digest"
}
]
}
]
}
}
]
},
{
"title": "Task01 — healthy run and fault fixtures",
"order": 90,
"content_kind": "tasks",
"task_refs": [
"task01"
]
}
],
"tasks": {
"task01": {
"title": "Diagnose before changing the program",
"uuid": "c3027314-85a4-5e4a-af13-0939c7467a62",
"prompt_tex": "Odtwórz zdrowy ślad E01--E06, a potem cztery izolowane terminale E07--E10. Dla każdego zapisz, który kontrakt wykrył błąd i jakie pole rekordu to dowodzi.",
"criterion": "Healthy PASS; four intended fault terminals; bounded evidence; deterministic artifact identity.",
"conclusion_tex": "Diagnostyka jest wiarygodna wtedy, gdy zdrowy PASS i oczekiwane awarie mają rozłączne, mierzalne terminale oraz identyfikowalny artefakt.",
"flow": [
{
"kind": "block",
"id": "predict",
"title": "A — przewidywanie",
"content_tex": "Przypisz każdy błąd do właściwego mechanizmu.",
"steps": [
{
"id": "contracts",
"title": "Uzupełnij tabelę ASSERT/HOOK/MONITOR.",
"content_tex": "Podaj kontekst wywołania i dozwolone działania."
},
{
"id": "healthy",
"title": "Zapisz zdrowe nierówności.",
"content_tex": "Nie myl high-water mark z bieżącym użyciem stosu."
}
]
},
{
"kind": "block",
"id": "replay",
"title": "B — replay",
"content_tex": "Uruchom zdrowy wariant i cztery fixture'y.",
"steps": [
{
"id": "e01-e06",
"title": "Zweryfikuj E01--E06.",
"content_tex": "Heartbeat, HWM, task count, stosy i PASS."
},
{
"id": "e07-e10",
"title": "Zweryfikuj E07--E10.",
"content_tex": "Każdy fixture ma dokładnie jeden oczekiwany terminal."
}
]
},
{
"kind": "exercise",
"id": "diagnose-trace",
"title": "Ćwiczenie — diagnoza rekordu",
"prompt_tex": "Dostajesz rekord fault bez opisu testu. Wskaż mechanizm, prawdopodobny kontekst i pierwszy bezpieczny krok diagnostyczny bez zmiany kodu.",
"evidence_tex": "fixture, hook, line/task, SP, committed marker oraz identyfikator ELF.",
"criterion": "Wniosek wynika z pól rekordu; uczeń nie traktuje samego komunikatu jako dowodu.",
"based_on": [
"predict",
"replay"
]
}
],
"educational_requirement_refs": [
"FC12.WE01"
],
"learning_effect_refs": [
"FC12.EN01",
"FC12.EK01"
],
"assessment_criterion_ref": "FC12.KW01"
}
},
"tasks_order": [
"task01"
]
}