MasterData GA means more than creating nine tables. It must prove trustworthy assets, ORM parity, repeat-safe import, consistent cached reads, tenant isolation, auditable management, and rollback.
1. Current maturity
| Dimension | Evidence | Gap |
|---|---|---|
| Ownership | owner-local architecture gates | I18n physical coupling remains |
| Metadata | compile-time gate for nine models | business constraints incomplete |
| ORM | IEntitySet and parity foundation | full-catalog/large-data evidence |
| Seeding | eight steps and E2E seed tests | strict schema, diff, cardinality, bulk/transaction |
| Reads | resolver, tenant cache key, fallback | composite collision, precise invalidation, culture chain |
| Governance | feature and two read permissions | no endpoints, management rights, enforcement |
| Operations | upsert count logging | SLO, dashboard, alerts, runbook, rollback report |
2. Existing test evidence
Architecture tests keep legacy Framework/ORM paths deleted, require nine records and eight assets, enforce ORM neutrality and EntitySet seeders, verify host composition/resolver dependencies, and inspect generated table/tenant/soft-delete metadata.
Integration tests register these records in persistence metadata, repository parity, and end-to-end seed scenarios.
3. What remains unproved
Existing evidence does not prove four empty assets, 43k-row performance, Code/Class collisions, production cache propagation, entry authorization, or data authority.
4. Data-quality contract
| Check | Examples |
|---|---|
| schema | exact headers, types, required fields |
| identity | asset key aligns with index and Match |
| cardinality | min/max rows and change threshold |
| referential | parent exists and graph is acyclic |
| semantic | BCP-47, ISO code, currency, date range |
| governance | authority, revision, license, owner |
| compatibility | published code is not silently removed/redefined |
Retain reports as CI artifacts and release evidence.
5. Property-test example
// ① Rows are unique under the domain identity shared by storage and resolution.var rows = seedReader.Read<SysGeneralCodeCatalogRecord>(assetRequest);rows.GroupBy(row => new { row.TenantId, row.Group, row.Class, row.Code }) .Where(group => group.Count() > 1) .ShouldBeEmpty();
// ② Every parent exists and no parent chain returns to its origin.var byCode = rows.ToDictionary(row => (row.Class, row.Code));foreach (var row in rows.Where(row => row.ParentCode is not null)) CatalogGraph.AssertAcyclicAndParentExists(row, byCode);Adjust the key to the approved domain identity; this gate is not current source.
6. Dual-ORM matrix
Each adapter must prove empty schema initialization, first/repeat seed reports, targeted update, key/type/cancellation/failure behavior, tenant-0 vs regular-tenant isolation, resolver translation/sort/soft-delete behavior, and cold/warm large-asset duration/round trips.
Final row count alone cannot reveal an incorrect overwrite.
7. Startup and readiness
With a separate seed job, API readiness should verify the expected revision rather than execute the same large asset concurrently.
8. Metrics and alerts
Track seed duration/outcome, inserted/updated/unchanged/failed rows, asset revision, cache hit/miss/negative, resolver hit/raw/error, invalidation lag, and quality failures. Keep labels low cardinality; do not label by group, code, or tenant.
9. Audit and change management
A future management plane needs draft, semantic diff, approval, scheduled publication, revision, reason, impact scan, rollback revision, actor, and evidence.
IsProtect is only data today. Handlers must enforce it. Add create/update/publish permissions rather than reusing read permissions.
10. Backup and rollback
- backup affected tenant/catalog;
- retain asset digest and before/after diff;
- roll back by applying an approved revision, not manual production edits;
- do not delete a newly referenced code blindly;
- invalidate caches as part of rollback;
- include I18n translation impact;
- checkpoint recovery for large batches.
11. Commercial GA gates
| Gate | Required |
|---|---|
| G0 identity | owner, natural key, scope, authority, version for nine catalogs |
| G1 assets | strict schema, quality, diff, digest, license |
| G2 persistence | index/Match/resolver alignment, ORM parity, migration compatibility |
| G3 reads | composite key, culture fallback, precise distributed invalidation, version signal |
| G4 management | Application/API, feature/permission, approval, audit, rollback |
| G5 performance | 43k+ cold start, bulk upsert, transaction/recovery SLO |
| G6 operations | readiness, metrics, alerts, dashboard, runbook, drills |
A header-only core catalog or unverifiable authority revision blocks that catalog’s GA.
12. Evidence aggregation
// ① Every enabled catalog provides evidence for the same release revision.var evidence = await gaEvidence.LoadAsync(release.Revision, cancellationToken);foreach (var catalog in release.EnabledCatalogs){ evidence.RequirePassed(catalog, "schema"); evidence.RequirePassed(catalog, "dual-orm-repeat-seed"); evidence.RequirePassed(catalog, "tenant-isolation"); evidence.RequirePassed(catalog, "rollback-drill");}
// ② Header-only required assets and warnings block release.if (evidence.HasWarnings || evidence.AnyRequiredCatalogIsEmpty) throw new CommercialGaGateException(evidence.Summary);13. Current priorities
- repair CodeText identity and exchange-rate field drift;
- build strict validation and promote warnings to failures;
- classify or populate empty assets;
- establish 43k-row ORM performance/recovery evidence;
- correct precise invalidation and culture semantics;
- then build an approved/audited management plane.
14. Commands
dotnet test tests/BitzOrcas.Architecture.Tests/BitzOrcas.Architecture.Tests.csproj --no-restore --filter MasterDataInfrastructureArchitectureTestsdotnet test tests/BitzOrcas.Integration.Tests/BitzOrcas.Integration.Tests.csproj --no-restore --filter "Seed|MasterData"
# Expected no legacy ownership hit.rg -n "SysCountryEntity|SqlSugarDataDictionaryResolver|MasterDataEntityConfigurations" src -g '*.cs'