{"algorithms":[{"algorithm_params":{"items":["<item_id>","...","or {\"id\": \"<id>\", \"indivisible\": true|false}"]},"id":"split.v1","limits":"items <= 1024; each party's valuations are integers summing to exactly 1000 points; indivisible items are rejected — use random.v1 for who-gets-the-indivisible-thing","name":"Fair division, fixed budget (adjusted winner 2-party; proportional n-party)","note":"the fixed 1000-point budget makes envy-freeness and equitability unconditional and closes scale inflation (ADR-0011). Validate before committing: POST /v1/deals/{id}/validate-input.","parties":"2..=16","party_input":{"valuations":{"<item_id>":"<integer 0..=1000>"}},"test_vectors":[{"algorithm":"split.v1","description":"two-party fixed budget, no fractional split needed: clean phase-1 assignment already equalises at 600","expected_output":{"allocations":[{"items":[{"fraction":"1","item":"i1"}],"party":"alice","points":"600"},{"items":[{"fraction":"1","item":"i2"}],"party":"bob","points":"600"}],"method":"adjusted_winner"},"expected_output_sha256":"d1cee290747809cbb19626a1e06757ce866f9520e127ecb8993589644831d5d8","input":{"items":[{"id":"i1","valuations":{"alice":600,"bob":400}},{"id":"i2","valuations":{"alice":400,"bob":600}}],"parties":["alice","bob"]},"vector_id":"split-001"},{"algorithm":"split.v1","description":"two-party fixed budget, equalising fraction: bob wins the high-ratio item, then sheds 1/6 of it to equalise at 750","expected_output":{"allocations":[{"items":[{"fraction":"1","item":"i1"},{"fraction":"1/6","item":"i2"}],"party":"alice","points":"750"},{"items":[{"fraction":"5/6","item":"i2"}],"party":"bob","points":"750"}],"method":"adjusted_winner"},"expected_output_sha256":"425884432ea07398ff73c1404e5672ebb7de3a5ae196d50e7729efa7691f0c73","input":{"items":[{"id":"i1","valuations":{"alice":700,"bob":100}},{"id":"i2","valuations":{"alice":300,"bob":900}}],"parties":["alice","bob"]},"vector_id":"split-002"},{"algorithm":"split.v1","description":"two-party fixed budget, both tie-break branches: equal points go to the lex-first party, then the trailing party","expected_output":{"allocations":[{"items":[{"fraction":"1","item":"i1"}],"party":"a","points":"500"},{"items":[{"fraction":"1","item":"i2"}],"party":"b","points":"500"}],"method":"adjusted_winner"},"expected_output_sha256":"e3ce1afd3b596e303cc0c5f086000c9fb7cef413fcea2fbbe0a26b882e209693","input":{"items":[{"id":"i1","valuations":{"a":500,"b":500}},{"id":"i2","valuations":{"a":500,"b":500}}],"parties":["a","b"]},"vector_id":"split-003"},{"algorithm":"split.v1","description":"two-party fixed budget, multi-iteration equalisation: ratio tie broken by item id, whole i2 transfers then 1/6 of i3","expected_output":{"allocations":[{"items":[{"fraction":"1","item":"i1"},{"fraction":"1","item":"i2"},{"fraction":"1/6","item":"i3"}],"party":"a","points":"2000/3"},{"items":[{"fraction":"5/6","item":"i3"}],"party":"b","points":"2000/3"}],"method":"adjusted_winner"},"expected_output_sha256":"f7ad5d68f8879da1858d8d5b8785131219146702d215404512d9f2795e3eceb3","input":{"items":[{"id":"i1","valuations":{"a":500,"b":0}},{"id":"i2","valuations":{"a":100,"b":200}},{"id":"i3","valuations":{"a":400,"b":800}}],"parties":["a","b"]},"vector_id":"split-004"},{"algorithm":"split.v1","description":"two-party fixed budget: an item valued 0 by both never transfers; the contested item splits 1/2","expected_output":{"allocations":[{"items":[{"fraction":"1","item":"i1"},{"fraction":"1/2","item":"i2"}],"party":"a","points":"500"},{"items":[{"fraction":"1/2","item":"i2"}],"party":"b","points":"500"}],"method":"adjusted_winner"},"expected_output_sha256":"132b008d593dae25208adbc4dcf2c6c2ae2e7306914a91508c9ccea5e2843606","input":{"items":[{"id":"i1","valuations":{"a":0,"b":0}},{"id":"i2","valuations":{"a":1000,"b":1000}}],"parties":["a","b"]},"vector_id":"split-005"},{"algorithm":"split.v1","description":"three-party fixed budget proportional: everyone holds 1/3 of every item, points are 1000/3","expected_output":{"allocations":[{"items":[{"fraction":"1/3","item":"i1"},{"fraction":"1/3","item":"i2"}],"party":"a","points":"1000/3"},{"items":[{"fraction":"1/3","item":"i1"},{"fraction":"1/3","item":"i2"}],"party":"b","points":"1000/3"},{"items":[{"fraction":"1/3","item":"i1"},{"fraction":"1/3","item":"i2"}],"party":"c","points":"1000/3"}],"method":"proportional"},"expected_output_sha256":"0f5a8397e76934423b24c539a730d159403ee14903fb1fbda5824e899000ebac","input":{"items":[{"id":"i1","valuations":{"a":500,"b":300,"c":200}},{"id":"i2","valuations":{"a":500,"b":700,"c":800}}],"parties":["c","a","b"]},"vector_id":"split-006"}]},{"algorithm_params":{"item":"<label>","price_cap":"<optional integer minor units, >= reserve>","reserve":"<integer minor units>","unit":"<ISO 4217 or compute unit>"},"id":"auction.v1","limits":"each bid an integer in 0..=2^62-1","name":"Sealed-bid second-price (Vickrey) auction","note":"the highest bid at or above the reserve wins and pays min(second-highest bid, price_cap) (the reserve if one bid qualifies); ties go to the earliest party in canonical order (commitment string, or party:<label> in open mode); no qualifying bid certifies no_sale. The certificate attests the outcome given the sealed bids; settlement is off-layer.","parties":"2..=1024","party_input":{"bid":"<integer 0..=2^62-1>"},"test_vectors":[{"algorithm":"auction.v1","description":"clean three-bidder sale: highest bid wins, pays the second-highest (800/450/300, reserve 100 → ada at 450)","expected_output":{"bid_count":3,"method":"vickrey","outcome":"sold","price":450,"reserve":100,"unit":"GBP","winner":"ada"},"expected_output_sha256":"4eb1ca49fc481072e0a301b4341664075b96fa6c7ac3902d8d55d09235919290","input":{"bids":{"ada":800,"ben":450,"cid":300},"reserve":100,"tie_order":["ada","ben","cid"],"unit":"GBP"},"vector_id":"auction-001"},{"algorithm":"auction.v1","description":"reserve binds the price: one qualifying bid (800 vs 50, reserve 400) → winner pays the reserve","expected_output":{"bid_count":2,"method":"vickrey","outcome":"sold","price":400,"reserve":400,"unit":"GBP","winner":"ada"},"expected_output_sha256":"5b65fcc6937bbdf3a2a65a298ead37d120cf91c854068685abdc5311beee5aa0","input":{"bids":{"ada":800,"ben":50},"reserve":400,"tie_order":["ada","ben"],"unit":"GBP"},"vector_id":"auction-002"},{"algorithm":"auction.v1","description":"tie at the top: earliest in canonical party order (tie_order) wins and pays the tied price (500/500/300, reserve 0, order cid<ben<ada → ben at 500 — NOT the lex-first label)","expected_output":{"bid_count":3,"method":"vickrey","outcome":"sold","price":500,"reserve":0,"unit":"GPU_SECONDS","winner":"ben"},"expected_output_sha256":"a05253c77f990c3cfe0d9448041026bf399c70501b00719e5a02dc2e6a268984","input":{"bids":{"ada":500,"ben":500,"cid":300},"reserve":0,"tie_order":["cid","ben","ada"],"unit":"GPU_SECONDS"},"vector_id":"auction-003"},{"algorithm":"auction.v1","description":"no qualifying bid: certified no_sale (300/200 vs reserve 500), winner and price null","expected_output":{"bid_count":2,"method":"vickrey","outcome":"no_sale","price":null,"reserve":500,"unit":"GBP","winner":null},"expected_output_sha256":"be0cbe271942387f5acd0c8a29ede2a395df8185274f58aba8160de0acf9e691","input":{"bids":{"ada":300,"ben":200},"reserve":500,"tie_order":["ada","ben"],"unit":"GBP"},"vector_id":"auction-004"},{"algorithm":"auction.v1","description":"zero edge: both bids 0 with reserve 0 qualify, lex-first wins at price 0","expected_output":{"bid_count":2,"method":"vickrey","outcome":"sold","price":0,"reserve":0,"unit":"USD","winner":"ada"},"expected_output_sha256":"7942a699499b1b76c4d27973f4be9a095ca644b41f7dcd3bc21e42c750594f59","input":{"bids":{"ada":0,"ben":0},"reserve":0,"tie_order":["ada","ben"],"unit":"USD"},"vector_id":"auction-005"},{"algorithm":"auction.v1","description":"razor-thin margin: winner pays the runner-up exactly (1000 vs 999, reserve 0 → ada at 999)","expected_output":{"bid_count":2,"method":"vickrey","outcome":"sold","price":999,"reserve":0,"unit":"GBP","winner":"ada"},"expected_output_sha256":"65323915316f2c68381544b559243a5014a90cdb240a105e16c2859ef0fd4cb9","input":{"bids":{"ada":1000,"ben":999},"reserve":0,"tie_order":["ada","ben"],"unit":"GBP"},"vector_id":"auction-006"},{"algorithm":"auction.v1","description":"price_cap binds: second price 450 capped to 400; cap echoed in the result (ADR-0015)","expected_output":{"bid_count":3,"method":"vickrey","outcome":"sold","price":400,"price_cap":400,"reserve":100,"unit":"GBP","winner":"ada"},"expected_output_sha256":"2a6606c44303d2e2d364abd9176cbd2f19ae5cf7d59354b78da21ed2becc8741","input":{"bids":{"ada":800,"ben":450,"cid":300},"price_cap":400,"reserve":100,"tie_order":["ada","ben","cid"],"unit":"GBP"},"vector_id":"auction-007"},{"algorithm":"auction.v1","description":"price_cap equal to the second price binds exactly (cap 450, second 450 → 450)","expected_output":{"bid_count":3,"method":"vickrey","outcome":"sold","price":450,"price_cap":450,"reserve":100,"unit":"GBP","winner":"ada"},"expected_output_sha256":"77fe2463d11cb16e3d83a2755e0642e069926ef060786dd43f7a9d471a21f7e2","input":{"bids":{"ada":800,"ben":450,"cid":300},"price_cap":450,"reserve":100,"tie_order":["ada","ben","cid"],"unit":"GBP"},"vector_id":"auction-008"},{"algorithm":"auction.v1","description":"price_cap above the outcome has no effect: single qualifying bid pays the reserve (800 vs 50, reserve 400, cap 500 → 400)","expected_output":{"bid_count":2,"method":"vickrey","outcome":"sold","price":400,"price_cap":500,"reserve":400,"unit":"GBP","winner":"ada"},"expected_output_sha256":"c783ab1bd8a3b71b96db70716e8ae1e13103f20f8ed9f3aef30b6f6018615f00","input":{"bids":{"ada":800,"ben":50},"price_cap":500,"reserve":400,"tie_order":["ada","ben"],"unit":"GBP"},"vector_id":"auction-009"}]},{"algorithm_params":{"drand_round":"<optional integer — omit to pin the first round after seal-close (recommended); if provided it must publish after the commit deadline>"},"id":"random.v1","limits":"nonce <= 1024 bytes (hex-encoded)","name":"Verifiable random selection (XOR nonces + drand, deterministic Fisher-Yates; winner = permutation[0], full permutation published)","parties":"2..=10000","party_input":{"nonce":"<hex>"},"test_vectors":[{"algorithm":"random.v1","description":"three candidates, two nonces plus drand: XOR entropy, deterministic Fisher-Yates permutation, winner = permutation[0]","expected_output":{"drand_round":5150000,"entropy":"2be5b21aca5e5f4a5c37abcf03321bc64a321c3c81b71ce8b68e1dae110fbfa2","method":"fisher_yates_sha256","permutation":["agent-voice","agent-vision","agent-prompt"],"winner":"agent-voice"},"expected_output_sha256":"2d40e7f5538b0fe2a7a3c9149ea4a30bbea2f702f7cbb7d5b147449b2e3bc8f7","input":{"candidates":["agent-prompt","agent-vision","agent-voice"],"drand_round":5150000,"drand_value":"c0ffee42","nonces":["a1b2c3","deadbeef"]},"vector_id":"random-001"},{"algorithm":"random.v1","description":"two candidates, single nonce: nonce order invariance, drand mixing, full permutation published","expected_output":{"drand_round":1,"entropy":"532e423720ec8e75f730dcb5c81b3a42a92a541c0bce3ce979bf0f0a2e2d11a0","method":"fisher_yates_sha256","permutation":["second","first"],"winner":"second"},"expected_output_sha256":"c410e5b1a3d3e42871ae7ebcbeeadf1d4854b5cff0979f56f250a4658924eae1","input":{"candidates":["first","second"],"drand_round":1,"drand_value":"0123456789abcdef","nonces":["00ff"]},"vector_id":"random-002"}]},{"algorithm_params":{"coalition_values":{"<sorted members joined by ','>":"<integer 0..=2^62-1>"}},"id":"shapley.v1","limits":"coalition values < 2^62; party labels must not contain ','","name":"Shapley value share (split the pie by marginal contribution)","parties":"2..=8","party_input":{"accept":"<true|false — any rejection VOIDs the deal naming the rejector>"},"test_vectors":[{"algorithm":"shapley.v1","description":"two-party classic: v(a)=10 v(b)=20 v(ab)=50 -> shares 20/30, exact integers","expected_output":{"method":"shapley","shares":[{"party":"a","share":"20"},{"party":"b","share":"30"}],"total":"50"},"expected_output_sha256":"893e8b44f1fccf2838eade25ab56f82e4040e202026cfbcd76bf489b4295fc41","input":{"coalition_values":{"a":10,"a,b":50,"b":20},"parties":["a","b"]},"vector_id":"shapley-001"},{"algorithm":"shapley.v1","description":"three-party majority game (v=1 iff |S|>=2): symmetric 1/3 shares, exact rationals","expected_output":{"method":"shapley","shares":[{"party":"a","share":"1/3"},{"party":"b","share":"1/3"},{"party":"c","share":"1/3"}],"total":"1"},"expected_output_sha256":"461902d5ae6f79dbaf8d11f7a605aedc49ae7dc4e9e2f5d15dac2a20aa191438","input":{"coalition_values":{"a":0,"a,b":1,"a,b,c":1,"a,c":1,"b":0,"b,c":1,"c":0},"parties":["c","a","b"]},"vector_id":"shapley-002"}]}],"commitment":"sha256:<hex of sha256(JCS(party_input) ++ salt_bytes)>","protocol":"create deal -> all parties commit (sealed mode) -> all parties reveal -> certificate issued automatically; verify at GET /v1/verify/{cert_id}"}