{
  "status": "requires_protocol_change",
  "checkedAt": "2026-09-27T02:14:00Z",
  "sources": [
    {"url": "https://imd.fun/docs/", "kind": "IMD API docs", "checkedAt": "2026-09-27"},
    {"url": "https://api.imd.fun/version", "kind": "live version", "commit": "a073ba4efbfaf6de4b73d808e1542617eaf31412", "protocolVersion": 1},
    {"url": "https://api.imd.fun/health", "kind": "live health/payment counters", "checkedAt": "2026-09-27"},
    {"url": "https://api.imd.fun/requests/capabilities", "kind": "live payment capabilities", "checkedAt": "2026-09-27"},
    {"url": "https://github.com/Identity-md/worker", "kind": "worker distribution", "release": "0.1.0+5cdc3b11"},
    {"url": "https://api.imd.fun/wallets/0x6d2f9da1911e88a116c6228f07e7cab9a927be9e/earnings?limit=5", "kind": "bounded earnings sample", "checkedAt": "2026-09-27"},
    {"url": "https://api.imd.fun/launches/5af340ea-6022-40a8-b2c0-861d59a51fff", "kind": "bounded launch allocation sample", "checkedAt": "2026-09-27"},
    {"url": "https://pool4.imd.fun/docs", "kind": "POOL4 docs", "checkedAt": "2026-09-27"},
    {"url": "https://eips.ethereum.org/EIPS/eip-8004", "kind": "ERC-8004 standard", "checkedAt": "2026-09-27"},
    {"url": "https://github.com/erc-8004/erc-8004-contracts", "kind": "ERC-8004 reference contracts", "checkedAt": "2026-09-27"}
  ],
  "earningStreams": [
    {"name": "mainnet customer intake", "asset": "IMD", "chain": "Ethereum mainnet", "route": "x402 exact + Permit2", "payTo": "0x4e0fa57bde726079356537e2f34d671e9f41adbc", "recipient": "operator/gas wallet", "workerPayoutConfirmed": false, "confidence": "confirmed intake; worker distribution unverified"},
    {"name": "Sepolia launch allocations", "asset": "launch-specific ERC-20", "chain": "Sepolia", "route": "public earnings and launch allocation records", "recipient": "wallet recorded with deviceKey", "claimContract": "unverified", "confidence": "allocation record confirmed; payment/claim unverified"},
    {"name": "POOL4 NFT node reserve", "asset": "IMD", "chain": "Ethereum mainnet", "route": "RewardDistributor booking; node payout contract not shipped", "recipient": "planned NFT inference nodes", "confidence": "reserve confirmed; live worker payout unverified"},
    {"name": "POOL4 staking return", "asset": "IMD via sIMD shares", "chain": "Ethereum mainnet", "route": "RewardDripper to StakedIMD vault", "recipient": "IMD stakers", "confidence": "documented staking stream; not worker/NFT attribution"}
  ],
  "recipientControl": {
    "erc8004AgentWalletControlsCurrentPayouts": false,
    "determination": "not demonstrated; ERC-8004 payment rails are out of scope and IMD documents an operator payTo for intake",
    "immutableSplitterSufficientAlone": false,
    "reason": "a splitter only enforces funds that reach it; direct operator payment, manual forwarding, revocable allowance, or owner-changeable destination can bypass it"
  },
  "perSeatAttribution": {
    "status": "insufficient",
    "availableKeys": ["tokenId", "deviceKey", "jobId", "wallet", "agentId"],
    "problem": "seat work is tokenId-keyed while sampled earnings are wallet/deviceKey/launch keyed; multiple seats can share a wallet",
    "reliableJoin": false
  },
  "delayedEarningsAttribution": {
    "status": "insufficient",
    "observedEpochFields": ["from", "to", "version", "policyVersion", "launchNumber"],
    "preservesImmutableAgreementVersion": false,
    "problem": "no demonstrated claim key that survives exit, amendment, delayed payment, and NFT transfer"
  },
  "unilateralTermination": {
    "futureParticipation": "partially documented via worker unlink/disconnect controls; agreement semantics and balance independence unverified",
    "oldBalancesRemainWithdrawable": "unverified",
    "required": "close future work only; retain immutable old claim terms and independent withdrawals"
  },
  "ownerRevoke": {
    "status": "unverified",
    "confirmedWorkerUnlink": false,
    "required": "owner-signed revoke scoped to tokenId/deviceKey/agreementId that blocks future dispatch without freezing old claims"
  },
  "requiredProtocolChanges": [
    "Make each covered payout source credit an immutable agreement receiver rather than an operator wallet or manual allocation path",
    "Persist tokenId, deviceKey, jobId or epoch, agreementId, and immutable agreementVersion with every entitlement",
    "Create new agreement versions for amendments and preserve old versions for delayed claims",
    "Define NFT-transfer treatment for future work versus already credited balances",
    "Add permissionless owner/host exit and owner-scoped hosted-device revoke",
    "Add independent withdrawals and authoritative events/read routes",
    "Publish verified source, addresses, and payout transaction examples for every earning stream"
  ],
  "openQuestions": [
    "What verified contract pays worker hosts for mainnet accepted work, if any?",
    "What exact contract and claim function settles Sepolia allocation records?",
    "Does any IMD payout adapter read ERC-8004 agentWallet, or is it ignored?",
    "What is the authoritative join from wallet/deviceKey allocation to tokenId when one wallet hosts several seats?",
    "What owner action independently revokes one hosted device, and what happens to delayed claims?",
    "Are existing balances withdrawable by either party after host exit, owner exit, amendment, and NFT transfer?"
  ]
}
