{"bundle_version":"1.0.0","generated":"2026-09-01T23:27:19Z","python":"3.11.16","python_target":"3.11","python_matches_target":true,"gamification":{"params":{"xp_base":10,"xp_first_try_bonus":5,"xp_stage_factor":0.15,"xp_retry_decay":0.5,"xp_checkpoint_multiplier":2.0,"xp_capstone_multiplier":3.0,"mastery_alpha":0.4,"mastery_threshold":0.75,"mastery_min_forms":2,"mastery_min_attempts":2,"gate_checkpoint_score":0.8,"gate_max_error_rate":0.34,"review_intervals":[1,3,7,16,35],"review_lapse_penalty":2,"streak_grace_days":1},"badges":[{"slug":"arrow-not-value","name":"The arrow, not the value","misconception":"assignment-copies-a-value","requires_forms":2,"blurb":"You never again said `b = a` copies the list."},{"slug":"shallow-and-deep","name":"Two levels down","misconception":"a-new-outer-container-means-new-inner-objects","requires_forms":2,"blurb":"You track the outer object and the inner objects separately."},{"slug":"star-trap","name":"The `*` trap, survived","misconception":"makes-independent-inner-lists","requires_forms":2,"blurb":"`[[0] * 3] * 3` will never surprise you again."},{"slug":"mutable-default","name":"Default made once","misconception":"defaults-are-created-per-call","requires_forms":1,"blurb":"You know when a default argument is built."},{"slug":"indentation-is-meaning","name":"Indentation is meaning","misconception":"indentation-is-cosmetic","requires_forms":2,"blurb":"Block boundaries stopped being guesswork."},{"slug":"no-copies-here","name":"Not a copy","misconception":"function-parameters-are-copies","requires_forms":2,"blurb":"You can say what a caller sees, and why."}],"storage":{"key":"pyviz.progress.v1","schema":1,"shape":"{\"body\": {\"schema\": 1, \"attempts\": [Attempt]}, \"sig\": \"sha256\"}","append_only":true,"dedupe_key":["item_id","attempt_no","at"],"notes":["Wrap every read and write in try/catch: storage throws in private windows and in thumbnail capture contexts.","Render correctly with no stored value; an empty log is a valid state.","Never store anything not present in the Attempt schema -- the export blob is the learner's whole record and must stay portable.","On a quota error, drop the oldest attempts but keep one per item so the mastery fold stays meaningful."]}},"counts":{"stages":9,"items":214,"snippets":191,"traces":191,"steps":2956,"diagrams":854,"concepts":46,"xp_available":12411},"coverage":{"graders_by_kind":{"token_roles":6,"exact_output":75,"object_graph":13,"execution_order":16,"snippet_divergence":21,"rubric":36,"code_repair":19,"code_property":22,"self_assessed":4,"block_membership":4,"code_equivalence":3},"derived_graders":151,"authored_graders":68,"supplements_applied":4,"authoring_gaps":64,"gradable":155,"nondeterministic_items":["1.11","6.9","6.10","6.14","8.14","C8.2"],"untraceable":0,"trace_failures":0,"concepts":{"concepts_used":46,"items_with_concepts":198,"items_without_concepts":16,"max_concepts_on_an_item":9,"mean_concepts_per_item":2.89,"concepts_reachable_in_two_forms":42}},"build_seconds":2.29}