# FORGE — MODELUL JOB (Pas 0.2)  [detaliat]
Unitatea durabila pe care o proceseaza fabrica. Sinteza din prior art real (cautat pe GitHub/internet):

## Surse & ce am luat din fiecare
- Argo Workflows (16k*) + Conductor (31k*, agentic): workflow = DAG de "templates" cu `needs` + entrypoint; artifacts/parameters intre stagii.
- Temporal: DURABLE EXECUTION — starea persista, runner-ul re-ruleaza rezilient, retry automat -> checkpoint/resume.
- BullMQ (16k*) / Prefect (22k*) / Airflow: masina de stari a job-ului (waiting->active->completed/failed/delayed/retry).
- crewAI (52k*): fiecare stagiu are un OWNER (agent/model) propriu.
- ADAUS PROPRIU: poarta QA (ochii) intre stagii — pe care sistemele mari NU o au built-in.

## Masina de stari — 2 niveluri
JOB:    DRAFT -> QUEUED -> RUNNING -> (PAUSED | NEEDS_INPUT) -> COMPLETED | FAILED | CANCELLED
STAGE:  PENDING -> READY -> RUNNING -> (RETRYING | GATE_REVIEW) -> DONE | FAILED | SKIPPED | BLOCKED
Tranzitii cu garzi:
- PENDING->READY cand toate `needs` sunt DONE/SKIPPED.
- READY->RUNNING cand runner-ul il alege (si resource-guard OK pt stagii grele: Blender/model local).
- RUNNING->GATE_REVIEW daca stagiul are poarta QA -> ruleaza ochii -> score>=target ? DONE : bucla auto (retry) pana la `max`; daca tot pica -> FAILED sau BLOCKED(cere om).
- RUNNING->RETRYING la eroare, cu fallback model (Opus->Groq/local) pana la max_attempts.
- orice->BLOCKED cand lipseste input om (brief incomplet, chei API/Stripe).
- JOB COMPLETED cand toate stagiile DONE.

## Schema JOB (JSON pe disc /root/factory/jobs/<id>.json)
id, kind(site|app|game|video), title, status, created, updated,
brief{ core_loop, audience, diferentiator, must/nice, vibe+referinte+culori, backend, deadline, complete },
stages[], artifacts[], scores[], context{} (parametri partajati), checkpoint, events[]

## Schema STAGE
id, name, tool(capabilitate din registry.json), owner(model/agent), needs[],
status, attempts, max_attempts, gate{metric,target,on_fail,max}, outputs[](id artefacte),
started, ended

## Artefacte (stil Argo) & Checkpoint (stil Temporal)
- artifact{ id, stage, type(file|url|image|glb|video), path/url, meta, score? }; stagiile declara ce produc/consuma.
- checkpoint = id-ul ultimului stagiu procesat; la resume runner-ul ia primul stagiu non-DONE cu deps gata. Stagii idempotente.

## Pipeline templates (entrypoint + DAG) per tip
- SITE:  BRIEF->MOODBOARD->DESIGN->ASSETS->FRONTEND->LOGIC->INTEGRATE->QA(gate 8.0)->DELIVER
- APP:   BRIEF->DESIGN + DATA_MODEL->BACKEND/AUTH->FRONTEND->INTEGRATE->QA->DELIVER
- GAME:  BRIEF->DESIGN/MECHANICS->ASSETS3D->ENGINE(three+rapier+ecs)->AUDIO->INTEGRATE->QA->DELIVER
- VIDEO: BRIEF->SCRIPT->ASSETS->COMPOSE(remotion)->RENDER->QA(7.5)->DELIVER

## Integrare
Modelul sta PE registry.json: fiecare stage.tool = o capabilitate din registru (gen.opus, eyes.*, assets.image, blender, deploy). Asta leaga modelul de harta reala.

## Implementare
/root/factory/job_model.py — new_job(kind,brief), advance(job) (ruleaza next ready + poarta QA + retry + checkpoint), save/load, ready(), summary(). CLI: `python3 job_model.py demo`.

## Urmeaza (0.3)
Runner real: advance() apeleaza TOOL-urile reale (gen.opus, materialize->/root/builds, eyes.auto_improve, deploy) in loc de simulare. Dashboard FORGE citeste jobs/ + registry.json -> progres live.
