From 1e9523088bec037e0af76773db0f174ae65e4886 Mon Sep 17 00:00:00 2001 From: gnezim Date: Wed, 15 Apr 2026 08:40:59 +0300 Subject: [PATCH] Add Phase 2G parity harness implementation plan Defines tasks for URL parity harness (table-driven + fast-check fuzz), SEO parity harness, and Online Board registration against both. --- .../plans/2026-04-15-phase-2g-parity.md | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 docs/superpowers/plans/2026-04-15-phase-2g-parity.md diff --git a/docs/superpowers/plans/2026-04-15-phase-2g-parity.md b/docs/superpowers/plans/2026-04-15-phase-2g-parity.md new file mode 100644 index 00000000..ab57a171 --- /dev/null +++ b/docs/superpowers/plans/2026-04-15-phase-2g-parity.md @@ -0,0 +1,81 @@ +# Phase 2G — Parity Harnesses + +> **Parent:** `2026-04-14-phase-2-online-board-master.md` (sub-plan 2G) +> **Depends on:** 2B (URL serializer), 2F (SEO builders) + +## Goal + +Build generic, reusable parity harnesses for URL serialization and SEO output. +Register the Online Board feature against both harnesses. Phase 3+ features +will register their own serializers into the same framework. + +## Deliverables + +1. **URL parity harness** (`tests/parity/url/harness.ts`) — generic framework + for table-driven + `fast-check` property-based URL roundtrip tests. +2. **URL parity test** (`tests/parity/url/onlineboard.test.ts`) — Online Board + registered against the harness, testing against fixture corpus. +3. **URL fixture corpus** (`tests/fixtures/phase-2/url-corpus/onlineboard.json`) + — ~20 representative URLs covering all 6 route types. +4. **SEO parity harness** (`tests/parity/seo/harness.ts`) — generic framework + for testing SEO builder output shape/completeness. +5. **SEO parity test** (`tests/parity/seo/onlineboard.test.ts`) — Online Board + SEO builders registered against the harness. +6. **`fast-check`** installed as a dev dependency. + +## Task list + +### T1 — Install `fast-check` + +- `pnpm add -D fast-check` +- Verify: `pnpm typecheck` + +### T2 — Create URL fixture corpus + +- File: `tests/fixtures/phase-2/url-corpus/onlineboard.json` +- ~20 entries covering: start, flight (with/without suffix, 3-char carrier), + departure (with/without time range), arrival (with/without time range), + route (with/without time range), details (with/without suffix). +- Each entry: `{ url: string, expected: OnlineBoardParams }`. + +### T3 — URL parity harness + +- File: `tests/parity/url/harness.ts` +- Exports `UrlParityConfig` interface and `defineUrlParityTests()`. +- Table-driven tests: reads fixture file, for each entry asserts + `parse(url) === expected` and `build(expected) === url`. +- Fuzz tests: uses `fast-check` arbitrary to generate random params, + asserts `parse(build(params)) deep-equals params` (roundtrip property). + +### T4 — Register Online Board URL parity + +- File: `tests/parity/url/onlineboard.test.ts` +- Imports harness + URL serializer + fixtures. +- Defines `fc.Arbitrary` covering all 6 discriminants. +- Calls `defineUrlParityTests(config)`. + +### T5 — SEO parity harness + +- File: `tests/parity/seo/harness.ts` +- Exports `SeoParityConfig` interface and `defineSeoParityTests()`. +- Tests: for each registered SEO builder call, asserts output has all required + fields (title, description, canonical, hreflang with 10 entries, OG tags). + +### T6 — Register Online Board SEO parity + +- File: `tests/parity/seo/onlineboard.test.ts` +- Registers all 6 Online Board SEO builders. +- Asserts shape correctness for each route type x 2 languages (ru, en). + +### T7 — Verification + +- `pnpm typecheck && pnpm lint && pnpm test` +- All new tests pass. All existing tests still pass. + +## Exit gates + +- URL parity: 100% of fixture corpus passes roundtrip. +- `fast-check` fuzz finds no roundtrip asymmetry (100 iterations default). +- SEO parity: all 6 route types produce complete SeoHeadProps. +- `pnpm typecheck`, `pnpm lint`, `pnpm test` green. +- No `any` types in harness code.