Files
atm-curs-dl/gen/workshop_5_copilul_interior.py
Claude Agent 98905bd8bd MODUL 5, lectia 6: workshop 5, vindecarea copilului interior
3 scheme (lantul ranii, cele 5 rani cu mastile lor, etapele pe varsta), audit
curat. Partea utila e scoasa ca procedura: chestionarul, cele doua intrebari pe
masca, jurnalul de context, interviul cu parintii, numirea emotiei, retrairea
disociata, testul de ciclicitate - si legatura fiecarei rani cu o greseala de
executie (mutat stopul, revansa, schimbat strategia la prima serie proasta).

Limite de sursa, notate in document: transa de re-parenting nu e in audio
(autorul opreste inregistrarea ca s-o taie separat), iar cele 20 de intrebari
au fost trimise pe WhatsApp, deci in transcriere apar doar trei.

Afirmatiile de ordin clinic (memorie celulara, trauma release, 7 generatii)
raman atribuite autorului, intr-o sectiune separata.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
2026-10-02 01:21:53 +00:00

252 lines
14 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Cele trei scheme din summaries/06_MODUL_5/06_workshop_5_copilul_interior.md.
Workshop de psihologie: nu există preț, deci nu există candele. Schemele sunt
doar structuri (lanțul de decizie, maparea rană -> mască -> greșeală de
execuție, axa de vârstă a etapelor). Se generează de aici ca să existe un
singur loc unde se schimbă o etichetă și ca să treacă prin assert-urile de
lățime — nu se editează SVG-ul din .md.
Rulează: .venv/bin/python gen/workshop_5_copilul_interior.py
"""
import re
from pathlib import Path
MD = Path("/workspace/atm-curs-dl/summaries/06_MODUL_5/06_workshop_5_copilul_interior.md")
GRAY, RED, GREEN, BLUE, ORANGE = "#777", "#c00", "#188a3e", "#1a5fb4", "#b06000"
INK, MUTED, LINE, FILL = "#333", "#666", "#9bb0c7", "#f7f9fb"
CHAR_W = 5.7 # px/caracter la 12px sans-serif, calibrat ca în audit_diagrams.py
svgs = {}
def fits(txt: str, box_w: float, fs: float = 12.0) -> str:
"""Text care intră în lățimea dată la font-size-ul dat, altfel assert."""
w = len(txt) * CHAR_W * fs / 12.0
assert w <= box_w, f"text de {w:.0f}px în {box_w:.0f}px: {txt!r}"
return txt
# --------------------------------------------------------------- 1. lanțul de decizie
FILTRE = ["filtrele VAKOG — vizual, auditiv, kinestezic",
"valorile și credințele (unele limitative)",
"experiențele, cu rănile emoționale din ele"]
LANT2 = [("gând", '„iar m-a trădat piața"'),
("emoție", "furie"),
("comportament", "intri în revanșă"),
("rezultat", "a doua pierdere")]
def lant_rana() -> str:
p = ['<svg viewBox="0 0 700 330" xmlns="http://www.w3.org/2000/svg"'
' style="width:100%;height:auto;font:12px sans-serif">',
f'<text x="14" y="22" fill="{INK}" style="font-weight:bold">Formula de'
' funcționare reluată la începutul workshopului — rana stă în a doua'
' casetă</text>']
# stimul extern
p += [f'<rect x="14" y="40" width="150" height="56" fill="{FILL}"'
f' stroke="{LINE}" stroke-width="1"/>',
f'<text x="24" y="60" fill="{INK}" style="font-weight:bold">'
f'{fits("stimul extern", 130)}</text>',
f'<text x="24" y="78" fill="{MUTED}" font-size="10">'
f'{fits("tot ce e în afara pielii", 130, 10)}</text>',
f'<text x="24" y="90" fill="{MUTED}" font-size="10">'
f'{fits("ex: piața îți ia stopul", 130, 10)}</text>']
p += [f'<line x1="166" y1="68" x2="196" y2="68" stroke="{LINE}" stroke-width="1.5"/>',
f'<path d="M 190 64 L 198 68 L 190 72 Z" fill="{LINE}"/>']
# reprezentare mentală, cu filtrele
p += [f'<rect x="200" y="40" width="330" height="96" fill="{BLUE}"'
f' fill-opacity="0.07" stroke="{BLUE}" stroke-width="1.5"/>',
f'<text x="210" y="60" fill="{BLUE}" style="font-weight:bold">'
f'{fits("reprezentare mentală — lentila prin care vezi", 310)}</text>']
for k, t in enumerate(FILTRE):
y = 78 + 18 * k
p += [f'<circle cx="216" cy="{y - 4}" r="3" fill="{BLUE}"/>',
f'<text x="226" y="{y}" fill="{INK}" font-size="11">'
f'{fits(t, 296, 11)}</text>']
p += [f'<text x="546" y="64" fill="{RED}" font-size="11">'
f'{fits("rana nu schimbă", 140, 11)}</text>',
f'<text x="546" y="80" fill="{RED}" font-size="11">'
f'{fits("evenimentul —", 140, 11)}</text>',
f'<text x="546" y="96" fill="{RED}" font-size="11">'
f'{fits("schimbă lentila", 140, 11)}</text>',
f'<line x1="534" y1="88" x2="542" y2="88" stroke="{RED}" stroke-width="1.5"/>']
# coborârea pe rândul doi
p += [f'<line x1="365" y1="138" x2="365" y2="162" stroke="{LINE}" stroke-width="1.5"/>',
f'<path d="M 361 156 L 365 164 L 369 156 Z" fill="{LINE}"/>']
for k, (nume, ex) in enumerate(LANT2):
x = 14 + 172 * k
p += [f'<rect x="{x}" y="170" width="152" height="54" fill="{FILL}"'
f' stroke="{LINE}" stroke-width="1"/>',
f'<text x="{x + 10}" y="190" fill="{INK}" style="font-weight:bold">'
f'{fits(nume, 132)}</text>',
f'<text x="{x + 10}" y="212" fill={chr(34)}{ORANGE}{chr(34)}'
f' font-size="11">{fits(ex, 132, 11)}</text>']
if k < len(LANT2) - 1:
p += [f'<line x1="{x + 154}" y1="197" x2="{x + 170}" y2="197"'
f' stroke="{LINE}" stroke-width="1.5"/>',
f'<path d="M {x + 164} 193 L {x + 172} 197 L {x + 164} 201 Z"'
f' fill="{LINE}"/>']
p += [f'<rect x="14" y="240" width="672" height="74" fill="{RED}"'
f' fill-opacity="0.06" stroke="{RED}" stroke-width="1"/>',
f'<text x="24" y="260" fill="{RED}" style="font-weight:bold">'
f'{fits("De ce te interesează la execuție", 652)}</text>',
f'<text x="24" y="280" fill="{INK}" font-size="11">'
f'{fits("Doi traderi cu același stop luat, pe același grafic, scriu două reprezentări diferite — deci două", 652, 11)}</text>',
f'<text x="24" y="296" fill="{INK}" font-size="11">'
f'{fits("comportamente diferite. Regula scrisă dinainte acționează în caseta a doua, nu în ultima.", 652, 11)}</text>',
'</svg>']
return "\n ".join(p)
# ------------------------------------------------- 2. rană -> mască -> greșeală
# col. 4: True = legătura cu piața e rostită în transcriere; False = completarea mea
RANI = [("respingere", "fugarul", "de obicei tatăl",
"închizi tranzacția mai devreme; fugi de reguli", True),
("abandon", "dependentul", "de obicei mama",
"nu intri până nu confirmă altcineva setup-ul", False),
("umilire", "masochistul", "de obicei mama",
"te autosabotezi; suporți pierderea mai mult decât trebuie", True),
("trădare", "dominatorul", "părintele de sex opus",
"schimbi strategia la prima serie proastă: „m-a trădat piața”", True),
("nedreptate", "rigidul", "părintele mai autoritar",
"vrei să ai dreptate — muți stopul; overtrading „ca să meriți”", True)]
def rani_masti() -> str:
h = 76 + 34 * len(RANI) + 58
p = [f'<svg viewBox="0 0 700 {h}" xmlns="http://www.w3.org/2000/svg"'
' style="width:100%;height:auto;font:12px sans-serif">',
f'<text x="14" y="22" fill="{INK}" style="font-weight:bold">Cele cinci'
' răni: masca fiecăreia și greșeala de execuție pe care o produce</text>',
f'<text x="20" y="46" fill="#44576e" font-size="10">RANA</text>',
f'<text x="118" y="46" fill="#44576e" font-size="10">MASCA</text>',
f'<text x="212" y="46" fill="#44576e" font-size="10">PĂRINTE ASOCIAT</text>',
f'<text x="344" y="46" fill="#44576e" font-size="10">CE FACE PE CONT</text>',
f'<line x1="14" y1="52" x2="686" y2="52" stroke="{LINE}" stroke-width="1"/>']
for k, (rana, masca, par, ef, din_curs) in enumerate(RANI):
y = 74 + 34 * k
col = INK if din_curs else BLUE
p += [f'<text x="20" y="{y}" fill="{INK}" font-size="11"'
f' style="font-weight:bold">{fits(rana, 92, 11)}</text>',
f'<text x="118" y="{y}" fill="{ORANGE}" font-size="11">'
f'{fits(masca, 88, 11)}</text>',
f'<text x="212" y="{y}" fill="{MUTED}" font-size="10">'
f'{fits(par, 126, 10)}</text>',
f'<text x="344" y="{y}" fill="{col}" font-size="11">'
f'{fits(ef, 340, 11)}</text>']
if k < len(RANI) - 1:
p.append(f'<line x1="14" y1="{y + 11}" x2="686" y2="{y + 11}"'
f' stroke="{LINE}" stroke-width="0.5" stroke-opacity="0.6"/>')
yb = 76 + 34 * len(RANI) + 18
p += [f'<text x="14" y="{yb}" fill="{INK}" font-size="11">'
f'{fits("Coloana a patra, în negru, e rostită în transcriere; rândul albastru (abandon) e completarea mea —", 672, 11)}</text>',
f'<text x="14" y="{yb + 16}" fill="{MUTED}" font-size="11">'
f'{fits("cursul descrie rana de abandon pe relații și dependențe, nu pe execuție. Poți fi în mai multe, cu una dominantă.", 672, 11)}</text>',
'</svg>']
return "\n ".join(p)
# ----------------------------------------------------- 3. etapele copiilor interiori
# (start_ani, stop_ani, nume, linia 1, linia 2)
ETAPE = [(0.0, 1.5, "sinele infantil",
"nevoi de bază: hrană, somn, atingere, siguranță.",
"Fără amintiri — cursul le pune în „memoria celulară”."),
(1.5, 3.0, "sinele copilului mic",
"autonomie și testarea limitelor.",
"Mediu restrictiv aici duce în rușine, vinovăție, îndoială."),
(3.0, 6.0, "copilul interior tânăr",
"imaginație, creativitate, stimă de sine.",
"Aici se formează, spune cursul, umilirea și respingerea."),
(6.0, 12.0, "copilul interior școlar",
"identitate și valoare de sine, prin grup.",
"Critica produce aici „nu sunt suficient de bun”."),
(12.0, 15.0, "adolescentul interior",
"rebeliune, căutare de identitate, apartenență.",
"De aici vine, spune cursul, încălcarea regulilor."),
(16.0, 22.0, "tânărul adult interior",
"asumarea responsabilității, primele decizii mari.",
"De aici vine indecizia, inclusiv în trading.")]
AX0, AXW, YEARS, ROW = 20.0, 250.0, 22.0, 54
def eti(a: float, b: float) -> str:
"""Eticheta de vârstă: luni sub doi ani, altfel ani, cu virgulă zecimală."""
if b <= 1.6:
return f"{int(a * 12)}–{int(b * 12)} luni"
lo = "18 luni" if a == 1.5 else f"{a:g}".replace(".", ",")
return f"{lo}–{b:g} ani".replace(".", ",")
def _x(an: float) -> float:
return AX0 + AXW * an / YEARS
def etape_copii() -> str:
h = 74 + ROW * len(ETAPE) + 44
p = [f'<svg viewBox="0 0 700 {h}" xmlns="http://www.w3.org/2000/svg"'
' style="width:100%;height:auto;font:12px sans-serif">',
f'<text x="14" y="22" fill="{INK}" style="font-weight:bold">Nu un copil'
' interior, ci șase — barele sunt la scară pe axa de vârstă</text>']
# axa de vârstă, sus
p += [f'<line x1="{AX0}" y1="52" x2="{_x(YEARS)}" y2="52" stroke="{LINE}"'
' stroke-width="1"/>']
for an in (0, 3, 6, 12, 22):
p += [f'<line x1="{_x(an)}" y1="48" x2="{_x(an)}" y2="56"'
f' stroke="{LINE}" stroke-width="1"/>',
f'<text x="{_x(an) - 4}" y="45" fill="{MUTED}" font-size="10">{an}</text>']
p.append(f'<text x="{_x(YEARS) + 8}" y="56" fill="{MUTED}" font-size="10">ani</text>')
y_last = 74 + ROW * (len(ETAPE) - 1) + 18
p += [f'<line x1="{_x(3)}" y1="58" x2="{_x(3)}" y2="{y_last}" stroke="{RED}"'
' stroke-width="1" stroke-dasharray="4 3"/>']
for k, (a, b, nume, l1, l2) in enumerate(ETAPE):
y = 74 + ROW * k
col = RED if b <= 3 else INK
p += [f'<rect x="{_x(a)}" y="{y}" width="{_x(b) - _x(a)}" height="18"'
f' fill="{col}" fill-opacity="0.16" stroke="{col}" stroke-width="1"/>',
f'<text x="298" y="{y + 12}" fill="{col}" font-size="11"'
f' style="font-weight:bold">{fits(f"{nume} · {eti(a, b)}", 388, 11)}</text>',
f'<text x="298" y="{y + 28}" fill="{INK}" font-size="11">'
f'{fits(l1, 388, 11)}</text>',
f'<text x="298" y="{y + 43}" fill="{MUTED}" font-size="10">'
f'{fits(l2, 388, 10)}</text>']
yb = 74 + ROW * len(ETAPE) + 16
p += [f'<text x="14" y="{yb}" fill="{RED}" font-size="11">'
f'{fits("Linia punctată de la 3 ani: sub ea nu ai amintiri (neocortexul nu e dezvoltat), deci informația vine", 672, 11)}</text>',
f'<text x="14" y="{yb + 16}" fill="{RED}" font-size="11">'
f'{fits("de la părinți sau din corp, nu din memorie. Între 15 și 16 ani cursul nu numește o etapă separată.", 672, 11)}</text>',
'</svg>']
return "\n ".join(p)
svgs["lant_rana"] = lant_rana()
svgs["rani_masti"] = rani_masti()
svgs["etape_copii"] = etape_copii()
# ---------------------------------------------------------------------- assert-uri
# 1. nicio bară nu iese din axă și barele sunt în ordine crescătoare de vârstă
assert all(0 <= a < b <= YEARS for a, b, *_ in ETAPE), "interval de vârstă invalid"
assert [a for a, *_ in ETAPE] == sorted(a for a, *_ in ETAPE), "etape neordonate"
# 2. eticheta „sub 3 ani nu ai amintiri" trebuie să acopere exact primele două etape
sub3 = [e for e in ETAPE if e[1] <= 3.0]
assert len(sub3) == 2, f"linia de 3 ani nu mai taie 2 etape, ci {len(sub3)}"
# 3. textul spune „șase" copii interiori
assert len(ETAPE) == 6, "titlul spune șase etape"
# 4. textul spune „cinci răni", fiecare cu exact o mască
assert len(RANI) == 5 and len({r[1] for r in RANI}) == 5, "5 răni, 5 măști distincte"
# 5. legenda spune că exact un rând e completarea mea
assert sum(1 for r in RANI if not r[4]) == 1, "legenda vorbește de un singur rând albastru"
# 6. niciun SVG nu are linie goală (python-markdown ar rupe blocul)
for name, svg in svgs.items():
assert "\n\n" not in svg, f"linie goală în {name}"
assert svg.count("<svg") == 1 and svg.rstrip().endswith("</svg>"), name
if MD.exists():
md = MD.read_text(encoding="utf-8")
for name, svg in svgs.items():
pat = re.compile(rf"<!--SVG:{name}-->.*?<!--/SVG-->", re.S)
assert pat.search(md), f"marcatorul {name} lipsește din .md"
md = pat.sub(lambda _m: f"<!--SVG:{name}-->\n{svg}\n<!--/SVG-->", md)
MD.write_text(md, encoding="utf-8")
print("scris", MD)
else:
print("nu există încă", MD)