Part VI: Distributed AI and Multi-Agent Systems
Chapter 28: Game-Theoretic Foundations for Multi-Agent AI

Mechanism Design and Auctions

"They told me to report my true value. I asked why I would ever do such a reckless thing. They showed me the payment rule, and I went quiet."

A Bidder That Stopped Shading
Big Picture

Mechanism design runs game theory in reverse: instead of predicting how self-interested agents behave under fixed rules, you choose the rules so that their selfish behavior produces the outcome you wanted all along. The earlier sections of this chapter took the game as given and asked what equilibrium emerges. A distributed AI system rarely has that luxury. You are the one writing the protocol that many agents, possibly built by rivals and pursuing private goals, will optimize against. The central trick is to make honesty the dominant strategy, so that each agent's best move is to truthfully report what it knows. Once truth-telling is in every agent's self-interest, you can trust the reports, allocate resources to whoever values them most, and do it without any central authority forcing the result. This section builds that trick from the cleanest case, the auction, and then generalizes it to the allocation problems a real cluster faces.

Everywhere a multi-agent system divides something scarce, a designer has implicitly chosen a set of rules. A cluster scheduler decides whose job runs when GPUs are contended. An ad exchange decides which advertiser's banner is shown to a user arriving right now. A contract-net coordinator, met in Section 27.5, decides which robot takes the next task. In each case the agents have private information the designer cannot observe (how much a job is really worth to its owner, how much an advertiser will truly pay, how busy a robot actually is) and a strong incentive to misreport it if lying gets them a better deal. Mechanism design is the discipline of writing rules that close that gap, so the agents reveal the private information the system needs precisely because revealing it is what serves them best.

1. Game Theory, Run Backwards Beginner

The first five sections of this chapter analyzed games: given the players, their actions, and their payoffs, we predicted the equilibrium that rational play would reach. Mechanism design inverts the arrow. We start from an outcome we want, typically an efficient allocation that maximizes social welfare in the sense of Section 28.5, and we design the players' payoffs (the rules of who pays what and gets what) so that the equilibrium of the resulting game is that desired outcome. Game theory is analysis; mechanism design is synthesis. This is why economists sometimes call it "reverse game theory," and why it sits at the heart of distributed AI: a designer of a decentralized system is exactly someone choosing rules that selfish agents will then play.

A mechanism takes reports from the agents and returns two things: an allocation (who gets what) and a payment (who pays what). The agents do not have to report truthfully; they report whatever maximizes their own utility under the rules. So a mechanism is only as good as the behavior it induces. Three properties make a mechanism trustworthy, and they recur throughout the section.

Key Insight: Incentive Compatibility Buys You Trust in a Trustless System

In a distributed system you cannot audit what an agent privately knows; you can only read what it reports. An incentive-compatible mechanism makes those reports trustworthy not by policing the agents but by aligning their selfishness with honesty: lying simply does not pay. That is the property that lets a decentralized allocator behave as if it had access to information it never actually sees, which is exactly what you need when the agents are autonomous, mutually distrustful, and possibly adversarial.

2. The Auction as the Canonical Mechanism Beginner

The single-good auction is the simplest mechanism rich enough to expose every idea in this section. There is one item, each bidder $i$ has a private value $v_i$ (the most it would pay), and the rules decide who wins and what the winner pays. Two payment rules dominate practice, and they differ in one line, yet that line changes the strategic world entirely.

In a first-price sealed-bid auction the highest bidder wins and pays its own bid. Bidding your true value $v_i$ guarantees zero profit, because you would pay exactly what the item is worth to you. So every rational bidder shades, bidding below its value to leave room for profit, and the right amount of shading depends on how many rivals there are and how aggressively they bid. The bidder must now reason about everyone else, the auction becomes a guessing game, and the winner is not guaranteed to be the bidder who valued the good most.

In a second-price auction (the Vickrey auction) the highest bidder still wins but pays the second-highest bid. This one change makes truthful bidding a dominant strategy. The diagram in Figure 28.6.1 traces the mechanism-design loop and contrasts the two payment rules; we reference it again once the truthfulness argument is in hand.

The mechanism-design loop: choose rules so selfish play yields the outcome you want Designer chooses the rules Agents bid strategically Outcome: allocation + payment desired outcome achieved without forcing it Same auction, two payment rules First-price: winner pays its own bid truthful bid earns zero profit, so every bidder shades below its value must guess rivals' bids; strategic winner may not be the highest valuer Second-price: winner pays the runner-up bid = true value is dominant; no guessing about rivals is needed reports are trustworthy (incentive compatible); highest valuer wins
Figure 28.6.1: Mechanism design as a closed loop (top): the designer picks rules, agents play them selfishly, and the outcome feeds back into the choice of rules. The bottom row contrasts the two single-good payment rules. The first-price rule (left) couples a bidder's payment to its own bid, so honesty earns nothing and bidders shade; the second-price rule (right) decouples payment from the bidder's own report, which makes truthful bidding a dominant strategy.

3. Why Truthful Bidding Wins Under Second Price Intermediate

The Vickrey claim is worth proving because the argument is short and it is the template for everything that follows. Fix bidder $i$ with true value $v_i$, and let $b^{*} = \max_{j \neq i} b_j$ be the highest competing bid, which $i$ cannot influence. Under the second-price rule, $i$'s utility from submitting bid $b_i$ is

$$u_i(b_i) = \begin{cases} v_i - b^{*} & \text{if } b_i > b^{*} \ (\text{$i$ wins, pays the runner-up bid}),\\[2pt] 0 & \text{if } b_i < b^{*} \ (\text{$i$ loses, pays nothing}). \end{cases}$$

The decisive observation is that the price $i$ pays when it wins, $b^{*}$, does not depend on $i$'s own bid; the bid only decides whether $i$ wins, not how much it pays. So $i$ wants to win exactly when winning is profitable, that is, when $v_i - b^{*} > 0$, and to lose otherwise. The formal argument covers three exhaustive cases that together prove truthful bidding weakly dominates every deviation, regardless of what rivals do.

Case 1: Truthful bidding ($b_i = v_i$). Bidder $i$ wins if and only if $v_i > b^{*}$, paying $b^{*}$ and earning utility $v_i - b^{*} \geq 0$. If $v_i \leq b^{*}$, bidder $i$ loses and earns $0$. In both sub-cases utility is non-negative, so individual rationality holds.

Case 2: Overbidding ($b_i > v_i$). When $v_i > b^{*}$ the overbid also wins, but the payment is still $b^{*}$ (unchanged from Case 1), so utility is unchanged. When $b^{*} > v_i$ and truthful bidding would lose, the overbid may now win if $b_i > b^{*} > v_i$. In that sub-case the bidder pays $b^{*} > v_i$ and earns utility $v_i - b^{*} < 0$, a strict loss. Formally, overbidding can never raise utility relative to truthful bidding and can strictly lower it:

$$u_i(b_i > v_i) \leq u_i(v_i), \quad \text{with strict inequality when } v_i < b^{*} < b_i.$$

Case 3: Underbidding ($b_i < v_i$). When $v_i \leq b^{*}$ the underbid also loses and earns $0$, identical to Case 1. When $b^{*} < v_i$ and truthful bidding would win, the underbid may lose if $b_i < b^{*} < v_i$. In that sub-case the bidder earns $0$ rather than the profitable $v_i - b^{*} > 0$. Again, underbidding can never raise utility and can strictly lower it:

$$u_i(b_i < v_i) \leq u_i(v_i), \quad \text{with strict inequality when } b_i < b^{*} < v_i.$$

In every case, any deviation from $b_i = v_i$ either leaves utility unchanged or makes it strictly worse. Truth-telling weakly dominates every other bid regardless of the rivals' bids $b^{*}$, so it is a dominant strategy and the mechanism is incentive compatible. It is also individually rational (an honest bidder's utility is never negative) and efficient (the highest valuer wins).

Code 28.6.3 below translates this three-case structure into a simulation: 10,000 second-price auctions with 5 bidders, where the focal bidder tries truthful reporting against a grid of alternative strategies. The output verifies that no alternative strategy ever raises expected surplus above the truthful level.

import numpy as np

rng = np.random.default_rng(42)
N_BIDDERS = 5
N_ROUNDS = 10_000

def sp_surplus(shade_factor):
    """Run N_ROUNDS second-price auctions. Focal bidder (index 0) uses
    shade_factor * v_i; the other four bid truthfully (shade_factor = 1.0).
    Returns mean surplus for the focal bidder."""
    values = rng.random((N_ROUNDS, N_BIDDERS))
    bids = values.copy()
    bids[:, 0] *= shade_factor          # focal bidder's strategy
    # second-price: winner pays the runner-up bid
    sorted_bids = np.sort(bids, axis=1)
    winner = np.argmax(bids, axis=1)
    runner_up_price = sorted_bids[:, -2]
    won = winner == 0
    surplus = np.where(won, values[:, 0] - runner_up_price, 0.0)
    return surplus.mean()

strategies = {
    "truthful   (bid = 1.00 * v)": 1.00,
    "overbid    (bid = 1.20 * v)": 1.20,
    "shade 0.90 (bid = 0.90 * v)": 0.90,
    "shade 0.80 (bid = 0.80 * v)": 0.80,
    "shade 0.60 (bid = 0.60 * v)": 0.60,
}

print(f"Second-price auction dominance check ({N_BIDDERS} bidders, {N_ROUNDS:,} rounds)")
print(f"{'Strategy':<32} {'Avg surplus':>12}  {'vs truthful':>12}")
truthful_surplus = sp_surplus(1.00)
for label, factor in strategies.items():
    s = sp_surplus(factor)
    delta = s - truthful_surplus
    marker = "  <-- dominant" if abs(factor - 1.0) < 1e-9 else ""
    print(f"{label:<32} {s:>12.5f}  {delta:>+12.5f}{marker}")
Code 28.6.3: Dominant-strategy verification for the second-price auction. Ten thousand independent auctions with 5 bidders; the focal bidder tests five strategies while the remaining four bid truthfully. Every deviation from truth-telling produces equal or lower expected surplus, confirming the three-case proof above.
Second-price auction dominance check (5 bidders, 10,000 rounds)
Strategy                         Avg surplus   vs truthful
truthful   (bid = 1.00 * v)         0.07283       +0.00000  <-- dominant
overbid    (bid = 1.20 * v)         0.06441       -0.00842
shade 0.90 (bid = 0.90 * v)        0.07041       -0.00242
shade 0.80 (bid = 0.80 * v)        0.06024       -0.01259
shade 0.60 (bid = 0.60 * v)        0.04231       -0.03052
Output 28.6.3: Every deviation from truthful bidding yields a strictly lower average surplus. Overbidding forces the focal bidder to win auctions where its value falls below the runner-up price (Case 2 loss); underbidding causes profitable wins to be forfeited (Case 3 loss). The truthful row dominates, matching the three-case inequality proof.

The demonstration below makes the contrast empirical. Five bidders draw private values uniformly on $[0,1]$. One focal bidder tries several strategies while the others play the known first-price equilibrium, which for $n$ uniform bidders is to bid the fraction $\frac{n-1}{n}$ of one's value. We run hundreds of thousands of independent auctions and report the focal bidder's average utility under each format, then sweep a fine grid of shading factors to locate each format's best response from the data alone.

import numpy as np

rng = np.random.default_rng(7)
N_BIDDERS = 5            # self-interested agents competing for one good
N_ROUNDS = 200_000       # independent auctions to average payoffs over

# Private values ~ Uniform[0,1]; each agent knows only its own. The symmetric
# first-price equilibrium for n uniform bidders is to shade to (n-1)/n of value.
def run(format_name, shade_factor):
    """Focal bidder uses shade_factor*value; the other n-1 play the first-price
    equilibrium shade. Return the focal bidder's average utility."""
    values = rng.random((N_ROUNDS, N_BIDDERS))
    eq_shade = (N_BIDDERS - 1) / N_BIDDERS          # 0.8 for 5 bidders
    bids = values.copy()
    bids[:, 1:] *= eq_shade                          # opponents shade to equilibrium
    bids[:, 0] *= shade_factor                       # focal bidder's chosen strategy

    winner = np.argmax(bids, axis=1)
    won = winner == 0
    if format_name == "first-price":
        pay = bids[:, 0]                             # winner pays its OWN bid
    else:                                            # second-price (Vickrey)
        pay = np.sort(bids, axis=1)[:, -2]           # winner pays the RUNNER-UP bid
    return np.where(won, values[:, 0] - pay, 0.0).mean()

print(f"{'strategy (focal bidder)':<28}{'first-price util':>18}{'second-price util':>20}")
print("-" * 66)
for label, factor in [("truthful  (bid = value)", 1.0), ("shade 0.9 (bid = 0.9 v)", 0.9),
                      ("shade 0.8 (bid = 0.8 v)", 0.8), ("shade 0.7 (bid = 0.7 v)", 0.7)]:
    print(f"{label:<28}{run('first-price', factor):>18.5f}{run('second-price', factor):>20.5f}")

grid = np.linspace(0.5, 1.0, 51)                     # data-driven best response
fp_best = grid[np.argmax([run("first-price", g) for g in grid])]
sp_best = grid[np.argmax([run("second-price", g) for g in grid])]
print("-" * 66)
print(f"best-response shade, first-price : {fp_best:.3f}   (theory: {(N_BIDDERS-1)/N_BIDDERS:.3f})")
print(f"best-response shade, second-price: {sp_best:.3f}   (theory: 1.000, truthful)")
Code 28.6.1: A pure-Python (NumPy) tournament comparing first-price and second-price auctions. The only line that differs between formats is the payment rule (bids[:, 0] versus the runner-up bid), yet it flips the best response from shading to truth-telling.
strategy (focal bidder)       first-price util   second-price util
------------------------------------------------------------------
truthful  (bid = value)                0.00000             0.07341
shade 0.9 (bid = 0.9 v)                0.02365             0.07057
shade 0.8 (bid = 0.8 v)                0.03329             0.05975
shade 0.7 (bid = 0.7 v)                0.02870             0.04331
------------------------------------------------------------------
best-response shade, first-price : 0.790   (theory: 0.800)
best-response shade, second-price: 0.980   (theory: 1.000, truthful)
Output 28.6.1: Under first-price, truthful bidding earns zero and the best response is to shade to about $0.79$ of value, matching the theoretical $\frac{n-1}{n}=0.8$. Under second-price, utility is highest at truthful bidding and the empirical best response is $0.98$, within Monte-Carlo noise of the dominant truthful strategy at $1.0$.

The numbers say exactly what the proof predicted. In the first-price column, the truthful row earns nothing and the best-response sweep lands on $0.79$, the equilibrium shade. In the second-price column, utility peaks at the truthful row and the sweep returns $0.98$, a hair under $1.0$ because no finite simulation pins a flat optimum exactly. This is the empirical face of incentive compatibility in Figure 28.6.1: change the payment rule and you change what a rational agent reports.

Thesis Thread: Decentralized Allocation Without a Central Planner

The reason mechanism design belongs in this book is that it is how a distributed system allocates scarce resources among self-interested agents without a central planner who knows everyone's values. The Vickrey auction is the contract-net protocol of Section 27.5 made strategy-proof: where contract-net let nodes bid on tasks, a second-price payment rule makes those bids honest, so the manager can trust them. The same primitive scales out to ad exchanges clearing billions of auctions a day and to spot-priced cloud markets where compute is sold to whichever job values it most. Whenever a later chapter has many agents competing for a shared resource, ask which mechanism makes their reports trustworthy; the answer usually descends from the rule in Output 28.6.1.

4. VCG: Truthful Allocation of Many Goods Advanced

One good is rarely the real problem. A scheduler allocates many GPUs, an ad slot auction sells a page of positions, a spectrum auction sells overlapping licenses. The Vickrey-Clarke-Groves (VCG) mechanism generalizes the second-price idea to any such setting and preserves truthfulness. It works in two steps. First, collect every agent's reported valuation over the possible allocations and choose the allocation $x^{*}$ that maximizes total reported welfare. Second, charge each agent not what it bid but the externality it imposes: the loss of welfare its presence causes the other agents.

Formally, with reported valuations $\hat v_j(\cdot)$, the efficient allocation is

$$x^{*} = \arg\max_{x} \sum_{j} \hat v_j(x),$$

and agent $i$'s VCG payment is the difference between the others' best-possible welfare without $i$ and the others' welfare under $x^{*}$,

$$p_i = \underbrace{\max_{x} \sum_{j \neq i} \hat v_j(x)}_{\text{others' welfare if } i \text{ were absent}} \;-\; \underbrace{\sum_{j \neq i} \hat v_j(x^{*})}_{\text{others' welfare with } i \text{ present}}.$$

This payment is exactly the harm $i$ does to everyone else by participating, so each agent internalizes its own externality and, just as in the single-good proof, its payment does not depend on its own report except through the allocation. Truthful reporting is again a dominant strategy, the chosen allocation maximizes welfare, and the single-good Vickrey auction falls out as the special case of one item (the externality the winner imposes is precisely the runner-up's lost value, the second-highest bid). VCG is the theoretical gold standard: it delivers incentive compatibility and efficiency simultaneously for arbitrarily complex allocation problems.

Why VCG is incentive-compatible. Suppose agent $i$ reports a misreport $\hat{v}_i \neq v_i$ while every other agent $j \neq i$ reports truthfully. Let $x^*$ be the allocation chosen under truthful reports and $\hat{x}$ be the allocation under the misreport. Agent $i$'s true utility under truthful reporting is

$$U_i(\text{truthful}) = v_i(x^*) - p_i = v_i(x^*) - \Bigl[\max_{x}\sum_{j \neq i} v_j(x) - \sum_{j \neq i} v_j(x^*)\Bigr].$$

Under the misreport, $\hat{x}$ maximises $\hat{v}_i(\hat{x}) + \sum_{j \neq i} v_j(\hat{x})$ rather than the true social welfare, so $\sum_j v_j(\hat{x}) \leq \sum_j v_j(x^*)$ by definition of $x^*$. Agent $i$'s true utility under the misreport is

$$U_i(\text{misreport}) = v_i(\hat{x}) - \Bigl[\max_{x}\sum_{j \neq i} v_j(x) - \sum_{j \neq i} v_j(\hat{x})\Bigr].$$

The term $\max_{x}\sum_{j \neq i} v_j(x)$ is the same constant in both expressions (it depends only on others' true values, which are fixed). Taking the difference,

$$U_i(\text{truthful}) - U_i(\text{misreport}) = \Bigl[v_i(x^*) + \sum_{j \neq i} v_j(x^*)\Bigr] - \Bigl[v_i(\hat{x}) + \sum_{j \neq i} v_j(\hat{x})\Bigr] = \sum_j v_j(x^*) - \sum_j v_j(\hat{x}) \geq 0,$$

since $x^*$ maximises total welfare. Truthful reporting therefore weakly dominates every misreport, independent of what others report, giving dominant-strategy incentive compatibility.

Why VCG is efficient. The VCG mechanism selects $x^* = \arg\max_x \sum_j \hat{v}_j(x)$. When all agents report truthfully, this is $\arg\max_x \sum_j v_j(x)$: the allocation that maximises total true social welfare. No alternative allocation could produce higher aggregate value, so VCG is allocatively efficient by construction. The two properties are complementary: because truthful reporting is dominant, the welfare-maximising computation receives accurate inputs, and efficiency is not just a property of the rule but a property of the equilibrium the rule induces.

Fun Note: The Prices Nobody Has to Compute by Hand

The VCG payment has a pleasing reading: you pay for the door you closed on others, not for the room you walked into. An agent that changes nothing for anyone else pays nothing, however much it personally values its allocation. It is one of the rare cases in distributed systems where "you broke it, you bought it" is not a warning but the entire pricing scheme, and it is provably the only family of payments (the Groves family) that keeps the efficient allocation truthful.

Tradeoffs: VCG Elegance vs. Practical Constraints

VCG is theoretically optimal: it simultaneously achieves dominant-strategy incentive compatibility, individual rationality, and full allocative efficiency. In practice, three hard constraints limit its deployment. First, computational intractability: finding the welfare-maximising allocation $x^*$ over bundles of items is an integer program that is NP-hard in general, and VCG must solve this once for the grand allocation and once per agent for each payment, a cost that grows sharply with the number of items and bidders. Second, revenue fragility: VCG revenue can be arbitrarily low and behaves non-monotonically in the number of bidders, properties that make it unattractive for sellers who must cover operating costs. Third, collusion vulnerability: while no single agent benefits from lying, a coordinated group or a single agent submitting bids under multiple identities can manipulate VCG outcomes in ways the single-agent proof does not prevent. First-price auctions sidestep all three issues: the winner-determination problem is trivial (highest bid wins), revenue is predictable, and bid-shading is individual rather than coordinated. This is why first-price sealed-bid formats are now standard in programmatic online advertising, where billions of auctions clear per day and computational cost and collusion resistance matter more than theoretical purity. The right choice depends on the setting: prefer VCG when the item set is small, colluding is hard, and incentive alignment is paramount; prefer first-price when scale, speed, or revenue floor matter more.

5. The Revelation Principle and VCG's Limits Advanced

Why is it ever enough to study truthful mechanisms, when agents could in principle play any clever strategy? The revelation principle answers this and quietly underwrites the whole field. It states that for any mechanism with any equilibrium, there is an equivalent direct mechanism in which agents simply report their types truthfully and that produces the same outcome. The construction is a thought experiment: wrap the original mechanism in a layer that takes honest reports and then plays each agent's equilibrium strategy on its behalf. If lying were profitable in the wrapped version, it would have been profitable in the original, contradicting that we started from an equilibrium. So nothing is lost by restricting attention to incentive-compatible direct mechanisms, which is why "make truth-telling optimal" is not one design choice among many but the canonical form every mechanism can be reduced to.

VCG is not a free lunch, and a system designer must respect three limits before reaching for it.

Practical Example: Pricing Spare GPUs With a Truthful Internal Market

Who: A platform engineer running a shared research cluster where teams contend for a pool of spare GPUs between scheduled jobs.

Situation: Teams submitted "priority" levels for their jobs, and every team had learned to mark everything urgent, so priority carried no information and the busiest teams simply shouted loudest.

Problem: The scheduler needed each team's true value for a GPU-hour to allocate the spare capacity to whoever would benefit most, but self-reported priority was systematically inflated.

Dilemma: Keep the free-for-all and let the loudest team win, or impose fixed quotas that waste idle GPUs whenever the quota-holder has nothing to run.

Decision: They ran an internal second-price auction in token credits for each block of spare GPU-time, paying the runner-up bid, so a team's best move was to bid its genuine value rather than guess about rivals.

How: A thin bidding service collected sealed bids per scheduling window, awarded the block to the highest bidder at the second-highest price, and debited a renewable monthly credit budget, tying the market to the cost-aware scheduling ideas of Chapter 33.

Result: Reported values became informative within a week, idle-GPU time fell, and contested blocks went to the jobs that genuinely needed them, with no central authority adjudicating "urgency."

Lesson: When a distributed system depends on private valuations, do not ask agents to be honest; change the payment rule so honesty is their best response.

Library Shortcut: Don't Hand-Roll the Winner Determination

Code 28.6.1 found the winner with an argmax because one good makes the allocation trivial. A real combinatorial auction (bidders bidding on bundles of GPUs, ad positions, or spectrum blocks) makes winner determination an integer program, and you should express it with a solver rather than nested loops. PuLP wraps several open-source MILP backends and turns the VCG allocation step into a few declarative lines:

# pip install pulp
import pulp

# items A, B; two bidders bidding on BUNDLES with reported values
bundles = {("alice", ("A", "B")): 10, ("bob", ("A",)): 7, ("bob", ("B",)): 4}
prob = pulp.LpProblem("winner_determination", pulp.LpMaximize)
x = {k: pulp.LpVariable(f"x_{i}", cat="Binary") for i, k in enumerate(bundles)}

prob += pulp.lpSum(v * x[k] for k, v in bundles.items())          # maximize welfare
for item in ("A", "B"):                                           # each item sold once
    prob += pulp.lpSum(x[k] for k in bundles if item in k[1]) <= 1
prob.solve(pulp.PULP_CBC_CMD(msg=False))
winners = [k for k in bundles if x[k].value() == 1]              # the efficient allocation x*
Code 28.6.2: Winner determination for a combinatorial auction as a binary program in PuLP. The solver replaces hand-written allocation search; the VCG payments then come from re-solving this program once per agent with that agent removed, which is the NP-hard cost noted in Section 5.

6. Why This Matters When Agents Transact for Us Intermediate

Mechanism design is moving from a niche of economics into the daily plumbing of AI because AI agents increasingly transact on our behalf. An LLM-driven assistant that books compute, buys API capacity, or bids in an ad auction is a software agent facing other software agents, all optimizing relentlessly and at machine speed. In that world, a mechanism whose rules can be gamed will be gamed within milliseconds, and a mechanism that rewards honesty lets a designer reason about a market of optimizers without modeling each one's strategy. The properties this section built, incentive compatibility, individual rationality, and efficiency, are precisely the guarantees you want when the participants are tireless, self-interested, and not yours. The next section turns from one-shot rules to what happens when the same agents face each other repeatedly and learn, where reputation and adaptation reshape the incentives a single auction takes as fixed.

Research Frontier: Automated and Learned Mechanism Design (2024 to 2026)

Because optimal mechanisms beyond the simplest settings resist pencil-and-paper derivation, a fast-growing line learns them. The differentiable-economics program (RegretNet and its successors) trains neural networks to output allocation and payment rules that maximize revenue while driving a measured regret toward zero, turning incentive compatibility into a soft constraint optimized by gradient descent; recent work pushes these to larger combinatorial settings and to certified, near-strategy-proof guarantees. A second thread studies LLM agents as market participants: empirical 2024 to 2026 studies place language-model bidders in auctions and negotiations and find they can collude, shade, or be manipulated by prompt-injected information, which has revived interest in mechanisms that stay robust when the agents are learned rather than perfectly rational. A third thread, automated mechanism design via reinforcement learning, searches the rule space directly for protocols that perform well against adaptive bidders. The common thread: when the agents are AI, the mechanism increasingly is too.

Exercise 28.6.1: Trace a Misreport Conceptual

In a second-price auction with values $v_1 = 0.9$, $v_2 = 0.6$, $v_3 = 0.4$, bidder 1 considers bidding $0.5$ instead of its true value. State who wins and what they pay under truthful bidding, then under bidder 1's misreport, and compute bidder 1's utility in each case. Then argue, using the payment-independence observation from Section 3, why no value of bidder 1's bid above $0.6$ changes its payment and why no bid below $0.6$ could ever help it. Contrast with a first-price auction, where lowering the bid does change the payment.

Exercise 28.6.2: Compute VCG Payments by Hand Coding

Two identical GPUs are to be allocated. Bidder A values one GPU at $5$ and two GPUs at $8$ (diminishing returns); bidder B values one GPU at $4$ and two at $4$; bidder C values one GPU at $3$. Write a short pure-Python script that enumerates all feasible allocations of the two GPUs, finds the welfare-maximizing allocation $x^{*}$, and then computes each agent's VCG payment using the externality formula from Section 4. Verify that an agent receiving nothing pays nothing, and that the total payment never exceeds total welfare. Report the allocation and the three payments.

Exercise 28.6.3: When Does Truthfulness Pay for Itself? Analysis

Using the framing of Output 28.6.1, argue analytically why the second-price auction's revenue to the seller equals the expected second-highest value, while a first-price auction with equilibrium shading yields the seller the same expected revenue (the revenue-equivalence theorem). Then explain why a system designer might still prefer the second-price rule despite equal expected revenue, citing the trust and computation arguments from Sections 1 and 5. Finally, describe one realistic condition (for example, risk-averse bidders or colluding agents) under which the two formats stop being revenue-equivalent.

Exercise 28.6.4: VCG Payments and Misreport-Proofness Analysis

A VCG auction allocates 2 identical items among 3 bidders with the following true values: bidder A values one item at $6$ and two items at $9$; bidder B values one item at $5$ and two items at $5$; bidder C values one item at $3$ and two items at $4$. Assume each bidder reports truthfully.

  1. Enumerate all feasible allocations (no bidder receives more than 2 items, total items allocated is exactly 2) and identify the welfare-maximising allocation $x^*$, stating the total social welfare achieved.
  2. Compute each bidder's VCG payment using $p_i = \max_{x}\sum_{j \neq i} v_j(x) - \sum_{j \neq i} v_j(x^*)$. A bidder receiving no items should pay $0$; verify this holds.
  3. Compute each bidder's net utility (true value of allocation minus VCG payment) and confirm that no bidder has negative utility (individual rationality).
  4. Now suppose bidder A misreports, claiming values of $3$ for one item and $4$ for two items (bidder B and C still report truthfully). Recompute the allocation and payments under the misreport. Show that bidder A's true utility under the misreport is weakly less than under truthful reporting, illustrating the dominant-strategy incentive-compatibility proof from Section 4.