Kihagyás

Execution State and Scratchpad

Mi az execution state?

Egy agentic run közben folyamatosan változik a rendszer állapota:

current goal
current step
completed steps
pending work
observations
artifacts
budget usage
approvals
errors

Ha ezt csak a modell conversation contextjére bízzuk, a runtime törékennyé válik.

A fontos mental model:

A model context egy aktuális view. A canonical execution state az application runtime tulajdona.

Canonical Run State
        ↓ projection
Model Context
        ↓
LLM decision
        ↓ validated transition
Canonical Run State

State vs context vs scratchpad vs memory

Ezeket érdemes különválasztani.

Execution state

A run authoritative operational állapota.

Például:

{
  "run_id": "run-1842",
  "status": "RUNNING",
  "goal": "Fix failing payment test",
  "current_step": "run_regression_tests",
  "completed_steps": ["inspect_failure", "patch_code"],
  "tool_calls_used": 7,
  "cost_used_usd": 0.84
}

Context

Az az információ, amit az adott model callhoz kiválasztunk.

relevant goal
+ current state summary
+ latest observations
+ allowed tools
+ relevant code/docs

Nem kell a teljes state minden mezőjét minden hívásban a modell elé tenni.

Scratchpad

Rövid életű working artifactok vagy explicit intermediate notes.

Példák:

suspected root causes
candidate files
current hypothesis
temporary comparison table

A scratchpad lehet runtime-managed, de nem kell authoritative domain state-nek tekinteni.

Memory

A current runon túl is fennmaradó információ.

Például:

user preference
previous incident lesson
repository convention
long-term project fact

Ez már külön memory architecture kérdés.

execution state = this run
memory          = beyond this run

Mi legyen canonical?

Általában az, amire a runtime hard controlt épít.

Például:

  • run status,
  • goal és success criteria,
  • iteration counter,
  • budget usage,
  • completed/pending step,
  • tool call result reference,
  • approval state,
  • side-effect idempotency key,
  • checkpoint version.

Ne a modell szabad szövegéből próbáljuk visszafejteni:

"I think I already ran the tests earlier."

Jobb:

{
  "test_execution": {
    "id": "test-781",
    "suite": "payment-regression",
    "status": "PASSED",
    "completed_at": "..."
  }
}

State machine mental model

Egy run felfogható state machine-ként.

Például:

CREATED
  ↓
RUNNING
  ├──→ WAITING_FOR_HUMAN
  ├──→ WAITING_FOR_EXTERNAL_EVENT
  ├──→ FAILED
  ├──→ CANCELLED
  └──→ COMPLETED

A transitiont kiválthatja:

  • model decision,
  • tool result,
  • deterministic rule,
  • user input,
  • timeout,
  • external event.

De a transition végrehajtása a runtime feladata.

LLM proposes: STOP_SUCCESS
        ↓
runtime checks success contract
        ↓
COMPLETED or continue

Egy lehetséges RunState

Konceptuálisan:

{
  "run_id": "run-1842",
  "status": "RUNNING",
  "goal": {
    "description": "Fix flaky retry test",
    "success_conditions": [
      "targeted test passes 20 consecutive runs",
      "related regression suite passes"
    ]
  },
  "plan": {
    "version": 3,
    "steps": []
  },
  "observations": [],
  "artifacts": [],
  "approvals": [],
  "budget": {
    "iterations": 6,
    "tool_calls": 11,
    "cost_usd": 1.18
  },
  "version": 27
}

A konkrét schema rendszerfüggő, de a lényeg az explicit state ownership.

State projection a model contextbe

A teljes state lehet nagy és zajos.

Ezért legyen külön lépés:

Canonical state
     ↓
Context Builder
     ↓
Relevant state projection
     ↓
LLM

Például a modellnek elég lehet:

Goal: fix flaky retry test
Current step: verify patch
Latest observation: target test passed 10/10
Remaining success criterion: related regression suite not yet run
Budget: 4 iterations remaining

Nem kell elé adni az összes korábbi API response-t.

Ez ugyanaz a context engineering elv, csak runtime state-re alkalmazva.

Observations ne vesszenek el chat textben

Tool result:

{
  "suite": "payment-regression",
  "passed": 418,
  "failed": 1,
  "failure": "RefundRetryTest"
}

Tárolhatjuk normalizált observationként:

{
  "type": "TEST_RESULT",
  "source": "test_runner",
  "timestamp": "...",
  "data": {
    "suite": "payment-regression",
    "failed_tests": ["RefundRetryTest"]
  }
}

A conversation transcript lehet audit/debug artifact, de ne az legyen az egyetlen state store.

Intermediate artifacts

Sok agentic task közben keletkeznek artifactok:

  • patch,
  • generated file,
  • query result,
  • report draft,
  • candidate plan,
  • test log,
  • screenshot,
  • deployment manifest.

Ezeket jobb reference-ként tárolni:

{
  "artifact_id": "artifact-92",
  "type": "PATCH",
  "location": "object://runs/run-1842/patch.diff",
  "sha256": "..."
}

mint minden iterációban teljes egészében visszatolni contextbe.

Checkpoint

Hosszabb runoknál fontos, hogy ne csak process memoryban éljen a state.

step completes
     ↓
state transition
     ↓
persist checkpoint
     ↓
next step

Ha megszakad:

worker dies
network fails
process restarts

akkor:

load checkpoint
 ↓
revalidate environment
 ↓
resume

Nem:

read old chat transcript
 ↓
ask model what probably happened

Resume nem egyszerű continue

A checkpoint lehet korrekt, miközben az environment közben megváltozott.

Példa:

checkpoint:
PR #184 is open

30 minutes later:
PR was merged by a human

Resume előtt friss observation kell.

restore internal state
      +
refresh external preconditions
      ↓
continue / replan / stop

State versioning és concurrency

Ha egyszerre több worker vagy event próbál state-et frissíteni, race condition keletkezhet.

Például:

worker A reads version 27
worker B reads version 27
A writes version 28
B also writes based on stale version 27

Hasznos technikák:

  • optimistic locking,
  • compare-and-swap version,
  • single-writer orchestration,
  • transactional update,
  • event ordering.

Példa:

UPDATE run
SET state=?, version=28
WHERE run_id=? AND version=27

Ha 0 row módosul, újra kell olvasni a state-et.

Az agentic runtime ugyanúgy concurrency problemekkel találkozik, mint bármely distributed application.

Event log vs snapshot

Két gyakori representation.

Snapshot

current state object

Egyszerű olvasni.

Event log

RUN_CREATED
TOOL_CALLED
TOOL_SUCCEEDED
PLAN_REVISED
APPROVAL_REQUESTED
APPROVAL_GRANTED
RUN_COMPLETED

Jó audit/debug célra.

Gyakran a kettő együtt a legpraktikusabb:

append events
    ↓
maintain current snapshot

Nem feltétlen kell full event sourcing, ha nincs rá valódi szükség.

Scratchpad mint explicit working state

Egy scratchpad lehet például:

{
  "hypotheses": [
    {"text": "shared fixture race", "status": "LIKELY"},
    {"text": "retry timer bug", "status": "REJECTED"}
  ],
  "files_to_inspect": ["RetryService.java", "RefundRetryTest.java"]
}

Ez hasznosabb, mint egy hosszú prose reasoning history.

A runtimenak operationally releváns intermediate conclusions, evidence és pending questions kellenek; nem szükséges belső reasoning transcriptet canonical state-ként tárolni.

Derived state vs source state

Például:

raw observations:
- error rate 12%
- deployment 5 minutes ago

hypothesis:
- deployment likely caused regression

A kettőt külön jelöljük.

FACT / OBSERVATION
vs
HYPOTHESIS / DERIVED

Ez csökkenti annak esélyét, hogy egy korábbi model assumption később „tényként” kerüljön vissza contextbe.

State cleanup és retention

Nem minden run state-et kell örökké megtartani.

Lehet külön retention:

run metadata: 90 days
sensitive tool payload: 7 days
large artifacts: 30 days
aggregated metrics: longer

Security/privacy és cost szempontból is fontos.

Anti-pattern: chat history mint adatbázis

Gyenge:

messages[]

és minden fontos állapot csak valahol prose formában szerepel.

Problémák:

  • nehéz determinisztikusan query-zni,
  • nehéz resume-olni,
  • stale információ marad bent,
  • context window növekszik,
  • nehéz concurrencyt kezelni,
  • implicit state-et hoz létre.

Jobb:

structured canonical state
+ event/trace history
+ selected context projection

Anti-pattern: minden observation bemásolása a következő promptba

Egy 50 lépéses loop végére ez token- és noise-explosion.

Jobb:

persist full evidence externally
        ↓
select / summarize / reference relevant evidence
        ↓
current model call

Takeaways

  • A canonical execution state runtime-owned, nem model-owned.
  • A model context csak a state aktuális, releváns projectionje.
  • State, context, scratchpad és long-term memory külön fogalom.
  • Run status, budget, approvals, completed steps és side-effect metadata legyen explicit strukturált state.
  • Checkpoint/resume hosszabb vagy asynchronous runoknál alapvető reliability capability.
  • Resume után az external environmentet újra kell validálni.
  • Concurrency és state versioning normál software-engineering probléma itt is.
  • Observationt és hypothesis-t külön reprezentáljuk.
  • Artifactokat reference-ként tároljuk, ne minden körben teljes payloadként.
  • Chat history hasznos trace lehet, de rossz canonical state store.