Skip to content

Library · Data Practice OS

Traceability gap report and rule trace card

Template · Published · Source reviewed

Copy one per wave, and rerun it on every build of the trace graph until the wave exits. Method detail is in Tracing rules from legacy code to modern code.

Source and status. Based on the draft Modernization traceability graph (Nov 2026). Proposed practice, not an adopted standard. The thresholds below are suggestions to agree with the migration lead and the rule catalogue owner.

Not when: lift-and-shift waves where SQL moves unchanged (use Reconciliation and cutover checklist alone), or before rule extraction has given every in-scope rule an id.

Field Value
System
Wave (from Migration wave plan)
Report date
Graph build (commit SHA)
dbt manifest schema version e.g. v12
Lineage snapshot date Databricks system tables or Snowflake ACCESS_HISTORY, if used
Owner

1. Scope

Priority Approved rules Proposed rules Total
P0 (fees, eligibility, sanctions, decisions about people)
P1
P2

Only approved rule cards count as fully traced (Rule authority; practice adaptation). G1 counts proposed cards separately, and G10 lists proposed cards that are already linked.

2. Gap queries

ID Question How computed Wave-exit threshold Count Owner Notes
G1 Not migrated In-scope rule with no modern implements edge, split into approved and proposed 0 at exit
G2 Migrated on faith Rule with a modern implements edge, no verified_by and no accepted decision 0 at exit
G3 P0 without a pinning test P0 rule with no pinned_by edge 0 before conversion starts
G4 Dead legacy Legacy module with no implements edge, cross-checked against the dead-end flag in the dependency map (Migration assessment) Each one triaged: dead / plumbing / missed rule
G5 Undecided suspected defects Rule card with a suspected defect and no decided_by 0 at exit
G6 Unknown rule ids Rule id in dbt meta or code that is not in the rule catalogue 0
G7 Untraced hand-written SQL Procedures, notebooks or scripts outside dbt with no rule-id header tag Listed, each with an owner
G8 Before cutting over table X Writers of X, then their rules, then each rule's verification All writer rules verified or waived
G9 Can I delete program Y? Rules Y carries, then the modern code claiming each, then verification Every carried rule claimed and verified or waived
G10 Rule not approved (practice adaptation) Proposed rule card with any implements or verified_by edge 0 at exit

"Waived" means an accepted decision record. Proposed, rejected or deferred records do not count, and a superseded or deprecated record counts only if its replacement also waives the rule.

3. Rule trace cards (one row per P0 rule)

Rule id, version, status Legacy modules (evidence) Pinning test and fixture Modern model or column Equivalence test, last green run Decision record id and status (if divergent) Recorded from (each claim)
e.g. REG-FEE-014 v2, approved usp_calc_rego_fee L212-260 (commit) pin_reg_fee_014, 12 cases int_registration_fee.concession_applied reg_fee_014_concession_equivalence, (date) REG-DEC-007, accepted

4. Deliberate divergences

Rule id Decision record id (system-prefixed, in the system's migration repo) Status (only accepted waives) Pinning test kept (y/n) Approver

5. Sign-off

Role Name Date
Migration lead
Rule catalogue owner
Business owner

Write the results to a table on each run, so the history is auditable, as in Reconciliation and cutover checklist.