{
  "copyright": "© liviu.ai",
  "version": "plan-4-zile-48-tutoriale-2026-09-11",
  "kind": "plan editorial și didactic cu legături către filmele efectiv verificate",
  "duration_minutes": 720,
  "planned_tutorial_slots": 48,
  "rendered_tutorial_slots": 48,
  "final_objective": "Două echipe mixte construiesc fiecare aplicația temei alese: un flux complet, reguli explicite, rezultat păstrat, o modificare verificată și probe reproductibile. Fiecare participant demonstrează o contribuție și explică o regulă.",
  "team_model": {
    "expected_teams": 2,
    "composition": "începători și avansați împreună",
    "project_topics": "alese de echipe în ora 1; încă neprecizate",
    "shared_standard": "P1–P6, cu criterii și exemple specifice fiecărei teme"
  },
  "skills": {
    "S1": "Definește o problemă, un rezultat observabil și un scop realizabil.",
    "S2": "Transformă cerințele în exemple și criterii de acceptare.",
    "S3": "Colaborează cu AI prin context, schimbări mici și verificarea rezultatului.",
    "S4": "Modelează datele și aplică reguli explicite de validare.",
    "S5": "Modelează stări și tranziții cu precondiții.",
    "S6": "Păstrează identitatea și datele; explică limitele stocării locale.",
    "S7": "Reproduce un defect, localizează cauza și verifică remedierea.",
    "S8": "Îmbunătățește, livrează și demonstrează o aplicație cu dovezi."
  },
  "proofs": {
    "P1": "Fișa temei alese de echipă: utilizator, sarcină, limite și trei criterii verificabile.",
    "P2": "Un flux complet în aplicația echipei: intrare, acțiune și rezultat; un caz valid și unul invalid demonstrate.",
    "P3": "O acțiune permisă și una respinsă de o precondiție sau stare relevantă proiectului.",
    "P4": "Rezultatul salvat este regăsit după reîncărcare, cu identitatea și informațiile relevante păstrate.",
    "P5": "O schimbare delimitată după feedback, cu probe înainte și după.",
    "P6": "Pachetul aplicației, probe reproductibile și explicația limitelor."
  },
  "days": [
    {
      "day": 1,
      "title": "De la problemă la primul flux funcțional",
      "milestone": "Fiecare echipă are tema și scopul alese, trei criterii și primul flux funcțional în aplicația sa.",
      "proofs": [
        "P1",
        "P2"
      ],
      "bridge": "Ziua 2 pornește de la fluxul fiecărei echipe și introduce intrări și acțiuni neașteptate."
    },
    {
      "day": 2,
      "title": "Date corecte, stări explicite, informații păstrate",
      "milestone": "Fiecare proiect aplică reguli de date și acțiune și păstrează rezultatul după reîncărcare.",
      "proofs": [
        "P2",
        "P3",
        "P4"
      ],
      "bridge": "Ziua 3 folosește aceleași probe, dar le privește prin ochii unui coleg care încearcă să găsească un defect."
    },
    {
      "day": 3,
      "title": "Verificăm, explicăm și reparăm",
      "milestone": "Fiecare echipă reproduce și repară un defect și alege o îmbunătățire din feedbackul celeilalte echipe.",
      "proofs": [
        "P2",
        "P3",
        "P4",
        "P5"
      ],
      "bridge": "Ziua 4 începe cu îmbunătățirea aleasă și urmărește impactul ei până la livrare."
    },
    {
      "day": 4,
      "title": "Modificăm cu control și demonstrăm rezultatul",
      "milestone": "Cele două aplicații sunt predate cu probe, o modificare verificată și limite explicate; fiecare participant contribuie la demonstrație.",
      "proofs": [
        "P5",
        "P6"
      ],
      "bridge": "Următorul proiect pornește de la aceeași metodă, cu complexitate aleasă explicit."
    }
  ],
  "hours": [
    {
      "hour": 1,
      "day": 1,
      "title": "Alegem o țintă care poate fi demonstrată",
      "scenario": "Club media: împrumutul echipamentelor",
      "result": "Fiecare echipă alege tema, completează fișa proiectului și scrie trei criterii.",
      "final_proof": "P1",
      "tutorial_ids": [
        "V01",
        "V02",
        "V03",
        "V04"
      ],
      "minutes": {
        "reactivation": 5,
        "videos_and_controls": 6,
        "decisions_and_feedback": 8,
        "application": 30,
        "peer_evidence_review": 6,
        "break": 5
      }
    },
    {
      "hour": 2,
      "day": 1,
      "title": "Lucrăm cu AI în pași pe care îi putem verifica",
      "scenario": "Organizarea unui eveniment mic",
      "result": "Prima cerere de implementare, contextul proiectului și o versiune de revenire.",
      "final_proof": "P1",
      "tutorial_ids": [
        "V05",
        "V06",
        "V07",
        "V08"
      ],
      "minutes": {
        "reactivation": 5,
        "videos_and_controls": 6,
        "decisions_and_feedback": 8,
        "application": 30,
        "peer_evidence_review": 6,
        "break": 5
      }
    },
    {
      "hour": 3,
      "day": 1,
      "title": "Construim un traseu complet, de la intrare la rezultat",
      "scenario": "Cereri de materiale pentru un atelier",
      "result": "Primul flux funcțional al fiecărei echipe, fără obligația de a copia formularul exemplului.",
      "final_proof": "P2",
      "tutorial_ids": [
        "V09",
        "V10",
        "V11",
        "V12"
      ],
      "minutes": {
        "reactivation": 5,
        "videos_and_controls": 6,
        "decisions_and_feedback": 8,
        "application": 30,
        "peer_evidence_review": 6,
        "break": 5
      }
    },
    {
      "hour": 4,
      "day": 2,
      "title": "Definim contractul datelor",
      "scenario": "Înscriere la un eveniment cu locuri limitate",
      "result": "Câmpuri, tipuri, limite și mesaje relevante temei; un caz valid, unul invalid și unul la limită.",
      "final_proof": "P2",
      "tutorial_ids": [
        "V13",
        "V14",
        "V15",
        "V16"
      ],
      "minutes": {
        "reactivation": 5,
        "videos_and_controls": 6,
        "decisions_and_feedback": 8,
        "application": 30,
        "peer_evidence_review": 6,
        "break": 5
      }
    },
    {
      "hour": 5,
      "day": 2,
      "title": "Controlăm ce se poate întâmpla",
      "scenario": "Atelier de reparații: o lampă defectă",
      "result": "O acțiune permisă și una blocată de starea sau precondiția stabilită de echipă.",
      "final_proof": "P3",
      "tutorial_ids": [
        "V17",
        "V18",
        "V19",
        "V20"
      ],
      "minutes": {
        "reactivation": 5,
        "videos_and_controls": 6,
        "decisions_and_feedback": 8,
        "application": 30,
        "peer_evidence_review": 6,
        "break": 5
      }
    },
    {
      "hour": 6,
      "day": 2,
      "title": "Păstrăm aceeași înregistrare după reîncărcare",
      "scenario": "Revenire la clubul media și la cererea de echipament",
      "result": "Rezultatul relevant proiectului este salvat și restaurat, fără pierderea identității.",
      "final_proof": "P4",
      "tutorial_ids": [
        "V21",
        "V22",
        "V23",
        "V24"
      ],
      "minutes": {
        "reactivation": 5,
        "videos_and_controls": 6,
        "decisions_and_feedback": 8,
        "application": 30,
        "peer_evidence_review": 6,
        "break": 5
      }
    },
    {
      "hour": 7,
      "day": 3,
      "title": "Construim probe care pot contrazice aplicația",
      "scenario": "Rezervarea unei săli de întâlniri",
      "result": "Fișă de probe: intrare, pași, așteptare, rezultat observat.",
      "final_proof": "P2",
      "tutorial_ids": [
        "V25",
        "V26",
        "V27",
        "V28"
      ],
      "minutes": {
        "reactivation": 5,
        "videos_and_controls": 6,
        "decisions_and_feedback": 8,
        "application": 30,
        "peer_evidence_review": 6,
        "break": 5
      }
    },
    {
      "hour": 8,
      "day": 3,
      "title": "Găsim cauza unui defect",
      "scenario": "O cerere de service dispare sau își schimbă valoarea",
      "result": "Un defect reprodus, o cauză verificată și o remediere retestată.",
      "final_proof": "P5",
      "tutorial_ids": [
        "V29",
        "V30",
        "V31",
        "V32"
      ],
      "minutes": {
        "reactivation": 5,
        "videos_and_controls": 6,
        "decisions_and_feedback": 8,
        "application": 30,
        "peer_evidence_review": 6,
        "break": 5
      }
    },
    {
      "hour": 9,
      "day": 3,
      "title": "Privim aplicația din roluri diferite",
      "scenario": "Cele două echipe își testează reciproc aplicațiile",
      "result": "Feedback concret de la cealaltă echipă și o singură îmbunătățire prioritară.",
      "final_proof": "P5",
      "tutorial_ids": [
        "V33",
        "V34",
        "V35",
        "V36"
      ],
      "minutes": {
        "reactivation": 5,
        "videos_and_controls": 6,
        "decisions_and_feedback": 8,
        "application": 30,
        "peer_evidence_review": 6,
        "break": 5
      }
    },
    {
      "hour": 10,
      "day": 4,
      "title": "Schimbăm o regulă fără să pierdem controlul",
      "scenario": "Club media: noua limită de echipamente",
      "result": "O schimbare relevantă temei, probe actualizate și versiune de revenire.",
      "final_proof": "P5",
      "tutorial_ids": [
        "V37",
        "V38",
        "V39",
        "V40"
      ],
      "minutes": {
        "reactivation": 5,
        "videos_and_controls": 6,
        "decisions_and_feedback": 8,
        "application": 30,
        "peer_evidence_review": 6,
        "break": 5
      }
    },
    {
      "hour": 11,
      "day": 4,
      "title": "Pregătim livrarea și înțelegem limitele",
      "scenario": "Fișiere locale și magazin online pentru contrast",
      "result": "Pachet portabil verificat; diferența dintre salvare locală și reîncercări într-un serviciu.",
      "final_proof": "P6",
      "tutorial_ids": [
        "V41",
        "V42",
        "V43",
        "V44"
      ],
      "minutes": {
        "reactivation": 5,
        "videos_and_controls": 6,
        "decisions_and_feedback": 8,
        "application": 30,
        "peer_evidence_review": 6,
        "break": 5
      }
    },
    {
      "hour": 12,
      "day": 4,
      "title": "Demonstrăm, transferăm și predăm",
      "scenario": "Proiectul propriu și un context nou ales de cursant",
      "result": "Aplicație, fișă de probe, modificare demonstrată și limite explicate.",
      "final_proof": "P6",
      "tutorial_ids": [
        "V45",
        "V46",
        "V47",
        "V48"
      ],
      "minutes": {
        "reactivation": 5,
        "videos_and_controls": 6,
        "decisions_and_feedback": 8,
        "application": 30,
        "peer_evidence_review": 6,
        "break": 5
      }
    }
  ],
  "asset_families": {
    "CORE": {
      "status": "existent; selectare după potrivire",
      "elements": "Materiale, lumini, camere, tabletă, înregistrare și imagini din pilotul aprobat.",
      "rule": "Refolosim numai componentele potrivite. Materialele comune nu înlocuiesc regia sau obiectele specifice."
    },
    "MEDIA": {
      "status": "parțial construit: cameră 3D, imagine alfa și fișă; celelalte obiecte rămân propuse",
      "elements": "Cameră foto, trepied, microfon, dulap de împrumut și fișă de predare.",
      "rule": "Obiectele explică ce solicită persoana; aceeași fotografie identifică echipamentul în interfață și în scenă."
    },
    "EVENT": {
      "status": "parțial construit: scaune 3D și decor generat; biletele și ecusoanele rămân propuse",
      "elements": "Bilet numerotat, locuri discrete, ecuson, plan de sală și afiș de eveniment.",
      "rule": "Numărul de locuri explică discreția cantității; nu tratăm schema ca rezervare reală cu concurență."
    },
    "SERVICE": {
      "status": "parțial construit: lampă 3D, banc, instrumente și fișe de stare",
      "elements": "Lampă defectă, banc de lucru, etichetă de intervenție, cutie de predare.",
      "rule": "Etapele reflectă o regulă explicită a atelierului; un obiect mutat nu implică automat o operație software."
    },
    "ROOM": {
      "status": "de inventariat / completat",
      "elements": "Sală de întâlniri, ușă, ceas, calendar și intervale vizibile.",
      "rule": "Intervalele arată cazuri de test și feedback; nu adăugăm un motor complet de rezervări în proiectul de bază."
    },
    "TRACE": {
      "status": "implementat în V15/V23: două verificări, straturi pagină–memorie–stocare și fișă cu ID",
      "elements": "Straturi interfață–logică–date, traseu al unei valori, memorie temporară, sertar persistent, jurnal de observații.",
      "rule": "Metafora stocării este însoțită de explicația mecanismului și a limitelor sale."
    },
    "DELIVERY": {
      "status": "de inventariat / completat",
      "elements": "Dosar de proiect, versiuni comparate, colet cu fișiere locale, fișă de probe și fișă de predare.",
      "rule": "Arătăm și rezultatul real în browser; simbolurile nu țin loc de dovadă."
    }
  },
  "tutorials": [
    {
      "id": "V01",
      "day": 1,
      "hour": 1,
      "part": 1,
      "title": "Cui îi economisește timp aplicația?",
      "skill": "S1",
      "objective": "Formulează un utilizator, o sarcină și un rezultat observabil.",
      "scenario": "Club media: împrumutul echipamentelor",
      "visual_direction": "Organizatorul, valiza goală și trei conversații arată că răspunsul lipsește; căutarea pe tabletă identifică împrumutul M204, iar colegul repetă sarcina.",
      "student_decision": "Cine face ce mai ușor, la sfârșit?",
      "application_task": "Alegeți tema echipei și formulați un utilizator, o sarcină și rezultatul dorit.",
      "evidence": "Tema are o nevoie concretă și un rezultat observabil, confirmate în fișa echipei.",
      "final_proof": "P1",
      "prerequisites": [],
      "asset_families": [
        "MEDIA"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V01-diversitate/Lectie.mp4",
      "guided_example_task": "Scrie o propoziție despre utilizator, sarcină și rezultat în fișa proiectului.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V01",
      "duration_seconds": 47.875
    },
    {
      "id": "V02",
      "day": 1,
      "hour": 1,
      "part": 2,
      "title": "Ce încape în prima versiune?",
      "skill": "S1",
      "objective": "Separă traseul esențial de funcțiile care pot aștepta.",
      "scenario": "Club media: împrumutul echipamentelor",
      "visual_direction": "Harta modulară grupează înregistrează, găsește și actualizează în împrumuturi; chat, plăți și statistici sunt opționale. Scoaterea listei întrerupe traseul; scoaterea ramurilor opționale îl păstrează.",
      "student_decision": "Fără această funcție, sarcina principală mai poate fi terminată?",
      "application_task": "Delimitați un singur flux principal realizabil în curs și treceți trei funcții la «mai târziu».",
      "evidence": "Scopul permite o demonstrație completă; fiecare membru poate explica o excludere.",
      "final_proof": "P1",
      "prerequisites": [
        "V01"
      ],
      "asset_families": [
        "MEDIA"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V02-diversitate/Lectie.mp4",
      "guided_example_task": "Alege creare, listă, validare, stări și salvare; trece trei idei suplimentare la «mai târziu».",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V02",
      "duration_seconds": 53.125
    },
    {
      "id": "V03",
      "day": 1,
      "hour": 1,
      "part": 3,
      "title": "«Ușor de folosit» devine o cerință",
      "skill": "S2",
      "objective": "Rescrie o intenție vagă ca situație, acțiune și rezultat.",
      "scenario": "Club media: împrumutul echipamentelor",
      "visual_direction": "Ecranul frumos nu arată cererea după trimitere; trecem din perspectiva solicitantului în lista operatorului; aceeași fișă apare cu identificator.",
      "student_decision": "Ce trebuie să pot vedea ca să spun «funcționează»?",
      "application_task": "Scrieți trei criterii verificabile pentru fluxul ales, folosind date fictive din tema voastră.",
      "evidence": "Fiecare criteriu are situație inițială, acțiune și rezultat; nu impune câmpurile exemplului video.",
      "final_proof": "P1",
      "prerequisites": [
        "V01",
        "V02"
      ],
      "asset_families": [
        "MEDIA",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V03-diversitate/Lectie.mp4",
      "guided_example_task": "Scrie trei criterii pentru creare, respingerea datelor greșite și regăsire după reîncărcare.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V03",
      "duration_seconds": 53.208333333333336
    },
    {
      "id": "V04",
      "day": 1,
      "hour": 1,
      "part": 4,
      "title": "Proba se gândește înaintea soluției",
      "skill": "S2",
      "objective": "Decide cum va verifica o cerință înainte să ceară cod.",
      "scenario": "Club media: împrumutul echipamentelor",
      "visual_direction": "Două ecrane identice la salvare; reîncărcarea golește unul și păstrează fișa în celălalt; camera urmărește identitatea, nu doar mesajul «salvat».",
      "student_decision": "Mesajul «salvat» dovedește că datele vor rămâne?",
      "application_task": "Alegeți un rezultat care trebuie păstrat și descrieți proba de reîncărcare înainte de a cere implementarea.",
      "evidence": "Proba identifică rezultatul și informațiile care trebuie să rămână neschimbate.",
      "final_proof": "P1",
      "prerequisites": [
        "V03"
      ],
      "asset_families": [
        "MEDIA",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V04-diversitate/Lectie.mp4",
      "guided_example_task": "Notează pașii și rezultatul așteptat pentru o cerere păstrată după reîncărcare.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "existing_reference": {
        "file": "lectii/01-cerinte/Lectie-hibrid.mp4",
        "status": "prototip de rescris și refăcut; utilizatorul îl consideră prea simplist"
      },
      "interactive_file": "tutoriale/curs.html#V04",
      "duration_seconds": 52.666666666666664
    },
    {
      "id": "V05",
      "day": 1,
      "hour": 2,
      "part": 1,
      "title": "AI propune; tu stabilești criteriul",
      "skill": "S3",
      "objective": "Separă o propunere plauzibilă de un rezultat verificat.",
      "scenario": "Organizarea unui eveniment mic",
      "visual_direction": "La recepția atelierului, propunerea acceptă greșit 11 locuri; organizatorul explicitează maximum 10 per cerere. După corecție, 5 este acceptat și 11 este respins fără cerere nouă.",
      "student_decision": "Cine decide dacă rezultatul respectă regula evenimentului?",
      "application_task": "Cereți AI-ului să reformuleze tema și presupunerile; un membru mai puțin experimentat conduce clarificarea.",
      "evidence": "Echipa corectează o presupunere și păstrează scopul convenit.",
      "final_proof": "P1",
      "prerequisites": [
        "V04"
      ],
      "asset_families": [
        "EVENT",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V05-diversitate/Lectie.mp4",
      "guided_example_task": "Cere AI-ului să reformuleze scopul și să enumere presupunerile; corectează o presupunere.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V05",
      "duration_seconds": 52.583333333333336
    },
    {
      "id": "V06",
      "day": 1,
      "hour": 2,
      "part": 2,
      "title": "Contextul care schimbă răspunsul",
      "skill": "S3",
      "objective": "Oferă AI-ului informațiile necesare unei schimbări delimitate.",
      "scenario": "Organizarea unui eveniment mic",
      "visual_direction": "Aceeași solicitare intră alături de două dosare: unul vag, unul cu câmpuri, reguli și un exemplu; comparăm comportamentele produse, fără a sugera că dosarul garantează corectitudinea.",
      "student_decision": "Ce informație îi lipsește AI-ului ca să nu inventeze regula?",
      "application_task": "Pregătiți contextul temei: fișiere, utilizator, date, reguli, criteriu și limite tehnice.",
      "evidence": "Un alt membru identifică din cerere rezultatul și verificarea fără explicații suplimentare.",
      "final_proof": "P1",
      "prerequisites": [
        "V05"
      ],
      "asset_families": [
        "EVENT",
        "DELIVERY"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V06-diversitate/Lectie.mp4",
      "guided_example_task": "Pregătește contextul: aplicație locală, fișiere existente, câmpuri, reguli, criteriu și excluderi.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V06",
      "duration_seconds": 52.125
    },
    {
      "id": "V07",
      "day": 1,
      "hour": 2,
      "part": 3,
      "title": "Un pas mic, de la capăt la capăt",
      "skill": "S3",
      "objective": "Cere o schimbare suficient de mică pentru a putea fi verificată.",
      "scenario": "Organizarea unui eveniment mic",
      "visual_direction": "Din planul evenimentului alegem un bilet; camera îl urmărește de la introducere la listă; ramurile fără legătură rămân în fundal.",
      "student_decision": "Care este cea mai mică schimbare care produce un rezultat utilizabil?",
      "application_task": "Cereți cea mai mică implementare care parcurge fluxul ales de la intrare la rezultat.",
      "evidence": "Cererea are un rezultat demonstrabil și nu include funcțiile amânate.",
      "final_proof": "P1",
      "prerequisites": [
        "V06"
      ],
      "asset_families": [
        "EVENT",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V07-diversitate/Lectie.mp4",
      "guided_example_task": "Cere numai formularul și lista, cu date păstrate deocamdată în sesiune; verifică intrarea aleasă.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V07",
      "duration_seconds": 54.083333333333336
    },
    {
      "id": "V08",
      "day": 1,
      "hour": 2,
      "part": 4,
      "title": "Păstrează o versiune și verifică diferența",
      "skill": "S3",
      "objective": "Păstrează posibilitatea de revenire și identifică ce a schimbat AI-ul.",
      "scenario": "Organizarea unui eveniment mic",
      "visual_direction": "Două dosare de proiect se deschid în paralel; numai fișierele afectate se evidențiază; revenirea restaurează versiunea anterioară, apoi proba este repetată.",
      "student_decision": "Poți reveni dacă această schimbare nu funcționează?",
      "application_task": "Salvați o copie datată; comparați ce a schimbat AI-ul și cine a verificat efectul.",
      "evidence": "Există o versiune de revenire și o explicație a schimbării în registrul echipei.",
      "final_proof": "P1",
      "prerequisites": [
        "V07"
      ],
      "asset_families": [
        "DELIVERY"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V08-diversitate/Lectie.mp4",
      "guided_example_task": "Salvează o copie datată a proiectului; cere AI-ului lista fișierelor schimbate și explicația lor.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V08",
      "duration_seconds": 55.291666666666664
    },
    {
      "id": "V09",
      "day": 1,
      "hour": 3,
      "part": 1,
      "title": "Ce vezi și ce se întâmplă în aplicație",
      "skill": "S6",
      "objective": "Distinge interfața, logica și datele într-un singur traseu.",
      "scenario": "Cereri de materiale pentru un atelier",
      "visual_direction": "Un formular de materiale se desface în trei straturi spațiale; valoarea 2 traversează evenimentul, regula și înregistrarea; revenim la rândul nou din listă.",
      "student_decision": "Un buton desenat pe ecran execută deja regula?",
      "application_task": "Urmăriți un exemplu din tema voastră prin interfață, logică și date.",
      "evidence": "Fiecare membru poate indica locul deciziei și locul rezultatului.",
      "final_proof": "P2",
      "prerequisites": [
        "V04"
      ],
      "asset_families": [
        "SERVICE",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V09-diversitate/Lectie.mp4",
      "guided_example_task": "Indică în proiect unde se citește formularul, unde se decide și unde se păstrează lista.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V09",
      "duration_seconds": 48.625
    },
    {
      "id": "V10",
      "day": 1,
      "hour": 3,
      "part": 2,
      "title": "HTML, CSS și JavaScript într-o singură acțiune",
      "skill": "S3",
      "objective": "Recunoaște rolurile celor trei componente fără să memoreze sintaxa.",
      "scenario": "Cereri de materiale pentru un atelier",
      "visual_direction": "Pe aceeași scenă construim eticheta și butonul, aplicăm aspectul, apoi conectăm acțiunea la listă; dezactivarea pe rând a stilului și a acțiunii arată efecte distincte.",
      "student_decision": "Ce trebuie modificat dacă butonul arată bine, dar nu face nimic?",
      "application_task": "Identificați în proiect un element HTML, o regulă CSS și o acțiune JavaScript.",
      "evidence": "Cursantul aflat la început explică efectul fiecăruia, cu sprijin dacă este necesar.",
      "final_proof": "P2",
      "prerequisites": [
        "V09"
      ],
      "asset_families": [
        "SERVICE",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V10-diversitate/Lectie.mp4",
      "guided_example_task": "Identifică o etichetă, o regulă de aspect și acțiunea de trimitere în fișiere, cu ajutorul AI-ului.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V10",
      "duration_seconds": 50.75
    },
    {
      "id": "V11",
      "day": 1,
      "hour": 3,
      "part": 3,
      "title": "Primul traseu care chiar funcționează",
      "skill": "S3",
      "objective": "Pornește și verifică propria versiune de creare și afișare.",
      "scenario": "Cereri de materiale pentru un atelier",
      "visual_direction": "Urmărim două materiale diferite din raft până la formular și apoi în listă; captură reală a aplicației înlocuiește pentru câteva secunde metafora 3D.",
      "student_decision": "Ce dovedește că lista arată intrarea ta, nu un exemplu fix?",
      "application_task": "Rulați fluxul propriu cu două intrări distincte, prin operarea directă a unui membru aflat la început.",
      "evidence": "Rezultatele corespund intrărilor; echipa are prima versiune funcțională.",
      "final_proof": "P2",
      "prerequisites": [
        "V07",
        "V10"
      ],
      "asset_families": [
        "SERVICE",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V11-diversitate/Lectie.mp4",
      "guided_example_task": "Deschide index.html, trimite două cereri diferite și compară rândurile rezultate.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V11",
      "duration_seconds": 48.958333333333336
    },
    {
      "id": "V12",
      "day": 1,
      "hour": 3,
      "part": 4,
      "title": "Ce vede omul când lista este goală sau apare o eroare?",
      "skill": "S8",
      "objective": "Oferă feedback care ajută următoarea acțiune.",
      "scenario": "Cereri de materiale pentru un atelier",
      "visual_direction": "Lista de cereri este goală; mesajul indică acțiunea disponibilă. La material lipsă, mesajul numește câmpul, păstrează cantitatea corectă și permite continuarea sarcinii.",
      "student_decision": "După acest mesaj, știi ce ai de făcut?",
      "application_task": "Adăugați feedback pentru lipsa datelor sau o eroare relevantă fluxului; alt membru încearcă fără instrucțiuni.",
      "evidence": "Persoana găsește următoarea acțiune și locul de corectat.",
      "final_proof": "P2",
      "prerequisites": [
        "V11"
      ],
      "asset_families": [
        "SERVICE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V12-diversitate/Lectie.mp4",
      "guided_example_task": "Adaugă starea goală și un mesaj pentru un câmp lipsă; cere unui coleg să continue fără explicații.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V12",
      "duration_seconds": 49.125
    },
    {
      "id": "V13",
      "day": 2,
      "hour": 4,
      "part": 1,
      "title": "Din formular în model de date",
      "skill": "S4",
      "objective": "Definește nume de câmpuri, sens și tipuri consecvente.",
      "scenario": "Înscriere la un eveniment cu locuri limitate",
      "visual_direction": "Un ecuson și un bilet se separă în câmpuri aliniate cu formularul și înregistrarea; «locuri» și «cantitate» sunt comparate înainte de a alege un nume comun.",
      "student_decision": "Dacă două părți folosesc nume diferite, cum știu că vorbesc despre același lucru?",
      "application_task": "Definiți datele temei, tipurile și sursa fiecărui câmp; precizați ce este introdus și ce este generat.",
      "evidence": "Schema echipei folosește nume consecvente și are un exemplu complet.",
      "final_proof": "P2",
      "prerequisites": [
        "V11"
      ],
      "asset_families": [
        "EVENT",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V13-diversitate/Lectie.mp4",
      "guided_example_task": "Scrie schema participant, locuri și identificator, cu exemplul E101/Alex/2; separă câmpurile introduse de identificatorul generat.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V13",
      "duration_seconds": 59.458333333333336
    },
    {
      "id": "V14",
      "day": 2,
      "hour": 4,
      "part": 2,
      "title": "Lipsă, text și număr nu înseamnă același lucru",
      "skill": "S4",
      "objective": "Tratează explicit câmpul gol și conversia intrării.",
      "scenario": "Înscriere la un eveniment cu locuri limitate",
      "visual_direction": "Trei bilete poartă gol, textul «doi» și valoarea «2»; apropierea arată ce primește formularul; fiecare merge spre rezultat sau mesajul potrivit.",
      "student_decision": "Un câmp gol poate fi transformat din greșeală într-un zero acceptat?",
      "application_task": "Alegeți un câmp real din proiect și tratați lipsa lui și o valoare de tip greșit.",
      "evidence": "Intrarea invalidă produce mesaj util fără a fi acceptată sau salvată ca validă.",
      "final_proof": "P2",
      "prerequisites": [
        "V13"
      ],
      "asset_families": [
        "EVENT",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V14-diversitate/Lectie.mp4",
      "guided_example_task": "Verifică separat golul și valoarea numerică; respinge textul nevalid fără a salva.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V14",
      "duration_seconds": 53.708333333333336
    },
    {
      "id": "V15",
      "day": 2,
      "hour": 4,
      "part": 3,
      "title": "De ce 2,5 trece o regulă și pică alta?",
      "skill": "S4",
      "objective": "Combină regula de număr întreg cu intervalul permis.",
      "scenario": "Înscriere la un eveniment cu locuri limitate",
      "visual_direction": "Planul sălii are locuri discrete; 2,5 cade în intervalul 1–10, dar nu poate ocupa două locuri și jumătate; vederea din formular se leagă de regula și înregistrarea efectivă.",
      "student_decision": "Ajunge să verifici că numărul este între 1 și 10?",
      "application_task": "Combinați o regulă de tip cu una de domeniu pentru un câmp al vostru; cantitatea este doar exemplul filmului.",
      "evidence": "Echipa arată o intrare care respectă o regulă, dar o încalcă pe cealaltă.",
      "final_proof": "P2",
      "prerequisites": [
        "V14"
      ],
      "asset_families": [
        "EVENT",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V15-diversitate/Lectie.mp4",
      "guided_example_task": "Aplică număr întreg și interval inclusiv 1–10 în logica aplicației.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "existing_reference": {
        "file": "lectii/02-contract/Lectie-hibrid.mp4",
        "status": "prototip de rescris și refăcut; următoarea iterație recomandată pentru calitate"
      },
      "interactive_file": "tutoriale/curs.html#V15",
      "duration_seconds": 48.583333333333336
    },
    {
      "id": "V16",
      "day": 2,
      "hour": 4,
      "part": 4,
      "title": "La limită se văd greșelile",
      "skill": "S4",
      "objective": "Probează valorile de la marginea regulii și cele imediat vecine.",
      "scenario": "Înscriere la un eveniment cu locuri limitate",
      "visual_direction": "Șirul de locuri 1–10 este văzut de sus; 0 și 11 rămân în afară; apropierea pe 10 dezvăluie diferența dintre «mai mic» și «mai mic sau egal».",
      "student_decision": "Valoarea maximă este inclusă în regula ta?",
      "application_task": "Definiți și probați o limită relevantă: număr, lungime de text sau interval de date.",
      "evidence": "Cazul de limită și unul imediat din afară au rezultate explicate.",
      "final_proof": "P2",
      "prerequisites": [
        "V15"
      ],
      "asset_families": [
        "EVENT"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V16-diversitate/Lectie.mp4",
      "guided_example_task": "Probează 0, 1, 10 și 11; verifică separat mesajul și faptul că nu se salvează intrarea invalidă.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V16",
      "duration_seconds": 54.0
    },
    {
      "id": "V17",
      "day": 2,
      "hour": 5,
      "part": 1,
      "title": "Starea descrie unde suntem acum",
      "skill": "S5",
      "objective": "Distinge o stare de acțiunea care schimbă starea.",
      "scenario": "Atelier de reparații: o lampă defectă",
      "visual_direction": "Lampa defectă are o fișă «Nouă»; operatorul o preia, eticheta devine «În lucru»; camera separă obiectul, eticheta și acțiunea.",
      "student_decision": "«Preia» este o stare sau o acțiune?",
      "application_task": "Alegeți entitatea sau fluxul relevant și numiți stările și acțiunile proprii; nu copiați automat stările atelierului.",
      "evidence": "Harta separă stările de acțiuni și are sens în tema echipei.",
      "final_proof": "P3",
      "prerequisites": [
        "V13"
      ],
      "asset_families": [
        "SERVICE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V17-diversitate/Lectie.mp4",
      "guided_example_task": "Definește cele trei stări și numele acțiunilor care le leagă.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V17",
      "duration_seconds": 54.125
    },
    {
      "id": "V18",
      "day": 2,
      "hour": 5,
      "part": 2,
      "title": "Nu orice salt este permis",
      "skill": "S5",
      "objective": "Aplică o tranziție doar dacă starea curentă o permite.",
      "scenario": "Atelier de reparații: o lampă defectă",
      "visual_direction": "Vedere generală recepție–banc–predare; o lampă nouă încearcă scurtătura; apropierea arată condiția «trebuie preluată», apoi urmărim traseul corect.",
      "student_decision": "Poți marca lucrarea finalizată înainte să fi fost preluată?",
      "application_task": "Implementați o precondiție sau o tranziție permisă și una interzisă în proiect.",
      "evidence": "O acțiune validă reușește; cea invalidă păstrează informația și starea relevante.",
      "final_proof": "P3",
      "prerequisites": [
        "V17"
      ],
      "asset_families": [
        "SERVICE",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V18-diversitate/Lectie.mp4",
      "guided_example_task": "Implementează Nouă → În lucru → Finalizată și respinge Nouă → Finalizată.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "existing_reference": {
        "file": "lectii/03-stari/Lectie-hibrid.mp4",
        "status": "prototip de rescris și refăcut; utilizatorul îl consideră prea simplist"
      },
      "interactive_file": "tutoriale/curs.html#V18",
      "duration_seconds": 47.75
    },
    {
      "id": "V19",
      "day": 2,
      "hour": 5,
      "part": 3,
      "title": "Regula trebuie să existe și în logică",
      "skill": "S5",
      "objective": "Separă indiciul din interfață de verificarea care protejează tranziția.",
      "scenario": "Atelier de reparații: o lampă defectă",
      "visual_direction": "Butonul indisponibil este arătat din față; camera trece în logica aplicației, unde aceeași cerere invalidă este verificată; ambele perspective converg la starea păstrată.",
      "student_decision": "Dacă ascunzi butonul, ai verificat deja regula peste tot?",
      "application_task": "Verificați că regula de acțiune este aplicată în logică, pe lângă indiciile din interfață.",
      "evidence": "Echipa demonstrează respingerea unei acțiuni nepermise printr-o probă ghidată.",
      "final_proof": "P3",
      "prerequisites": [
        "V18"
      ],
      "asset_families": [
        "SERVICE",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V19-diversitate/Lectie.mp4",
      "guided_example_task": "Cere o funcție de tranziție care verifică starea curentă; probeaz-o printr-un exemplu ghidat.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V19",
      "duration_seconds": 53.375
    },
    {
      "id": "V20",
      "day": 2,
      "hour": 5,
      "part": 4,
      "title": "Ce înseamnă «finalizată» în acest proiect?",
      "skill": "S5",
      "objective": "Definește comportamentul după ultima stare, fără să inventeze tranziții.",
      "scenario": "Atelier de reparații: o lampă defectă",
      "visual_direction": "Postul de control arată R042 În lucru și verificarea neconsemnată; finalizarea este refuzată. După consemnare, Finalizată blochează editarea directă. Persoana ilustrată nu dovedește o verificare fizică.",
      "student_decision": "Ce verificare consemnată permite finalizarea și ce acțiuni rămân permise după aceea?",
      "application_task": "Decideți efectul repetării acțiunii finale în tema voastră și verificați rezultatul.",
      "evidence": "Repetarea are un comportament explicit, fără efect suplimentar accidental.",
      "final_proof": "P3",
      "prerequisites": [
        "V18",
        "V16"
      ],
      "asset_families": [
        "SERVICE",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V20-diversitate/Lectie.mp4",
      "guided_example_task": "Stabilește că starea finală rămâne finală; repetă acțiunea și verifică identificatorul și numărul cererilor.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V20",
      "duration_seconds": 53.916666666666664
    },
    {
      "id": "V21",
      "day": 2,
      "hour": 6,
      "part": 1,
      "title": "De ce dispare cererea când reîncarci?",
      "skill": "S6",
      "objective": "Distinge memoria paginii de stocarea persistentă.",
      "scenario": "Revenire la clubul media și la cererea de echipament",
      "visual_direction": "Revenim la camera împrumutată în ziua 1; reîncărcarea înlocuiește scena de lucru, iar un sertar separat rămâne; revenirea la ecran arată dacă există ceva de restaurat.",
      "student_decision": "Ce informație trebuie salvată înainte ca pagina să fie recreată?",
      "application_task": "Creați un rezultat în aplicație și reîncărcați; descrieți ce se păstrează acum și ce ar trebui păstrat.",
      "evidence": "Observația inițială este notată înaintea modificării.",
      "final_proof": "P4",
      "prerequisites": [
        "V09",
        "V11"
      ],
      "asset_families": [
        "MEDIA",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V21-diversitate/Lectie.mp4",
      "guided_example_task": "Creează o cerere, reîncarcă și descrie comportamentul actual înainte de modificare.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V21",
      "duration_seconds": 50.125
    },
    {
      "id": "V22",
      "day": 2,
      "hour": 6,
      "part": 2,
      "title": "Aceeași cerere are aceeași identitate",
      "skill": "S6",
      "objective": "Folosește un identificator stabil independent de poziția în listă.",
      "scenario": "Revenire la clubul media și la cererea de echipament",
      "visual_direction": "Două camere identice stau lângă fișe cu ID diferit; sortarea schimbă locurile fișelor, dar nu identitatea; un close-up urmărește cererea modificată.",
      "student_decision": "Numărul rândului rămâne o identitate bună după sortare?",
      "application_task": "Alegeți identificatorul rezultatului sau al înregistrării și păstrați-l la modificare și restaurare.",
      "evidence": "Două înregistrări similare sunt distincte; aceeași înregistrare își păstrează identitatea.",
      "final_proof": "P4",
      "prerequisites": [
        "V13"
      ],
      "asset_families": [
        "MEDIA",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V22-diversitate/Lectie.mp4",
      "guided_example_task": "Generează ID la creare și păstrează-l când starea se schimbă sau lista este restaurată.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V22",
      "duration_seconds": 51.166666666666664
    },
    {
      "id": "V23",
      "day": 2,
      "hour": 6,
      "part": 3,
      "title": "Salvează și reconstruiește aceeași stare",
      "skill": "S6",
      "objective": "Salvează lista după modificări și o încarcă fără duplicare.",
      "scenario": "Revenire la clubul media și la cererea de echipament",
      "visual_direction": "Modelul nativ de cameră foto și reprezentările etichetate ale aceleiași M204 arată memoria, salvarea ultimei stări și reconstruirea după reîncărcare; există o singură cerere.",
      "student_decision": "Salvezi doar crearea sau și schimbarea stării?",
      "application_task": "Adăugați salvarea și restaurarea informațiilor relevante fluxului; verificați și o modificare.",
      "evidence": "După reîncărcare rezultatul și informațiile sale sunt păstrate fără o copie accidentală.",
      "final_proof": "P4",
      "prerequisites": [
        "V21",
        "V22"
      ],
      "asset_families": [
        "MEDIA",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V23-diversitate/Lectie.mp4",
      "guided_example_task": "Adaugă salvarea locală la creare și tranziție, apoi restaurarea la pornire.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V23",
      "duration_seconds": 50.083333333333336
    },
    {
      "id": "V24",
      "day": 2,
      "hour": 6,
      "part": 4,
      "title": "«Salvat aici» nu înseamnă «salvat oriunde»",
      "skill": "S6",
      "objective": "Explică și tratează limita stocării în browser.",
      "scenario": "Revenire la clubul media și la cererea de echipament",
      "visual_direction": "Două calculatoare pe mese distincte; sertarul unui browser nu se mută prin simpla copiere a paginii; un blocaj de stocare produce mesaj, fără bifă de succes.",
      "student_decision": "Un coleg care primește fișierele primește automat și datele tale?",
      "application_task": "Documentați unde se salvează datele și comportamentul la eșecul salvării.",
      "evidence": "Aplicația nu anunță succes fals; fiecare membru explică limita browserului și locației.",
      "final_proof": "P4",
      "prerequisites": [
        "V23"
      ],
      "asset_families": [
        "MEDIA",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V24-diversitate/Lectie.mp4",
      "guided_example_task": "Notează limita browserului și locației; prevede un mesaj dacă salvarea eșuează.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V24",
      "duration_seconds": 56.875
    },
    {
      "id": "V25",
      "day": 3,
      "hour": 7,
      "part": 1,
      "title": "Așteptat și observat sunt două lucruri diferite",
      "skill": "S7",
      "objective": "Scrie rezultatul așteptat înainte de executarea probei.",
      "scenario": "Rezervarea unei săli de întâlniri",
      "visual_direction": "O sală liberă și calendarul ei ocupă două planuri; rezervarea apare vizual, dar intervalul afișat diferă; fișa de test păstrează alăturat așteptarea și observația.",
      "student_decision": "O captură de ecran, fără așteptare, dovedește corectitudinea?",
      "application_task": "Scrieți o probă din tema voastră, cu așteptarea înaintea rezultatului observat.",
      "evidence": "Alt membru poate decide dacă proba a trecut folosind numai fișa.",
      "final_proof": "P2",
      "prerequisites": [
        "V04",
        "V16"
      ],
      "asset_families": [
        "ROOM",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V25-diversitate/Lectie.mp4",
      "guided_example_task": "Scrie intrarea, pașii, rezultatul așteptat și apoi rezultatul efectiv pentru o regulă proprie.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V25",
      "duration_seconds": 51.833333333333336
    },
    {
      "id": "V26",
      "day": 3,
      "hour": 7,
      "part": 2,
      "title": "Un exemplu bun, unul greșit, unul la limită",
      "skill": "S7",
      "objective": "Alege cazuri cu șanse diferite de a descoperi greșeli.",
      "scenario": "Rezervarea unei săli de întâlniri",
      "visual_direction": "Cadranul duratei începe la 10:00: 2 ore acceptate, 4 respinse și 3 acceptate la limita inclusivă. Fiecare caz pornește din calendar gol; nu se impun ore întregi.",
      "student_decision": "Trei exemple comode verifică și limitele regulii?",
      "application_task": "Alegeți câte un caz valid, invalid și de limită pentru o regulă a proiectului.",
      "evidence": "Cele trei probe verifică comportamente distincte și au rezultate observate.",
      "final_proof": "P2",
      "prerequisites": [
        "V25",
        "V20"
      ],
      "asset_families": [
        "ROOM"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V26-diversitate/Lectie.mp4",
      "guided_example_task": "Alege un caz valid, unul invalid și unul de limită pentru cantitate sau tranziții.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V26",
      "duration_seconds": 47.75
    },
    {
      "id": "V27",
      "day": 3,
      "hour": 7,
      "part": 3,
      "title": "O probă trebuie să poată fi repetată",
      "skill": "S7",
      "objective": "Precizează starea inițială și identifică înregistrarea urmărită.",
      "scenario": "Rezervarea unei săli de întâlniri",
      "visual_direction": "Două probe par identice, dar prima începe cu sala goală, a doua cu o rezervare; camera dezvăluie diferența ascunsă în calendar.",
      "student_decision": "Ce trebuie să știe colegul înainte să urmeze pașii tăi?",
      "application_task": "Documentați datele inițiale și identitatea urmărită; alt membru repetă proba.",
      "evidence": "Rezultatul poate fi reprodus din condiția descrisă.",
      "final_proof": "P2",
      "prerequisites": [
        "V25",
        "V23"
      ],
      "asset_families": [
        "ROOM",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V27-diversitate/Lectie.mp4",
      "guided_example_task": "Documentează datele inițiale și ID-ul folosit; repetă proba după o reîncărcare controlată.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V27",
      "duration_seconds": 53.208333333333336
    },
    {
      "id": "V28",
      "day": 3,
      "hour": 7,
      "part": 4,
      "title": "După o schimbare, ce trebuie reverificat?",
      "skill": "S7",
      "objective": "Repetă probele pe care schimbarea le poate afecta.",
      "scenario": "Rezervarea unei săli de întâlniri",
      "visual_direction": "Agenda arată schimbarea duratei maxime de la 3 la 2 ore: 2 acceptat, 3 respins. Sala, ora de început și rezervările existente sunt verificate separat; așteptările sunt actualizate conform regulii.",
      "student_decision": "O regulă nouă schimbă și testele vechi?",
      "application_task": "Păstrați un set scurt de probe pentru flux, regulă și persistență, care va fi repetat după modificare.",
      "evidence": "Setul indică așteptările și comportamentele protejate.",
      "final_proof": "P2",
      "prerequisites": [
        "V26",
        "V27"
      ],
      "asset_families": [
        "ROOM",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V28-diversitate/Lectie.mp4",
      "guided_example_task": "Listează probele afectate de o modificare și păstrează o probă de bază pentru creare, stare și salvare.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V28",
      "duration_seconds": 51.75
    },
    {
      "id": "V29",
      "day": 3,
      "hour": 8,
      "part": 1,
      "title": "Descrie defectul ca să-l poți reproduce",
      "skill": "S7",
      "objective": "Raportează o problemă cu pași și rezultat precis.",
      "scenario": "O cerere de service dispare sau își schimbă valoarea",
      "visual_direction": "R042 este preluată, apoi pagina este reîncărcată: cererea există, dar starea revine din În lucru la Nouă. Proba fixează ID-ul, condiția inițială, pașii, așteptarea și observația.",
      "student_decision": "«Nu merge» conține destulă informație ca să repari?",
      "application_task": "Reproduceți un defect al proiectului; dacă nu există unul disponibil, folosiți o eroare introdusă controlat într-o copie.",
      "evidence": "Un membru mai puțin experimentat reproduce defectul și descrie pașii.",
      "final_proof": "P5",
      "prerequisites": [
        "V25"
      ],
      "asset_families": [
        "SERVICE",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V29-diversitate/Lectie.mp4",
      "guided_example_task": "Reproduce un defect real sau unul introdus în copia de exercițiu; scrie pașii, așteptarea și observația.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V29",
      "duration_seconds": 51.75
    },
    {
      "id": "V30",
      "day": 3,
      "hour": 8,
      "part": 2,
      "title": "Urmărește valoarea, nu ghici fișierul",
      "skill": "S7",
      "objective": "Localizează locul unde datele devin greșite.",
      "scenario": "O cerere de service dispare sau își schimbă valoarea",
      "visual_direction": "Patru urme arată R042: În lucru în memorie, Nouă în stocare, Nouă la citire și Nouă în afișarea reconstruită. Investigația se oprește la prima diferență, fără să inventeze o cauză.",
      "student_decision": "În ce punct valoarea nu mai corespunde intrării?",
      "application_task": "Urmăriți cu AI traseul unei valori din proiect și verificați prima etapă unde diferă de așteptare.",
      "evidence": "Echipa localizează divergența, fără a trata explicația AI ca dovadă suficientă.",
      "final_proof": "P5",
      "prerequisites": [
        "V09",
        "V29"
      ],
      "asset_families": [
        "SERVICE",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V30-diversitate/Lectie.mp4",
      "guided_example_task": "Cere AI-ului să urmărească traseul unei valori și verifică observațiile în proiect.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V30",
      "duration_seconds": 49.125
    },
    {
      "id": "V31",
      "day": 3,
      "hour": 8,
      "part": 3,
      "title": "O ipoteză se verifică printr-o schimbare",
      "skill": "S7",
      "objective": "Alege o explicație a cauzei și caută o observație care o confirmă sau o contrazice.",
      "scenario": "O cerere de service dispare sau își schimbă valoarea",
      "visual_direction": "R042 există, dar are o stare veche. Două ipoteze despre salvare și citire sunt confruntate cu observația stocării; aceasta susține sau contrazice o ipoteză, fără să confirme automat o cauză exclusivă.",
      "student_decision": "Ce observație ar demonstra că ipoteza ta este greșită?",
      "application_task": "Formulați două cauze posibile și verificați o observație care le poate separa.",
      "evidence": "Ipoteza, observația și concluzia sunt notate separat.",
      "final_proof": "P5",
      "prerequisites": [
        "V30"
      ],
      "asset_families": [
        "SERVICE",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V31-diversitate/Lectie.mp4",
      "guided_example_task": "Formulează două cauze posibile; verifică una printr-o observație sau instrumentare temporară.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V31",
      "duration_seconds": 53.041666666666664
    },
    {
      "id": "V32",
      "day": 3,
      "hour": 8,
      "part": 4,
      "title": "Repară puțin și dovedește efectul",
      "skill": "S7",
      "objective": "Aplică o remediere delimitată și repetă proba defectului.",
      "scenario": "O cerere de service dispare sau își schimbă valoarea",
      "visual_direction": "Un conector greșit din traseul de salvare este corectat; aceeași secvență «Preia → reîncarcă» păstrează acum fișa; o probă vecină este verificată separat.",
      "student_decision": "Dacă refaci toată aplicația, mai știi ce a rezolvat problema?",
      "application_task": "Aplicați o remediere delimitată și repetați proba defectului plus o probă conexă.",
      "evidence": "Corecția are dovezi înainte și după; membrul care verifică diferă de cel care a aplicat-o.",
      "final_proof": "P5",
      "prerequisites": [
        "V28",
        "V31"
      ],
      "asset_families": [
        "SERVICE",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V32-diversitate/Lectie.mp4",
      "guided_example_task": "Cere o corecție mică, verifică diferența și repetă proba defectului plus o probă conexă.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V32",
      "duration_seconds": 53.541666666666664
    },
    {
      "id": "V33",
      "day": 3,
      "hour": 9,
      "part": 1,
      "title": "Proprietarul: ce merită făcut acum?",
      "skill": "S8",
      "objective": "Prioritizează după efectul asupra sarcinii și efort.",
      "scenario": "Cele două echipe își testează reciproc aplicațiile",
      "visual_direction": "Pe masa de revizuire apar o temă nouă și o cerere pierdută; comparăm consecința pentru utilizator, apoi costul intervenției, fără procente prezentate ca lege.",
      "student_decision": "Ce schimbare deblochează sarcina principală cu efort rezonabil?",
      "application_task": "Prioritizați trei observații după valoare, risc și efort; alegerea finală poate integra feedbackul din restul orei.",
      "evidence": "O singură îmbunătățire pentru ziua 4 are justificare legată de utilizator.",
      "final_proof": "P5",
      "prerequisites": [
        "V01",
        "V12"
      ],
      "asset_families": [
        "DELIVERY"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V33-diversitate/Lectie.mp4",
      "guided_example_task": "Ordonează trei observații prin valoare, risc și efort; alege una pentru ziua 4.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V33",
      "duration_seconds": 55.458333333333336
    },
    {
      "id": "V34",
      "day": 3,
      "hour": 9,
      "part": 2,
      "title": "Utilizatorul: poate termina fără explicațiile tale?",
      "skill": "S8",
      "objective": "Observă utilizarea și reduce un obstacol concret.",
      "scenario": "Cele două echipe își testează reciproc aplicațiile",
      "visual_direction": "Camera urmărește un coleg care caută acțiunea de creare, fără să vadă indicațiile autorului; apropierea arată eticheta ambiguă și feedbackul lipsă.",
      "student_decision": "Ai observat unde s-a blocat sau doar l-ai întrebat dacă îi place?",
      "application_task": "Oferiți celeilalte echipe o sarcină, observați unde se blochează și verificați și accesul prin tastatură.",
      "evidence": "Feedbackul descrie acțiunea și obstacolul; nu este doar preferință vizuală.",
      "final_proof": "P5",
      "prerequisites": [
        "V12",
        "V26"
      ],
      "asset_families": [
        "DELIVERY"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V34-diversitate/Lectie.mp4",
      "guided_example_task": "Dă colegului o sarcină și observă în tăcere; notează primul blocaj; verifică și navigarea prin tastatură.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V34",
      "duration_seconds": 55.125
    },
    {
      "id": "V35",
      "day": 3,
      "hour": 9,
      "part": 3,
      "title": "Analistul și QA: aceeași regulă, rezultate compatibile?",
      "skill": "S2",
      "objective": "Compară cerința scrisă cu regula și mesajul aplicației.",
      "scenario": "Cele două echipe își testează reciproc aplicațiile",
      "visual_direction": "Cerința permite maximum 10, textul de ajutor spune 5, iar fixture-ul declarat al implementării permite 8. Probele8/9/10 compară cerința, mesajul și rezultatul; acceptarea lui 8 singură nu dovedește limita.",
      "student_decision": "Care dintre cele trei exprimă regula pe care ai convenit-o?",
      "application_task": "Comparați cerința, logica și mesajul pentru o regulă importantă a temei.",
      "evidence": "Echipa explică rezultatul convenit și elimină o eventuală contradicție.",
      "final_proof": "P5",
      "prerequisites": [
        "V20",
        "V25"
      ],
      "asset_families": [
        "TRACE",
        "DELIVERY"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V35-diversitate/Lectie.mp4",
      "guided_example_task": "Compară cerința, rezultatul și mesajul pentru un caz de limită sau o tranziție.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V35",
      "duration_seconds": 51.625
    },
    {
      "id": "V36",
      "day": 3,
      "hour": 9,
      "part": 4,
      "title": "Responsabilul datelor: de ce colectăm acest câmp?",
      "skill": "S8",
      "objective": "Limitează datele la cele necesare sarcinii și explică accesul local.",
      "scenario": "Cele două echipe își testează reciproc aplicațiile",
      "visual_direction": "Fișa de cerere conține câmpuri utile și detalii personale fără rol; rămân numai cele necesare, apoi camera arată browserul unde ajung.",
      "student_decision": "Poate sarcina fi realizată fără acest detaliu personal?",
      "application_task": "Justificați câmpurile colectate, folosiți date fictive și eliminați un câmp fără rol, dacă există.",
      "evidence": "Fișa explică datele păstrate și accesul real, fără promisiuni de autentificare inexistente.",
      "final_proof": "P5",
      "prerequisites": [
        "V24"
      ],
      "asset_families": [
        "DELIVERY",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V36-diversitate/Lectie.mp4",
      "guided_example_task": "Folosește date fictive, elimină câmpurile inutile și notează cine poate vedea datele în configurația locală.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V36",
      "duration_seconds": 54.333333333333336
    },
    {
      "id": "V37",
      "day": 4,
      "hour": 10,
      "part": 1,
      "title": "O regulă schimbată are mai multe consecințe",
      "skill": "S8",
      "objective": "Identifică suprafețele afectate înainte de modificare.",
      "scenario": "Club media: noua limită de echipamente",
      "visual_direction": "Revenim la dulapul clubului media; noul maxim 5 apare în formular, logică, mesaj și probe; legăturile se aprind pe rând.",
      "student_decision": "Dacă schimbi numai textul «maxim 5», regula este schimbată?",
      "application_task": "Alegeți schimbarea din feedback și listați efectele asupra logicii, mesajelor, probelor și datelor deja existente.",
      "evidence": "Planul este specific temei; modificarea 10 → 5 din film nu este obligatorie.",
      "final_proof": "P5",
      "prerequisites": [
        "V15",
        "V28",
        "V33"
      ],
      "asset_families": [
        "MEDIA",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V37-diversitate/Lectie.mp4",
      "guided_example_task": "Pentru modificarea 10 → 5, listează logica, mesajele și probele afectate; decide ce se întâmplă cu cererile vechi.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V37",
      "duration_seconds": 54.083333333333336
    },
    {
      "id": "V38",
      "day": 4,
      "hour": 10,
      "part": 2,
      "title": "Cererea de modificare are și limite",
      "skill": "S3",
      "objective": "Cere AI-ului o schimbare precisă, cu criterii și comportamente de păstrat.",
      "scenario": "Club media: noua limită de echipamente",
      "visual_direction": "Dosarul cu noua regulă se așază peste versiunea existentă; afișarea și traseul stărilor rămân în cadru ca probe de păstrat.",
      "student_decision": "Ce trebuie să rămână funcțional după această schimbare?",
      "application_task": "Cereți AI-ului schimbarea aleasă, criteriile și comportamentele care trebuie păstrate.",
      "evidence": "Cererea are un rezultat delimitat și o probă înainte/după.",
      "final_proof": "P5",
      "prerequisites": [
        "V06",
        "V37"
      ],
      "asset_families": [
        "MEDIA",
        "DELIVERY"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V38-diversitate/Lectie.mp4",
      "guided_example_task": "Cere noua limită și probele 5 acceptat, 6 respins; precizează comportamentul pentru înregistrările vechi.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V38",
      "duration_seconds": 55.916666666666664
    },
    {
      "id": "V39",
      "day": 4,
      "hour": 10,
      "part": 3,
      "title": "Compară versiuni și păstrează revenirea",
      "skill": "S8",
      "objective": "Aplică schimbarea pe o copie și verifică efectul înainte de a o păstra.",
      "scenario": "Club media: noua limită de echipamente",
      "visual_direction": "Două versiuni ale dulapului digital sunt comparate cu aceeași intrare 6; un selector de versiune arată diferența și restaurează copia, fără a pretinde recuperarea automată a datelor.",
      "student_decision": "Ai o versiune verificată la care poți reveni?",
      "application_task": "Aplicați schimbarea pe o copie verificată și comparați diferențele; folosiți Git numai dacă echipa îl poate explica.",
      "evidence": "Versiunea anterioară poate fi identificată și restaurată separat de datele browserului.",
      "final_proof": "P5",
      "prerequisites": [
        "V08",
        "V38"
      ],
      "asset_families": [
        "MEDIA",
        "DELIVERY"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V39-diversitate/Lectie.mp4",
      "guided_example_task": "Salvează copia, aplică schimbarea și inspectează diferențele; tehnicii pot folosi un commit.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V39",
      "duration_seconds": 53.041666666666664
    },
    {
      "id": "V40",
      "day": 4,
      "hour": 10,
      "part": 4,
      "title": "O schimbare este gata când probele sunt actualizate",
      "skill": "S8",
      "objective": "Verifică noua regulă și efectele asupra comportamentelor existente.",
      "scenario": "Club media: noua limită de echipamente",
      "visual_direction": "Valori 5 și 6, o cerere veche de 8 și o fișă «În lucru» sunt urmărite în paralel; camera confirmă separat politica veche și regula nouă.",
      "student_decision": "Ce se întâmplă cu cererea validă ieri, care depășește noua limită?",
      "application_task": "Verificați regula nouă, datele existente și probele de bază; decideți dacă păstrați modificarea.",
      "evidence": "Dovezile corespund politicii stabilite și nu ascund un defect nou.",
      "final_proof": "P5",
      "prerequisites": [
        "V37",
        "V39"
      ],
      "asset_families": [
        "MEDIA",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V40-diversitate/Lectie.mp4",
      "guided_example_task": "Rulează cazurile 5, 6, cererea veche și reîncărcarea; păstrează ori corectează schimbarea după rezultate.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V40",
      "duration_seconds": 51.833333333333336
    },
    {
      "id": "V41",
      "day": 4,
      "hour": 11,
      "part": 1,
      "title": "Ce trebuie să conțină pachetul predat?",
      "skill": "S8",
      "objective": "Livrează fișierele necesare și verifică pornirea din alt folder.",
      "scenario": "Fișiere locale și magazin online pentru contrast",
      "visual_direction": "Dosarul aplicației se desface în HTML, CSS, JavaScript și imagini locale; un fir către un fișier uitat se rupe; copierea întregului pachet permite pornirea.",
      "student_decision": "Funcționează și fără folderul tău de lucru?",
      "application_task": "Copiați proiectul complet într-un folder nou și verificați pornirea conform instrucțiunilor de predare.",
      "evidence": "Pachetul de bază se deschide local; fișierele aplicației nu sunt confundate cu datele din browser.",
      "final_proof": "P6",
      "prerequisites": [
        "V24",
        "V39"
      ],
      "asset_families": [
        "DELIVERY"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V41-diversitate/Lectie.mp4",
      "guided_example_task": "Copiază întregul proiect într-un folder nou și deschide index.html; verifică lipsa dependențelor de server local.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V41",
      "duration_seconds": 57.375
    },
    {
      "id": "V42",
      "day": 4,
      "hour": 11,
      "part": 2,
      "title": "Acțiunea și confirmarea sunt momente diferite",
      "skill": "S6",
      "objective": "Distinge efectuarea unei operații de primirea confirmării.",
      "scenario": "Fișiere locale și magazin online pentru contrast",
      "visual_direction": "Comanda C101 este creată în serviciul simulat, dar confirmarea se pierde pe traseul de întoarcere. Vederea clientului nu arată sigur dacă operația a fost efectuată; nu se adaugă o etapă de pregătire neobservată.",
      "student_decision": "Dacă nu vezi confirmarea, știi sigur că operația nu s-a executat?",
      "application_task": "Explicați în perechi diferența dintre acțiune și confirmare, apoi spuneți dacă fluxul vostru are sau nu un serviciu extern.",
      "evidence": "Cursantul recunoaște limita analogiei; nu adaugă un server doar ca să semene cu exemplul.",
      "final_proof": "P6",
      "prerequisites": [
        "V09",
        "V22"
      ],
      "asset_families": [
        "CORE",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V42-diversitate/Lectie.mp4",
      "guided_example_task": "Explică ce știe clientul în simularea de reîncercare; compară acest caz cu aplicația locală fără server.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V42",
      "duration_seconds": 51.833333333333336
    },
    {
      "id": "V43",
      "day": 4,
      "hour": 11,
      "part": 3,
      "title": "Idempotență: repetăm cererea, nu efectul",
      "skill": "S6",
      "objective": "Alege aceeași cheie pentru reîncercarea aceleiași operații.",
      "scenario": "Fișiere locale și magazin online pentru contrast",
      "visual_direction": "Refolosim pilotul aprobat: produs mapat, comandă, răspuns pierdut, duplicare, aceeași cheie și un singur rezultat; nouă perspective cu continuitate.",
      "student_decision": "Dacă s-a pierdut confirmarea, retrimiți aceeași cheie sau creezi una nouă?",
      "application_task": "Comparați cheile în laboratorul existent; precizați ce ar trebui verificat dacă proiectul vostru ar avea trimiteri către un serviciu.",
      "evidence": "Este explicată o reîncercare sigură; integrarea pe server rămâne extensie, nu funcție pretinsă în proiect.",
      "final_proof": "P6",
      "prerequisites": [
        "V42",
        "V22"
      ],
      "asset_families": [
        "CORE",
        "TRACE"
      ],
      "target_seconds": 45,
      "production_status": "reper aprobat reutilizat",
      "video_file": "revizii/V43-diversitate/Lectie.mp4",
      "guided_example_task": "În laboratorul existent, compară aceeași cheie cu o cheie nouă; notează de ce dezactivarea unui buton nu garantează același lucru.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "existing_reference": {
        "file": "idempotenta/Lectie.mp4",
        "status": "reper vizual aprobat; candidatul de reutilizare în ora 11"
      },
      "interactive_file": "tutoriale/curs.html#V43",
      "duration_seconds": 45.416666666666664
    },
    {
      "id": "V44",
      "day": 4,
      "hour": 11,
      "part": 4,
      "title": "Explică limitele înainte de utilizare",
      "skill": "S8",
      "objective": "Descrie ce garantează aplicația și ce presupune o versiune cu mai mulți utilizatori.",
      "scenario": "Fișiere locale și magazin online pentru contrast",
      "visual_direction": "Dosarul livrat stă lângă un browser cu date locale; o a doua persoană nu primește automat aceleași date; o etichetă separată indică serviciul comun care ar trebui construit.",
      "student_decision": "Ce promisiune nu poți face cu această soluție locală?",
      "application_task": "Scrieți ce face proiectul, unde ține datele și ce nu garantează; indicați explicit orice parte simulată.",
      "evidence": "Fișa de predare separă funcțiile reale de limite și extensii.",
      "final_proof": "P6",
      "prerequisites": [
        "V24",
        "V41",
        "V43"
      ],
      "asset_families": [
        "DELIVERY",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V44-diversitate/Lectie.mp4",
      "guided_example_task": "Scrie trei limite: stocare locală, lipsa sincronizării și lipsa autentificării; atașează pașii de pornire și probele.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V44",
      "duration_seconds": 56.791666666666664
    },
    {
      "id": "V45",
      "day": 4,
      "hour": 12,
      "part": 1,
      "title": "Demonstrația urmărește o cerere reală",
      "skill": "S8",
      "objective": "Demonstrează un traseu complet folosind date introduse în fața colegului.",
      "scenario": "Proiectul propriu și un context nou ales de cursant",
      "visual_direction": "Un obiect familiar revine alături de captură reală; aceeași fișă trece prin creare, «Preia» și reîncărcare; ID-ul leagă perspectivele.",
      "student_decision": "Ai demonstrat efectul sau doar ai arătat ecranele?",
      "application_task": "Pregătiți demonstrația echipei: flux valid, acțiune respinsă, reîncărcare și modificare verificată.",
      "evidence": "Mai mulți membri operează aplicația și explică dovezi distincte.",
      "final_proof": "P6",
      "prerequisites": [
        "V40",
        "V44"
      ],
      "asset_families": [
        "DELIVERY",
        "TRACE"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V45-diversitate/Lectie.mp4",
      "guided_example_task": "În maximum trei minute, arată creare validă, intrare invalidă, salt blocat și persistență.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V45",
      "duration_seconds": 50.875
    },
    {
      "id": "V46",
      "day": 4,
      "hour": 12,
      "part": 2,
      "title": "Colegul repetă proba, autorul observă",
      "skill": "S7",
      "objective": "Predă suficiente instrucțiuni pentru verificare independentă.",
      "scenario": "Proiectul propriu și un context nou ales de cursant",
      "visual_direction": "Fișa de probe schimbă mâinile; autorul se retrage din cadru; colegul deschide copia și urmează pașii, iar orice indicație suplimentară este notată.",
      "student_decision": "Ar reuși cineva care nu a fost lângă tine când ai construit?",
      "application_task": "Schimbați pachetul și fișa de probe cu cealaltă echipă; autorii observă fără a conduce fiecare pas.",
      "evidence": "Cealaltă echipă reproduce cel puțin o probă și notează ajutorul necesar.",
      "final_proof": "P6",
      "prerequisites": [
        "V27",
        "V41",
        "V45"
      ],
      "asset_families": [
        "DELIVERY"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V46-diversitate/Lectie.mp4",
      "guided_example_task": "Schimbă proiectul cu un coleg și repetă o probă fără explicații suplimentare; corectează instrucțiunile dacă lipsesc pași.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V46",
      "duration_seconds": 51.833333333333336
    },
    {
      "id": "V47",
      "day": 4,
      "hour": 12,
      "part": 3,
      "title": "Transferă regula într-un context nou",
      "skill": "S8",
      "objective": "Recunoaște ce se păstrează și ce trebuie schimbat când domeniul diferă.",
      "scenario": "Proiectul propriu și un context nou ales de cursant",
      "visual_direction": "Cererea de cameră foto se transformă într-o înscriere la atelier; ID-ul și validarea rămân principii utile, însă numele și tranzițiile sunt reevaluate.",
      "student_decision": "Ce poți refolosi și ce regulă trebuie decisă din nou?",
      "application_task": "Fiecare participant alege un context nou și explică o regulă reutilizabilă și una care trebuie schimbată.",
      "evidence": "Transferul este explicat individual; nu este necesară o a doua implementare completă.",
      "final_proof": "P6",
      "prerequisites": [
        "V13",
        "V18",
        "V40"
      ],
      "asset_families": [
        "MEDIA",
        "EVENT"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V47-diversitate/Lectie.mp4",
      "guided_example_task": "Alege un alt domeniu și scrie un câmp, o regulă și o probă care se schimbă; nu construi o a doua aplicație completă.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V47",
      "duration_seconds": 57.625
    },
    {
      "id": "V48",
      "day": 4,
      "hour": 12,
      "part": 4,
      "title": "Predă rezultatul și alege următorul pas",
      "skill": "S8",
      "objective": "Leagă funcțiile, dovezile și limitele de un pas următor concret.",
      "scenario": "Proiectul propriu și un context nou ales de cursant",
      "visual_direction": "Dosarul final conține aplicația, criteriile, probele și schimbarea; o singură ramură de evoluție este aleasă din mai multe, pornind de la nevoia utilizatorului.",
      "student_decision": "Ce ai învățat să controlezi și ce ai verifica înainte de următoarea funcție?",
      "application_task": "Predați aplicația și dovezile echipei; fiecare participant notează ce a definit, modificat sau verificat personal.",
      "evidence": "P1–P6 sunt demonstrabile, iar contribuția și înțelegerea fiecărui membru sunt vizibile.",
      "final_proof": "P6",
      "prerequisites": [
        "V44",
        "V45",
        "V46",
        "V47"
      ],
      "asset_families": [
        "DELIVERY"
      ],
      "target_seconds": 60,
      "production_status": "randat și verificat tehnic; evaluarea pedagogică este deschisă",
      "video_file": "revizii/V48-diversitate/Lectie.mp4",
      "guided_example_task": "Predă pachetul și fișa de dovezi; explică modificarea făcută, o limită și următoarea funcție justificată.",
      "team_transfer_required": true,
      "individual_learning_evidence": "Răspuns propriu înaintea discuției; operare, explicație sau probă personală, cu ajutorul necesar notat.",
      "interactive_file": "tutoriale/curs.html#V48",
      "duration_seconds": 59.708333333333336
    }
  ]
}
