How do you record state for rerunnable multi-step LLM workflows?

I am trying to understand how other developers record state once an LLM workflow becomes more than a single prompt.

For one-off exploration, chat is fine. For repeatable work, the prompt text is only part of the system. I usually want a durable record of:

  • provider/model and params
  • system/task text
  • input files or upstream outputs
  • constraints
  • generated artifacts
  • verifier results
  • why the next step ran

I am experimenting with a small syntax for this called ICC DSL (Intent-Cell Coding). The idea is a local-first notebook where each step keeps readable task text together with execution details.

Tiny example:

c1 Draft
> auto
< tokens <= 50000
@file -markdown draft.md

c2 Review
> fast
%from c1
@file -json review.json

c3 Final
> best
%from c1
%from c2
@file -markdown final.md

The tricky part is file/context identity. A path like docs/spec.md is not enough for a true rerun unless the run also records the exact version, hash, or snapshot used.

For people building multi-step AI apps: where do you keep this state today?

App DB, traces/logs, notebooks, YAML/config, orchestration code, or something else?