Skip to content

GSD planning cutover + Phase 2: binding-correctness engine test hardening - #30

Merged
guy-lud merged 14 commits into
masterfrom
chore/gsd-ownership-cutover
Jul 14, 2026
Merged

GSD planning cutover + Phase 2: binding-correctness engine test hardening#30
guy-lud merged 14 commits into
masterfrom
chore/gsd-ownership-cutover

Conversation

@guy-lud

@guy-lud guy-lud commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

What this PR does

Two related pieces on the pre-stable v2.0.0 line:

  1. GSD planning cutover — adopts .planning/ as the single source of truth for project planning and freezes the legacy FIX-PLAN.md as a historical reference. Reconciles .planning/ with the already-merged T7 generator-concurrency fix (Close the SettingsClassGenerator concurrency race (T7) #29).
  2. Phase 2 — Binding Correctness & Engine Test Hardening — locks the engine's precedence / converter / concurrency behavior with tests. Test-only: no production src/ changes.

Phase 2 details

New tests (all under src/Tests/ExistForAll.SimpleSettings.UnitTests/):

File Req Cases
Core/ValuesPopulatorTests.cs TEST-01 binder last-writer-wins; earlier-survives-when-later-silent; attribute DefaultValue survives
Core/TypeConverterTests.cs TEST-02 null → 0; int? null → null; "42" → 42; ConverterType bypasses the collection converter
Conversion/ScalarConversionTests.cs TEST-03 scalar Uri positive; scalar DateTime positive; one format-mismatch negative (exception type only — redaction stays owned by ExceptionRedactionTests)
  • ENG-01 (verify-only): confirmed the SettingsClassGenerator concurrency gate (_generationGate, double-checked locking) + same/distinct-interface stress tests satisfy success criterion Validate settings #4 — already shipped in Close the SettingsClassGenerator concurrency race (T7) #29. No code change.
  • COLL-01 is intentionally owner-deferred (the List<T>/IList<T>/ICollection<T> broaden-vs-document+throw decision is being held). Documented in the plan's <deferred> section, PROJECT.md, and VERIFICATION.md; it is not a coverage gap.

Verification

  • Build: 0 warnings / 0 errors (net8 + net10).
  • Full suite: 94/94 passing (net10 locally; net8 via CI — the verifier also ran net8 = 94/94).
  • No production source under src/Core/ modified across the phase.
  • Phase verifier: passed, 10/10 must-haves (02-VERIFICATION.md).
  • Plans reviewed up front by architect / performance / security specialists and the finished tests by a code reviewer — all pass, no blocking findings.

Notes

  • Reviewers: the substantive code is just the 3 test files; the rest is .planning/ planning artifacts and the FIX-PLAN.md freeze.
  • Requirements traceability: REQUIREMENTS.md still has 13 brownfield baseline IDs (BIND-01…NAME-01) present in the body but not yet in the traceability table — pre-existing, tracked separately, not introduced here.

guy-lud added 14 commits July 14, 2026 12:11
GSD is now the source of truth for project tracking. Reconcile .planning to
the real git state and retire FIX-PLAN.md as the working doc.

- Mark ENG-01/T7 complete across REQUIREMENTS/ROADMAP/STATE/PROJECT (shipped
  pre-GSD via #29 — double-checked locking + same/distinct-interface stress tests)
- Clear the stale "T7 race open" concern in STATE; log the generator-serialization
  decision (one gate over all generation; not Lazy-per-type)
- Phase 2 now: ENG-01 done; COLL-01 (C1, deferred) + TEST-01/02/03 remain
- Freeze FIX-PLAN.md with a banner pointing at .planning/ (kept for its per-item
  file:line detail, mined by each phase's CONTEXT/PLAN)

Local branch only (no push) — rides the next work branch to avoid a doc-only
master alpha. SESSION-HANDOFF.md left uncommitted (living handoff).
- last-writer-wins across two ordered binders
- later silent binder does not clobber earlier set value
- [SettingsProperty] DefaultValue survives when no binder sets the property
- null for non-nullable int resolves to 0
- Nullable<int> null resolves to null; "42" strips and converts to 42
- ConverterType on IEnumerable<int> bypasses the collection converter (sentinel wins)
- Scalar Uri positive: bound URL string resolves to new Uri(value)
- Scalar DateTime positive: yyyy-MM-dd string resolves via ParseExact
- One DateTime format-mismatch negative asserts SettingsPropertyValueException type only
- No array-of-* duplication (owned by CollectionConversionTests); no redaction re-proof (ExceptionRedactionTests)
@guy-lud
guy-lud merged commit 67aa72f into master Jul 14, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant