A Plan Is Not a Commitment — Model Goals, Commitments and Executable Work
An agent says:
I will deploy the release after the migration check passes.
What exactly just happened?
Did the agent merely describe a possible future?
Did it reserve a deployment slot?
Did it tell another service to prepare capacity?
Did it promise a human that the deployment would happen?
Did it create a task in a queue?
Did it acquire a lock?
Did it actually start the deployment?
Those are not the same thing.
Yet many agent systems represent all of them as some variation of:
plan step = deploy release
That becomes dangerous as soon as agents operate for more than a few seconds.
A plan may be abandoned.
A commitment may need to be discharged.
A queued task may be retried.
An external reservation may need to be released.
An irreversible action may need reconciliation rather than cancellation.
If the architecture treats all of those as ordinary plan nodes, replanning becomes a source of hidden side effects.
Step 37 introduced versioned intent, supersession and cancellation.
That answered an important question:
Is the system still pursuing the current objective?
But intent alone is not enough.
A long-running autonomous system needs another distinction:
What has the system merely considered, and what has it actually committed itself or others to?
The core rule for this post is:
A plan describes possible future work. A commitment creates an obligation or dependency that must be explicitly satisfied, released, transferred or reconciled.
This distinction turns out to affect planning, retries, cancellation, scheduling, human review, multi-agent coordination and incident recovery.
The Search Problem: “How Should AI Agents Manage Goals and Commitments?”
Most agent planning examples have a shape like this:
Goal
↓
Plan
↓
Step 1
Step 2
Step 3
That is useful for explaining planning.
It is incomplete for production systems.
The problem is that the nodes do not all have the same semantics.
Consider this plan:
Goal: deploy release 4.2
1. inspect repository
2. run migration check
3. reserve deployment window
4. notify operations
5. deploy release
6. verify service health
Step 1 is mostly observation.
Step 2 is execution with local consequences.
Step 3 may reserve scarce shared capacity.
Step 4 creates an expectation for another person.
Step 5 changes production.
Step 6 observes whether that change worked.
Calling all six items “tasks” erases information the runtime needs.
The architecture needs to know:
Which items can be discarded?
Which items must be released?
Which items create external obligations?
Which items can be transferred to another worker?
Which items survive replanning?
Which items require reconciliation after cancellation?
Which items already changed the world?
That is why we need a richer model.
Five Different Things
A useful hierarchy is:
intent
↓
goal
↓
subgoal
↓
commitment
↓
task
↓
action
These are related.
They are not interchangeable.
Intent
Intent answers:
What outcome does the principal currently want?
Step 37 made intent versioned and authoritative.
Example:
intent_id = release-production
version = 7
objective = deploy version 4.2 safely
Goal
A goal is a desired state that supports the intent.
production is running version 4.2
A goal describes what should become true.
It does not necessarily say how.
Subgoal
A subgoal is a decomposed desired state.
migration compatibility established
release artifact verified
production capacity available
Subgoals help structure planning.
Commitment
A commitment is different.
It records that the system has crossed a boundary where some obligation now exists.
Examples:
capacity reserved until 15:30
reviewer requested and awaiting response
customer notification scheduled
maintenance window announced
exclusive lock acquired
external job submitted
payment authorized
A commitment may exist before the final action occurs.
And critically:
A commitment may survive the plan that created it.
Task
A task is executable work assigned or ready to be assigned.
run migration compatibility test
Tasks may be retried, rescheduled, transferred or cancelled depending on their state.
Action
An action is an individual execution attempt or operation.
invoke migration-check tool with repository SHA abc123
Actions are where idempotency, side effects, tool results and postconditions become concrete.
Why a Plan Is Not a Commitment
Suppose the planner emits:
1. inspect schema
2. reserve deployment window
3. run migration
4. deploy
Before step 2 executes, that plan can usually be thrown away.
After the reservation succeeds, something changed.
Another team may now be waiting.
Capacity may be unavailable to another deployment.
A timed resource may be held.
The system has created an obligation.
That means replanning cannot simply produce:
new plan:
1. do something else
and forget the reservation.
The old plan is disposable.
The old commitment is not.
This gives us the first important invariant:
plan deletion
MUST NOT imply
commitment deletion
A commitment needs an explicit lifecycle transition.
The Commitment Ledger
A production agent should have a durable commitment ledger.
For example:
from dataclasses import dataclass
from datetime import datetime
from enum import Enum
class CommitmentStatus(str, Enum):
PROPOSED = "proposed"
ACTIVE = "active"
SATISFIED = "satisfied"
RELEASE_PENDING = "release_pending"
RELEASED = "released"
TRANSFER_PENDING = "transfer_pending"
TRANSFERRED = "transferred"
BREACHED = "breached"
RECONCILIATION_REQUIRED = "reconciliation_required"
UNKNOWN = "unknown"
@dataclass(frozen=True)
class Commitment:
commitment_id: str
intent_id: str
intent_version: int
goal_id: str
owner_id: str
status: CommitmentStatus
obligation_type: str
resource_refs: tuple[str, ...]
counterparty_refs: tuple[str, ...]
created_at: datetime
due_at: datetime | None
release_operation_id: str | None
evidence_refs: tuple[str, ...]
The exact schema will vary.
The key is the semantics.
The ledger says:
what obligation exists
why it exists
who owns it
which intent created it
what external objects it touches
when it expires
how it can be satisfied or released
what evidence proves the lifecycle transition
That is much stronger than storing a sentence in agent memory saying:
remember: we reserved deployment capacity
Commitments Must Be Authoritative State
The model may reason about commitments.
It should not be the authority on whether they exist.
Bad architecture:
if "reservation complete" in agent_memory:
reserved = True
Better:
reservation = reservation_store.get(reservation_id)
if reservation.status == "ACTIVE":
...
This follows the same principle we have used throughout the series:
When the system already has an authoritative state source, query it instead of asking the model to infer the state.
A commitment ledger therefore belongs in the control plane.
Proposed Commitments vs Active Commitments
It is useful to distinguish:
PROPOSED
from:
ACTIVE
A planner can propose:
reserve GPU capacity for 30 minutes
without actually reserving anything.
That proposal may be scored, compared, rejected or revised.
Only after the external reservation operation succeeds should the commitment become ACTIVE.
The transition might look like:
PROPOSED
↓
execute reservation operation
↓
verify reservation exists
↓
ACTIVE
This prevents a common agent mistake:
model says it will do something
↓
system behaves as though it already happened
Planning language is not evidence of commitment creation.
Commitments Need Evidence
Every important commitment should be backed by evidence.
For a deployment reservation:
commitment_id
reservation_id
provider response
resource identity
start time
expiry time
verification observation
For a human review request:
review request ID
reviewer identity or routing group
submitted artifact hash
submitted intent version
expiry
For an external job:
job ID
idempotency key
submitted payload hash
current remote status
This means commitment state can participate in replay and incident forensics.
We can answer:
Why did the agent think this obligation existed?
Was it actually created?
Was it later released?
Which intent version created it?
Was the release verified?
Commitment Creation Is a Side Effect
This sounds obvious.
Architecturally, it matters.
If the agent reserves a deployment slot, schedules an email, creates a ticket, acquires a lock or submits a job, it has already changed the world.
That operation should therefore have the same safeguards as other consequential tool calls:
current intent
current state
valid authority
idempotency
ownership
fresh approval if required
commit operation
postcondition verification
A commitment is not “just metadata.”
It can consume resources or create expectations.
Commitment Scope
Commitments should be scoped.
Suppose an intent contains three goals:
G1: update backend
G2: update frontend
G3: publish release notes
A deployment reservation may belong only to G1.
A documentation-review request may belong only to G3.
If G2 is superseded, we should not automatically release G1’s reservation.
This means the graph matters:
intent
├── G1
│ └── C1 deployment reservation
├── G2
│ └── C2 browser test session
└── G3
└── C3 reviewer request
Supersession can then invalidate only the affected subtree.
Step 37’s scoped intent invalidation becomes more precise when commitments are explicit nodes.
Goals Should Be States, Not Commands
A useful design rule is to represent goals primarily as desired states.
Instead of:
run database migration
prefer:
database schema satisfies release 4.2 requirements
Why?
Because the first phrase encodes one particular action.
The second defines a condition that may be achieved in several ways.
This makes replanning much easier.
Goal:
schema is compatible
Possible plans:
- run migration A
- run migration B
- discover migration already applied
- discover schema already compatible
The goal can survive while the plan changes.
This is another important separation:
goal identity
≠
plan identity
A Goal May Already Be Satisfied
Step 37 introduced OBJECTIVE_ALREADY_SATISFIED.
At the goal level, this becomes normal.
Before executing work, the system should ask:
Is the desired state already true?
Example:
def goal_status(goal, state_provider):
state = state_provider.observe(goal.state_scope)
return goal.acceptance_predicate(state)
This is another reason goals need external acceptance criteria.
If a goal has no observable completion condition, the runtime cannot reliably know whether it is done.
Goal Acceptance Criteria
A goal can be represented with explicit acceptance evidence.
@dataclass(frozen=True)
class Goal:
goal_id: str
intent_id: str
description: str
acceptance_check: str
evidence_requirements: tuple[str, ...]
risk_class: str
For example:
Goal:
production runs release 4.2
Acceptance:
- deployment reports version 4.2
- health checks pass
- error budget remains within rollout threshold
The model may help formulate the goal.
But final acceptance should use the verifier architecture established earlier in the series.
Decomposition Creates Dependencies
Once we separate goals and subgoals, we need dependency semantics.
Consider:
G0 deploy release
├── G1 artifact verified
├── G2 migration compatible
├── G3 capacity available
└── G4 deployment executed
G4 may require G1, G2 and G3.
That is not necessarily the same as requiring them to run in sequence.
A dependency graph allows:
G1 ─┐
G2 ─┼──> G4
G3 ─┘
The runtime can parallelize independent work while preserving required preconditions.
This connects directly to Step 19’s speculative execution and Step 21’s scheduling/backpressure.
Hard Dependency vs Advisory Dependency
Not every relationship should block execution.
Useful edge types include:
REQUIRES
ENABLES
PREFERS
INVALIDATES
CONFLICTS_WITH
SATISFIES
For example:
migration verification
REQUIRES
schema snapshot
while:
performance benchmark
PREFERS
warm cache
The first is a correctness condition.
The second is a quality preference.
Collapsing both into “dependency” makes orchestration brittle.
Commitment Dependencies Are Stronger
A commitment can create dependencies in both directions.
Suppose:
C1 = maintenance window reserved
The deployment may depend on C1.
But C1 also creates an obligation:
if deployment cancelled
release reservation
That means commitments generate cleanup dependencies.
A useful graph might include:
G4 deploy release
REQUIRES C1
C1 active reservation
ON_SUPERSESSION -> release operation R1
This is the beginning of durable workflow semantics.
Commitment Lifecycle
A practical commitment lifecycle might be:
PROPOSED
↓
ACTIVE
├──> SATISFIED
├──> RELEASE_PENDING -> RELEASED
├──> TRANSFER_PENDING -> TRANSFERRED
├──> BREACHED
└──> RECONCILIATION_REQUIRED
Each transition should be explicit.
SATISFIED
The obligation was fulfilled.
Example:
reviewer completed requested review
RELEASED
The obligation no longer exists and release was verified.
Example:
reserved capacity returned
TRANSFERRED
Ownership moved to another actor or workflow.
Example:
incident response handed from autonomous workflow to human operations
BREACHED
The obligation was not met within its required conditions.
Example:
service promised response before deadline, deadline expired
RECONCILIATION_REQUIRED
The system cannot currently prove the external state.
Example:
release request timed out while cancellation was in flight
This preserves uncertainty rather than inventing a clean state.
Cancellation Does Not Erase Commitments
Suppose the user says:
cancel the deployment
Step 37 correctly invalidates future mutation authority.
But what about these existing commitments?
maintenance window reserved
reviewer waiting
deployment job submitted
customer notice scheduled
The answer cannot be:
intent cancelled -> delete everything
Instead:
intent cancelled
↓
block new dependent actions
↓
inspect active commitments
↓
for each commitment:
satisfy?
release?
transfer?
compensate?
reconcile?
This is why commitment state must outlive the plan that created it.
Cancellation Can Create New Work
This sounds paradoxical:
cancel work
↓
create more work
But it is normal.
Cancelling a deployment may require:
release reservation
cancel queued job
revoke approval token
notify reviewer
reconcile in-flight API call
restore temporary capacity setting
These are cancellation obligations.
The runtime therefore needs to distinguish:
business work
from:
cleanup / reconciliation work
Otherwise cancellation can accidentally cancel the work required to make cancellation safe.
Protected Reconciliation Work
Step 16 protected verification budgets.
Step 37 protected reconciliation budgets during cancellation.
The same principle applies here.
If cancellation exhausts all remaining execution budget, the agent may be unable to release resources it already reserved.
Therefore:
run budget
├── exploration reserve
├── verification reserve
└── reconciliation reserve
The exact proportions are workload-dependent.
The architectural rule is stronger:
Do not let optional exploration consume the resources required to discharge existing obligations.
Task State Is Not Commitment State
Suppose a task says:
cancel reservation C1
The task may succeed as a local process while the commitment remains unresolved.
For example:
cancel API returned 202 Accepted
That does not prove the reservation is gone.
So:
task complete
≠
commitment released
The system must verify authoritative external state.
This mirrors our earlier rule:
tool call succeeded
≠
real-world objective satisfied
Commitments Need Owners
Every active commitment should have a responsible owner.
That owner may be:
workflow
agent worker
human operator
external service
organizational role
But it should be explicit.
Why?
Because distributed systems fail.
Workers disappear.
Agents are cancelled.
Deployments are handed off.
If commitments are merely attached to ephemeral workers, they become orphaned.
Bad:
worker-17 owns reservation because worker-17 created it
Better:
workflow release-42 owns reservation
worker-17 currently services the obligation
This separates durable ownership from physical execution.
Servicing a Commitment vs Owning It
This is analogous to Step 35’s separation between logical run state and physical worker state.
We can say:
commitment owner
= durable accountable workflow/entity
servicing worker
= current executor responsible for progress
A worker can fail without destroying ownership.
Another worker can take over through a controlled handoff.
Commitment Transfer
Some obligations can be transferred.
Example:
autonomous incident agent
↓
human operator takes control
The transfer should be explicit:
TRANSFER_PENDING
↓
target acknowledges commitment
↓
ownership record updated
↓
source loses authority
↓
TRANSFERRED
This is very similar to lease/fencing handoff.
A commitment should not be considered transferred simply because the source sent a message saying:
your problem now
The target must accept or an authoritative control plane must assign ownership under a defined policy.
Delegation Is Not Abdication
Multi-agent systems make this especially important.
Agent A may delegate a task to Agent B.
That does not automatically transfer the original commitment.
Agent A owns commitment C1
↓
delegates task T1 to Agent B
Agent B may execute the work while A remains accountable for C1.
Alternatively, the system may explicitly transfer C1.
Those are different operations.
This distinction becomes crucial in Step 42 when we return to multi-agent coordination.
Deadlines Belong to Commitments, Not Prompts
If an obligation expires at 15:00, that deadline should not live only in natural-language context.
It belongs in durable state.
@dataclass(frozen=True)
class CommitmentDeadline:
due_at: datetime
grace_until: datetime | None
missed_action: str
escalation_policy: str
Then the workflow can reason deterministically:
if now > due_at:
commitment = BREACHED
run escalation policy
The model may interpret consequences.
It should not be responsible for remembering the clock.
Expiry Is Different From Satisfaction
A reservation may expire automatically.
That does not mean the commitment was satisfied.
Consider:
commitment:
maintain reservation until deployment completes
reservation expires before deployment
The commitment may now be breached.
So:
external resource expired
≠
obligation satisfied
Again, explicit semantics matter.
Commitments Can Be Conditional
Some commitments activate only when a condition becomes true.
Example:
if migration succeeds,
notify release channel
That can be represented as:
PENDING_CONDITION
↓
condition satisfied
↓
ACTIVE
This is preferable to storing the rule only inside a planning transcript.
Conditional commitments are one of the points where the architecture starts naturally evolving into durable workflow semantics.
Commitments Can Conflict
Suppose two agents create:
C1: reserve environment E for release A
C2: reserve environment E for destructive migration B
The runtime should be able to detect that those obligations conflict.
A commitment graph can include:
CONFLICTS_WITH
or resource-level exclusivity constraints.
This should be deterministic whenever the resource semantics are known.
Do not ask an LLM to arbitrate an exclusive lock if the platform can enforce one directly.
Resource Commitments
Many commitments are really claims over resources:
GPU capacity
browser session
repository worktree
cloud environment
maintenance window
human reviewer slot
financial budget
API quota
exclusive lock
This connects commitments directly to Step 21’s admission control and Step 16’s budgets.
The scheduler needs to know which resources are merely desired versus already committed.
Reservations Need Expiry and Reclamation
A leaked reservation is a reliability bug.
Therefore resource commitments should generally have:
owner
lease or expiry
renewal policy
release path
reconciliation path
Long-lived commitments without bounded ownership can become permanent resource leaks.
This is especially dangerous when agents create reservations faster than humans notice them.
Human Commitments Are Real Commitments
Human review systems also create obligations.
Suppose the agent escalates:
Need database approval before 14:00
That creates several stateful facts:
review requested
review packet version
reviewer group
deadline
current status
If the intent is superseded, the request should be withdrawn or marked obsolete.
Otherwise a reviewer may later approve stale work.
Step 29 already gave us approval expiry and artifact binding.
The commitment model explains why review requests themselves need lifecycle state.
Communication Can Create Commitments
This is easy to miss.
An agent that sends:
We will deploy at 15:00
has potentially created an organizational commitment even if no technical resource was reserved.
That means communication tools may need authority classes based not only on data sensitivity but on commitment semantics.
Sending an informational message:
Migration test passed.
is different from:
Deployment will happen at 15:00.
The second creates an expectation that may need release or correction.
Proposal Mode Helps
For many high-consequence systems, the safest architecture is:
agent proposes commitment
↓
human or policy approves
↓
commitment created
For example:
PROPOSED:
reserve €50,000 cloud capacity for benchmark
The agent can reason about the trade-off without having authority to create the obligation.
This is another case where reducing authority does not reduce reasoning quality.
Plans Should Reference Commitments, Not Recreate Them
Suppose a deployment reservation already exists.
A replan should produce:
use commitment C1
not:
reserve another deployment window
This avoids duplicate commitments.
The planner therefore needs access to the commitment ledger as structured state.
This also creates opportunities for idempotency and reuse.
Commitment Identity Prevents Duplication
A logical commitment may have several execution attempts.
Example:
commitment C1:
obtain deployment reservation
attempt A:
timeout
attempt B:
retry
If the first attempt actually succeeded remotely, attempt B must not create a second reservation.
So we again need:
logical commitment ID
physical attempt ID
idempotency key
Step 20 established the same distinction for distributed work.
The commitment layer carries it into goal orchestration.
Plans Must Be Allowed to Change
We do not want the commitment architecture to make planning rigid.
Quite the opposite.
A good system should allow:
same goal
same commitments
new plan
when possible.
Example:
Goal:
verify release
Commitment:
reviewer has reserved 30 minutes
Old plan:
run full benchmark then review
New plan:
run targeted regression suite then review
The commitment can remain valid if its preconditions still hold.
This is why commitment compatibility should be checked rather than assumed.
Replanning Needs a Commitment Diff
When a new plan replaces an old plan, compute:
old commitments
vs
new required commitments
Classify each existing commitment:
KEEP
RELEASE
TRANSFER
REVALIDATE
RECONCILE
For example:
class CommitmentDisposition(str, Enum):
KEEP = "keep"
RELEASE = "release"
TRANSFER = "transfer"
REVALIDATE = "revalidate"
RECONCILE = "reconcile"
That gives replanning operational semantics.
Without it, the system can silently leak obligations every time the plan changes.
Semantic Compatibility Is Not Enough
A model may judge:
old reservation probably still useful
But if the new plan changes:
environment
region
release version
time window
resource quantity
risk class
then the commitment may no longer be valid.
Use deterministic compatibility checks wherever possible.
Model-assisted interpretation should remain secondary.
Commitments Bind to Intent Versions
Every commitment should record the intent version that justified it.
Why?
Because Step 37 allows the objective to change.
If intent version 7 created:
C1 reserve production window
and version 8 changes the objective to:
do not deploy; produce a report only
then C1 becomes a stale commitment that likely needs release.
The commit gateway should also reject any new side effect justified only by obsolete commitment state.
Commitment Revalidation After Supersession
Not every old commitment becomes invalid.
Suppose intent changes from:
deploy version 4.2
to:
deploy version 4.2 after one additional test
The existing maintenance window may still be useful.
So supersession should trigger:
commitment dependency analysis
↓
KEEP / REVALIDATE / RELEASE / RECONCILE
This is the same selective invalidation principle we used for evidence and artifacts.
Tasks Are Disposable More Often Than Commitments
Tasks should usually be cheap to recreate.
run test suite
inspect logs
query API
summarize findings
If a worker disappears, the task can be retried.
If the plan changes, the task can often be cancelled.
Commitments are different because they represent durable external obligations.
This suggests different storage policies:
Tasks:
queue/workflow state
Commitments:
durable authoritative ledger
They may live in the same database.
They should not have the same semantics.
Actions Need Operation Identity
At the bottom of the hierarchy, actions are concrete attempts.
@dataclass(frozen=True)
class ActionAttempt:
operation_id: str
attempt_id: str
task_id: str
commitment_id: str | None
intent_version: int
tool_id: str
input_hash: str
started_at: datetime
This connects the commitment model directly to:
- idempotency,
- fencing,
- side-effect verification,
- replay,
- incident forensics.
The hierarchy is therefore not merely conceptual.
It gives us identifiers that link the entire trajectory.
A Complete Lineage
A consequential action should be traceable through:
intent I7
↓
goal G3
↓
commitment C9
↓
task T12
↓
operation O22
↓
attempt A31
↓
external effect E44
↓
verification V52
That is enormously useful during an incident.
Instead of asking:
Why did the agent do this?
we can query:
Which current intent justified this commitment?
Which goal did it support?
Who owned the commitment?
Which task serviced it?
Which operation caused the side effect?
Which verifier accepted the outcome?
Commitment Graphs Help Incident Forensics
Imagine an incident where production capacity remained reserved overnight.
The final visible symptom is:
unexpected resource cost
But the forensic graph may reveal:
intent superseded
↓
old plan invalidated
↓
reservation commitment remained ACTIVE
↓
release task was cancelled with ordinary work
↓
resource leaked
The root cause is not “agent forgot to release capacity.”
The root cause is a bad cancellation model that did not distinguish business tasks from obligation-reconciliation tasks.
This is exactly the type of distinction Step 26’s incident pipeline needs.
Commitment SLOs
Once commitments are explicit, they can have reliability metrics.
Useful measurements include:
active commitments
orphaned commitments
commitment age
commitment breach rate
release latency
transfer latency
reconciliation latency
unknown commitment state
duplicate commitment rate
stale-intent commitment count
For critical systems, we may define an SLO such as:
99.99% of cancelled resource reservations
must reach verified RELEASED state within 60 seconds
The point is not the particular number.
The point is that commitment correctness becomes observable.
Orphan Detection
One especially valuable invariant is:
ACTIVE commitment
MUST have
valid durable owner
If not:
ORPHANED_COMMITMENT
should become an incident or reconciliation event.
This can be checked deterministically.
No model is necessary.
Commitment Garbage Collection Is Dangerous
It may be tempting to periodically delete old commitments.
Do not confuse data retention with lifecycle cleanup.
An old commitment with no recent activity may still represent a real external obligation.
Garbage collection should occur only after authoritative terminal state is established:
SATISFIED
RELEASED
TRANSFERRED
and retention policy allows archival.
Age alone is not evidence of nonexistence.
Unknown Must Remain Unknown
Suppose the agent submitted a cancellation request.
The provider timed out.
We cannot tell whether the reservation still exists.
The commitment state should be:
RECONCILIATION_REQUIRED
or:
UNKNOWN
not:
RELEASED
because that is what the system hoped happened.
This preserves one of the most important principles from the reliability section:
UNKNOWN is a real state, not a failure of confidence.
Some Commitments Are Irreversible
Not every commitment can be released.
Examples may include:
message already sent
public announcement made
contractual instruction issued
irreversible external submission
For those commitments, cancellation may require:
correction
follow-up communication
compensation
human escalation
reconciliation
This tees up Step 40’s deeper treatment of compensation.
Reversible, Releasable, Compensatable, Irreversible
It is useful to classify commitment resolution semantics.
RELEASABLE
external obligation can be explicitly removed
EXPIRING
obligation ends automatically but may still breach expectations
TRANSFERABLE
ownership can move
COMPENSATABLE
original effect remains but another action can mitigate it
IRREVERSIBLE
cannot be meaningfully undone
UNKNOWN
system cannot currently establish the real external state
This should affect authority and planning.
The more irreversible the commitment, the stronger the approval and verification requirements should generally be.
Commitments and Human Trust
There is a human-facing reason this distinction matters.
People tolerate agents exploring options.
They care deeply when agents begin making promises or consuming resources.
A system that says:
I am considering a deployment at 15:00
is very different from one that says:
The deployment is scheduled for 15:00
The interface should reflect that difference.
Agent UX can expose states such as:
PLAN
PROPOSED COMMITMENT
ACTIVE COMMITMENT
EXECUTING
VERIFIED COMPLETE
That improves trust because the system stops pretending thought and action are the same thing.
Do Not Let Natural Language Create Hidden Commitments
This is a subtle but important safety boundary.
A model may generate:
I'll make sure this is completed by tomorrow.
Unless the system explicitly translates that into an approved structured commitment, it should remain text.
Otherwise ordinary generated language can silently create operational obligations.
A safer pattern is:
model proposes commitment
↓
structured parser / explicit action
↓
authority check
↓
commitment ledger write
This is analogous to typed tool calls.
Natural language alone should not mutate the commitment ledger.
Commitment APIs Should Be Narrow
Rather than giving the model generic database write access, expose narrow operations:
create_commitment(...)
release_commitment(...)
transfer_commitment(...)
mark_satisfied(...)
request_reconciliation(...)
Each operation can enforce:
- valid state transition,
- current intent,
- authority,
- ownership,
- resource identity,
- evidence requirements,
- idempotency.
This keeps the control plane deterministic.
State Machines Beat Prompt Instructions
A prompt might say:
Remember to release reservations when plans change.
That is not an invariant.
A state machine can enforce:
intent superseded
AND active commitment no longer supported
↓
commitment MUST enter
RELEASE_PENDING or RECONCILIATION_REQUIRED
Use language models for ambiguity.
Use state machines for rules you already know.
A Minimal Commitment Runtime
The architecture does not require a giant framework.
A minimal version could be:
class CommitmentRuntime:
def create(self, proposal, context):
self.intent_gate.require_current(proposal.intent_version)
self.authority_gate.require(
proposal.required_authority,
context,
)
operation = self.executor.create_external_obligation(proposal)
observed = self.observer.verify(operation)
if not observed.confirmed:
return self.store.record_unknown(proposal, operation)
return self.store.activate(proposal, observed)
def release(self, commitment, context):
self.intent_gate.require_release_allowed(commitment, context)
operation = self.executor.release_external_obligation(commitment)
observed = self.observer.verify_release(operation)
if not observed.confirmed:
return self.store.require_reconciliation(commitment, operation)
return self.store.mark_released(commitment, observed)
The important part is not the Python.
It is the boundary:
propose
authorize
execute
observe
transition durable state
What Should the Model Do?
The model can be useful for:
proposing goal decomposition
identifying possible commitments
interpreting ambiguous user intent
suggesting commitment compatibility after replanning
explaining consequences of release or breach
ranking alternative plans
The model should not be authoritative for:
whether a commitment currently exists
whether a reservation was released
who owns an active obligation
whether the current intent version is valid
whether a deadline passed
whether a lock is still held
whether an external side effect occurred
Those should come from structured state and authoritative observations.
Planning With Commitments
A planner should receive at least:
current intent
current goals
active commitments
resource constraints
current state
competence envelope
authority limits
Then it can produce candidate plans that respect obligations already in force.
Without this context, planning is stateless fantasy.
Plan Scoring Should Include Commitment Cost
Plans that create many commitments are not necessarily better.
Suppose two plans achieve the same goal.
Plan A:
creates five external reservations
requires two human reviews
locks production environment
Plan B:
uses existing evidence
requires one reversible sandbox action
The planner should consider commitment burden.
That burden includes:
resource cost
human attention
release complexity
failure exposure
reconciliation cost
irreversibility
This is another way complexity must earn its place.
Commitment Debt
An agent can accumulate too many unresolved obligations.
Call this commitment debt if the metaphor is useful.
A practical measurement could be:
number of ACTIVE commitments
weighted by age, consequence and unresolved uncertainty
High commitment load should affect admission control.
A workflow with many unresolved external obligations may need to stop creating new ones until it catches up.
This connects directly to Step 21 backpressure.
Commitment-Aware Admission Control
Suppose a workflow already has:
12 active browser sessions
3 pending human reviews
2 reserved GPU jobs
1 unresolved production mutation
Should it create ten more speculative branches that reserve additional resources?
Probably not.
Admission policy can include:
active_commitment_count
commitment_risk
reconciliation_backlog
human-review backlog
resource-reservation pressure
This makes capacity planning more semantically aware than raw queue depth.
Commitment-Aware Search
Search algorithms also need to know when a branch crosses a commitment boundary.
Before commitment:
branch freely
prune aggressively
After commitment:
branch carries cleanup obligations
This changes the economics of speculative execution.
A search node that creates an external reservation is no longer an isolated hypothetical node.
Therefore a useful rule is:
Keep search branches side-effect-free as long as possible.
This aligns with Step 29’s prepare/simulate/verify-before-commit architecture.
Keep Commitments Near the Commit Boundary
When possible:
reason
↓
simulate
↓
verify candidate
↓
create necessary commitments
↓
commit consequential action
rather than:
create reservations
notify humans
lock resources
↓
then begin thinking
Delayed commitment reduces cleanup burden.
But sometimes early commitment is necessary—for scarce capacity, external deadlines or human coordination.
That should be an explicit trade-off.
Commitment Timing Is an Optimization Problem
Creating a commitment too early has carrying cost.
Creating it too late risks losing the resource.
For example:
reserve GPU now
-> guaranteed capacity, but idle cost
reserve GPU later
-> lower cost, but possible unavailability
This resembles Expected Value of Information and dynamic budgeting.
The decision can consider:
probability resource is needed
probability resource disappears
reservation cost
impact of delay
release cost
Again, do not fake precise probabilities if the evidence is weak.
Ranges and historical rates are often better.
Commitments and Capability Placement
Step 34 chose execution placements.
Some placements may require commitments:
reserve GPU pool
allocate browser session
reserve region-specific worker
acquire licensed specialist capacity
Placement therefore should distinguish:
eligible placement
from:
committed placement
A candidate placement is not real capacity until the reservation is verified.
Commitment-Aware Handoff
Step 35 moved running tasks between workers.
The handoff checkpoint must include active commitment references.
But remember:
state transfer
≠
commitment ownership transfer
The target worker can learn that C1 exists without owning C1.
If ownership must move, perform an explicit transfer.
This prevents a checkpoint from silently transferring organizational obligations.
Temporal Consistency Applies to Commitments
Step 36 introduced freshness.
Commitments also become stale.
A reservation may expire.
A reviewer may withdraw.
A maintenance window may move.
A resource lock may be revoked.
So before relying on an ACTIVE commitment, check whether its evidence is still fresh enough.
commitment ledger says ACTIVE
↓
resource is consequential
↓
revalidate external state
The ledger is authoritative about the system’s recorded lifecycle.
The external system may still require observation for current truth.
A Commitment Can Become Invalid Without Being Released
Suppose the provider revokes capacity.
The system did not release the commitment.
But the underlying obligation may no longer be satisfiable.
This can transition to:
BREACHED
or:
RECONCILIATION_REQUIRED
That difference matters for incident handling.
Commitment Compatibility and Behavioral Releases
Suppose an agent workflow is upgraded while active commitments exist.
Can the new release service the old commitments?
This is a compatibility question.
A release may need to understand:
commitment schema version
obligation type
release protocol version
verifier requirements
ownership semantics
If not, the old workflow version may need to remain available until obligations are discharged.
This connects commitments to Step 24 release compatibility.
Never Deploy a Release That Cannot Discharge Existing Obligations
This is a useful deployment invariant:
new release
MUST either
1. service every active commitment type it may inherit,
2. migrate them safely,
3. or leave them with a compatible previous runtime.
Otherwise a software rollout can orphan agent obligations even if all normal request handling works.
Commitment Schemas Need Versioning
As with checkpoints:
schema_v1
schema_v2
Migration must preserve semantics.
Adding a field is not the only concern.
Changing what SATISFIED means is a behavioral compatibility change.
That should be reviewed like any other control-plane policy change.
Failure Modes
Failure 1: Treating Plans as Obligations
The agent proposes five alternatives.
The platform reserves resources for all five.
Result:
speculation creates real-world side effects
Fix:
PROPOSED commitment
≠
ACTIVE commitment
Failure 2: Treating Commitments as Plan Nodes
A replan deletes the node.
The external reservation remains.
Fix:
commitment ledger + explicit release lifecycle
Failure 3: Cancelling Cleanup Work
User cancels objective.
Scheduler kills every task, including reservation release.
Fix:
business work cancelled
reconciliation work protected
Failure 4: Duplicate Commitment Creation
A network timeout triggers retry.
Both attempts create reservations.
Fix:
logical commitment ID + idempotency key
Failure 5: Stale Human Commitments
Reviewer approves an old plan after supersession.
Fix:
review request bound to intent/artifact identity + expiry
Failure 6: Orphaned Ownership
Worker dies while holding obligation.
No other component knows it exists.
Fix:
durable commitment owner + reconciliation scan
Failure 7: Assuming Release Succeeded
Cancel call returns timeout.
System marks commitment released.
Fix:
UNKNOWN / RECONCILIATION_REQUIRED until authoritative confirmation
Failure 8: Hidden Natural-Language Commitment
Agent tells customer:
We'll have this done tomorrow.
No structured obligation exists.
Fix:
commitment-bearing communication requires explicit structured transition
Failure 9: Commitment Explosion
Every planning branch reserves resources.
Fix:
delay commitment boundary + commitment-aware admission control
Failure 10: Replanning Without Commitment Diff
New plan is valid.
Old obligations leak.
Fix:
KEEP / RELEASE / TRANSFER / REVALIDATE / RECONCILE
for every active commitment affected by the replan.
Failure Injection
Do not trust commitment management until it survives deliberate failure.
Test scenarios such as:
worker crashes after reservation creation but before ledger update
ledger updates but external reservation call actually failed
release call times out after succeeding remotely
intent superseded while commitment creation is in flight
human approves after request becomes stale
commitment owner disappears
transfer target crashes before acknowledgement
reservation expires unexpectedly
new behavioral release cannot parse old commitment state
cancellation event is dropped
retry creates duplicate operation attempt
The expected outcomes should be explicit.
For example:
ambiguous reservation creation
-> reconcile by idempotency key / external query
-> never blindly create another reservation
Useful Invariants
Some commitment rules should be executable invariants.
ACTIVE commitment MUST have a durable owner
SATISFIED commitment MUST have satisfaction evidence
RELEASED commitment MUST have release evidence
stale intent MUST NOT create new dependent commitments
commitment transfer MUST invalidate prior servicing authority
UNKNOWN external state MUST NOT be represented as RELEASED
terminal commitment MUST NOT return to ACTIVE without a new lifecycle event
These are excellent candidates for deterministic tests.
Benchmark the Simpler Alternatives
As always, do not implement the full architecture automatically.
Compare:
simple task queue
vs
task queue + durable cancellation
vs
task queue + explicit commitment ledger
vs
full goal/commitment/task graph
The richer model earns its cost when workflows actually create durable external obligations.
A simple read-only research agent may need almost none of this.
A deployment, purchasing, operations or customer-facing agent probably needs much more.
When You Do Not Need Commitments
If your agent:
receives request
reads immutable data
generates answer
returns response
then a commitment ledger may be overkill.
Do not add it because the architecture sounds sophisticated.
Add it when the system crosses boundaries such as:
reserving resources
waiting on humans
creating scheduled obligations
submitting external jobs
making promises
acquiring locks
initiating multi-stage side effects
That is the measured failure boundary.
Where This Leaves the Architecture
We now have another important separation.
Step 37 gave us:
intent
= what outcome currently matters
Step 38 adds:
goal
= what state should become true
plan
= one proposed way to get there
commitment
= an obligation the system has actually created
task
= executable work servicing goals or commitments
action
= a concrete execution attempt
The hierarchy looks like:
Intent
│
├── Goal
│ ├── Subgoal
│ │ ├── Commitment
│ │ │ └── Task
│ │ │ └── Action
│ │ │
│ │ └── Task
│ │ └── Action
│ │
│ └── Plan candidates
│
└── Intent lifecycle
And importantly, plans can disappear while commitments remain visible and accountable.
The Larger Principle
There is a broader lesson here.
Agent systems often blur thought and action.
A model says:
I'll do X.
The system treats that as:
X is now part of reality.
Production autonomy requires sharper boundaries.
The platform should know whether something is:
considered
proposed
committed
executing
observed
verified
Those transitions should not happen implicitly inside prose.
The core principle remains:
A plan is not a commitment, and a commitment is not merely another task in the queue.
Once that distinction exists, the next architectural problem becomes unavoidable.
Commitments can remain active for hours, days or weeks.
Humans may need to respond later.
Timers may fire tomorrow.
Providers may recover after an outage.
A workflow may pause, migrate, retry, wait and resume many times.
At that point, the agent is no longer just a loop around an LLM.
It needs a durable workflow runtime.
That is Step 39.