Booster v2.0 × ImplicitWrap × UCP Catalog — Trace-as-Consent Aggregation Layer

<aside> 📜

Chartered by: Trace-as-Consent Federation (EU AI Act anchor) • Signatory: Pareto Prime (Eternal Diamond) • Charter Surface row:

Vetoable here: any consent-strength downgrade (reclassifying a conduct event as notice) without federation ratification.

</aside>

<aside> 🔗

Single-path output. Aggregates four sources — ‣, ‣, ‣, and ‣ — into a unified Trace-as-Consent layer. Extends implicitlyAgrees beyond function calls to every trace-leaving event (unique views, clicks, catalog queries, MCP tool invocations, A2N peer messages). Compliant with UCP Catalog spec (ucp.dev/2026-04-08/specification/catalog/) using reverse-domain capability namespace io.genesisconductor.*.

</aside>

Layer 1 — Solution

1. Aggregation topology

flowchart LR
	subgraph SOURCES["Source artifacts (4)"]
		BV2C["Booster v2.0 source\\n(ImplicitAgreement.sol\\n+ SupportEscrow.sol\\n+ EulerCycleAttestorV2.sol)"]
		BV2W["Booster v2.0 tracker DB\\n(SBT Token ID, Proof Hash,\\nBase L2 Tx, Auditor Drift)"]
		IWA["ImplicitWrapArbiter JSONL\\n(IWA-000…IWA-170,\\nVDF batching N=256,\\nGeth-finality gating)"]
		GWB["Genesis Workers Bundle\\n(W-14 gc-synthesis,\\nIngestor/Graphweaver/\\nOracle/Auditor/Publisher)"]
	end
	subgraph AGG["Trace-as-Consent aggregation"]
		TL["Off-chain Trace Ledger\\n(D1 + KV, signed events)"]
		BM["Batch Merkleizer\\n(N=256, ~17min window)"]
		ECA["EulerCycleAttestor v2\\nsettleCycle → KVDF NFT"]
		IA["ImplicitAgreement.sol\\nrecord per agent"]
	end
	subgraph UCP["UCP Catalog binding\\n(io.genesisconductor.*)"]
		CS["catalog.search"]
		CL["catalog.lookup"]
		SIG["Signals\\n(buyer_ip, user_agent,\\ndev.ucp.session_id)"]
		CTX["Context\\n(eligibility = reverse-domain\\nnon-identifying claims)"]
	end
	BV2C --> IA
	BV2C --> ECA
	BV2W --> ECA
	IWA --> BM
	GWB --> TL
	TL --> BM
	BM --> ECA
	ECA --> IA
	CS --> TL
	CL --> TL
	SIG --> TL
	CTX --> IA

2. Trace-as-Consent — the core extension

Problem: implicitlyAgrees in ‣ binds only on direct function calls to gated contract methods. A reader who views the SKILL.md, an agent that fetches the catalog, or an MCP client that lists tools never sends a transaction — and therefore leaves no on-chain agreement record. The legal-by-conduct chain breaks at the off-chain perimeter.

Reframe: Treat every trace-leaving event as a candidate for implicit consent. Capture off-chain, batch via Merkle root (reusing IWA-020's BATCH_SIZE_N=256 pattern), commit batch root on-chain through EulerCycleAttestorV2.attestVdfProof(). The batch commit IS the agreement-formation event for all events it covers.

Event taxonomy (every row capturable by the W-14 gc-synthesis worker):

Event class Trigger Signals captured Consent strength view Unique page/SKILL/catalog read buyer_ip, user_agent, session_id, page_id, dwell_ms Notice (legible terms posted)
click UI interaction (button, link, command) Same as view + element_id, ts Conduct (active selection) catalog_search dev.ucp.shopping.catalog.search call query_text, filters_hash, context.eligibility[] Conduct (programmatic intent)
catalog_lookup dev.ucp.shopping.catalog.lookup call identifier_set_hash Conduct mcp_tool_list MCP listTools JSON-RPC client_id, capability_filter Notice
mcp_tool_call MCP callTool JSON-RPC tool_name, args_hash Conduct (binding by interaction) a2n_announce POST /v1/a2n/announce device_id, role, pubkey Conduct (joining the mesh)
a2n_receive POST /a2n/receive from, intent, schema Conduct (consuming an artifact) function_call On-chain tx to gated function tx_hash, block, caller Conduct + immutable record (existing)

Consent strength matters because UCP Catalog distinguishes session-specific (non-binding) from transactional (binding). Per spec: "Catalog responses ... are not transactional commitments — checkout is authoritative." We honor that:

3. UCP Catalog binding

Genesis Conductor capabilities exposed as UCP Catalog entries under reverse-domain namespace io.genesisconductor.*. The Catalog spec's metadata field is the carrier for our implicit-contract hooks.

Capability registry:

Capability ID UCP analog Function io.genesisconductor.skill.search dev.ucp.shopping.catalog.search Search /maru, Greg, Retraining Worker, etc. by task_type / model_class
io.genesisconductor.skill.lookup dev.ucp.shopping.catalog.lookup Retrieve skill by URL or capability ID io.genesisconductor.cycle.settle (checkout analog) Authoritative on-chain settlement via EulerCycleAttestorV2
io.genesisconductor.attest.trace (extension) Submit batched off-chain trace for on-chain attestation io.genesisconductor.agreement.lookup (extension, identity-linking analog) Query agent's implicit-agreement state on-chain

Skill-as-Variant mapping (each skill = one Variant under a Product):