from pathlib import Path
import json, re, hashlib, shutil
root=Path('/Users/agency/Documents/Agty/KomplexLogopédia')
out=root/'outputs/rita-journey-20261002'
app=out/'site/app'
src=root/'plans/kl-slides-execution/SO-04/build/module-text'
texts={i:(src/f'module-{i}.txt').read_text() for i in range(1,7)}
for i,t in texts.items(): shutil.copyfile(src/f'module-{i}.txt',app/f'source/module-{i}.txt')
def cut(m,start,end=None):
 t=texts[m]; a=t.index(start); b=t.index(end,a) if end else len(t)
 return {'module':m,'startLine':t[:a].count('\n')+1,'endLine':t[:b].count('\n')+1,'text':t[a:b].strip()}
def clean(t):
 t=t.replace('\f','\n\n')
 # Keep exact wording and punctuation, normalize extraction spaces only.
 lines=[x.strip() for x in t.splitlines()]
 return '\n'.join(lines).strip()
mods={
1:{'title':'A légzés','range':'1–2. nap','duration':20,'tools':'Csendes hely, tükör, szőnyeg vagy talaj','rationale':cut(1,'  MIÉRT FONTOS ?','Feladatok'),'intro':cut(1,'Mielőtt belevágsz','        1 – 2 . N A P'),'sections':[
 ('floor','Feladatok fekve',cut(1,'Feladatok','      A PRÉSELÉSRŐL DIÓHÉJBAN')),
 ('months','Könnyedség és hónapok',cut(1,'      A PRÉSELÉSRŐL DIÓHÉJBAN','Folytasd ülve egy széken')),
 ('seated','Folytasd ülve egy széken',cut(1,'Folytasd ülve egy széken','Ráadás feladatok')),
 ('extra','Ráadás feladatok',cut(1,'Ráadás feladatok','  ▶ Légzőgyakorlatok videón'))]},
2:{'title':'Milyen ügyes a nyelved és az ajkaid?','range':'3–4. nap','duration':20,'tools':'Tükör, kávéskanál, víz, szívószál, zabpehely vagy betűtészta','rationale':cut(2,'  MIÉRT FONTOS ?','Gyakorolj tükör előtt! Fontos!'),'sections':[
 ('warm','Gyakorolj tükör előtt! Fontos!',cut(2,'Gyakorolj tükör előtt! Fontos!','Nyelv- és ajakügyesség')),
 ('water','Nyelv- és ajakügyesség',cut(2,'Nyelv- és ajakügyesség','Egyensúlyozás a nyelven')),
 ('balance','Egyensúlyozás a nyelven',cut(2,'Egyensúlyozás a nyelven','Szívószál-egyensúly és berregés')),
 ('straw','Szívószál-egyensúly és berregés',cut(2,'Szívószál-egyensúly és berregés','Magánhangzók szájképe')),
 ('vowels','Magánhangzók szájképe',cut(2,'Magánhangzók szájképe','Állkapocs-lazítás és szótagok')),
 ('jaw','Állkapocs-lazítás és szótagok',cut(2,'Állkapocs-lazítás és szótagok','Nyelvtörők')),
 ('tongue','Nyelvtörők',cut(2,'Nyelvtörők','  ▶ Artikulációs gyakorlatok videón'))]},
3:{'title':'Hangadás','range':'5–6. nap','duration':20,'tools':'Csendes hely, tükör, szőnyeg vagy talaj, puha labda és tál','rationale':cut(3,'  MIÉRT FONTOS ?','Jöjjenek a feladatok :)'),'sections':[
 ('voice','Jöjjenek a feladatok :)',cut(3,'Jöjjenek a feladatok :)','Most ülj fel székre, majd állj fel')),
 ('standing','Most ülj fel székre, majd állj fel',cut(3,'Most ülj fel székre, majd állj fel','Rezonancia + célba juttatás')),
 ('target','Rezonancia + célba juttatás',cut(3,'Rezonancia + célba juttatás','Levegőbeosztás zengő hanggal')),
 ('week','Levegőbeosztás zengő hanggal',cut(3,'Levegőbeosztás zengő hanggal','  ▶ Hangadás és rezonancia videón'))]},
4:{'title':'A beszéd és a ritmus','range':'7–8. nap','duration':20,'tools':'Asztal és tükör','rationale':cut(4,'     MIÉRT FONTOS ?','Egy kis ritmus szekció'),'sections':[
 ('beat','Egy kis ritmus szekció',cut(4,'Egy kis ritmus szekció','Szóritmus gyakorlat')),
 ('words','Szóritmus gyakorlat',cut(4,'Szóritmus gyakorlat','Weöres Sándor Kínai Templom')),
 ('temple','Kínai templom',cut(4,'Weöres Sándor Kínai Templom','Az alábbi versnél')),
 ('bird','Ha a világ rigó lenne',cut(4,'Az alábbi versnél','  ▶ Ritmusgyakorlatok videón'))]},
5:{'title':'Komplex légzőgyakorlatok','range':'9–10. nap','duration':20,'tools':'Tükör és szabad tér a sétához','rationale':cut(5,'     MIÉRT FONTOS ?','Bemelegítés és alaphelyzet'),'sections':[
 ('warm','Bemelegítés és alaphelyzet',cut(5,'Bemelegítés és alaphelyzet','Hónapok egy levegővel')),
 ('months','Hónapok egy levegővel',cut(5,'Hónapok egy levegővel','Állva, majd mozgásban')),
 ('walking','Állva, majd mozgásban',cut(5,'Állva, majd mozgásban','Másik komplex légzőgyakorlat')),
 ('swan','Másik komplex légzőgyakorlat',cut(5,'Másik komplex légzőgyakorlat','  ▶ Komplex légzőgyakorlatok videón'))]},
6:{'title':'Integráció, mindent összerakunk','range':'11–14. nap','duration':30,'tools':'Tükör, szabad tér, célként tál vagy vödör 1–2 méterre','rationale':cut(6,'     MIÉRT FONTOS ?','M-mel induló szavak rezonanciával'),'sections':[
 ('words','M-mel induló szavak rezonanciával',cut(6,'M-mel induló szavak rezonanciával','Dús rezonancia, célba juttatás')),
 ('target','Dús rezonancia, célba juttatás',cut(6,'Dús rezonancia, célba juttatás','Levegőbeosztás — meddig bírod könnyedén?')),
 ('months','Levegőbeosztás, meddig bírod könnyedén?',cut(6,'Levegőbeosztás — meddig bírod könnyedén?','Mindent vess be (záró integrációs feladat)')),
 ('final','Mindent vess be (záró integrációs feladat)',cut(6,'Mindent vess be (záró integrációs feladat)','     A kisebb, de rendszeres változtatások')),
 ('closing','A kihívás után',cut(6,'     A kisebb, de rendszeres változtatások','  📓 Napló & önértékelés')),
 ('next','Mi a következő lépés?',cut(6,'Mi a következő lépés?'))]}}
# Full source ranges keep the whole module available, selected day sections make the daily focus clear.
configs=[
 (1,'Figyeld meg a beszédlégzésed','Fekve figyeld a levegő útját, majd gyakorolj az SZ és S hangokkal.','Készítsd elő a tükröt és a szőnyeget. A bemutatkozás után kezdd a fekvő légzésgyakorlattal.',['floor'],'A számolásból és a hónapokkal végzett gyakorlatból mutass egy rövid részletet. Az első napi spontán bemutatkozó videó külön is kiválasztható.','A minta felvételben az SZ hang végén már rövidebb a szünet. Ez jó alkalom arra, hogy megfigyeld a levegő beáramlását. A következő körben állj meg akkor, amikor még könnyed a hangadás, és hagyd meg a forrásban szereplő beáramlási időt.'),
 (1,'Légzés ülve és beszéd közben','Folytasd ülve, számolással és a hónapok sorolásával.','Nézd vissza az előző nap videóját és olvasd el a visszajelzés példáját. Utána ülj a tükör elé.',['months','seated'],'Vedd fel a számokkal és a hónapokkal való gyakorlatot, majd nézd vissza.','Ebben a mintában a hónapok között egyre kevesebb a kilélegezhető levegő. Nem az a cél, hogy mindenáron végigérj. A következő próbán figyeld a rekeszre tett kezed mozgását, és még a préselés előtt tarts szünetet.'),
 (2,'Nyelv és ajkak tükör előtt','Bemelegítés után figyeld a nyelved és az ajkaid pontos mozgását.','Készítsd elő a tükröt, a vizet, a kávéskanalat és a szívószálat. Kezdd az arcmasszázzsal.',['warm','water','balance','straw'],'Mutass egy rövid részletet a tükör előtti nyelv- és ajakgyakorlatokból.','A példában csettintés közben többször bezáródik a száj. A tükör segít észrevenni ezt a mozdulatot. A következő körben lassabban végezd a csettintéseket, és figyeld, nyitva marad-e a szád a feladat szerint.'),
 (2,'Pontos hangzók és nyelvtörők','Formáld a magánhangzókat, majd haladj lassan a nyelvtörőkkel.','Melegíts be az előző nap gyakorlataival. Ezután figyeld tükörben a magánhangzók szájképét.',['vowels','jaw','tongue'],'Vedd fel a betanult nyelvtörők ismétlését, és nézd vissza az artikulációd.','A minta nyelvtörőjében a szóvégi hangok a gyorsításnál kevésbé hallhatók. A lassú változatban könnyebb megfigyelni őket. Következőnek ugyanazt a nyelvtörőt mondd csak magánhangzókkal, majd a szájképet megtartva teljes szöveggel.'),
 (3,'Ismerkedj a zengő hanggal','Figyeld az M hangot, a mellkas rezgését és a könnyed hangindítást.','Először nézd vissza tegnap videóját és olvasd el a mintavisszajelzést. A mai gyakorlást a tenyerek melegítésével kezdd.',['voice'],'Mutasd meg az M-mel indított számolást és a kitartott hang egy részletét.','A mintában az M hang rezgése után az á hang indítása hirtelenebb. Érdemes a két hang közti átmenetet megfigyelni. A következő körben tartsd az M hangot a forrás szerint, és lassan formálj belőle magánhangzót, a mellkason tartott kézzel ellenőrizve a rezgést.'),
 (3,'Juttasd célba a hangodat','Próbáld ülve, állva és mozgásban, majd küldd a szótagokat egy kijelölt pontra.','Ismételd a fekvő hanggyakorlatot, majd válts ülő és álló helyzetre.',['standing','target','week'],'Vedd fel az M és V hanggal végzett számolást. Jegyezd fel, hányig jutottál könnyedén.','A célba juttatás mintájában a második szótag magasabban szól. A feladat középhangmagasságon kéri a zengő hangot. Következőnek lassíts a manna-menne-monno-mánná soron, és külön figyeld, hogy a hang célba juttatása közben ne emeld meg a hangmagasságot.'),
 (4,'Hosszú és rövid szótagok','Érezd meg a TÁ és TI arányát a kézmozgásban és a szavakban.','Készítsd elő az asztalt és a tükröt. Kezdd a félperces kézritmussal.',['beat','words'],'Mutass egy rövid részletet a kézritmusból és a szóritmusból.','A minta talál szavában a két szótag majdnem azonos hosszúságú. A ti-tá képlet segít meghallani a különbséget. A következő körben mondd a-a helyett a-á formával, majd ti-tá-val, és csak utána ismételd teljes szóval.'),
 (4,'Ritmus verssel és levegővel','Gyakorolj a Kínai templommal és a Ha a világ rigó lenne soraival.','Nézd vissza a tegnapi ritmusgyakorlatot. Utána ismételd a TÁ és TI képletet, és kezdj a Kínai templommal.',['temple','bird'],'Vedd videóra az egész verset, pontos ritmussal. A Kínai templom olvasását is visszanézheted.','A mintában az oszlop végén szünet hallható a Kínai templom olvasásakor. A forrás éppen a folyamatos továbbolvasást kéri. Következőnek lassan olvasd az oszlopokat a végükön új szünet nélkül, majd figyeld meg, hol szükséges levegőt hagynod beáramlani.'),
 (5,'Beszédlégzés hosszabb sorokkal','Bemelegítés után sorold a hónapokat, majd bővítsd őket mondatokkal.','Kezdd a forrás bemelegítésével, majd fekve figyeld a hónapok sorolását.',['warm','months'],'Vedd fel a hónapok és az utazós mondatok egy részletét.','A mintában a hosszabb utazós mondat vége sietősebb. A levegőszünet helye fontosabb, mint hogy egyetlen levegővel végigmondd. Következőnek állj meg a beáramláshoz, majd ugyanolyan nyugodt tempóban folytasd a következő hónappal.'),
 (5,'Beszéd közben is maradj mozgásban','Ismételd állva és sétálva, majd dolgozz a hattyúnyakas szorzótáblával.','Állj a tükör elé, nézz egy pontra, majd kezdd az álló hónapgyakorlattal.',['walking','swan'],'Mutass egy részletet a sétálva végzett hónapgyakorlatból vagy a hattyúnyakas szorzótáblából.','A sétás mintában a lépés és a beszéd tempója egyszerre gyorsul. A feladat az egyenletes, lassú mozgást kéri. A következő próbán előbb állva mondd a hattyúnyakas sorokat, majd ugyanebben a tempóban kezdj sétálni, a levegőszüneteket megtartva.'),
 (6,'Rezonancia szavakkal','Az ajak- és hangbemelegítés után gyakorolj az M-mel induló szavakkal.','Ismételd a korábbi ajak-, nyelv- és hanggyakorlatokat, majd állj a tükör elé.',['words'],'Mutass egy részletet az M-mel induló szavakból. A kéz ellenőrizze a mellkas rezgését.','Az M-es szavak mintájában az első hang egyik helyen rövidebb, a másikon hosszabb. A forrás körülbelül két másodpercet ad a kezdő M hangnak. Következőnek öt szót mondj egymás után, ellenőrizd a mellkas rezgését, és az ötödik után hagyj időt a beáramlásnak.'),
 (6,'Zengő szókapcsolatok','Küldd célba a rövid szókapcsolatokat, és figyeld a levegő beosztását.','Nézd vissza a tegnapi M-es szavakat és a mintavisszajelzést. Ezután melegíts be, és válassz egy célt.',['target'],'Vedd fel a forrás szókapcsolatait, először külön, majd kettesével egy levegővel.','A szókapcsolatok mintájában a második rész halkabbra vált. A feladatban a célba juttatás és a dús rezonancia együtt fontos. Következőnek előbb külön levegővel mondd a máskor venne és máskor enne sort, majd kettesével, a rezgést kézzel is figyelve.'),
 (6,'Levegőbeosztás összetett mondatokban','Gyakorolj a hónapváltó mondatokkal, könnyed középhangerőn.','Az ajak- és hangbemelegítés után mondd a hónapváltó mondatokat.',['months'],'Mutasd meg, meddig jutottál könnyedén a hónapváltó mondatokban.','A mintában a januárból február lesz mondat után még folytatódik a beszéd, miközben a hang már szorítottabb. Érdemes korábban észrevenni a határt. Következőnek középhangerőn mondd a sorokat, és még a könnyedség elvesztése előtt állj meg a beáramláshoz.'),
 (6,'Rakd össze, amit megfigyeltél','A záró halandzsaszövegben kapcsolódjon össze a légzés, hang, artikuláció és ritmus.','Melegíts be az ajak-, nyelv- és hanggyakorlatokkal. Ezután gyakorold a teljes záró szöveget.',['final','closing','next'],'Küldd el a záró gyakorló videót egy felvételben, maximum 2–3 percben. Majd készítsd elő a konzultációt.','A záró szöveg mintájában a negyedik sor után elmarad a tervezett légzésszünet. A forrás ezen a ponton kéri a megállást. A következő próbán jelöld ki a negyedik sort, ott hagyd beáramlani a levegőt, majd ugyanolyan tempóban folytasd. A konzultációra hozd el, melyik rész ment könnyebben és melyik igényel még figyelmet.')]
days=[]
for n,(m,title,summary,first,focus,recording,feedback) in enumerate(configs,1):
 md=mods[m]
 d={'id':f'day-{n:02}','number':n,'module':m,'sourceRange':md['range'],'title':title,'summary':summary,'firstTask':first,'focus':focus,'recording':recording,'feedbackSample':feedback,'previousCheckpoint':n in [2,5,8,12],'duration':md['duration'],'tools':md['tools'],'moduleTitle':md['title']}
 days.append(d)
for md in mods.values():
 md['rationale']['text']=clean(md['rationale']['text'])
 if 'intro' in md:md['intro']['text']=clean(md['intro']['text'])
 md['sections']=[{'id':id,'title':title,**s,'text':clean(s['text'])} for id,title,s in md['sections']]
 # Source journal controls retain the exact prompts, all six share the supplied 1-5 scale.
 md['journal']={'score':'Mennyire ment könnyedén ma a gyakorlás? (1–5)','reflection':'Mit figyeltél meg magadon? Mi volt nehéz, mi ment jól?','scale':[1,2,3,4,5]}
 md['originalText']=texts[next(i for i,v in mods.items() if v is md)]
(app/'lessons.json').write_text(json.dumps({'version':1,'days':days,'modules':mods},ensure_ascii=False,indent=2))
# Required pre-build copy and wireframes, concrete critiques before UI/media work.
for d in days:
 md=mods[d['module']]
 focussections=[s for s in md['sections'] if s['id'] in d['focus']]
 draft=f"# {d['id']} copy draft and source\n\nStatus: pre-implementation draft. Daily organization is a Matt proposal, not 14 original Rita modules.\n\n## Participant copy\n\n{d['number']}. nap: {d['title']}\n\n{d['summary']}\n\nFirst task: {d['firstTask']}\n\nOriginal range: module {d['module']}, {d['sourceRange']}. Source duration approx {d['duration']} minutes.\n\n## Full original rationale\n\n{md['rationale']['text']}\n\n"
 if d['number']==1:draft+='## Original introduction\n\n'+md['intro']['text']+'\n\n'
 for s in focussections:draft+=f"## {s['title']} | original lines {s['startLine']}-{s['endLine']}\n\n{s['text']}\n\n"
 draft+=f"## Source journal and recording\n\n{md['journal']['score']}\n\n{md['journal']['reflection']}\n\n{d['recording']}\n\n## Fictional Rita feedback example\n\n{d['feedbackSample']}\n\n## Wireframe\n\n```text\nBrand + overview link\nDay/progress/title + plain task + first action\n{'Yesterday: video + feedback + practice focus' if d['previousCheckpoint'] else 'Current status + feedback when available'}\nTools/time and original source rationale\n{'Original introduction + initial spontaneous video' if d['number']==1 else ''}\nOrdered complete original exercises for daily focus\nAll remaining original module tasks under labelled expansion\nVisual chooser: infographic A/B and AI image A/B\nSource reflection: unanswered slider + free text + save status\nRecording instruction + chooser + playable preview + replace/remove\nDeliberate prototype submission + honest receipt\nNext day / day14 consultation preparation\n````\n\n## Concrete pre-build criticism and planned correction\n\nA full module presented as one undifferentiated text block makes the participant hunt for the first task. Keep the original text in readable steps, emphasize the assigned focus and put the full other source tasks in a clearly labelled expansion. The opening must tell the participant what to do before showing controls. A slider set to 3 must not look like a submitted answer: keep an explicit unanswered output until touched. A sample clip is not a Rita teaching recording or a real participant performance: label it as a technical demo everywhere. Feedback is fictional and references an imagined practice clip, so never claim the bundled nonhuman clip demonstrates the observation.\n\n## Rita wireframe and criticism\n\nDay + sample participant + submission status/time → source task and saved reflection → playable video → clearly fictional suggested feedback → editable local draft → preview → deliberate mark-sent action → receipt naming recipient/day + participant readback link. Keep day switching and context together. Empty send must produce an inline recovery message.\n"
 (out/f'drafts/app/{d["id"]}.md').write_text(draft)
(out/'drafts/app/consultation.md').write_text('''# Consultation copy and wireframe before implementation

Source: module-1 introduction and module-6 final passage. A slot may be reserved early, but the online call takes place after the challenge. This review is not therapeutic completion. All slots and meeting-link states are simulated.

Copy: „Nézzük át, mit figyeltél meg.” Bring the initial spontaneous video, final 2–3 minute practice clip, notes on what felt easy and difficult, and questions. The meeting reviews changes and remaining needs. Longer work may be discussed if wanted, with no invented price or commitment.

Wireframe: source timing → preparation checklist + saved notes → sample slot radio group → deliberate local booking → confirmation naming sample slot → honest no-real-Meet state → reschedule/cancel → post-call next steps and saved personal plan.

Criticism: Real-looking calendar dates would imply availability. Use plainly named example slots after day14, not current dates. Never show a fake external meeting URL. Early reservation and after-challenge timing must be in the same explanation. Editing a slot must not silently alter a confirmed reservation: require a separate save action and show exact status.
''')
(out/'site/app/PRODUCT.md').write_text('''# Product
<!-- impeccable:product-schema 1 -->

## Platform
web

## Stack
Delegated static HTML, CSS and JavaScript frontend, as explicitly authorized in the goal. All data is browser-local and fictional. No backend.

## Users
Adult participants practise on their phones. Rita reviews each day’s demo video and reflection on her phone. Matt reviews the complete journey.

## Product Purpose
Enable a clear daily practice → reflection → video → personal feedback → next practice loop across 14 distinct day views, followed by the source-grounded post-challenge consultation.

## Capabilities and Constraints
Six exact source modules, with ranges 1–2, 3–4, 5–6, 7–8, 9–10 and 11–14. A proposed new daily allocation is labelled. Daily video and daily personal feedback are Matt’s first-cohort proposal, not Rita acceptance. Instruction recordings and real slots are unavailable. Only mobile widths 360/390/430 are tested. No backend, real login, upload service, payment or messaging.

## Brand Commitments
Komplex Logopédia, natural Hungarian, incumbent Quicksand and Nunito Sans, blue/pink/yellow identity. Source wording is preserved verbatim. New interface wording avoids em dashes and semicolons.

## Evidence on Hand
All six module text sources. 18 August call extract and Rita’s Figma notes were read for consultation framing and practical video guidance. Matt’s later daily-feedback instruction supersedes earlier feedback limits.

## Product Principles
Put the next useful action first. Preserve full instructions. Distinguish unanswered, edited, saved and submitted. Label every simulated service state. Keep day and participant context together.
''')
(out/'site/app/DESIGN.md').write_text('''# Established Komplex mobile application system

Mode: Operate with source lesson passages in Read mode. Established brand extension, not rebranding.

Incumbent evidence: September brand.css, live identity referenced by the parent, original Figma insights. Quicksand body and Nunito Sans headings. Blue #008ae6, pink #e14f9b, yellow #fea500. Darker functional blue/pink ensure readable controls. Cool paper background, white task area, minimal radii and consistent touch actions.

Composition: single-column mobile task flow. A compact brand header gives overview access. Day number and progress carry real sequence information. Plain first task precedes source rationale and ordered exercises. Original source text remains readable and clearly marked. Fixed navigation is avoided so long text and video/editor actions cannot be obscured.

Forms: labelled standard controls, generous touch size, explicit unanswered sliders and distinct unsaved/saved states. Feedback/editor preview is inline. Browser-local receipt always identifies day and participant. Source downloads remain intact.

Decision authority: Matt explicitly said to take liberties, make almost all decisions and complete first. The full authorized assignment specifies mobile journey, identity, ordering, source boundaries and prototype stack. No fresh decision/approval page is necessary and no user-facing panels are opened.
''')
source_map={'sources':[],'days':[],'excludedCover':{'module':1,'reason':'Initial cover contains old unverified experience/case/rating marketing proof. It remains in the exact original download and archived source expansion, is not reused as current marketing proof. No exercise passage is omitted.'}}
for i,md in mods.items():
 source_map['sources'].append({'module':i,'path':str(src/f'module-{i}.txt'),'download':f'app/source/module-{i}.txt','sha256':hashlib.sha256(texts[i].encode()).hexdigest(),'rationale':{k:v for k,v in md['rationale'].items() if k!='text'},'sections':[{k:v for k,v in s.items() if k!='text'} for s in md['sections']],'fullSourceExpansion':'Every corresponding day has the complete original module text, including examples, poems, repetition/duration, references and journal.'})
for d in days:source_map['days'].append({'id':d['id'],'module':d['module'],'range':d['sourceRange'],'selectedSections':d['focus'],'remainingSections':'Complete, exact source tasks in labelled expandable section','newUI':[d['title'],d['summary'],d['firstTask'],d['recording']],'checkpoint':d['previousCheckpoint']})
(out/'evidence/app/source-map.json').write_text(json.dumps(source_map,ensure_ascii=False,indent=2))
(out/'evidence/app/source-map.md').write_text('# Source-to-screen mapping\n\nAll six originals copied byte for byte to app/source. JSON records SHA-256 identities and exact source line ranges for every displayed section. Each day includes the complete original source in an expansion, and a downloadable exact text. Main daily focus is an explicitly proposed allocation. Source instructions keep spelling and punctuation, with extraction whitespace normalized only. Cover proof statistics are not reused as current claims.\n\n'+ '\n'.join(f'- {d["id"]}: module {d["module"]} ({d["sourceRange"]}), main sections '+', '.join(d['focus'])+'; all other module tasks remain fully reachable.' for d in days)+'\n\nSource-video references have no supplied recording. The interface labels them pending and does not substitute the playable technical fixture as a teaching recording. The two checkpoint concepts use explicit fictional feedback and a nonhuman technical fixture until a real local demo submission exists.\n')
print('Wrote 14 complete prebuild drafts, consultation draft, 6 originals, lessons data and source map.')
