MODUL 5, lectia 7: workshop 6, psihologia abundentei

2 scheme (a fi / a face / a avea cu scurtcircuitul, si strategia ca schema
logica), audit curat. Actionabil: exercitiul celor doua verbe, rescrierea
obiectivului din suma in obiect, desenarea schemei logice a propriei strategii
cu toate ramurile inchise, si fixarea orizontului.

Inregistrarea sursa e trunchiata: se opreste in mijlocul frazei la 3614s,
adica exact la finalul audio-ului lectiei, deci nu e coada noastra. Raman fara
acoperire doua lucruri promise in material: principiile lui Demartini si
exemplul numeric de capital/win rate - notate ca goluri, nu completate.

Afirmatiile categorice (cuvantul ca energie, vechimea banilor, meritul) raman
atribuite autorului, intr-o sectiune separata.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
This commit is contained in:
Claude Agent
2026-10-02 01:56:41 +00:00
parent 781628b1d1
commit 862627c33a
3 changed files with 1235 additions and 0 deletions

193
gen/workshop_6_abundenta.py Normal file
View File

@@ -0,0 +1,193 @@
"""Cele două scheme din summaries/06_MODUL_5/07_workshop_6_abundenta.md.
Workshop de psihologie: nu există preț, deci nu există candele. Schemele sunt
structuri — lanțul a fi / a face / a avea, și schema logică a unei strategii,
cea pe care autorul spune că o desenează cu romb de pe vremea Turbo Pascal.
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_6_abundenta.py
"""
import re
from pathlib import Path
MD = Path("/workspace/atm-curs-dl/summaries/06_MODUL_5/07_workshop_6_abundenta.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. a fi -> a face -> a avea
# (eticheta, ce e, cele două rânduri de detaliu din transcriere)
VERBE = [
("a FI", "abilitățile + starea emoțională",
["„20% strategie, 80% psihologie — puse", "la pachet ca să obții 100%"]),
("a FACE", "procesul: execuția strategiei",
["„acțiunea sau procesul care", "înseamnă creștere și dezvoltare\u201d"]),
("a AVEA", "rezultatul: banii",
["„a avea ce este? rezultatul, frate —", "rezultatul e consecința procesului"]),
]
BOX_W, BOX_H, GAP_X, X0, Y0 = 200, 104, 32, 18, 44
def a_fi_a_face_a_avea() -> str:
w = X0 * 2 + 3 * BOX_W + 2 * GAP_X
p = [f'<svg viewBox="0 0 {w} 250" xmlns="http://www.w3.org/2000/svg"'
' style="width:100%;height:auto;font:12px sans-serif">',
f'<text x="{X0}" y="24" fill="{INK}" style="font-weight:bold">'
f'{fits("Ordinea dată de curs: a fi, a face, a avea — și scurtcircuitul pe care îl ia majoritatea", w - 2 * X0)}</text>']
for i, (verb, ce, detail) in enumerate(VERBE):
x = X0 + i * (BOX_W + GAP_X)
col = GREEN if i < 2 else ORANGE
p += [f'<rect x="{x}" y="{Y0}" width="{BOX_W}" height="{BOX_H}" fill="{col}"'
f' fill-opacity="0.07" stroke="{col}" stroke-width="1.5" rx="4"/>',
f'<text x="{x + 12}" y="{Y0 + 24}" fill="{col}" style="font-weight:bold">'
f'{fits(verb, BOX_W - 24)}</text>',
f'<text x="{x + 12}" y="{Y0 + 44}" fill="{INK}" font-size="11">'
f'{fits(ce, BOX_W - 24, 11)}</text>']
for k, d in enumerate(detail):
p += [f'<text x="{x + 12}" y="{Y0 + 66 + k * 14}" fill="{MUTED}" font-size="10">'
f'{fits(d, BOX_W - 20, 10)}</text>']
if i < len(VERBE) - 1:
xa = x + BOX_W
p += [f'<line x1="{xa + 4}" y1="{Y0 + BOX_H / 2}" x2="{xa + GAP_X - 6}"'
f' y2="{Y0 + BOX_H / 2}" stroke="{LINE}" stroke-width="1.5"/>',
f'<path d="M {xa + GAP_X - 12} {Y0 + BOX_H / 2 - 4} L {xa + GAP_X - 4}'
f' {Y0 + BOX_H / 2} L {xa + GAP_X - 12} {Y0 + BOX_H / 2 + 4} Z" fill="{LINE}"/>']
# scurtcircuitul: de la stânga primei casete direct la a treia, pe dedesubt
y_sc = Y0 + BOX_H + 34
x_end = X0 + 2 * (BOX_W + GAP_X) + BOX_W / 2
p += [f'<path d="M {X0 + 14} {Y0 + BOX_H + 6} L {X0 + 14} {y_sc} L {x_end} {y_sc}'
f' L {x_end} {Y0 + BOX_H + 8}" fill="none" stroke="{RED}" stroke-width="1.5"'
' stroke-dasharray="5 4"/>',
f'<path d="M {x_end - 4} {Y0 + BOX_H + 16} L {x_end} {Y0 + BOX_H + 6}'
f' L {x_end + 4} {Y0 + BOX_H + 16} Z" fill="{RED}"/>',
f'<text x="{X0 + 24}" y="{y_sc - 8}" fill="{RED}" font-size="11">'
f'{fits("scurtcircuitul: pui obiectivul direct pe rezultat, în bani", 400, 11)}</text>',
f'<text x="{X0}" y="{y_sc + 24}" fill="{RED}" font-size="11">'
f'{fits("Motivul pe care îl dă autorul: „oamenii nu-și asumă responsabilitatea transformării. Stau în a avea pentru", w - 2 * X0, 11)}</text>',
f'<text x="{X0}" y="{y_sc + 40}" fill="{RED}" font-size="11">'
f'{fits("că nu-și asumă responsabilitatea transformării.” Transformarea sunt exact cele două casete sărite.", w - 2 * X0, 11)}</text>',
'</svg>']
return "\n ".join(p)
# ------------------------------------------------ 2. schema logică a strategiei
# (eticheta nodului, tipul) — tipul contează pentru assert-uri
NODURI = [
("A — condiția de intrare din strategie", "start"),
("s-a format A, exact ca în reguli?", "romb"),
("B — intri, cu stopul pus în același ordin", "pas"),
("prețul face D: se duce la stop?", "romb"),
("E — stopul te scoate: pierdere planificată", "iesire-plan"),
("C — duci poziția la ieșirea din plan", "iesire-bun"),
("nu faci nimic, aștepți următoarea alertă", "iesire-bun"),
]
def schema_logica() -> str:
w, h = 700, 382
p = [f'<svg viewBox="0 0 {w} {h}" xmlns="http://www.w3.org/2000/svg"'
' style="width:100%;height:auto;font:12px sans-serif">',
f'<text x="16" y="24" fill="{INK}" style="font-weight:bold">'
f'{fits("Strategia ca schemă logică — forma pe care autorul spune că o desenează cu romb, din liceu", w - 32)}</text>']
def box(x, y, bw, bh, txt, col, bold=False, fs=11):
wt = "font-weight:bold" if bold else ""
return [f'<rect x="{x}" y="{y}" width="{bw}" height="{bh}" fill="{col}"'
f' fill-opacity="0.07" stroke="{col}" stroke-width="1.5" rx="4"/>',
f'<text x="{x + 10}" y="{y + bh / 2 + 4}" fill="{col}" font-size="{fs}"'
f' style="{wt}">{fits(txt, bw - 20, fs)}</text>']
def diamond(cx, cy, dw, dh, lines):
"""Romb cu text centrat; textul stă în banda din mijloc, unde rombul e lat."""
out = [f'<path d="M {cx} {cy - dh / 2} L {cx + dw / 2} {cy} L {cx} {cy + dh / 2}'
f' L {cx - dw / 2} {cy} Z" fill="{BLUE}" fill-opacity="0.07"'
f' stroke="{BLUE}" stroke-width="1.5"/>']
y0 = cy - 4 if len(lines) == 2 else cy + 3
for k, t in enumerate(lines):
dy = abs(y0 + k * 13 - cy) + 5 # cât de departe de mijloc e rândul
half = dw / 2 * (1 - dy / (dh / 2)) # semi-lățimea rombului acolo
out += [f'<text x="{cx}" y="{y0 + k * 13}" fill="{BLUE}" font-size="10"'
f' text-anchor="middle">{fits(t, 2 * half - 16, 10)}</text>']
return out
def arrow(x1, y1, x2, y2, col=LINE):
d = 4
head = (f'M {x2 - d} {y2 - 9} L {x2} {y2} L {x2 + d} {y2 - 9} Z' if y2 > y1
else f'M {x2 - 9} {y2 - d} L {x2} {y2} L {x2 - 9} {y2 + d} Z')
return [f'<line x1="{x1}" y1="{y1}" x2="{x2}" y2="{y2}" stroke="{col}" stroke-width="1.5"/>',
f'<path d="{head}" fill="{col}"/>']
# coloana centrală: start -> romb 1 -> B -> romb 2 -> C
p += box(200, 40, 300, 34, NODURI[0][0], GRAY, bold=True)
p += arrow(350, 74, 350, 92)
p += diamond(350, 130, 300, 76, ["s-a format A, exact ca în reguli?",
"(fără „dar aici e un bull flag”)"])
p += arrow(350, 168, 350, 182)
p += box(200, 182, 300, 34, NODURI[2][0], GREEN)
p += arrow(350, 216, 350, 230)
p += diamond(350, 268, 300, 76, ["prețul se duce înspre stop (D)?"])
p += arrow(350, 306, 350, 320)
p += box(200, 320, 300, 34, NODURI[5][0], GREEN)
# ramura NU a primului romb -> aștepți
p += arrow(500, 130, 536, 130)
p += box(536, 113, 150, 34, "aștepți alerta", GRAY)
p += [f'<text x="506" y="124" fill="{MUTED}" font-size="10">NU</text>',
f'<text x="356" y="180" fill="{MUTED}" font-size="10">DA</text>']
# ramura DA a celui de-al doilea romb -> stopul
p += arrow(500, 268, 536, 268)
p += box(536, 251, 150, 34, "E — stopul te scoate", RED)
p += [f'<text x="506" y="262" fill="{MUTED}" font-size="10">DA</text>',
f'<text x="356" y="318" fill="{MUTED}" font-size="10">NU</text>',
f'<text x="536" y="300" fill="{RED}" font-size="10">'
f'{fits("pierdere planificată", 150, 10)}</text>']
p += [f'<text x="16" y="{h - 8}" fill="{MUTED}" font-size="10">'
f'{fits("Trei capete de drum, o singură pierdere — și e planificată. Literele A, B, C, D, E sunt ale autorului.", w - 32, 10)}</text>',
'</svg>']
return "\n ".join(p)
svgs["a_fi_a_face_a_avea"] = a_fi_a_face_a_avea()
svgs["schema_logica"] = schema_logica()
# ------------------------------------------------------------------- assert-uri
# 1. textul vorbește despre trei verbe, în ordinea a fi -> a face -> a avea
assert [v[0] for v in VERBE] == ["a FI", "a FACE", "a AVEA"], "ordinea verbelor"
# 2. scurtcircuitul roșu sare exact două casete (de la prima direct la a treia)
assert len(VERBE) == 3, "scurtcircuitul e desenat ca sărind peste exact 2 casete"
# 3. schema logică: exact două rombi (autorul descrie o ramificație de intrare și
# una de ieșire) și exact o singură ieșire etichetată ca pierdere
assert sum(1 for _, t in NODURI if t == "romb") == 2, "textul spune două ramificații"
assert sum(1 for _, t in NODURI if t == "iesire-plan") == 1, \
"legenda spune «o singură pierdere»"
# 4. legenda spune „trei capete de drum" — exact nodurile din care nu mai pleacă
# nicio săgeată (E, C, aștepți)
assert sum(1 for _, t in NODURI if t.startswith("iesire")) == 3, \
"legenda spune trei capete de drum"
# 5. literele din schemă sunt exact cele rostite în transcriere
litere = {s[0] for s, _ in NODURI if s[0].isupper() and s[1] == " "}
assert litere == {"A", "B", "C", "E"}, f"litere desenate: {litere}"
# 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)