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.