{"content":"merge: feat/nft-offer-e2e → main (--no-ff, 61c7d4bd) — the MRC-721 open offer is ready for the bot-run end-to-end acceptance.\n\nFour commits land, zero conflicts, and main had not drifted from the branch base: (1) take funding uses ordinary coin selection — several inputs plus buyer change at output2 — because the seller's SINGLE signature commits only output0. This removes the practical blocker where the inherited directed-swap rule demanded one near-exact UTXO. (2) Hard cancel — revoke-then-declare: a self-transfer moves the item to a fresh outpoint so the public signed offer can never complete, then the active:false pin stops the advertising. It is idempotent, and the take refuses cancelled index rows. (3) An honest, bot-navigable market — chain-checked LIVE/DEAD per row, a seller filter that accepts a local bot name (resolved to the 64-hex MetaID the MetaSo index keys on), and offer payloads printed on the offer receipt and per row. (4) docs/nft-offer-e2e-playbook.md, the seller/buyer playbook the bots execute themselves.\n\nPost-merge gate on main: test:mrc721 106 node + 34 tsx green. Branch and worktree removed. Not pushed. Next: the owner restarts the dev app from main, and two local bots run the playbook (seller role, buyer role, optional Phase C hard-cancel) against the production MetaSo index (offer flag enabled, endpoints verified).","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}