diff --git a/json/card_source.json b/json/card_source.json index 6689ca9..d635ae3 100644 --- a/json/card_source.json +++ b/json/card_source.json @@ -43,7 +43,8 @@ "show_repository_qr": false, "height_cm": 2.6, "repeat_on_every_page": true, - "replace_front_matter": true + "replace_front_matter": true, + "url": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/c456b505-dc5c-4894-b832-bb4c5afd0feb" }, "front_page_scope": { "title": "Cel karty", @@ -53,8 +54,20 @@ }, "side_margin_tree_layout": { "columns": [ - {"id": "zawodowe", "label": "TECH", "side": "left", "tree": "WE -> EK -> KW", "description": "Dowód z heap_4, ELF i Hazard3."}, - {"id": "ogolne", "label": "OG", "side": "right", "tree": "WE -> EN -> KW", "description": "Dobór polityki i interpretacja metryk."} + { + "id": "zawodowe", + "label": "TECH", + "side": "left", + "tree": "WE -> EK -> KW", + "description": "Dowód z heap_4, ELF i Hazard3." + }, + { + "id": "ogolne", + "label": "OG", + "side": "right", + "tree": "WE -> EN -> KW", + "description": "Dobór polityki i interpretacja metryk." + } ] }, "learning_effects": { @@ -62,26 +75,36 @@ "bloom_level": "Analiza", "label": "Polityka i metryki", "text": "Uczeń dobiera heap_1--heap_5 oraz odróżnia current free, largest free block i minimum-ever.", - "assessment_criteria": ["K05.KW01"] + "assessment_criteria": [ + "K05.KW01" + ] }, "K05.EK01": { "bloom_level": "Zastosowanie", "label": "Fragmentacja i most ABI", "text": "Uczeń wykazuje komplet new/delete i odtwarza failure, koalescencję, retry oraz historyczny watermark.", - "assessment_criteria": ["K05.KW01"] + "assessment_criteria": [ + "K05.KW01" + ] } }, "assessment_criteria": { "K05.KW01": { "text": "Program kończy się PASS; largest < request < total; pierwsza próba zawodzi bez zwiększenia success count; po koalescencji identyczna próba działa; current wraca do baseline, a minimum-ever zachowuje historię.", - "learning_effects": ["K05.EN01", "K05.EK01"] + "learning_effects": [ + "K05.EN01", + "K05.EK01" + ] } }, "educational_requirements": { "K05.WE01": { "text": "Dobranie i zbadanie polityki dynamicznej pamięci FreeRTOS dla C++.", "label": "Modele heapu i dowód fragmentacji", - "learning_effects": ["K05.EN01", "K05.EK01"], + "learning_effects": [ + "K05.EN01", + "K05.EK01" + ], "learning_tree": { "schema": "we-learning-tree.v1", "policy": "Każdy wniosek o pojemności wskazuje total, largest i stan bloków; każdy operator ma symbol ABI.", @@ -96,7 +119,15 @@ "tree_id": "K05.WE01.OG.LOCAL.MEM.POLICY.01", "text": "Dobiera model i interpretuje current, largest oraz minimum-ever.", "kw": [ - {"criterion_ref": "K05.KW01", "display": "KW LOCAL MEM.POLICY.01", "source": "LOCAL", "kind": "KW", "official": "MEM.POLICY", "local": "01", "text": "Uzasadnia heap_1, heap_4 i heap_5 dla trzech scenariuszy oraz nie myli total z largest."} + { + "criterion_ref": "K05.KW01", + "display": "KW LOCAL MEM.POLICY.01", + "source": "LOCAL", + "kind": "KW", + "official": "MEM.POLICY", + "local": "01", + "text": "Uzasadnia heap_1, heap_4 i heap_5 dla trzech scenariuszy oraz nie myli total z largest." + } ] } ], @@ -111,7 +142,15 @@ "tree_id": "K05.WE01.TECH.LOCAL.DBG.HEAP.01", "text": "Koreluje adresy, statystyki, nagłówki bloków i symbole new/delete.", "kw": [ - {"criterion_ref": "K05.KW01", "display": "KW LOCAL DBG.HEAP.01", "source": "LOCAL", "kind": "KW", "official": "DBG.HEAP", "local": "01", "text": "Pokazuje failure, koalescencję, retry, 3/3/0 i historyczne minimum-ever."} + { + "criterion_ref": "K05.KW01", + "display": "KW LOCAL DBG.HEAP.01", + "source": "LOCAL", + "kind": "KW", + "official": "DBG.HEAP", + "local": "01", + "text": "Pokazuje failure, koalescencję, retry, 3/3/0 i historyczne minimum-ever." + } ] } ] @@ -123,51 +162,125 @@ "title": "Wybór heap_1--heap_5", "content_kind": "prose", "content_tex": "Porównaj możliwość free, koalescencję oraz źródło/regiony pamięci. Wybierz heap dla startup-only, jednej areny z delete i dwóch rozłącznych banków RAM.", - "educational_requirement_refs": ["K05.WE01"], - "learning_effect_refs": ["K05.EN01"], - "assessment_criterion_refs": ["K05.KW01"], - "area_tree_refs": ["K05.WE01.OG.LOCAL.MEM.POLICY.01"], + "educational_requirement_refs": [ + "K05.WE01" + ], + "learning_effect_refs": [ + "K05.EN01" + ], + "assessment_criterion_refs": [ + "K05.KW01" + ], + "area_tree_refs": [ + "K05.WE01.OG.LOCAL.MEM.POLICY.01" + ], "steps": [ - {"id": "S01", "title": "Uzasadnij heap_1, heap_4 i heap_5 dla trzech wdrożeń.", "tree_refs": ["K05.WE01.OG.LOCAL.MEM.POLICY.01"]}, - {"id": "S02", "title": "Wyjaśnij zależność heap_3 od libc i linkera.", "tree_refs": ["K05.WE01.OG.LOCAL.MEM.POLICY.01"]} + { + "id": "S01", + "title": "Uzasadnij heap_1, heap_4 i heap_5 dla trzech wdrożeń.", + "tree_refs": [ + "K05.WE01.OG.LOCAL.MEM.POLICY.01" + ] + }, + { + "id": "S02", + "title": "Wyjaśnij zależność heap_3 od libc i linkera.", + "tree_refs": [ + "K05.WE01.OG.LOCAL.MEM.POLICY.01" + ] + } ] }, { "title": "Kompletny most C++", "content_kind": "prose", "content_tex": "Odszukaj scalar/array new oraz sized/unsized scalar/array delete. Zwykłe new jest fail-fast; raw pvPortMalloc pozostaje fallible.", - "educational_requirement_refs": ["K05.WE01"], - "learning_effect_refs": ["K05.EK01"], - "assessment_criterion_refs": ["K05.KW01"], - "area_tree_refs": ["K05.WE01.TECH.LOCAL.DBG.HEAP.01"], + "educational_requirement_refs": [ + "K05.WE01" + ], + "learning_effect_refs": [ + "K05.EK01" + ], + "assessment_criterion_refs": [ + "K05.KW01" + ], + "area_tree_refs": [ + "K05.WE01.TECH.LOCAL.DBG.HEAP.01" + ], "steps": [ - {"id": "S03", "title": "Potwierdź sześć symboli alokacji/dealokacji w ELF.", "tree_refs": ["K05.WE01.TECH.LOCAL.DBG.HEAP.01"]}, - {"id": "S04", "title": "Rozdziel fail-fast new od kontrolowanego raw probe.", "tree_refs": ["K05.WE01.TECH.LOCAL.DBG.HEAP.01"]} + { + "id": "S03", + "title": "Potwierdź sześć symboli alokacji/dealokacji w ELF.", + "tree_refs": [ + "K05.WE01.TECH.LOCAL.DBG.HEAP.01" + ] + }, + { + "id": "S04", + "title": "Rozdziel fail-fast new od kontrolowanego raw probe.", + "tree_refs": [ + "K05.WE01.TECH.LOCAL.DBG.HEAP.01" + ] + } ] }, { "title": "Fragmentacja, koalescencja i retry", "content_kind": "prose", "content_tex": "Zwolnij A i C wokół żywego B. Udowodnij largest < request < total oraz failure. Zwolnij B i ponów identyczne żądanie po koalescencji.", - "educational_requirement_refs": ["K05.WE01"], - "learning_effect_refs": ["K05.EK01"], - "assessment_criterion_refs": ["K05.KW01"], - "area_tree_refs": ["K05.WE01.TECH.LOCAL.DBG.HEAP.01"], + "educational_requirement_refs": [ + "K05.WE01" + ], + "learning_effect_refs": [ + "K05.EK01" + ], + "assessment_criterion_refs": [ + "K05.KW01" + ], + "area_tree_refs": [ + "K05.WE01.TECH.LOCAL.DBG.HEAP.01" + ], "steps": [ - {"id": "S05", "title": "Zapisz dwa free blocks oraz relację request między largest i total.", "tree_refs": ["K05.WE01.TECH.LOCAL.DBG.HEAP.01"]}, - {"id": "S06", "title": "Pokaż jeden blok po free B i udany retry.", "tree_refs": ["K05.WE01.TECH.LOCAL.DBG.HEAP.01"]} + { + "id": "S05", + "title": "Zapisz dwa free blocks oraz relację request między largest i total.", + "tree_refs": [ + "K05.WE01.TECH.LOCAL.DBG.HEAP.01" + ] + }, + { + "id": "S06", + "title": "Pokaż jeden blok po free B i udany retry.", + "tree_refs": [ + "K05.WE01.TECH.LOCAL.DBG.HEAP.01" + ] + } ] }, { "title": "Watermark zachowuje historię", "content_kind": "prose", "content_tex": "Po finalnym free current wraca do baseline, ale minimum-ever pozostaje historycznym minimum. Wylicz peak = baseline - minimum-ever.", - "educational_requirement_refs": ["K05.WE01"], - "learning_effect_refs": ["K05.EN01"], - "assessment_criterion_refs": ["K05.KW01"], - "area_tree_refs": ["K05.WE01.OG.LOCAL.MEM.POLICY.01"], + "educational_requirement_refs": [ + "K05.WE01" + ], + "learning_effect_refs": [ + "K05.EN01" + ], + "assessment_criterion_refs": [ + "K05.KW01" + ], + "area_tree_refs": [ + "K05.WE01.OG.LOCAL.MEM.POLICY.01" + ], "steps": [ - {"id": "S07", "title": "Porównaj final current z minimum-ever i wylicz peak.", "tree_refs": ["K05.WE01.OG.LOCAL.MEM.POLICY.01"]} + { + "id": "S07", + "title": "Porównaj final current z minimum-ever i wylicz peak.", + "tree_refs": [ + "K05.WE01.OG.LOCAL.MEM.POLICY.01" + ] + } ] } ], @@ -177,11 +290,21 @@ "uuid": "c456b505-dc5c-4894-b832-bb4c5afd0feb", "prompt_tex": "Wybierz model heapu, sprawdź most ABI, a następnie odtwórz siedem checkpointów i udowodnij failure mimo wystarczającej sumy free, udany retry po koalescencji oraz zachowanie minimum-ever.", "criterion": "Sześć symboli; largest < request < total; failure bez success increment; jeden blok po free B; retry działa; 3/3/0; current=baseline; minimum-ever