---
artifact_kind: optimizer-card
artifact_name: nsga-ii
version: 1.0.0
owner: Nous · agreement-search team
last_reviewed: 2026-04-25
next_review: 2026-07-25
optimizer_kind: multi-objective
related_phase_179_tasks: [179.4.2.2]
---

# Optimizer Card — nsga-ii v1.0.0

## 1. Identity

- **Optimizer name:** nsga-ii
- **Algorithm family:** NSGA-II (Deb et al. 2002) — non-dominated sorting +
  crowding-distance multi-objective evolutionary search.
- **Implementation source:** `libs/nous/agreement-search/src/nsga-ii.ts` plus
  shared GA primitives in `ga-operators.ts`.
- **Intended use:** approximating the Pareto frontier when parties or mediators
  must see genuinely different agreement families (60/40 vs 40/60, early-payout
  vs long-term royalty, restorative vs restitutive). Used by the workbench
  frontier view (§179.4.3.1).

## 2. Scoring rule

- **Utility aggregation:** none — multi-objective. One objective per party by
  default (maximize each party's mean utility minus BATNA); callers may pass
  `{ id, direction }` objectives to add fairness-metric or domain objectives.
- **Fairness metrics reported:** caller-selected; full `fairness-metrics.ts` set
  attaches to the run summary.
- **Handling of hard constraints:** filtered by `filterCandidates` before the
  candidate enters the population.
- **Handling of uncertainty:** objectives may consume posterior mean, LCB, or
  Thompson-sampled draws; the kernel is agnostic and uses whatever the caller's
  `evaluate` returns.

## 3. Inputs

- **Candidate space:** same as nash-genetic — sandboxed clause-mutator DSL; same
  `DEFAULT_ENABLED_MUTATORS`.
- **Initial population / seeds:** §179.4.1.1 sources.
- **Time / iteration budget:** generations × population size; tournament
  selection on (rank, crowding) is binary by default.
- **Randomness:** seeded `mulberry32`.

## 4. Outputs

- **Accepted candidate contract:** the entire final non-dominated front F_1 plus
  dominated fronts F_2, F_3, ..., each annotated with rank and crowding
  distance.
- **Pareto-frontier diagnostics:** rank histogram, per-front crowding
  distribution, dominated/dominating counts. The workbench renders these as the
  diversity panel (§179.4.3.1).
- **Uncertainty propagation:** every front member carries the same posterior
  detail nash-genetic emits.

## 5. Evaluation

| Metric                          | Value                                  | Evaluator card                                                      | Date       |
| ------------------------------- | -------------------------------------- | ------------------------------------------------------------------- | ---------- |
| Pareto-front coverage           | hypervolume vs Nash-GA single survivor | [baseline-benchmark-gate](../evaluators/baseline-benchmark-gate.md) | 2026-04-25 |
|                                 | strictly higher (multi-objective)      |                                                                     |            |
| Diversity preservation          | crowding distance preserved by         | n/a — `nsga-ii.test.ts`                                             | 2026-04-25 |
|                                 | (µ + λ) selection                      |                                                                     |            |
| Fairness (Nash / KS / max-min)  | reported per front member; gate runs   | [fairness-suite](../evaluators/fairness-suite.md)                   | 2026-04-25 |
|                                 | against §179.10.6 baseline             |                                                                     |            |
| Regret vs oracle                | bounded by acquisition objectives      | [baseline-benchmark-gate](../evaluators/baseline-benchmark-gate.md) | 2026-04-25 |
| Specification-gaming resistance | `spec-gaming-audit.ts` runs on every   | [fairness-suite](../evaluators/fairness-suite.md)                   | 2026-04-25 |
|                                 | front member                           |                                                                     |            |
| Runtime (typical)               | seconds for ~50 clauses, 100           | n/a — deterministic synchronous kernel                              | 2026-04-25 |
|                                 | population, 50 generations             |                                                                     |            |
| Cost per run                    | $0 once preference fits cached         | n/a — orchestrator scoring-cost trace                               | 2026-04-25 |

## 6. Known limitations

- Crowding distance assumes objectives are roughly normalized; large scale
  mismatches between objectives degrade diversity preservation.
- (µ + λ) selection can still mode-collapse in pathological landscapes; pair
  with MAP-Elites if behavioural diversity is required.
- Mutation rate hyperparameters are caller-supplied; misconfigured rates can
  stall exploration.

## 7. Guardrails

- **Candidate safety gate:** `filterCandidates` on every child.
- **Clause static validation:** §179.2.3.4 static validation inside
  `filterCandidates`.
- **Redline separation:** hard constraints filtered before the population.
- **Pareto-coercion audit:** the workbench rendering layer
  (`pareto-explanations.ts`) cannot reorder fronts to manipulate party
  perception; the rendering is from the kernel's record.

## 8. References

- `libs/nous/agreement-search/src/nsga-ii.ts`
- Deb, Pratap, Agarwal, Meyarivan (2002), "A fast and elitist multiobjective
  genetic algorithm: NSGA-II".
- `docs/research/bibliography.md` §pareto-frontier
