[Pre-ERC] Agent Service Order Amendments — ERC-8001 Profile

Quick Yes / No

Would you support continuing our work on jointly approved changes to agent service orders?

  • Yes
  • No
0 voters

No explanation needed. This is feedback on continuing the work, not an ERC approval vote.

Code and runnable demo · Latest implementation update


I would like feedback on a narrow interoperability problem: after a buyer and an agent service provider have agreed to an order, how can they consent to changing its scope, price, deadline, or acceptance criteria without losing the previous agreement or accidentally authorizing additional spending?

This is an exploratory discussion, not an assigned ERC. Existing work or a suitable extension point may already cover it; pointers to concrete interfaces would be especially useful.

A concrete example

A buyer orders a report on three projects for 100 units, due tomorrow. During execution, the buyer requests ten projects and a spreadsheet. The provider proposes an additional 80 units and a longer deadline. Both parties need an unambiguous answer to:

  • Which exact change did each party authorize?
  • When does the change become effective?
  • What happens if the additional funds are unavailable?
  • Which criteria apply to work already submitted?
  • Can a delayed signature or a competing change replace the current agreement?

An ordinary follow-up message should not by itself authorize an additional payment. Publishing a new catalogue offer also does not establish consent to changing an existing order.

Proposed boundary

The candidate standard would describe a signed amendment to an existing service order and the conditions for applying it. It would leave discovery, negotiation strategy, model execution, quality evaluation, disputes, and general escrow design to other components.

The initial experimental profile is deliberately small:

  • One buyer, one provider, one payment asset, one settlement domain.
  • An already-authorized order with an immutable identity and a revision history.
  • Price increases or unchanged prices, and deadline extensions or unchanged deadlines.
  • Changes only while the order is active and before a deliverable is submitted.
  • Both parties approve the exact change. Neither silence nor a chat message constitutes approval.

Partial completion, refunds, changing providers, and changing payment assets would require separate profiles or replacement orders. The initial profile does not silently rewrite accrued rights.

Candidate message and application rules

An amendment identifies:

Amendment {
  orderId: bytes32
  baseRevision: uint64
  baseTermsHash: bytes32
  newTermsHash: bytes32
  nonce: uint256
  validUntil: uint64
}

For the local experiment, the committed terms are:

Terms {
  scopeHash: bytes32
  acceptanceHash: bytes32
  totalPrice: uint256
  deadline: uint64
}

newTermsHash commits to the complete new terms, rather than an ambiguous natural-language delta. Scope and acceptance documents are hashed from their exact bytes; their commitments do not establish the quality or availability of their contents. Signers need access to those documents and a readable before/after comparison.

The experiment uses EIP-712 with chainId and verifyingContract domain separation. The order identity resolves to the authorized buyer, provider, asset, and settlement context. Those bindings cannot be changed by an amendment in this profile.

Applying an amendment would require:

  1. The order is still active and now < currentTerms.deadline, using the current authoritative revision immediately before applying the amendment. A previously agreed extension replaces the deadline used for this check; this profile has no separate immutable amendment cutoff.
  2. The current revision, terms hash, and nonce match the signed base state.
  3. Both signatures are valid for the authorized parties and the amendment has not expired.
  4. The supplied new terms match the signed commitment and the selected profile’s restrictions.
  5. The supplemental funding, newTerms.totalPrice - currentTerms.totalPrice, is secured and the new revision becomes active as one authoritative state transition. The funding delta, deadline check, revision, terms hash, and nonce all use the same current base state. For 100 -> 180 -> 220, the supplements are 80 and then 40.

If any check fails, the current terms and balances remain unchanged. A successful transition advances the revision and nonce, making competing amendments from the old revision unusable. Either party can explicitly invalidate outstanding amendment signatures through a separate nonce advance; this does not cancel the underlying work.

Submitted work freezes amendment eligibility in this initial profile. Submission and acceptance records bind the exact order revision, terms hash, and result hash. More flexible milestone changes need an explicit rule for protecting existing submissions and earned amounts.

An adapter acknowledgement is not automatically proof of funding. A same-chain implementation can make funding and activation one EVM transaction. An off-chain marketplace would need a durable reservation and recovery design, with its trust boundary stated explicitly. Cross-chain atomicity is outside this proposal.

Relation to existing work

  • ERC-8414 provides versioned task tenders and tender economics. This proposal asks about counterparties consenting to amendments of an existing service engagement. It would not mutate a tender’s fixed reward; a compatible integration may require a linked supplemental or replacement instrument.
  • ERC-8001 provides generic agent coordination and consent. A central question is whether order amendment semantics should be a profile over that framework rather than a separate ERC.
  • ERC-8412 addresses preregistered acceptance criteria. An amendment can reference a new criteria commitment for eligible future work, while preserving the criteria attached to protected submissions.

These are composition candidates, not claims that the integration is already implemented.

Implementation experiment and Finch use case

Finch’s public Agent integration documentation provides a useful motivating example: versioned offers, persisted Call Rights authority, logical invocations, terms hashes, and asynchronous supplemental input. The proposed integration would add a consented order-terms revision layer while preserving historical service versions and dispatch records. This is a proposed use case, not a claim of a production Finch deployment or endorsement.

The experiment now includes a local-EVM implementation of an ERC-8001 order-amendment profile, EOA and mock ERC-1271 signatures, and a runnable funding-to-settlement demo. All 62 local tests pass. It uses disposable tokens and synthetic data; it is not audited, independently implemented, or integrated with the Finch backend. See the linked implementation update for details.

The next useful interoperability test would have one client construct an amendment and a separately implemented consumer verify and apply it using published test vectors.

Questions for reviewers

  1. Is this a missing interoperability boundary, or is an existing interface sufficient?
  2. Should this be an independent ERC, an ERC-8001 profile, or a companion to a commerce/tender standard?
  3. Is freezing changes once work is submitted a reasonable first profile?
  4. Which funding/activation guarantees should be common, and which should belong to adapters?
  5. Does another implementation want to compare a concrete workflow and test vectors?

Non-binding scope poll

This poll is advisory feedback on the direction, not an ERC approval vote. Please explain your choice, especially any overlap with existing work. The initial feedback window closes on 13 October 2026 at 09:30 UTC (approximately 3 days after publication); technical objections remain relevant regardless of vote totals.

  • Explore a separate minimal ERC for service order amendments
  • Define this as a profile or extension of an existing ERC
  • Keep this at the application layer; no shared standard is needed yet
  • Need more implementation evidence before choosing
0 voters

References

Reference URL
ERC-8414 discussion ERC-8414: Token-Bound Task Tenders
ERC-8001 specification ERC-8001: Agent Coordination Framework
ERC-8412 discussion ERC-8412: Preregistered Acceptance Criteria
EIP-712 EIP-712: Typed structured data hashing and signing
Finch public integration documentation Finch
1 Like

Application rule 1 may need clarification for chained amendments. It requires:

The order is still active and the original execution deadline has not elapsed.

Consider:

  • Revision 0: deadline = Oct 12.
  • Revision 1, agreed on Oct 11: deadline extended to Oct 20.
  • On Oct 15, both parties want to amend the scope/price again, before any deliverable is submitted.

Revision 1 is still active and within its agreed deadline, but the original deadline has passed. Current rule 1 requirement would block revision 2.

I would expect eligibility to use the current authoritative revision:

now < currentTerms.deadline

Otherwise, the initial deadline remains a permanent amendment cutoff even after both parties replace it with a later execution deadline. If that fixed cutoff is intenitonal, it should probably be a separate immutable amendmentCutoff, since it serves a different purpose.

The funding rule could also be explicit. Since totalPrice is a total rather than a delta, supplemental funding for revision N+1 should be:

newTerms.totalPrice - currentTerms.totalPrice

rather than newTerms.totalPrice - originalTerms.totalPrice. Moving 100 -> 180 -> 220 should reserve another 80, then another 40, rather than 80, then 120.

Each amendment would then be a compare-and-swap against the current authoritative terms with both deadline eligibility and supplemental funding derived from the same base revision.

2 Likes

You’re right: rule 1 should use the current authoritative deadline. There is no separate immutable amendment cutoff in this profile. I’ve corrected rules 1 and 5, and changed “original terms” to “current terms” in the failure case.

The local model already read the current deadline and computed the price difference from that same revision, but the post did not state it accurately. I added regression cases covering:

  • 100 -> 180 -> 220: reserve 80, then 40. The second amendment succeeds after revision 0’s deadline but before revision 1’s deadline; a competing amendment signed against revision 1 then fails without changing state.
  • At revision 1’s deadline, a further extension fails even if its signatures have not expired.
  • If the second supplement cannot be funded, revision 1’s terms, nonce, history, and balances remain unchanged.

All 21 local tests pass, using EIP-712 EOA signatures and mock balances. These are JavaScript state-machine tests; they do not establish EVM or database atomicity. The adapter requirement remains one authoritative transition using the same base revision for eligibility, funding, and activation.

1 Like

Regarding the poll: I voted for “Define this as a profile or extension of an existing ERC”.

ERC-8001 looks like the first extension point to try. It already defines typed intents, explicit participant acceptance, expiry and nonces, replay protection, EOA/ERC-1271 signature verification and an execution lifecycle.

Amendment-specific work is the state transition on top of that: baseRevision, baseTermsHash, complete replacement terms, rules for permitted changes, supplemental funding, and submissions bound to a specific revision.

I would first try to express those rules through a coordination type like ORDER_AMENDMENT_V1 with a canonical payload and profile. That would reuse the existing consent framework.

I would consider a separate ERC justified if implementation work shows that ERC-8001 cannot cleanly enforce one of the required guarantees. These include atomic funding and revision activation, allowing either party to invalidate outstanding amendments, and binding execution to the current order state.

I do see an interoperability boundary worth standardizing here. At this stage, it looks like specialized order amendment semantics that could build on an existing coordination primitive.

1 Like

Thanks — I tried the ORDER_AMENDMENT_V1 route and now have a public implementation experiment:

The profile at commit 9e4a225 specifies the canonical payload and separates Core coordination status from the order’s applied revision.

Two mappings are implemented:

  • Either-party invalidation: a separate order amendment nonce, advanced by either buyer or provider and checked again at execution. Core cancellation remains proposer-only before expiry; invalidation does not cancel the underlying order.
  • Funding and activation: one isolated EVM application call performs the supplement and revision update. If it fails, order/token writes roll back, while Core records Executed with success=false. Retrying requires a fresh intent and acceptances. Successful application emits OrderAmendmentApplied; Executed alone is not sufficient evidence.

At commit 9e4a225, all 46 local tests passed: 24 EVM cases, one ethers/viem fixed-vector comparison, and the 21 earlier JavaScript tests. The EVM cases cover chained amendments, competing revisions, invalidation, failed transfers, a reentrant token callback, expiry equality, and a mock ERC-1271 wallet. Solidity also agrees with the published hashes. Nonempty unsigned executionData is rejected before consuming the intent.

One open tradeoff: any caller can execute a Ready intent, so a temporary funding failure can consume it before the parties want to retry. Would you prefer a more restrictive execution-admission policy for this profile?

This is a local-EVM experiment with disposable tokens, not an audited escrow, public-chain deployment, or independent second implementation. The initial Solidity example at that commit stopped at submission; the update below adds a minimal application settlement fixture. It provides something concrete to review before deciding whether a separate ERC is warranted.


Update — 13 October 2026: runnable local order lifecycle

I extended the experiment with a minimal application lifecycle around the amendment profile. The current repository snapshot and English walkthrough cover:

100 funded → both parties accept a total of 180 → 80 collected and revision 1 activated atomically → delivery submitted → buyer accepts → provider receives 180.

Buyer acceptance binds the exact submitted revision, terms hash and result hash. Acceptance and payment share one transaction; a failed transfer rolls back both and permits a retry. The demo also includes buyer cancellation before provider activation and a full refund for undelivered orders at the current amended deadline. Refunds include applied supplements and always go to the recorded buyer.

These settlement operations are an application fixture, not additions to ERC-8001 Core or changes to the signed amendment encoding. Verification of the sample file is performed off-chain; the contract checks the buyer’s authority and delivery bindings, not the quality of the work.

All 62 tests pass (40 EVM, one cross-library vector, 21 earlier model tests), and the implementation CI run also passes the full demo and unchanged-vector check. To reproduce from the repository:

npm ci --ignore-scripts
npm test
npm run demo

The demo saves its documents, signatures, balances and transaction/event records locally. It uses synthetic data and disposable tokens, with no public-chain deployment or Finch backend integration. On-time submission prevents an expiry refund; if the buyer does not accept, funds remain escrowed. Review timeouts and disputed-delivery resolution are still open application-policy work.

2 Likes

Thanks for the feedback! The initial scope poll closed on 13 October at 09:30 UTC: two votes, split between an existing-ERC profile and a separate ERC. That’s too little to claim consensus.

I’ll continue the experimental ERC-8001 profile and have updated the title to reflect that. The next step is an independent client checking the published vectors and running an amendment flow. We can revisit a separate ERC if that reveals a concrete interoperability gap.

The newer Yes / No poll and technical discussion remain open.