# AotCheckpointing sample
Demonstrates JSON checkpointing of a declarative workflow under
reflection-disabled `System.Text.Json` -- the same constraint imposed by
**AOT / trim-aggressive deployments**.
## What it shows
- A 3-action declarative workflow
(`SetVariable` -> `InvokeAzureAgent` -> `SendActivity`) checkpointed
after every superstep.
- The csproj sets
`false`.
Every JSON operation must resolve type info via a source-gen
`JsonSerializerContext` or fail with
`InvalidOperationException: No JSON type info is available for type 'X'`.
- The experimental
[`DeclarativeWorkflowJsonOptions.Default`](../../../../src/Microsoft.Agents.AI.Workflows.Declarative/DeclarativeWorkflowJsonOptions.cs)
`JsonSerializerOptions` instance covers every declarative-package
type that flows through the checkpoint pipeline. Pass it to
`CheckpointManager.CreateJson`.
- JSON round-trip is verified in two phases:
1. Run + drain -- every `[checkpoint x]` line is a successful JSON **write**.
2. `ResumeStreamingAsync` on a fresh workflow instance -- a clean
return is the proof JSON **reads** round-trip too. The resumed run
is disposed immediately; without a pending external request it
would park in `WaitForInputAsync` indefinitely.
`DeclarativeWorkflowJsonOptions` is marked
`[Experimental("MAAI001")]`. Suppress that diagnostic in your csproj to
use it.
### Registering user-defined types
For workflows whose inputs or custom `ActionExecutorResult.Result`
payloads are user-defined, clone `Default` and append your own resolver:
```csharp
JsonSerializerOptions options = new(DeclarativeWorkflowJsonOptions.Default);
options.TypeInfoResolverChain.Add(MyAppJsonContext.Default);
options.MakeReadOnly();
CheckpointManager manager = CheckpointManager.CreateJson(store, options);
```
## Run
Prerequisites:
- Azure Foundry project with a deployed model.
- `az login`.
- Configuration (user secrets or env):
| Setting | Description |
| --- | --- |
| `AZURE_AI_PROJECT_ENDPOINT` | Foundry project endpoint URL. |
| `AZURE_AI_MODEL_DEPLOYMENT_NAME` | Model deployment name. |
See the [parent README](../README.md) for the full walkthrough.
```sh
cd dotnet/samples/03-workflows/Declarative/AotCheckpointing
dotnet run "Hello, my name is Ada."
```
Expected output:
1. `[checkpoint x]` lines after each superstep.
2. The agent's streamed response.
3. `ACTIVITY: [Sample] Workflow completed. ...`
4. `WORKFLOW: Verifying read path by resuming from checkpoint `
5. `WORKFLOW: Checkpoint deserialized successfully`
6. `WORKFLOW: Done!`
The `chk-*/` checkpoint folder is deleted at the end.
## Observe the failure mode
Drop the options argument:
```csharp
CheckpointManager checkpointManager = CheckpointManager.CreateJson(store, DeclarativeWorkflowJsonOptions.Default);
```
becomes
```csharp
CheckpointManager checkpointManager = CheckpointManager.CreateJson(store);
```
Clean rebuild, then re-run. Expected on the first checkpoint commit:
```
System.InvalidOperationException: No JSON type info is available for type
'Microsoft.Agents.AI.Workflows.Declarative.Kit.ActionExecutorResult'.
```
This is what `dotnet publish -p:PublishAot=true` would surface at runtime.
## Notes
- `PublishAot=true` is **not** set. The
`JsonSerializerIsReflectionEnabledByDefault=false` flag is the
minimum constraint that reproduces the AOT failure for JSON
checkpointing.
- JSON code paths inside transitive dependencies (e.g. Foundry SDK)
that rely on reflection would also fail under this flag; those are
outside the workflow framework's responsibility.