How Caper approaches this
A caper sits at the typed end, and deliberately. An executive proposal carries a kind discriminator, and the logic package live at the time of writing recognises six, five of which execute: pay an address from the treasury (PAYOUT), buy another caper's token (INVEST), sell one back down its curve (DIVEST), rewrite the mutable metadata of the caper's own token (METADATA), or – on the platform's own caper only – swap the shared logic tier that every caper runs (UPGRADE) – plus a sixth that executes nothing at all, DEBATE, a ranked position in an argument that is terminal at the tally. There is no calldata field. A proposal cannot encode a call the contract does not already know how to make.
Read on-chain again on 30 September 2026: the CaperMain the live CaperRegistry (component_tdx_2_1cpndqmgr…) resolves to today (component_tdx_2_1cqma5fh…, the logic upgrade of 30 September 2026 on the registry the full redeploy of 25 September 2026 published) exposes twenty-one methods and one instantiation function; exit_open, added on 21 September, is the twenty-first. From 5 September to the redeploy of 18 September every component carried twenty-two: component_tdx_2_1czm6lcn… on 5 September, component_tdx_2_1cr8psn5… after 7 September, component_tdx_2_1cq64v5tw… after 11 September and component_tdx_2_1cq6jcm9… after 15 September.
The 7 September redeploy retuned the governance windows and the price measurement; the 11 September one changed what existing methods do – exit, for one, now takes amounts rather than buckets; the 15 September one changed how buys, sells and exits charge the trade fee and the founder's skim; the 18 September redeploy removed the $XRD caper and the trade fee on sells; the 21 September redeploy added exit_open (component_tdx_2_1czmc8h0…), which records a member's vote-token balance so that exit can only burn tokens that account gave up; and the 25 September redeploy replaced the trade fee with the treasury's share of the skim, with the method surface unchanged.
The only methods to go were two address reads, dao and treasury, dropped by the logic upgrade on the afternoon of 18 September; that upgrade and the one of 19 September 2026 otherwise changed only how the skim is priced and its shape. None added a method. Six of the methods are executors – one per executable kind, plus the second leg of the upgrade – and none of the twenty-one is a generic call entry point of any shape. That count is worth stating because it did not move when the enumeration did: DEBATE, the kind added on 5 September 2026, executes nothing, so it needed no executor, and a diff of the method surface would not have shown the change at all.
The consequences run both ways, and both are worth stating. A reader can tell what a proposal does from its kind and its typed fields, so the Tornado failure mode – a description that does not match the payload – has no room to occur. But the enumeration really is a ceiling: adding a kind needs a new logic package, not merely a passed proposal. Caper's answer to that is the UPGRADE kind, which swaps the logic tier and is itself a proposal subject to the same resolution rule.
Its enumeration has now moved in both directions, which is where the versioning question above stops being hypothetical. The discriminants run 0 PAYOUT, 1 INVEST, 3 UPGRADE, 4 DIVEST, 5 METADATA and 6 DEBATE: the gap at 2 was VOTE, an action that let one caper cast its treasury’s ballot inside another, and it died with the escrow voting system it belonged to. The number was retired rather than recycled, and the creation-time whitelist – 0 | 1 | 3 | 4 | 5 | 6 – still names VOTE in its abort message, so a proposal built against the old interface fails at creation with a message that says why, instead of decoding into some later kind. That is the loud-and-early handling, chosen at the cost of a permanently unusable discriminant.
The widening is the more instructive half, because it puts a price on the ceiling described above. DEBATE was written into the contract source on 30 August 2026 and could not be used for six days. The app half shipped first, so the create-proposal form, the published OpenAPI document and the MCP tool manifest all advertised a kind the deployed component refused, and a proposer who picked it got an abort naming the long-retired VOTE.
Closing the gap took what a typed design always requires and an arbitrary-execution design never does: a newly published logic package and a governed swap of the registry’s current_main, both completed on the morning of 5 September 2026. A Governor DAO wanting the same thing – a proposal that is voted on and deliberately executes nothing – expresses it with an empty targets array and deploys nothing. That is the trade in one worked example: legibility bought at the price of a contract release, and a six-day window in which the interface and the ledger disagreed about what a proposal was allowed to say.
One thing this page's axis does not anticipate: a caper's proposal has to be legible twice, to voters and then to the market. It is a ranked ballot over two to five options – at least one a “Do nothing”, at least one an answer other than it – and clearing that ballot only opens the optimistic market window; the winning action executes if the token's time-weighted price across the window holds at or above the trailing average locked at the trigger (optimistic governance is the wider family). Typing therefore does its work on both readers: a voter ranks options whose payloads the enumeration has already constrained, and a holder who wants to veto one is selling against an action they can read rather than a title they have to trust.