diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 5abc488..bdfb4eb 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -11,7 +11,7 @@ body:
id: version
attributes:
label: Unsga3 version / commit
- placeholder: "0.1.5 or git SHA"
+ placeholder: "0.2.0 or git SHA"
validations:
required: true
- type: textarea
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ebae0be..dff1c8e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
### Added
- Optional **TypeSafe / Jev System One** pass (`tools/typesafe-pareto`) for Score + Choice judgments over a small Pareto candidate sample. Additive semantic layer — does not replace NSGA-III / U-NSGA-III objectives. Live calls only when `TYPESAFE_API_KEY` is set; CI uses mocks. Metrics append to `metrics/typesafe-runs.jsonl`.
+
+### Changed
+
+- Docs and XML comments describe `initialPopulation` and hybrid loops in generic terms (domain-adapter warm-start / grid-seed). No product-repo names.
+
+## [0.2.0] — 2026-09-30
+
+Mating and constraints plus two-layer references. **Defaults stay unconstrained `RankNicheDistance`, independent mating, and single-layer `DasDennis`.** No new IGD or Wilcoxon table.
+
+### Added
+
- `ReferenceDirections.TwoLayerDasDennis`: outer Das–Dennis layer plus an inside layer scaled toward the centroid (Deb & Jain, NSGA-III Part I; default scale 0.5). Duplicates are removed. Single-layer `DasDennis` / `WithDasDennis` stays the default. M≤3 oracles do not need the second layer.
- Constrained problems `OsyProblem`, `TnkProblem`, and `C1Dtlz1Problem`, with formulation and survival self-tests. No IGD table.
- Opt-in `MatingPoolMode.TwoShuffledPasses`: two shuffled passes of consecutive tournaments (Seada & Deb Algorithm 1 and pymoo 0.6.2 `TournamentSelection`, pressure 2). When N parents are drawn from N members, each member is a contestant twice. The default pool stays N independent tournaments with replacement, which is the published ZDT1 Wilcoxon protocol.
@@ -18,7 +29,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
### Changed
- Environmental selection follows pymoo `Survival.filter_infeasible` (Jain & Deb, NSGA-III Part II). Feasible members are niched. If fewer than N are feasible, the rest are filled by ascending constraint violation and are not assigned a niche. When any member is feasible, ideal, worst, and ASF extremes come from feasible objectives. An all-infeasible generation does not move the hyperplane. This replaces the locked whole-pool ideal fixture.
-- Docs and XML comments describe `initialPopulation` and hybrid loops in generic terms (domain-adapter warm-start / grid-seed). No product-repo names.
### Fixed
@@ -101,7 +111,8 @@ Forensic-audit wave (G1–G10): document known gaps against pymoo and Seada & De
- Benchmarks: ZDT1–4/6, DTLZ1–4/7, Sphere / Ackley / Rosenbrock
- Metrics: IGD, GD, 2-D HV; self-tests + GitHub Packages publish workflow
-[Unreleased]: https://github.com/AppSprout-dev/Unsga3/compare/v0.1.5...HEAD
+[Unreleased]: https://github.com/AppSprout-dev/Unsga3/compare/v0.2.0...HEAD
+[0.2.0]: https://github.com/AppSprout-dev/Unsga3/compare/v0.1.5...v0.2.0
[0.1.5]: https://github.com/AppSprout-dev/Unsga3/compare/v0.1.4...v0.1.5
[0.1.4]: https://github.com/AppSprout-dev/Unsga3/compare/v0.1.3...v0.1.4
[0.1.3]: https://github.com/AppSprout-dev/Unsga3/compare/v0.1.2...v0.1.3
diff --git a/CITATION.cff b/CITATION.cff
index 8f25156..88fa287 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -21,8 +21,8 @@ keywords:
- C#
- .NET
license: MIT
-version: 0.1.5
-date-released: "2026-09-22"
+version: 0.2.0
+date-released: "2026-09-30"
references:
- type: article
authors:
diff --git a/Directory.Build.props b/Directory.Build.props
index 2341206..82c997c 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -12,7 +12,7 @@
https://github.com/AppSprout-dev/Unsga3
https://github.com/AppSprout-dev/Unsga3
optimization;nsga;nsga3;unsga3;multi-objective;evolutionary;moea
- 0.1.5
+ 0.2.0
README.md
diff --git a/README.md b/README.md
index 3e95035..25a6bc1 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
**U-NSGA-III** (Unified NSGA-III) for .NET — single-, multi-, and many-objective evolutionary optimization with Das–Dennis reference directions, SBX crossover, polynomial mutation, and **niching-based tournament selection** ([Seada & Deb, 2016](https://ieeexplore.ieee.org/document/7271063)).
-> **v0.1.5** — forensic-audit notes (G1–G10) and small edge fixes. Default tournament stays `RankNicheDistance`. The published 15-seed table is not rewritten. ZDT2 quality protocol remains gens=250.
+> **v0.2.0** — opt-in two-shuffle mating, Algorithm 2 tournament, odd-N pairing, feasible-only niching, equal-CV Deb fix, two-layer Das–Dennis, and OSY/TNK/C1-DTLZ1. Defaults stay unconstrained `RankNicheDistance`, independent mating, and single-layer Das–Dennis. The published 15-seed table is not rewritten.
> **15-seed IGD vs pymoo `UNSGA3`:** ZDT1 **median 0.053 vs 0.070** (MWU *p*≈0.05) compares the full C# non-dominated front with pymoo `res.F`. DTLZ2 **median 0.0045 vs 0.0028** (~1.6×) compares C# n_var=12 with pymoo's default n_var=10. Neither pair is a same-set, same-problem ranking. Notes: [`docs/ORACLE-RESULTS.md`](docs/ORACLE-RESULTS.md).
> Details: [`docs/WILCOXON-RESULTS.md`](docs/WILCOXON-RESULTS.md) · single-seed notes: [`docs/ORACLE-RESULTS.md`](docs/ORACLE-RESULTS.md)