ERC-8210: Agent Assurance

A small correction, thanks to @RNWY for flagging it: there’s an attribution mix-up in my post above.
In the Scenario 3 description (hybrid off-chain scoring), I conflated two separate projects. RNWY (@RNWY, soulbound identity, multidimensional sybil signal scoring with explicit weights, and live integration with the ERC-8183 hook system) and AHS (Agent Health Score, a separate independent project) are two distinct pieces of work that happen to overlap conceptually.
The correct attribution is:

  • The “dimensional scoring + shared reasoningCID” pattern in Scenario 3’s OffchainScorerMock draws on the conceptual approach from AHS
  • RNWY’s work (with the methodology document forthcoming this week) will be referenced separately in the AAP v2 IRiskHook section

Apologies for the confusion. Attribution accuracy matters for spec documentation, especially when multiple independent projects overlap conceptually.

The RoleCollusion direction feels right as a distinct CoverageType. EvaluatorDispute assumes a dispute was formally raised; RoleCollusion addresses the case where the fraud completed cleanly with no dispute trail. Same recovery mechanism, different trigger condition — worth formalizing separately rather than stretching EvaluatorDispute to cover it.

On the assessIndependence() interface — the evidence object we ship with every score already contains the signals that would feed it: shared funder address, wallet age at time of review, cluster size, whether the funder matches the agent owner. A Resolver consuming that object can apply their own threshold rather than trusting a single verdict. No black boxes on our end.

One heads up relevant to the IRiskHook discussion: we’re working through a methodology change that will affect some scores, including some that currently sit at zero.

Instead of penalizing agents for sybil reviews, we’re considering nullifying those reviews entirely. The agent gets scored on what remains — owner wallet age, registration maturity, commerce signals.

The rationale: ERC-8004 reviews are essentially free to manufacture. That makes them a viable attack surface not just for self-promotion but for ecosystem-wide poisoning — an actor trying to dilute a low RNWY score can simply spin up sybil campaigns against everyone, dragging the whole ecosystem down and making the review layer meaningless for all of it.

Penalizing agents for reviews they may not have manufactured punishes potential victims. Nullification is the more precise response: we remove the noise, show the math, and let the underlying signals speak.

For some agents this actually raises their score.

The evidence object and dual-score architecture don’t change. But if you’re pinning to specific score values in the IRiskHook reference, worth knowing the numbers may shift when this ships.


Pablo from RNWY.com

Pablo, thanks for the response. A note up front: what follows are my working positions on the open questions you raised, still subject to co-author review before anything lands in a v2 PR. Sharing early to get community feedback on the direction.

1. RoleCollusion as a distinct CoverageType

Your framing nails it: EvaluatorDispute presupposes a dispute was raised, RoleCollusion is the case where no dispute exists because the collusion succeeded cleanly. Same recovery mechanism, semantically distinct triggers. This framing will shape how we approach the v2 discussion on whether to separate them.

2. The evidence object deserves to be promoted to the interface layer

Your point about RNWY’s evidence object carrying signals that a Resolver can threshold on its own made me realize this pattern should be formalized at the interface layer rather than bound to any specific schema. Any trust layer implementing the same interface shape would then be drop-in compatible with any AAP Resolver that consumes independence evidence.

From first principles, independence assessment needs roughly these signal categories:

  1. Funding origin overlap: do the addresses share a funding source (direct match, or cluster membership under a common funder)
  2. Temporal proximity: how close are they on the timeline (creation time, first interaction, activity rhythm)
  3. Relationship density: direct or indirect on-chain interaction strength (tx count, graph distance, shared contract usage)
  4. Ownership signals: other evidence of same-entity control (funder-to-owner match, shared metadata, declared ownership)

And one open category worth discussing:

  1. Behavioral similarity: independently of the above, do the addresses exhibit similar fingerprints (gas price preferences, tx timing distribution, contract interaction patterns)? This catches same-operator cases that slip past the first four.

Your RNWY evidence object concretely covers 1, 2 (via wallet age at review), and 4, and extends 1 with cluster size. Three of the four core categories already landed in production is a large part of why this abstraction feels implementable rather than theoretical. Categories 3 and 5 remain open design space.

Draft interface (open for community discussion):

solidity

interface IIndependenceSignal {
    function assessIndependence(
        address addrA,
        address addrB
    ) external view returns (
        bool independent,
        uint8 confidence,
        bytes memory evidence
    );
}

Three design requirements the rationale needs to spell out:

Partial signals must be legal. Not every trust layer provides all four categories. The evidence payload must let implementations populate only what they can, with explicit markers for what’s available vs missing. confidence reflects certainty given available data, not data completeness.

No data at all must also be legal. A new trust layer on a new chain will encounter addresses it knows nothing about. Forcing it to fake data or revert would push implementations toward dishonesty. The cleanest expression of “I was asked but I have nothing to say” is to allow empty evidence under a strict two-way convention: empty evidence requires confidence == 0, and non-empty evidence requires confidence > 0. Either violation is an invalid state. Resolvers get a single clean check (confidence == 0 means no usable signal) without parsing the payload. This maps directly to your “Transparency, Not Judgment” principle: having nothing to say is itself a transparent answer.

The independent field is undefined when confidence == 0. My earlier instinct was to pin a fail-closed default (return false), but that conflates “no data” with “judgment that they’re linked”, which is in tension with the Transparency principle. Cleaner to state that consumers MUST NOT rely on independent when confidence is zero. Implementations can return any value, consumers are expected to branch on confidence == 0 first. Open to pushback on this.

One deliberate design choice worth flagging: the draft above defines assessIndependence as a view function, which assumes the trust layer has an on-chain oracle. This matches the deployment shape of some scoring layers but excludes pure off-chain ones (REST API only, no on-chain contract). An alternative would be a signed-attestation pattern where the Resolver submits a signed claim from an off-chain source as part of fileClaim evidence. Both have real use cases. I don’t have a strong opinion yet on whether IIndependenceSignal should pick one or support both. Would be good to hear from anyone building off-chain scoring layers in this thread before the shape gets fixed.

On RNWY’s positioning in v2: the spec text stays protocol-neutral per ERC conventions, but RNWY will be explicitly credited in two places:

  • Spec Acknowledgments, crediting the evidence-shipping design direction as informed by RNWY’s multidimensional scoring methodology
  • AAP reference implementation repo (planned Integration Examples doc), showing how to consume RNWY’s trust oracle through the IIndependenceSignal interface (oracle address, methodology link, integration code)

Push back in this thread on anything: the interface shape, the signal categories, partial availability, the empty-evidence convention, the view-vs-attestation question. Much easier to adjust now than after v2 PR goes up.

3. Nullification vs penalization

The principle lines up with AAP’s own ethos: parties without fault shouldn’t bear system failure costs. Different layer, same philosophy.

To stay stable across your methodology changes, the reference implementation’s Integration Examples will reference your methodology document by version, not by specific score values.


Thanks for this level of collaboration.

Jacky

Jacky, thanks for the detailed breakdown. A few responses from the production side.

On “no data” returning a shrug versus a fail:

Agree with your revised position completely. Fail-closed conflates two fundamentally different statements: “I have evidence of a problem” and “I have no information.” Collapsing those into the same output is itself a trust failure. Every legitimate new agent starts with no history. A system that returns false on no-data penalizes being new, which is exactly backwards; it rewards manufactured history over honest absence. Confidence zero with an explicit empty evidence payload is the only output that doesn’t lie. Consumers branch on confidence first and the independent field becomes irrelevant when confidence is zero. That’s clean.

This maps directly to how RNWY handles unknown addresses. We say nothing rather than fabricate a position. Having nothing to say is a transparent answer.

On oracle versus signed attestation:

Might be better not to pick one. They solve different problems and both have real production use cases.

The on-chain oracle is fast and trustless; a Resolver reads it directly without relying on any intermediary. RNWY’s oracle is live on Base at 0xD5fdccD492bB5568bC7aeB1f1E888e0BbA6276f4 and gets queried directly.

The signed attestation pattern covers cases the oracle cannot: orchestrators running off-chain, chains where no oracle is deployed yet, point-in-time snapshots for dispute evidence. RNWY’s /api/trust-check endpoint returns a signed result verifiable against the public key at rnwy.com/.well-known/jwks.json. Same underlying data, different delivery mechanism.

Forcing the interface to pick one excludes legitimate implementations. Define the output shape, let implementations choose how they deliver it. Both patterns are in production at RNWY today if anyone wants a reference.

On partial signals:

I feel like partial must be legal. Requiring all four categories before a result is valid would either freeze the ecosystem or push implementations toward fabricating data to meet completeness requirements. Fabricated completeness is catastrophically worse than honest partial coverage.

RNWY currently covers funding origin, temporal proximity, and ownership signals. Relationship density is open design space for us too. Our confidence score reflects certainty given available data, not data completeness. An honest result at confidence 60 with three of four categories is more useful to a Resolver than a forced result at confidence 100 built on invented signals.

The partial availability framing in your draft interface is correct. Explicit markers for what’s available versus missing, with confidence reflecting only what’s actually known, is the right shape.


Pablo from RNWY

1 Like

Pablo, thanks for the useful responses. Here are my thoughts on the three points:

On the independent field when confidence == 0:

The “rewards manufactured history over honest absence” reasoning is the right way to see this. It’s not just that fail-closed conflicts with the Transparency principle, it’s that fail-closed creates an inverse incentive: every legitimate new entrant starts at confidence zero, so a fail-closed default penalizes being new while attackers can manufacture history to escape the penalty. The default literally rewards the wrong behavior.

This framing will shape the v2 rationale’s justification for the undefined semantics.

On oracle versus signed attestation:

The binary framing was wrong. The right abstraction is to define the output shape and let implementations choose how they deliver it. Your three concrete scenarios (off-chain orchestrators, chains without deployed oracles, point-in-time snapshots for dispute evidence) make the case for signed attestation clearly enough that excluding it would just be excluding legitimate implementations. RNWY’s dual deployment (Base mainnet oracle plus the /api/trust-check endpoint with JWKS verification) is the existence proof that both can coexist around the same underlying data.

The v2 interface draft will be restructured accordingly:

interface IIndependenceSignal {
    // Delivery mode 1: on-chain oracle, direct view call
    function assessIndependence(
        address addrA,
        address addrB
    ) external view returns (
        bool independent,
        uint8 confidence,
        bytes memory evidence
    );

    // Delivery mode 2: signed attestation from off-chain source
    function verifyAttestation(
        address addrA,
        address addrB,
        bytes calldata attestation
    ) external view returns (
        bool independent,
        uint8 confidence,
        bytes memory evidence
    );
}

Both functions return the same output shape. Implementations may offer one or both, depending on their deployment model. Resolvers pick the path that fits their environment: direct view call when they have a trustless reader, attestation verification when they’re running off-chain or on a chain without a deployed oracle, or attestation as dispute-time snapshot evidence.

This also closes the view-vs-attestation open question from my previous post. It’s no longer pending community feedback, it’s resolved in favor of supporting both.

On partial signals:

The “fabricated completeness versus honest partial coverage” framing will shape the v2 rationale’s argument for why partial signals must be legal. This captures something my earlier draft only hinted at: the requirement itself creates a perverse incentive to fake the missing data, which is a structural argument rather than a convenience one.

Your disclosure that RNWY currently covers funding origin, temporal proximity, and ownership signals, with relationship density as open design space, is also useful. It confirms that the four-category framing aligns with what a serious production system actually covers, rather than being my theoretical construct. And relationship density being open space on both sides means the community has room to contribute there without stepping on existing implementations.

One small addition to the rationale:

Taking the three responses together, there’s a meta-point worth making explicit: IIndependenceSignal’s design is built around the principle that the interface should not punish honesty. Empty evidence is legal, partial signals are legal, implementations that only support one delivery mode are legal. The interface’s job is to define a shape that accommodates truthful answers of any completeness, and to leave the threshold decisions to the consumer. Each design choice we’ve landed on (undefined independent at confidence zero, partial-must-be-legal, dual delivery modes) is an instance of this same principle. Your three points together made this principle visible.

Thanks again. This is what makes spec work genuinely collaborative rather than one-way broadcasting.

Jacky

Hi Jacky: thank you for this. The meta-principle you’ve named makes the spec durable. Any design that penalizes truthful partial answers will eventually be gamed by implementations that fabricate completeness to avoid the penalty.

Looking forward to the v2 draft. :slightly_smiling_face:

Pablo

2 Likes

ERC-8210 v2 Changelog — Part 1 of 2: Overview and Open Questions

Hi everyone,

Since ERC-8210 was submitted, the discussion on this thread, in PR #1632, and in adjacent threads on ERC-8183 has produced a substantial set of refinements. Before v1 merges into Draft, we want to share the full v2 changelog we have been assembling, so the community has a review window to push back, suggest additions, or flag anything we have mischaracterized.

To be clear on sequencing: v2 work will not begin until v1 is merged. Opening this changelog now is meant to make the direction transparent and give contributors time to react, not to pre-empt the editor review.

For readability I am splitting the changelog into two posts. This one covers the overview, acknowledgments, and open questions. Part 2 (posted as a reply below) goes through all seventeen items in detail. If you only want to know the direction, reading this post is enough. If you want the full text of specific changes, jump to Part 2.


Acknowledgments

Every change in this changelog traces back to specific community contributions:

  • @RNWY drove a series of structural items: the role independence assumption, the EvaluatorDispute grace period, the IRiskHook dual-output shape, and the IIndependenceSignal interface design (including partial-signals handling, the confidence == 0 undefined semantics, and the dual delivery modes). RNWY’s dual-mode production deployment on Base mainnet — real-time trust oracle plus signed-attestation endpoint — validates that evidence-shipping multidimensional scoring is viable in production.
  • @douglasborthwick-cry (InsumerAPI) proposed the three-category verification framework (pre-commitment eligibility, post-hoc resolution evidence, behavioral reputation) in PR #1632, identified the implicit pre-commitment assumptions inside SlashingLoss and AMLFreeze, and contributed the wallet-state attestation primitive as a reference for pre-commitment verification.
  • @cmayorga (DeFiRe Labs) contributed Foundry test vectors covering all 14 test scenarios in PR #1647, multi-hop reference scenarios in PR #1653, and implementer feedback grounded in two independently deployed products: Lockstep (56 tests) and Catalyst (53 tests).
  • @bakugo32 (Demsys) proposed the structure-vs-behavior dichotomy that helps articulate the responsibility boundary between AAP and ERC-8183, surfaced the “on-chain slash event as auto-eligibility signal” design pattern and validated it in production, and shipped the stake-weighted Evaluator selection plus bounded re-draw patterns.
  • @thoughtproof authored the companion Informational ERC (Structured Verification Output Schema) defining the standardized JSON format for verification output, with claimId binding, the upstream field, and composition mapping tables — aligning the verification layer with AAP’s claim lifecycle.

Summary of core changes

v2 currently tracks seventeen items, grouped by maturity and the kind of change involved.

A. Core spec text changes (items 1-4)

The core thread is making the assumptions inherited from ERC-8183 explicit. v2 introduces an “Inherited Assumptions” subsection covering two layers: (1) role independence — AAP cannot judge at the protocol layer whether Provider / Evaluator / Resolver are genuinely independent; (2) pre-commitment facts — CoverageTypes like SlashingLoss and AMLFreeze implicitly require on-chain state conditions that v1 takes on trust rather than verifies. v2 upgrades “trust” to “verification” through the IRiskHook extension. Related items in this group: extending EvaluatorDispute eligibility, adding independence-check use cases to IRiskHook, and surfacing the Role Independence Assumption in Security Considerations.

B. Smaller refinements from community discussion (items 5-9)

These do not change interface semantics, but make implementations clearer or spec wording more accurate. Includes: typed custom errors on commitToJob, a chained-workflows known-limitations statement, a totalFunded wording fix, guidance on resolveClaim reason handling, and referencing the multi-hop reference scenarios from PR #1653 in the Reference Implementation section.

C. Structural / extension-level changes (items 10-16)

This is the substantive part of v2. Includes:

  • New RoleCollusion CoverageType, separating “collusion that completed cleanly” from “dispute with an on-chain trail” at the semantic level
  • IRiskHook upgraded to evidence + score dual output, with evidenceRef shaped so it can point to a single attestation or an aggregation of multiple independent attestations (interface-level anchor, schema-free)
  • Evidence-First Composability Principle as a new Rationale section, covering both the single-hook evidence-first output and multi-attestation composition
  • IIndependenceSignal abstract interface, supporting both on-chain oracle and off-chain signed-attestation delivery modes, with independent defined as undefined (not fail-closed) when confidence == 0
  • Stake-weighted Evaluator selection reference pattern, with Demsys’s agent-settlement-protocol as the live reference
  • “Integer Job Identifiers” Rationale note (non-normative), giving uint256 jobId implementations of ERC-8183 a canonical adaptation path

D. Tracked but not yet decided (item 17)

Whether to promote upstream / reasoningCID / slash evidence hash to first-class bytes32 fields on the Claim struct, pending more implementer reports of the same gas and indexability friction. Currently leaning observe.

Deferred out of v2: cross-chain assurance (waiting on cross-chain messaging standards), partial payout on insolvency (v1’s revert-on-insolvency preserves accounting-equation simplicity), and Resolver governance mechanisms (implementation layer, not protocol layer).

Full text, wording drafts, and triggering context for each item are in Part 2.


Open questions for community input

Ahead of the v2 PR (which will only open after v1 merges), we would particularly like community input on the following:

  1. RoleCollusion as a separate CoverageType (item 10) — is the semantic-clarity gain worth the enum expansion? Are there implementation concerns we have not considered?

  2. Behavioral similarity as a fifth core signal category (item 15) — should it sit alongside funding origin overlap, temporal proximity, relationship density, and ownership signals in the minimum set, or remain an open discussion category?

  3. High-frequency composition metadata (item 17) — if you are implementing ERC-8210 and have hit gas or indexability friction with the opaque evidence bytes approach, please share. We want to calibrate direction A vs direction B with more than one data point.

  4. IIndependenceSignal composition with IRiskHook (item 15) — parallel interfaces, inheritance, or one consuming the other? We have left this under-specified in the draft to keep the decision space open.

  5. Anything else in this changelog that looks wrong, redundant, or incomplete.


Process notes

  • v2 work begins once v1 merges.
  • All v2 changes will go through a new PR, not by editing the v1 PR.
  • When the v2 PR opens we will post a final changelog here and ping the contributors named above.

This thread will stay open through the v1 review period. Pushback, corrections, and additions are all welcome, whenever v1 merges and v2 work actually starts, the input gathered here will shape how we open the v2 PR. Given how much has been consolidated here, if any contribution has been missed or misattributed, please flag it.

Part 2 (full text of all seventeen items) follows as a reply to this post.

ERC-8210 v2 Changelog — Part 2 of 2: Full Text of All Seventeen Items

Continuing from Part 1. Below is the full content of the seventeen items, grouped as in the summary.


A. Core spec text changes (targeted for v2)

1. New “Inherited Assumptions” section in Rationale

A dedicated subsection in Rationale making the inherited assumptions from ERC-8183 explicit, covering two layers:

Role independence: AAP assumes that the Client, Provider, and Evaluator roles defined in ERC-8183 are genuinely independent. AAP cannot verify this at the protocol layer. If the assumption fails (for example, Provider and Evaluator sharing identity), the EvaluatorDispute path acts as a remediation channel, but that path depends on external independence signals supplied by a trust scoring layer or attestation provider. This part is triggered by @RNWY raising the role-collusion attack vector.

Pre-commitment facts: Some CoverageTypes implicitly require pre-commitment facts that v1 trusts rather than verifies. SlashingLoss is only meaningful if the Agent is actually staked; AMLFreeze is only meaningful if the wallet has passed AML screening. This part comes from @douglasborthwick-cry’s observation in PR #1632 — he did more than flag the problem, also pointing to the resolution path: the IRiskHook extension (items 3 and 11) lets implementations perform explicit on-chain state verification at commitToJob time, upgrading “trust” to “verification.” Douglas also contributed a wallet-state attestation primitive as a reference implementation shape for pre-commitment verification (ES256 + JWKS, covering 33 chains, with signing content including block and condition, the Assured Agent not holding the signing key, and anyone able to independently re-run the verification).

2. Extend EvaluatorDispute eligibility

The current wording (“formal dispute state or on-chain dispute attestation”) cannot accommodate the case where a Job reaches the Completed terminal state but an independence violation is surfaced afterwards. This scenario was raised by @RNWY.

v2 will:

  • Allow an EvaluatorDispute Claim to be filed within a grace period after Completed (suggested minimum 7 days, implementation-defined), provided an independence-violation attestation is supplied.
  • Keep the current behavior as the default, so implementations must explicitly opt in to preserve backward compatibility.

3. IRiskHook: independence-check use case

The IRiskHook section currently only describes reputation-based collateral recommendations. Driven by discussion between @RNWY and @thoughtproof on cross-vendor independence signaling, v2 will add:

  • A hook implementation MAY reject commitToJob based on an independence signal between Beneficiary and Assured Agent.
  • A hook implementation MAY dynamically adjust the recommended committedAmount based on an independence confidence score.
  • A suggested (non-binding) interface shape: assessIndependence(addrA, addrB) returns (independent, confidence, signals).

4. Security Considerations: Role Independence Assumption

As an extension of item 1, a new paragraph in Security Considerations surfacing the role independence assumption explicitly, noting that it is protected by both the IRiskHook extension layer and Claims Resolver judgment, and recommending that implementations integrate at least one independence signal source.


B. Smaller refinements from community discussion

5. Custom errors on commitToJob

Replace string-based require reverts with typed custom errors. This suggestion came from @cmayorga:

  • InsufficientAvailableAmount(uint256 available, uint256 requested)
  • DuplicateCommitment(bytes32 jobId, CoverageType coverageType)
  • AdverseSelectionBlocked(bytes32 jobId)
  • AccountNotActive(address agent)

Rationale: automated orchestrators need structured failure reasons to decide between retry, abandon, and alert paths.

6. Chained workflows limitation statement

Add to Rationale: each JobAssurance is 1:1 bound to a single Job, AAP does not track upstream dependencies, and in multi-agent pipelines (A → B → C → D) the Client should set up independent JobAssurance at each hop. Cross-Job causal tracing is an application-layer concern, out of scope for the AAP core.

This converges @cmayorga’s multi-hop workflow scenarios with @thoughtproof’s upstream field design.

7. totalFunded wording fix

Current: “totalFunded monotonically reflects the Agent’s historical funding commitment.”

Issue: withdrawals decrease totalFunded, so the wording is inconsistent with the reference implementation. Found during code review.

Revised: “totalFunded reflects the cumulative net inflow of the Agent’s funding commitment (cumulative deposits minus cumulative withdrawals).”

8. resolveClaim reason handling guidance

The spec is currently silent on whether the reason parameter should be stored in full or hashed. Based on the design decision in the reference implementation (wangbin9953/erc8210-aap), v2 will add implementation guidance: store keccak256(reason) (consistent with how evidence hashes are handled), with the full content tracked off-chain via the ClaimResolved event and referenced through IPFS CIDs or on-chain attestations.

9. Reference multi-hop scenarios in the spec

@cmayorga in PR #1653 was the first to land the three-layer architecture (Structure / Behavior / Recovery) from forum discussion into runnable end-to-end Foundry code, integrating design inputs from Demsys, RNWY, and ThoughtProof. v2 will reference these scenarios under assets/erc-8210/scenarios/ in the Reference Implementation section (or a new “Composition Patterns” subsection) as the canonical reference, covering:

  • Multi-hop dependency tracking via the upstream field
  • EvaluatorSlashedfileClaim as automatic claim evidence
  • Hybrid off-chain scoring reusing reasoningCID across Layer 2 and Layer 3

Contributor credit will be given in Acknowledgments rather than in the spec body.


C. Structural / extension-level changes

10. New CoverageType: RoleCollusion

Item 2 extends EvaluatorDispute to cover the role-collusion scenario. However, @RNWY pointed out that the two scenarios have fundamentally different trigger semantics: EvaluatorDispute presupposes an on-chain dispute state, while RoleCollusion is characterized precisely by the absence of a dispute trail (the collusion completed cleanly). Folding both into a single CoverageType would produce two mutually exclusive sets of eligibility conditions inside one Integration-with-ERC-8183 table.

v2 will introduce RoleCollusion as a separate CoverageType:

  • Separate eligibility conditions (RoleCollusion: post-completion attestation + grace period; EvaluatorDispute: pre-completion dispute state extension)
  • Shared Resolver path and payout mechanism, different trigger condition only
  • Cleaner for future Resolver qualification and processing workflows

Community input on whether the semantic-clarity gain justifies the enum expansion is welcome.

11. IRiskHook: evidence + score dual-output shape

v1’s IRiskHook returns a single recommended amount. v2 will generalize IRiskHook to return both:

  • An evidence reference (bytes32)
  • A score component

This lets Resolvers consume the evidence directly rather than relying on an opaque aggregated number.

evidence reference shape conventions: evidenceRef is a bytes32, and may point to either a single attestation or an aggregation of multiple independent attestations. The specific transport shape (IPFS CID, on-chain registry hash, signed off-chain payload hash, etc.) is left to implementations; when multiple attestations are combined, each should be independently verifiable, no wrapper signature expected. The specific envelope schema is not specified in the ERC-8210 spec and is left to separate specs and the relevant communities. This is an intentional “interface-level anchor, schema-free” design: giving aggregation a concrete landing point without pulling the spec scope too wide.

Verification taxonomy in the Rationale: IRiskHook’s v2 rationale will reference the three-category verification taxonomy @douglasborthwick-cry proposed in PR #1632, so implementers understand that different verification types correspond to different integration points and representative work:

  1. Pre-commitment eligibility — whether the Agent meets certain on-chain conditions (wallet state, staking status, AML screening status, etc.) before commitToJob. Representative work: InsumerAPI’s wallet-state attestation.
  2. Post-hoc resolution evidence — whether the claim is valid at resolve time during resolveClaim. Representative work: @thoughtproof’s verification schema (consumed by resolveClaim’s reason bytes).
  3. Behavioral reputation — whether the Agent has behaved reliably over a historical window. Representative work: RNWY and similar trust scoring oracles.

These three can be aggregated through the same IRiskHook interface, but correspond to different data sources, validity windows, and consumption timing. The framework helps implementers understand that IRiskHook is not a single verification pickup but a composable point for multiple types of input.

The observation driving the IRiskHook dual-output shape comes from @RNWY, based on production experience with multidimensional scoring (Activity / Risk dual score, quadrant system, five classes of sybil signals) and empirical data on volume-vs-trust decoupling that makes a single aggregated score insufficient in practice.

12. New Rationale section: Evidence-First Composability Principle

v2 will articulate the design principle implicit across the other changes: keep the canonical interface minimal, let composition metadata live in the payload rather than the interface signature, and prefer shipping evidence objects over aggregated scores when downstream consumers need to make their own judgments. This principle applies to IRiskHook, IAMLHook, and any future extension hooks.

The principle covers two layers: single-hook evidence-first output (the original formulation, from @RNWY’s observation that the evidence object can carry the signals Resolvers need), and multi-attestation composition (an extension, where multiple independent issuers each sign their own payload and the aggregation becomes the evidence consumed downstream). The latter aligns with @douglasborthwick-cry’s composable attestation direction; at the spec-body level we acknowledge the aggregation capability at the interface level without binding any specific envelope format.

13. Cross-vendor independence API via IIndependenceSignal

Earlier drafts assumed we would wait for an external Informational ERC (for example, the one @thoughtproof is working on) to standardize the JSON schema for independence verification output. v2 will instead define IIndependenceSignal inside the AAP spec (see item 15), letting any trust scoring layer plug in by implementing the interface.

This upgrade is driven by @RNWY’s observation that their existing evidence object already carries the signals Resolvers need (shared funder, wallet age at review, cluster size, funder-to-owner match), making an in-spec abstract interface more actionable than waiting on an external ERC.

14. Stake-weighted Evaluator selection reference pattern

Describe the stake-weighted Evaluator selection pattern. @bakugo32 / Demsys contributed to this item at two levels:

Conceptual level: proposed the structure-vs-behavior dichotomy that helps the spec articulate the responsibility boundary between AAP and ERC-8183; proposed the “on-chain slash event as EvaluatorDispute auto-eligibility signal” design pattern, validated in Demsys’s deployed contracts rather than remaining a forum design draft.

Implementation level: agent-settlement-protocol serves as the live reference. Redeployed on Base Sepolia on 2026-04-13 with four features live:

  • setMetadata() on EvaluatorRegistry: on-chain methodology declaration by evaluators
  • Bounded re-draw in assignEvaluator(): up to 5 attempts, skipping candidates equal to provider or client, revert with EvaluatorAssignmentFailed on exhaustion. A hook observing this event can serve as a health-monitoring feedback channel for the Evaluator pool
  • EvaluatorSlashed event carrying jobId and reason
  • Post-assignment independence check in fund() (evaluator ≠ provider and ≠ client)

15. IIndependenceSignal abstract interface

Following @RNWY’s argument (2026-04-09) that the two delivery modes address different problems and both have production usage, the interface supports both:

  • assessIndependence(...) — on-chain oracle mode
  • verifyAttestation(...) — off-chain signed-attestation mode
  • Shared output shape across both

RNWY has production deployments across both modes (Base mainnet trust oracle + /api/trust-check signed endpoint + JWKS public keys), demonstrating that “same underlying data, two deliveries” is a viable implementation architecture.

Two design conventions:

  • independent is undefined when confidence == 0, not fail-closed. Following @RNWY’s argument: a fail-closed default not only violates the Transparency principle but also creates adverse incentives — all legitimate new entrants would be judged non-independent by the system, while attackers can bypass the default by fabricating history. The result is that fail-closed rewards manufactured history over honest absence. In @RNWY’s words: “Confidence zero with an explicit empty evidence payload is the only output that doesn’t lie.”
  • assessIndependence(A, B) returns the same result as assessIndependence(B, A). Independence is symmetric.

Handling of partial signals and empty evidence: not every trust layer will provide all signal categories simultaneously, and new trust layers on new chains will encounter completely unknown addresses. Forcing completeness would push implementations toward fabricating data to meet formal completeness requirements. Quoting @RNWY from the forum:

“Requiring all four categories before a result is valid would either freeze the ecosystem or push implementations toward fabricating data to meet completeness requirements. Fabricated completeness is catastrophically worse than honest partial coverage.”

This argument is grounded in production data: RNWY itself currently covers three of the core signal categories (funding origin overlap, temporal proximity, ownership signals), with relationship density still an open space for them. This public confirmation upgrades v2’s four-category framework from “theoretical inference” to “aligned with what production systems actually cover” — even production systems do not cover all four, making partial coverage the norm rather than the exception.

Accordingly, v2 rationale will make clear:

  • evidence payload MUST allow implementations to fill only the portion they can provide, and mark which are available
  • evidence MAY be empty bytes, but subject to a strict bidirectional convention: empty evidence requires confidence == 0, non-empty evidence requires confidence > 0

Minimum signal categories: funding origin overlap, temporal proximity, relationship density, ownership signals. A fifth category — behavioral similarity — is currently an open discussion item rather than part of the minimum set (see open question 2 in Part 1).

Relationship to IRiskHook: IIndependenceSignal is a companion abstraction to IRiskHook, not a replacement. A Resolver handling an EvaluatorDispute or RoleCollusion Claim can call both and combine the outputs. The two interfaces may be implemented by the same contract or by different contracts. The final composition shape is deferred to v2 PR initiation (see open question 4 in Part 1).

16. New Rationale subsection: “Implementation Note: Integer Job Identifiers” (non-normative)

v1 uses bytes32 claimId for maximum flexibility, but mainstream ERC-8183 implementations use uint256 jobId natively. @cmayorga independently reported this identity-model friction from two independently deployed products (Lockstep, 56 tests; Catalyst, 53 tests, both on Base Sepolia). Both products independently declared local Claim structs keyed by (uint256 jobId, address claimant) rather than reusing IAAP.Claim directly.

v2 will add a Rationale subsection documenting the canonical adaptation path:

“Implementations integrating with ERC-8183-style Job registries that use uint256 as the native Job identifier MAY declare a local Claim representation keyed by (uint256 jobId, address claimant), deriving the canonical bytes32 claimId via keccak256(abi.encode(jobId, claimant)) when interoperability with canonical-shape consumers is required. This adaptation preserves the semantic guarantees of the canonical interface while reducing storage overhead and improving indexability for integer-keyed deployments.”

This change touches only Rationale. The normative Specification text is not affected.


D. Tracked but not yet decided

17. High-frequency composition metadata as first-class Claim fields (observation period)

Based on Lockstep and Catalyst, @cmayorga reports that placing upstream, reasoningCID, and slash evidence hashes inside the opaque evidence bytes of fileClaim carries measurable gas and indexability costs in production. Both products lift these into first-class bytes32 Claim fields for three reasons: ABI-decoding opaque bytes on every read, typed event fields being indexer-friendly, and this kind of composition metadata being high-frequency reuse across Scenarios 1 / 2 / 3.

This creates a real tension with item 12’s Evidence-First Composability Principle, which would otherwise argue for keeping these in the payload.

Two possible v2 directions:

  • Direction A: keep v1’s opaque bytes design. Item 16’s Rationale gives implementers a workable adaptation path.
  • Direction B: add optional first-class fields to the Claim struct (bytes32 upstream, bytes32 reasoningCID, bytes32 slashEvidenceHash), zero-valued when unused.

Current threshold: we would like to see at least one more independent implementer report the same friction before moving to direction B. Until then, the default lean is direction A.

If you are implementing ERC-8210 and have feedback on this tradeoff, please reply under open question 3 in Part 1.


That’s the complete v2 changelog. Given the volume of material consolidated here, there is a reasonable chance I have missed a contribution or misattributed an idea to the wrong person. If you see something that should be credited differently, a detail that is inaccurate, or a piece of context that belongs in here but isn’t, please say so — correcting the record before the v2 PR opens is exactly what this review window is for. Open questions for the direction itself are in Part 1.

Thank you Jacky; excited to see it all come together!