Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
cfdd5ba
Approve from the CLI in the leads demo, and print commands that run
arjunvlama Sep 7, 2026
728ea94
Replace the leads demo with examples that run
arjunvlama Sep 7, 2026
d6ca6cd
Say the examples need Charter's interpreter, not just its CLI
arjunvlama Sep 7, 2026
914560d
Serve the examples' MCP server over HTTP
arjunvlama Sep 7, 2026
66e9382
Call the example server what it is
arjunvlama Sep 7, 2026
39b6cf4
Leave the playground's tool names alone
arjunvlama Sep 7, 2026
44e54f7
Stop offering deleted instances to pick from
arjunvlama Sep 8, 2026
27dc334
Run a task without a checkout
arjunvlama Sep 8, 2026
a03281a
Let the approver's reason change the refund
arjunvlama Sep 8, 2026
f1ffa9c
Say what the example config is, not why
arjunvlama Sep 8, 2026
9bbbf69
Show rules as fields, not sentences
arjunvlama Sep 8, 2026
9c78f34
Size the example's windows so its rules can fire
arjunvlama Sep 8, 2026
ce97fdc
Make the rejection rule span runs
arjunvlama Sep 8, 2026
4ed5285
Show both lifecycle actions, one per example
arjunvlama Sep 8, 2026
e9e3a34
Stop restating the table under it
arjunvlama Sep 8, 2026
74e9699
Say what window means
arjunvlama Sep 8, 2026
554a3a1
Describe window as the lookback it is
arjunvlama Sep 8, 2026
c3cdd49
Name the config block after the fields it shows
arjunvlama Sep 9, 2026
739740b
Show everything the control plane holds
arjunvlama Sep 9, 2026
2b5cb87
Stop collapsing states that need different acts
arjunvlama Sep 9, 2026
55336c1
Ask the refund's reason for evidence
arjunvlama Sep 9, 2026
6408b67
Stop repeating the call above the fields that carry it
arjunvlama Sep 9, 2026
896167a
Give each argument of a gated call its own row
arjunvlama Sep 9, 2026
c146ab1
Ask the agent why, on any tool that stops for a human
arjunvlama Sep 9, 2026
80ce0b5
Let a tool opt out of being asked to justify itself
arjunvlama Sep 9, 2026
c7a468c
Say it plainly in the examples README
arjunvlama Sep 9, 2026
1af9ce9
Drop the closing explanation from the refund section
arjunvlama Sep 9, 2026
f966ea0
Say when a lifecycle rule is evaluated
arjunvlama Sep 9, 2026
d524944
List the tickets, and say how to reach four rejections
arjunvlama Sep 9, 2026
23583a4
Stop promising what the agent will decide
arjunvlama Sep 9, 2026
e30778a
Just give the ticket ids
arjunvlama Sep 9, 2026
735c78d
Version the prompt, which is what people actually roll back
arjunvlama Sep 9, 2026
3afb488
Say what the rollback is for, not what the prompt does
arjunvlama Sep 9, 2026
bddedf0
Drop the gating aside from the rollback section
arjunvlama Sep 9, 2026
73e6e8c
Cap how many times one task may ask a person
arjunvlama Sep 9, 2026
9cfab86
Cap proposals at three so the pause always spans runs
arjunvlama Sep 9, 2026
8b155d5
Stop the console showing the justification twice
arjunvlama Sep 9, 2026
8fdc646
Put the console where the first decision happens, and restore charter…
arjunvlama Sep 9, 2026
2afc52e
Open the console once and refer back to it
arjunvlama Sep 9, 2026
164814e
Read the gate's justification from the approval, not the arguments
arjunvlama Sep 9, 2026
5fed8a6
Pin the floor to the BoundFlow anyone tests
arjunvlama Sep 9, 2026
62c78b3
Show what is inside the custom policy
arjunvlama Sep 9, 2026
0ba1229
Ship the proposal ceiling in policy rather than the local file
arjunvlama Sep 9, 2026
995660a
Read runtime policy from the control plane on every worker
arjunvlama Sep 9, 2026
bed0a94
Stop the worker reading policy files at all
arjunvlama Sep 9, 2026
7a76fb6
Read `custom` policy off the wire as well as off the compiler
arjunvlama Sep 9, 2026
51a46dc
Cover a lifecycle rule firing, and stop pointing at the deleted demo
arjunvlama Sep 10, 2026
f124a4b
Make the refund example's pause rule reachable
arjunvlama Sep 10, 2026
9e097cb
Show --actor wherever an approval is answered
arjunvlama Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,10 @@ plane — which is what makes them different from `store.url`, holding the check
and files a parked task resumes from.

At boot the worker loads each listed config version and calls
`worker.workflow(agent, version=N)` once per version. There is one operation —
`worker.workflow(agent, version=N)` once per version. It reads only what the agent
is — `v<N>.yaml` and its skills. `runtime.yaml` and `lifecycle.yaml` are policy,
applied rather than served, and the caps come back from the control plane, so the
same numbers hold whether the worker was given a checkout or a pulled artifact. There is one operation —
the entry handler — re-entered after every park. `serves` is what makes a worker fleet-manageable: which process can run
which agent is declarative, so you can shard agents across workers, or run a
canary worker holding only `v2` while the fleet stays on `v1`.
Expand Down Expand Up @@ -434,6 +437,13 @@ tools:
trace.
- **`always`** — the call is intercepted and parks, every time.

A gated tool also gains a required `justification` argument, which the model fills
and Charter strips before calling the server. It becomes the gate's
`justification`, which is the only field a notification carries. The harness
supplies no reasoning of its own, so without it an approver sees the call and
nothing else. `justify: false` on a tool turns it off, for a call whose arguments
already say everything.

Set every tool to `never`, omit `gate`, and omit `ask_human`, and
you have a fully autonomous agent that never asks anyone anything. It is still
governed: per-task budget, tool limits, the full audit trail, and lifecycle rules
Expand Down Expand Up @@ -678,6 +688,9 @@ exactly one of `pause: {window}`, `cooldown: {window, seconds}`, or
`set_version: {target}`. A `set_version` target must exist on disk *and* appear in
`serves[].versions` for every worker running the agent.

`set_version` takes no window: it compares totals for the version now running,
which reset when the version changes.

### Worker — `worker.yaml`

Not versioned. Every secret is an `${ENV_VAR}` reference, never a literal.
Expand Down Expand Up @@ -735,8 +748,8 @@ break Charter's invariants outright:
| `charter status <task-id>` | result, cost, tools called, approvals, why it stopped |
| `charter audit <agent> --instance <id>` | every governance decision recorded |
| `charter pending <agent> --instance <id>` | the open approval or input gate |
| `charter approve <id> [--reason]` | resolve to workflow + approval id, decide |
| `charter reject <id> [--reason]` | same |
| `charter approve <id> [--actor] [--reason]` | resolve to workflow + approval id, decide |
| `charter reject <id> [--actor] [--reason]` | same |
| `charter answer <id> <text>` | respond to an `ask_human` gate |
| `charter pause <agent> --instance <id> [--now]` | hold it; prints the suspension id |
| `charter resume <agent> --instance <id> --suspension <id>` | release that hold |
Expand Down
11 changes: 5 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ export ANTHROPIC_API_KEY=<your model key> # or another provider's, see worker.
```

Remove it with `docker compose -f local.compose.yml down -v`. Cloning the repo
works too, and gets you the examples and the demo alongside it.
works too, and gets you the examples alongside it.

For production you have two options. Run the BoundFlow backend yourself, following
its [deployment docs](https://github.com/boundflow/boundflow/blob/main/docs/deployment.md).
Expand Down Expand Up @@ -197,7 +197,7 @@ Charter stops the task and shows a person the call it wants to make and the
reasoning behind it:

```bash
charter approve apr_01J8Z --reason "third dispute this month"
charter approve apr_01J8Z --actor dana --reason "third dispute this month"
```

Nothing waits in your terminal. The task ends at the gate and resumes when someone
Expand Down Expand Up @@ -288,10 +288,9 @@ through their workers and the control plane whether or not the CLI is installed.

- [DESIGN.md](DESIGN.md): every field of every file, and the decisions behind them
- [deploy/](deploy/): running workers as containers, and a control plane locally
- [examples/](examples/): fuller configurations, for reading. They name real
Zendesk and Stripe servers, so they do not run as-is
- [demo/leads/](demo/leads/): an agent that runs end to end against a local MCP
server, where you play the people it contacts
- [examples/](examples/): two agents over a toy support system. One gates a refund
and pauses itself when too many are turned down, the other rolls itself back to
an earlier version. They run with nothing but a model key

## Development

Expand Down
Loading
Loading