From 1776d7bad8e91623bd6c00848d3b73ef98f31060 Mon Sep 17 00:00:00 2001 From: "M. Pabiszczak" <2+mpabi@noreply.zsl-gitea.mpabi.pl> Date: Mon, 20 Jul 2026 08:36:15 +0200 Subject: [PATCH] meta: add interactive draft URL --- json/card_source.json | 151 ++++++++++++++++++++++++++++++++---------- 1 file changed, 116 insertions(+), 35 deletions(-) diff --git a/json/card_source.json b/json/card_source.json index 91a5069..9fc43b3 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/de1a2818-4c30-5760-8b31-255114f82e90" }, "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 kodu, ELF i Hazard3."}, - {"id": "ogolne", "label": "OG", "side": "right", "tree": "WE -> EN -> KW", "description": "Rozumowanie o własności i czasie życia."} + { + "id": "zawodowe", + "label": "TECH", + "side": "left", + "tree": "WE -> EK -> KW", + "description": "Dowód z kodu, ELF i Hazard3." + }, + { + "id": "ogolne", + "label": "OG", + "side": "right", + "tree": "WE -> EN -> KW", + "description": "Rozumowanie o własności i czasie życia." + } ] }, "learning_effects": { @@ -62,26 +75,36 @@ "bloom_level": "Analiza", "label": "Inwariant własności", "text": "Uczeń wyjaśnia jeden-owner invariant, usunięte kopiowanie, stan moved-from i kolejność release-before-transfer.", - "assessment_criteria": ["K03.KW01"] + "assessment_criteria": [ + "K03.KW01" + ] }, "K03.EK01": { "bloom_level": "Zastosowanie", "label": "Dowód pamięci", "text": "Uczeń odtwarza checkpointy 1–7 i koreluje adresy A/B, liczniki new/delete oraz stan heap_4.", - "assessment_criteria": ["K03.KW01"] + "assessment_criteria": [ + "K03.KW01" + ] } }, "assessment_criteria": { "K03.KW01": { "text": "Program kończy się PASS; adres A przechodzi do kolejnych właścicieli, B jest zwolniony przed transferem, źródła są puste, allocations=2, frees=2, live=0 i final free equals baseline.", - "learning_effects": ["K03.EN01", "K03.EK01"] + "learning_effects": [ + "K03.EN01", + "K03.EK01" + ] } }, "educational_requirements": { "K03.WE01": { "text": "Zaprojektowanie i zbadanie move-only właściciela bufora nad heap_4.", "label": "Vector V1 i RAII", - "learning_effects": ["K03.EN01", "K03.EK01"], + "learning_effects": [ + "K03.EN01", + "K03.EK01" + ], "learning_tree": { "schema": "we-learning-tree.v1", "policy": "Każda zmiana właściciela ma dowód adresu i licznika zwolnień.", @@ -139,20 +162,32 @@ "title": "V0 i inwariant jednego właściciela", "content_kind": "prose", "content_tex": "Zdiagnozuj wyciek V0 i ryzyko double free po dodaniu destruktora bez usunięcia kopiowania.", - "educational_requirement_refs": ["K03.WE01"], - "learning_effect_refs": ["K03.EN01"], - "assessment_criterion_refs": ["K03.KW01"], - "area_tree_refs": ["K03.WE01.OG.LOCAL.OOP.OWN.01"], + "educational_requirement_refs": [ + "K03.WE01" + ], + "learning_effect_refs": [ + "K03.EN01" + ], + "assessment_criterion_refs": [ + "K03.KW01" + ], + "area_tree_refs": [ + "K03.WE01.OG.LOCAL.OOP.OWN.01" + ], "steps": [ { "id": "S01", "title": "Nazwij właściciela, zasób i dwa błędy Vector V0.", - "tree_refs": ["K03.WE01.OG.LOCAL.OOP.OWN.01"] + "tree_refs": [ + "K03.WE01.OG.LOCAL.OOP.OWN.01" + ] }, { "id": "S02", "title": "Uzasadnij destruktor oraz usunięcie operacji kopiowania.", - "tree_refs": ["K03.WE01.OG.LOCAL.OOP.OWN.01"] + "tree_refs": [ + "K03.WE01.OG.LOCAL.OOP.OWN.01" + ] } ] }, @@ -160,20 +195,32 @@ "title": "Move assignment do zajętego celu", "content_kind": "prose", "content_tex": "Dla source->A i destination->B ułóż release, transfer pól i wyzerowanie źródła.", - "educational_requirement_refs": ["K03.WE01"], - "learning_effect_refs": ["K03.EN01"], - "assessment_criterion_refs": ["K03.KW01"], - "area_tree_refs": ["K03.WE01.OG.LOCAL.OOP.OWN.01"], + "educational_requirement_refs": [ + "K03.WE01" + ], + "learning_effect_refs": [ + "K03.EN01" + ], + "assessment_criterion_refs": [ + "K03.KW01" + ], + "area_tree_refs": [ + "K03.WE01.OG.LOCAL.OOP.OWN.01" + ], "steps": [ { "id": "S03", "title": "Zwolnij B przed przejęciem A i wyjaśnij self-move guard.", - "tree_refs": ["K03.WE01.OG.LOCAL.OOP.OWN.01"] + "tree_refs": [ + "K03.WE01.OG.LOCAL.OOP.OWN.01" + ] }, { "id": "S04", "title": "Wyzeruj źródło i sprawdź stan moved-from.", - "tree_refs": ["K03.WE01.OG.LOCAL.OOP.OWN.01"] + "tree_refs": [ + "K03.WE01.OG.LOCAL.OOP.OWN.01" + ] } ] }, @@ -181,25 +228,39 @@ "title": "Hazard3: checkpointy 1–7", "content_kind": "prose", "content_tex": "Śledź A i B, liczniki allocation/deallocation oraz relacje current free i minimum-ever.", - "educational_requirement_refs": ["K03.WE01"], - "learning_effect_refs": ["K03.EK01"], - "assessment_criterion_refs": ["K03.KW01"], - "area_tree_refs": ["K03.WE01.TECH.LOCAL.DBG.MEM.01"], + "educational_requirement_refs": [ + "K03.WE01" + ], + "learning_effect_refs": [ + "K03.EK01" + ], + "assessment_criterion_refs": [ + "K03.KW01" + ], + "area_tree_refs": [ + "K03.WE01.TECH.LOCAL.DBG.MEM.01" + ], "steps": [ { "id": "S05", "title": "Na STOP 3 zapisz dwa różne adresy i stan heapu.", - "tree_refs": ["K03.WE01.TECH.LOCAL.DBG.MEM.01"] + "tree_refs": [ + "K03.WE01.TECH.LOCAL.DBG.MEM.01" + ] }, { "id": "S06", "title": "Na STOP 4 pokaż B jako pierwszy zwolniony adres i A u celu.", - "tree_refs": ["K03.WE01.TECH.LOCAL.DBG.MEM.01"] + "tree_refs": [ + "K03.WE01.TECH.LOCAL.DBG.MEM.01" + ] }, { "id": "S07", "title": "Na STOP 7 potwierdź 2/2/0, baseline i PASS.", - "tree_refs": ["K03.WE01.TECH.LOCAL.DBG.MEM.01"] + "tree_refs": [ + "K03.WE01.TECH.LOCAL.DBG.MEM.01" + ] } ] }, @@ -207,15 +268,25 @@ "title": "Granica RAII", "content_kind": "prose", "content_tex": "RAII wymaga normalnego zakończenia czasu życia C++; arbitralne usunięcie taska bez unwindingu nie uruchamia automatycznie destruktorów jego ramek.", - "educational_requirement_refs": ["K03.WE01"], - "learning_effect_refs": ["K03.EN01"], - "assessment_criterion_refs": ["K03.KW01"], - "area_tree_refs": ["K03.WE01.OG.LOCAL.OOP.OWN.01"], + "educational_requirement_refs": [ + "K03.WE01" + ], + "learning_effect_refs": [ + "K03.EN01" + ], + "assessment_criterion_refs": [ + "K03.KW01" + ], + "area_tree_refs": [ + "K03.WE01.OG.LOCAL.OOP.OWN.01" + ], "steps": [ { "id": "S08", "title": "Odróżnij normalne wyjście z zakresu od wymuszonego zakończenia taska.", - "tree_refs": ["K03.WE01.OG.LOCAL.OOP.OWN.01"] + "tree_refs": [ + "K03.WE01.OG.LOCAL.OOP.OWN.01" + ] } ] } @@ -226,11 +297,21 @@ "uuid": "de1a2818-4c30-5760-8b31-255114f82e90", "prompt_tex": "Uzupełnij bezpieczną kolejność move assignment, a następnie odtwórz checkpointy i udowodnij transfer A, zwolnienie B oraz powrót heapu do baseline.", "criterion": "Copy jest zabronione; source i destination po move są puste; freed addresses mają kolejność B,A; allocations=2, frees=2, live=0 i pass=1.", - "educational_requirement_refs": ["K03.WE01"], - "learning_effect_refs": ["K03.EN01", "K03.EK01"], + "educational_requirement_refs": [ + "K03.WE01" + ], + "learning_effect_refs": [ + "K03.EN01", + "K03.EK01" + ], "assessment_criterion_ref": "K03.KW01", - "links": {"equations": [], "figures": []} + "links": { + "equations": [], + "figures": [] + } } }, - "tasks_order": ["task01"] + "tasks_order": [ + "task01" + ] }