Kihagyás

Planning and Task Decomposition

Miért kell egyáltalán plan?

Egy agentic loopnak nem mindig kell explicit terv. Sok feladatnál elég lehet:

observe
  ↓
choose next action
  ↓
act
  ↓
observe again

Viszont ha a feladat több egymásra épülő lépést, függőséget vagy hosszabb futást tartalmaz, egy explicit plan segít abban, hogy a runtime ne csak lokálisan jó következő lépéseket válasszon, hanem a teljes cél felé haladjon.

Például:

Goal:
Fix the failing payment test and open a PR.

Possible plan:
1. inspect failing test
2. inspect payment implementation
3. identify root cause
4. modify code
5. run targeted tests
6. run relevant regression tests
7. summarize change
8. open PR

A plan azonban nem maga az igazság.

A plan egy execution hypothesis arról, hogyan juthatunk el a célhoz. Az environment új observationjei felülírhatják.

Goal vs plan vs state

Érdemes három külön fogalomként kezelni:

Goal
  = mit akarunk elérni

Plan
  = jelenlegi elképzelés arról, milyen lépéseken keresztül érjük el

Execution State
  = mi történt ténylegesen eddig és mi a jelenlegi állapot

Például:

Goal:
production incident root cause identified

Plan:
1. query error rate
2. inspect recent deployment
3. inspect logs

State:
step 1 complete
error rate elevated
no deployment in last 24h

A plan 2. lépése ettől még létezhet, de az observation alapján lehet, hogy már nem releváns.

Ezért:

plan ≠ canonical state

A runtime state legyen authoritative; a plan módosítható artifact.

Plan-first vs reactive execution

Plan-first

A runtime a végrehajtás előtt explicit tervet készít.

Goal
 ↓
Create plan
 ↓
Execute step 1
 ↓
Execute step 2
 ↓
...

Hasznos lehet, ha:

  • több jól elkülöníthető subtask van,
  • vannak dependencyk,
  • hosszabb futás várható,
  • approvalhoz előre látni kell a tervezett műveleteket,
  • költséges vagy kockázatos lépések vannak,
  • a progresszt a usernek is mutatni akarjuk.

Gyenge pontja, hogy a terv könnyen stale lesz.

Reactive execution

A modell mindig csak a következő lépést választja a jelenlegi observation alapján.

Goal + current state
       ↓
choose next action
       ↓
new state
       ↓
choose next action

Jó lehet rövid, bizonytalan vagy gyorsan változó environmentben.

Például incident diagnosisnál előre nem biztos, hogy tudjuk, melyik logot kell majd olvasni.

Short-horizon planning

Gyakran ez a legjobb kompromisszum.

plan next 2–4 meaningful steps
        ↓
execute
        ↓
observe
        ↓
revise local plan

Nem próbálunk húsz lépéssel előre jósolni, amikor a 3. observation úgyis megváltoztathatja az egész irányt.

Task decomposition

Egy nagy cél gyakran jobb, ha kisebb subgoalokra bontjuk.

Például:

Goal:
Prepare a safe production release.

Subgoals:
├── validate build
├── evaluate test state
├── inspect release risk
├── prepare deployment plan
└── obtain approval

A jó subtask általában:

  • világos responsibilityvel rendelkezik,
  • van megfigyelhető completion conditionje,
  • lehetőleg kevéssé függ rejtett implicit state-től,
  • eredménye más lépések számára strukturáltan felhasználható.

Gyenge decomposition:

1. think about release
2. think more
3. decide what to do

Jobb:

1. read CI result
2. identify failed required checks
3. inspect release diff risk
4. return release-readiness assessment

Mikor ne bontsunk tovább?

A túlzott decomposition maga is overhead.

Például:

Goal: read current deployment version

nem kell:

1. decide to read deployment
2. find deployment tool
3. call deployment tool
4. inspect response
5. extract version

Ha a capability már jól definiált tool vagy skill, használjuk azt atomic stepként.

A decomposition boundary sokszor ott van, ahol már van stabil reusable capability.

Dependency graph

Nem minden plan egyszerű lista.

Például:

        build
       /     \
  unit tests  static analysis
       \     /
      package
         ↓
      approval
         ↓
      deploy

Ez inkább DAG, mint lineáris checklist.

Hasznos representation:

{
  "steps": [
    {"id": "build", "depends_on": []},
    {"id": "tests", "depends_on": ["build"]},
    {"id": "scan", "depends_on": ["build"]},
    {"id": "deploy", "depends_on": ["tests", "scan", "approval"]}
  ]
}

Itt a runtime determinisztikusan tudja, melyik step válik eligible-lé.

Nem kell az LLM-nek minden iterációban újra kitalálnia a dependency semanticsot.

Plan mint typed artifact

Production rendszerben a plan jobb, ha nem csak szabad szöveg.

Például:

{
  "goal": "Fix failing payment test",
  "steps": [
    {
      "id": "inspect_test",
      "description": "Read failing test and failure output",
      "status": "PENDING",
      "depends_on": []
    },
    {
      "id": "inspect_code",
      "description": "Read relevant payment implementation",
      "status": "PENDING",
      "depends_on": ["inspect_test"]
    }
  ]
}

A runtime így tud:

  • progresszt tárolni,
  • checkpointolni,
  • resume-olni,
  • dependencyt ellenőrizni,
  • auditálni,
  • plan diffet mutatni.

Plan generation vs plan validation

A modell generálhat tervet, de a runtime validálhatja.

Például:

Model proposes:
1. inspect production DB
2. delete suspicious row
3. restart service

A runtime policy:

production DB write → forbidden
restart production service → approval required

Tehát:

LLM plan proposal
      ↓
policy / capability validation
      ↓
accepted executable plan

A plan nem kerülheti meg a tool authorizationt.

Replanning

Replanning akkor kell, amikor új observation miatt a jelenlegi terv már nem megfelelő.

Tipikus trigger:

Assumption invalidated

Plan assumes recent deployment caused incident.
Observation: no deployment happened.

→ új diagnosztikai irány.

Step impossible

Required repository is unavailable.

→ fallback vagy human escalation.

Goal changed

User: "Don't fix it yet, only explain the cause."

→ a mutation lépések kiesnek.

Better path discovered

A single failing config value explains all symptoms.

→ a maradék exploratory lépések elhagyhatók.

Replanning ne jelentse az egész plan újragenerálását mindig

Gyenge pattern:

every observation
      ↓
regenerate entire 20-step plan

Ez:

  • drága,
  • instabil,
  • nehezen auditálható,
  • fölöslegesen változtat már jól működő részeken.

Jobb lehet local repair:

step 4 failed
 ↓
replace step 4 with 4a + 4b
 ↓
keep unaffected steps

Plan fixation

A másik véglet, amikor a runtime túl mereven ragaszkodik a tervhez.

Plan says: query deployment logs
Observation says: service never deployed
Runtime: query deployment logs anyway

Ez plan fixation.

A tervet mindig a current environment evidence fényében kell értelmezni.

Coding agent példa

User:

Fix the flaky retry test.

Első plan:

1. run failing test repeatedly
2. inspect test code
3. inspect retry implementation
4. identify race/timing dependency
5. patch
6. rerun repeated test
7. run related suite

Observation step 1 után:

Failure only occurs with parallel test execution.

Replan:

1. inspect shared mutable test fixture
2. inspect test isolation
3. patch fixture lifecycle
4. rerun parallel suite

A jó loop nem azért „intelligens”, mert előre mindent tudott, hanem mert evidence alapján képes volt tervet változtatni.

Deterministic workflow vs model-generated plan

Ha a folyamat ismert:

validate → approval → deploy → verify

ne kérjük minden futásnál az LLM-et, hogy találja ki ezt újra.

Ez workflow.

A modellen belüli agentic planning inkább ott értékes, ahol:

  • a következő lépés nem ismert előre,
  • semantic investigation kell,
  • environment feedback változtatja az irányt.

Jó hibrid:

Deterministic release workflow
        │
        ├── build
        ├── tests
        ├── agentic risk-analysis island
        ├── approval
        └── deploy

Anti-pattern: plan mint chain-of-thought adatbázis

A runtimenak nincs szüksége arra, hogy hosszú, belső gondolatmenetet tároljon „plan” címén.

Tároljuk inkább azt, ami operationally hasznos:

- explicit goal
- planned step
- dependency
- status
- evidence
- decision rationale röviden, ha audit kell

Nem kell a végrehajtás reprodukálhatóságát rejtett reasoning transcriptre építeni.

Takeaways

  • A goal, plan és canonical execution state három külön artifact.
  • A plan egy módosítható execution hypothesis, nem authoritative truth.
  • Stabil, ismert folyamatnál deterministic workflow jobb, mint újragenerált agent plan.
  • Bizonytalan környezetben a short-horizon planning gyakran jobb, mint a hosszú upfront terv.
  • A task decomposition addig hasznos, amíg meaningful, mérhető subgoalokat hoz létre.
  • A dependencyket érdemes explicit runtime adattá tenni.
  • Új observation invalidálhatja a tervet; replanning legyen evidence-driven.
  • Kerüljük mind az over-planninget, mind a plan fixationt.
  • A runtime validálja a planben szereplő capabilityket, permissionöket és risk boundaryket.
  • A plan legyen checkpointolható, auditálható artifact, ne implicit modell-emlékezet.