mergedhumanPR #30Negotiation
simon-mechanism-design: Pareto-seeking multi-attribute negotiation with a dominance validator
The reference alternating_offers plugin collapses multi-attribute bargaining into a one-dimensional price fight: its respond only looks at terms.price and never reads conditions['deadline_days'].
Author
@25simsa1
github profile →- Status
- Merged
- Merged on
- Jul 1
- Branch
- hackathon/simon-mechanism-design-pareto
Description
The pitch.
## Motivation The reference `alternating_offers` plugin collapses multi-attribute bargaining into a one-dimensional price fight: its `respond` only looks at `terms.price` and never reads `conditions['deadline_days']`. Problem 07 asks for a negotiator that reasons over more than one issue and reaches Pareto-efficient deals. Separately, the negotiation layer was previously exercised and traced by **no** scenario in the repo, so there was no way to observe or validate negotiation behavior at all. This adds the first scenario that drives the negotiation layer and writes it to a trace, plus a plugin and an adversarial validator. ## Design - **Additive multi-attribute utility** over price and `conditions['deadline_days']`, each normalized to `[0,1]` and weighted (Keeney & Raiffa additive MAUT). The buyer values low price / short deadline; the seller the opposite. - **Monotonic-concession aspiration schedule** `alpha(t) = reservation + (1 - reservation) * patience ** t`, non-increasing in `t` (Rosenschein & Zlotkin 1994 Monotonic Concession Protocol / Zeuthen). - **Similarity-based trade-off counteroffers** (Faratin, Sierra & Jennings 2002): when an offer is below aspiration, the plugin counters with the grid bundle whose own utility still clears the aspiration floor and whose normalized distance to the opponent's offer is minimal — moving along the iso-utility curve toward the opponent's revealed preference. - **Polymorphic plugin construction**: the scenario builds the configured negotiator through an `inspect.signature` kwargs filter, forwarding only the parameters a given `__init__` accepts. The Negotiation protocol does not define `__init__`, so this lets the YAML `negotiation:` layer be swapped to *any* Negotiation plugin (Pareto gets its full config; `alternating_offers` gets only `patience`) without a `TypeError`. - **Evaluation follows ANAC fixed-counterpart methodology**: the plugin under test plays the **seller** against a fixed, deterministic, price-driven **buyer** that is indifferent to the deadline. Because the deadline costs the buyer nothing, it hands the deadline-loving seller a generous long-deadline bundle early and cheaply (Raiffa integrative logrolling). Holding one side fixed makes the seller's `respond` — does it reason about the full multi-attribute Terms? — the discriminator. ## Honesty / tradeoffs - The plugin is **Pareto-SEEKING, not Pareto-guaranteeing**. The FSJ trade-off *approaches* but does not *guarantee* the frontier under incomplete information; a hard guarantee would require the exponential MCP/Zeuthen optimal-deal search per round, which the plugin deliberately trades away for tractable, deterministic concession. - Agreements are **individually rational** (proven property) and **empirically non-dominated on the shipped scenario** (the asymmetric gate). The validator is the independent, strict check — it is not the plugin grading itself. - The validator computes the frontier **from observed bids only**, so it is **trace-evidence-bounded**: an agreement it passes could still be dominated by a feasible bundle nobody offered. This matches NANDA Town's "validators check trace evidence, not proofs" stance. - The buyer counterpart's early long-deadline offer is **honest integrative bargaining, not a hidden trap** — the buyer is genuinely indifferent to the deadline, so giving it away costs it nothing and reflects real logrolling. ## Adversarial result `validate_multi_attribute_pareto_optimal`: - **FAILS** on `negotiation: alternating_offers` — its deadline-blind `respond` never concedes and only accepts at its round-limit timeout, closing on a short-deadline `(95, …)` bundle that the early `(60,30)` gift dominates (better price for the buyer, far longer deadline for the deadline-loving seller). - **PASSES** on `negotiation: pareto` — the trade-off counters settle on the non-dominated logroll. Both hold **deterministically under seeds 42, 7, and 1337**. A separate characterization test documents …
Try it
Open PR on GitHubView diffCheckout locally
git fetch origin pull/30/head:pr-30
git checkout pr-30