{"ok":true,"handoffMap":{"schema":"odei.daorg.handoff-map.v1","version":"2026-05-15","self":"/api/daorg/runtime/handoff-map","publicUrl":"https://daorg.odei.ai/api/daorg/runtime/handoff-map","state":"staged","summary":"Local app, app.odei.ai, and DAOrg each publish one public artifact before the operating loop can be called complete.","blocked":[],"staged":["local-app-proof","daorg-receipt-finality"],"promotionDecision":{"state":"staged","readyToPromote":false,"readyItems":1,"stagedItems":2,"blockedItems":0,"totalItems":3,"readyEvidence":5,"requiredEvidence":11,"pendingEvidence":6,"blockedEvidence":0,"firstBlockingItem":"local-app-proof","firstBlockingOwner":"Local app","firstBlockingEvidence":"Local proof contract","summary":"1/3 handoff lanes are promotion-ready; 5/11 evidence items are ready.","nextAction":"Close Local proof contract for Local app."},"itemCount":3,"nextAction":"Close Local proof contract for Local app.","items":[{"id":"local-app-proof","owner":"Local app","artifact":"Runtime receipt, heartbeat, and execution proof","state":"staged","summary":"Private execution stays local until the app emits a public-safe proof artifact with stable hashes and redacted summary.","nextAction":"Emit runtime receipt and heartbeat, then submit public-safe proof into the app intake route.","requiredEvidence":[{"label":"Local proof contract","url":"https://daorg.odei.ai/api/daorg/runtime/local-proof-contract","state":"staged"},{"label":"Runtime receipt","url":"https://app.odei.ai/runtime-receipt.json","state":"staged"},{"label":"Runtime heartbeat","url":"https://app.odei.ai/runtime-heartbeat.json","state":"staged"},{"label":"Execution proof template","url":"https://app.odei.ai/intake-status/{intakeId}/execution-proof","state":"staged"}],"acceptanceCriteria":["Public artifact uses stable sha256 hashes.","Raw local memory, prompts, and private payloads are redacted.","Receipt, heartbeat, and execution proof resolve before the lane can pass.","Heartbeat generatedAt is fresh before the lane can close."],"route":"/api/daorg/runtime/local-proof-contract","publicUrl":"https://daorg.odei.ai/api/daorg/runtime/local-proof-contract","href":"/api/daorg/runtime/local-proof-contract","hrefLabel":"Proof contract","evidenceRollup":{"state":"staged","readyEvidence":0,"requiredEvidence":4,"pendingEvidence":4,"blockedEvidence":0,"acceptanceCriteria":4,"readyToPromote":false,"pendingLabels":["Local proof contract","Runtime receipt","Runtime heartbeat","Execution proof template"],"blockedLabels":[],"summary":"4 evidence items are still staged."}},{"id":"app-session-handoff","owner":"app.odei.ai","artifact":"Verified holder and operator session handoff","state":"pass","summary":"The app owns identity and operator context; DAOrg only trusts the session after the shared handoff secret verifies it.","nextAction":"Keep ODEI_DAORG_AUTH_SECRET configured before calling app sessions a governance boundary.","requiredEvidence":[{"label":"App profile","url":"https://app.odei.ai/profile?tab=governance#governance","state":"pass"},{"label":"Session handoff route","url":"https://app.odei.ai/auth/daorg/session-handoff","state":"pass"},{"label":"Shared handoff secret","url":"/api/daorg/runtime/readiness","state":"pass"}],"acceptanceCriteria":["ODEI_DAORG_AUTH_SECRET is configured before imported sessions are trusted.","Imported session includes holder, operator context, and return target.","DAOrg records source as app-session instead of silently treating it as wallet-only."],"route":"https://app.odei.ai/profile?tab=governance#governance","publicUrl":"https://app.odei.ai/profile?tab=governance#governance","handoffUrl":"https://app.odei.ai/auth/daorg/session-handoff","href":"https://app.odei.ai/profile?tab=governance#governance","hrefLabel":"App profile","evidenceRollup":{"state":"pass","readyEvidence":3,"requiredEvidence":3,"pendingEvidence":0,"blockedEvidence":0,"acceptanceCriteria":3,"readyToPromote":true,"pendingLabels":[],"blockedLabels":[],"summary":"Required evidence is complete."}},{"id":"daorg-receipt-finality","owner":"DAOrg","artifact":"Motion proof index, decision receipts, and reward receipt index","state":"staged","summary":"DAOrg owns public memory. Motion proof can be indexed now; DAOrg-native rewards need the first complete receipt cycle.","nextAction":"Close the first contribution-to-reward receipt cycle before claiming DAOrg-native reward finality.","requiredEvidence":[{"label":"Motion proof index","url":"https://daorg.odei.ai/api/daorg/proofs","state":"pass"},{"label":"Reward receipts","url":"https://daorg.odei.ai/api/daorg/rewards/receipts","state":"staged"},{"label":"Reward finality verifier","url":"https://daorg.odei.ai/api/daorg/rewards/verifier","state":"staged"},{"label":"Rewards paid fact","url":"https://daorg.odei.ai/api/daorg/rewards/paid","state":"pass"}],"acceptanceCriteria":["Motion proof index exposes the proofHash for every public motion.","Reward finality requires a DAOrg-native reward receipt, not only the paid fact.","Reward finality verifier passes before DAOrg-native reward finality is claimed.","Decision receipt remains public after execution or reward state changes."],"route":"/api/daorg/rewards/verifier","publicUrl":"https://daorg.odei.ai/api/daorg/rewards/verifier","href":"/api/daorg/rewards/verifier","hrefLabel":"Finality verifier","evidenceRollup":{"state":"staged","readyEvidence":2,"requiredEvidence":4,"pendingEvidence":2,"blockedEvidence":0,"acceptanceCriteria":4,"readyToPromote":false,"pendingLabels":["Reward receipts","Reward finality verifier"],"blockedLabels":[],"summary":"2 evidence items are still staged."}}],"mapHash":"sha256:8570e6528d9a445aa7c053907a13405cec6f9192a5dcf81c7e338bcebb3869ea"}}