Status: done
As a a system user, I want extension records to store and validate legacy identifier references on creation, so that all new capabilities join deterministically to legacy Access records in workflows and reports.
ILegacyLinkValidator [Campaign_Tracker.Server/Controllers/LegacyLinkController.cs:36]Campaign_Tracker.Server/campaign-tracker-client/_bmad-output/implementation-artifacts/_bmad-output/planning-artifacts/epics.md (Epic 1 / Story 1.8)_bmad-output/planning-artifacts/architecture.md_bmad-output/planning-artifacts/ux-design-specification.mdclaude-sonnet-4-6
Introduced Campaign_Tracker.Server/ExtensionData/ namespace with the full linking infrastructure.
LegacyLinkType enum defines the three join-key domains: JurisdictionJCode, KitId, ContactId.
LegacyLinkReference immutable record stores the type+value pair; factory methods enforce non-blank JCode.
LegacyLinkValidationResult captures success/failure with a descriptive error string.
ILegacyLinkValidator / LegacyLinkValidator: resolves each link type through the anti-corruption layer (ILegacyDataAccess), guaranteeing unambiguous resolution per AC #2; rejects unknown/missing identifiers per AC #3.
ILegacyLinkedRecord / ILegacyLinkedRecordProvider: contracts that every future extension record type implements to participate in AC #1 and AC #4.
LegacyLinkIntegrityReport + LegacyLinkIntegrityFailure: report model for AC #4.
ILegacyLinkIntegrityCheck / LegacyLinkIntegrityService: scans all registered providers, validates each record's link, computes consistency percentage. Empty provider set → 100% consistent (no records to fail).
LegacyLinkController (POST /api/admin/legacy-link/integrity-check, Admin-only): on-demand integrity check with audit event.
Program.cs: registered ILegacyLinkValidator and ILegacyLinkIntegrityCheck as scoped services.
19 unit tests cover all four ACs across validator and integrity service.
Stories 1.10–1.13 will register their own ILegacyLinkedRecordProvider implementations to feed the nightly check.
Review fixes introduced a concrete admin extension-record save API backed by an in-memory extension record store/provider, validation-before-save, duplicate active-link detection, positive ID guards, provider coverage reporting, and a nightly hosted integrity scheduler.
Campaign_Tracker.Server/ExtensionData/LegacyLinkType.cs (new)Campaign_Tracker.Server/ExtensionData/LegacyLinkReference.cs (new)Campaign_Tracker.Server/ExtensionData/LegacyLinkValidationResult.cs (new)Campaign_Tracker.Server/ExtensionData/ILegacyLinkValidator.cs (new)Campaign_Tracker.Server/ExtensionData/LegacyLinkValidator.cs (new)Campaign_Tracker.Server/ExtensionData/ILegacyLinkedRecord.cs (new)Campaign_Tracker.Server/ExtensionData/ILegacyLinkedRecordProvider.cs (new)Campaign_Tracker.Server/ExtensionData/LegacyLinkIntegrityReport.cs (new)Campaign_Tracker.Server/ExtensionData/ILegacyLinkIntegrityCheck.cs (new)Campaign_Tracker.Server/ExtensionData/LegacyLinkIntegrityService.cs (new)Campaign_Tracker.Server/Controllers/LegacyLinkController.cs (new)Campaign_Tracker.Server/Program.cs (modified — added ExtensionData using + service registrations)Campaign_Tracker.Server.Tests/LegacyLinkValidatorTests.cs (new — 12 tests)Campaign_Tracker.Server.Tests/LegacyLinkIntegrityServiceTests.cs (new — 7 tests)_bmad-output/implementation-artifacts/1-8-legacy-identifier-linking-for-extension-records.md (this file)_bmad-output/implementation-artifacts/sprint-status.yaml (modified — status updated)2026-05-06: Review fixes completed - concrete extension-record save path, pre-save validation, ambiguity checks, provider coverage guard, nightly scheduler, and ID domain validation added. Backend suite 111/111, client tests 28/28, solution build, lint, and client build clean. (Codex)
2026-05-06: Story 1.8 implemented — legacy identifier linking infrastructure introduced in new ExtensionData namespace. Validator, integrity check service, admin API endpoint, and 19 unit tests added. All 4 ACs satisfied. (claude-sonnet-4-6)
Powered by TurnKey Linux.