Branch Test Plan: Sunbelt Senior Insurance Client Hub and Source System Seed (Arrival and Identity)
Test Plan
| Effort | Linear DIG-574; DIGEST Data Vault Implementation, increments 1 (arrival and identity), 1.1 (source system seed) and 2 (the two-source raw vault), elaborating this single document set; branch claude_ws/dig-574-arrival-and-identity; the fix to release 1, keys and missing keys (Linear DIG-594), branch claude_ws/dig-594-release-1-keys-rebased-2 |
| Governed by | Standard: Branch Delivery Documents (K#12 I#27) |
| References | Design: Branch Design, Pilot item 270; profile: Branch Profile, Pilot item 267; implementation guide: Pilot item 272; QA standard: K#2 I#167 |
| Audience | Ray Serrano as reviewer; the implementer of the increment |
| Author | Ray Serrano; edited by Claude, 2026-10-22 |
| Classification | Internal — Data Management |
| Official copy method | Copied from this governed template by AGENTIC.DATASKILLS.KNOWLEDGE_ITEM_FROM_TEMPLATE; template SHA-256 recorded in the created item |
1. Executive summary
| Model | Logic areas | Brute-force paths | Unique paths after collapse |
|---|---|---|---|
| stg_sunbelt_client (staging view) | A: client number hard rule and hashing | 16 (4 presence values x 4 forms) | 4: P4, P5, P6, P7 |
| client_h (hub, incremental) | B: keep the first sighting and insert only new keys | 24 (3 arrivals x 2 rows-per-key-in-load x 2 technical-key cases x 2 hub states) | 4: P1, P2, P3, P8 |
| inspector_sunbelt_client_number_form (inspector) | C: client-number form | 2 (conforming, nonconforming) | 2: I1, I2 |
| auditor_sunbelt_client_hub (auditor) | D: source against hub | 2 (counts agree, counts disagree) | 2: A1, A2 |
| stg_sunbelt_policy_sale (staging view) | F: policy key form | 8 (2 carrier-code states x 4 policy-number states) | 4: PH5 to PH8 |
| policy_h (hub, incremental) | E: policy by source and load | 12 | 4: PH1 to PH4 |
| client_h and stg_sunbelt_policy_sale | G: client numbers from the sales data | 3 | 3: CH1 to CH3 |
| insured_h and stg_northfield_policy | H: insured numbers | 8 | 4: IH1 to IH4 |
| agent_h and stg_sunbelt_policy_sale | K: agents | 12 | 5: AG1 to AG5 |
| client_policy_l (link with a dependent child key) | I: roles on a policy | 16 | 4: L1, L2, L3, L5 |
| insured_policy_l and client_policy_l | J: one person under two role keys, and the resend | 4 | 2: L4, L6 |
| agent_policy_l (link, two sources) | L: the agent on a policy | 4 | 2: LA2, LA3 |
| policy_northfield_s, insured_northfield_s, client_sunbelt_s, client_policy_sunbelt_s (satellites) | M: satellite versions | 12 per satellite | 5 on Northfield Life’s data (ST1 to ST5, ST4 on its staging model), and ST1 to ST3 on each of the other three satellites: 14 tests |
| inspector_sunbelt_policy_number_form (inspector) | N: policy number form | 2 | 2: I3, I4 |
| auditor_sunbelt_policy_hub, auditor_northfield_policy_hub (auditors) | O: source against hub, per new source table | 4 | 4: A3 to A6 |
| stg_sunbelt_client, stg_sunbelt_policy_sale, stg_northfield_policy (staging views) | P: change hashes | 2 per model | 2 per model: HD1, HD2; 6 tests |
| client_sunbelt_s1, client_policy_sunbelt_s1, insured_northfield_s1, policy_northfield_s1 (version 1 views) | Q: load end dates | 2 per view | 2 per view: V1, V2; 8 tests |
| stg_sunbelt_client_known_client, stg_northfield_policy_known_insured, stg_northfield_policy_known_policy (staging views), the three satellites reading them, and the three missing-key inspectors | Z: missing keys | 2 (key present, key missing) | 3: Z1, Z2, Z3; 6 unit tests and uq_client_sunbelt_s_pk |
| finding_fact (release 1 mart view) | Y: the classification and the row of a finding | 6 | 1: Y1 |
| stg_northfield_organization, stg_pinecrest_organization (staging views) | R: a carrier’s organization record | 1 per model | 1 per model: OS1; 2 tests |
| organization_h (hub, incremental) | S: an organization by carrier feed and load | 12 (2 feeds x 3 arrivals x 2 hub states) | 4: OH1 to OH4 |
| organization_northfield_s, organization_pinecrest_s (satellites) | T: organization versions | 4 per satellite | 3 per satellite: OT1 to OT3; 6 tests |
| person_dim, organization_dim, policy_dim (dimensions) | U: ghost members | 3 per dimension | 1 per dimension: DG1 to DG3 |
| person_dim, policy_dim (dimensions) | V: an attribute from the most recent sale | 2 per dimension | 1 per dimension: DL1, DL2 |
| client_dim, insured_dim, agent_dim, carrier_dim (role views) | W: one role per view | 2 per view | 1 per view: DS1 to DS4 |
| policy_terms_fact (fact) | X: a version’s validity | 2 | 2: FV1, FV2 |
2. Logic areas
Logic area A: client number hard rule and hashing (stg_sunbelt_client)
Dimensions: presence (present, empty string, whitespace only, NULL) and form relative to an existing number (exact, case differs, surrounding spaces, internal form differs). Brute force 4 x 4 = 16. Collapse: form matters only when a value is present (12 combinations reduce to the 4 forms), and exact form is the baseline every other path compares against; empty and whitespace-only behave alike after design decision D-4. Unique paths: surface variant (P4), internal-form variant (P5), NULL (P6), empty or whitespace only (P7).
Logic area B: keep the first sighting (client_h)
Dimensions: arrival (first load only, both loads, second load only), rows per key within one load (one, two), technical key across loads (same, new), hub state (empty first build, incremental build). Brute force 3 x 2 x 2 x 2 = 24. Collapse: the hub ignores the technical key, so both technical-key cases behave alike (24 reduce to 12); a first build and an incremental build differ only in whether existing keys are skipped, which the arrival paths already separate. Unique paths: new key (P1), key in both loads keeps the first (P2, run with a new CRM row ID), key first seen in a later load on an incremental build (P3), two rows of one key in one load (P8).
Each logic area states its dimensions, brute-force count, collapse and reason, then provides this table:
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| P1 | Key A-1001 in load 1 only, first build | One hub row, load 1 timestamp, record source SSI | unit_client_h_p1_new_key |
| P2 | Key A-1003 in load 1 and in load 2 under a new CRM row ID | One hub row with the load 1 timestamp | unit_client_h_p2_repeat_keeps_first |
| P3 | Key A-1031 first seen in load 2, incremental build with A-1001 already in the hub | A-1031 inserted with the load 2 timestamp; A-1001 not inserted again | unit_client_h_p3_later_load_inserts |
| P4 | a-1004 and A-1005 with a trailing space beside A-1004 and A-1005 | Each variant’s hash key equals its exact form’s hash key | unit_stg_sunbelt_client_p4_surface_variant_same_key |
| P5 | A1007 beside A-1007 | Different hash keys | unit_stg_sunbelt_client_p5_internal_form_new_key |
| P6 | NULL client number | Hash key is the all-zeros key | unit_stg_sunbelt_client_p6_null_zero_key |
| P7 | Empty string and three spaces | Hash key is the all-zeros key after D-4. Run first as a characterization test of the current behavior, before D-4 is coded | unit_stg_sunbelt_client_p7_blank_zero_key |
| P8 | A-1010 and a-1010 in the same load | One hub row | unit_client_h_p8_duplicate_in_load_one_row |
| I1 | Client numbers A-1001 and a-1004 (conforming once trimmed and uppercased) | No finding | unit_inspector_sunbelt_client_number_form_conforming_no_finding |
| I2 | Client numbers A1007 and A-01008 | Two findings, one per value | unit_inspector_sunbelt_client_number_form_nonconforming_one_finding_each |
| A1 | 3 usable source keys, 3 non-ghost hub rows | No finding | unit_auditor_sunbelt_client_hub_agree_no_finding |
| A2 | 3 usable source keys, 2 non-ghost hub rows | One summary finding carrying both counts | unit_auditor_sunbelt_client_hub_disagree_one_finding |
Logic area C: client-number form (inspector_sunbelt_client_number_form)
Dimension: the trimmed, uppercased client number matches the designed form (letter A, hyphen, four digits) or does not. Brute force 2, no collapse. Paths: I1, I2.
Logic area D: source against hub (auditor_sunbelt_client_hub)
Dimension: the count of distinct usable source keys equals the count of non-ghost hub rows, or does not. Brute force 2, no collapse. Paths: A1, A2.
Logic area E: policy by source and load (policy_h)
Dimensions: which source sends the policy (sales data, carrier data, both), whether both sources arrive in the same load or different loads, and the hub’s state (first build, incremental build). Brute force 3 x 2 x 2 = 12. Collapse: when one source alone sends the policy, the load relation does not apply, and the hub state is already separated by the load paths. Unique paths 4 (profile P-12):
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| PH1 | Sale of NF-100012 only | One hub row from SSI | unit_policy_h_ph1_sales_only |
| PH2 | Carrier row NF-100002 only | One hub row from NFL | unit_policy_h_ph2_carrier_only |
| PH3 | Sale and carrier row of NF-100001 in the same load | One hub row | unit_policy_h_ph3_both_sources_same_load |
| PH4 | Carrier row NF-100011 in load 1, its sale in load 2 | One hub row, the load 1 sighting kept | unit_policy_h_ph4_later_load_keeps_first |
Logic area F: policy key form (stg_sunbelt_policy_sale)
Dimensions: carrier code (present, missing), policy number (present, empty), and form when present (exact, case variant, internal variant). Brute force 2 x (1 + 3) = 8. Collapse: a missing carrier code and an empty number with a code present behave alike, one part missing; the exact form is the baseline. Unique paths 4:
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| PH5 | nf-100001 beside NF-100001 | The same hash key | unit_stg_sunbelt_policy_sale_ph5_case_variant_same_key |
| PH6 | NF100009 beside NF-100009 | Different hash keys | unit_stg_sunbelt_policy_sale_ph6_internal_form_new_key |
| PH7 | No policy number and no carrier code | The all-zeros key | unit_stg_sunbelt_policy_sale_ph7_both_parts_missing_zero_key |
| PH8 | NF-100005 without its carrier code | A real key with the placeholder in the code’s part, different from NFL with NF-100005 | unit_stg_sunbelt_policy_sale_ph8_one_part_missing_placeholder_key |
Logic area G: client numbers from the sales data (client_h, stg_sunbelt_policy_sale)
Dimension: the sale’s client number is already in the hub, new, or empty. Brute force 3, no collapse. Paths:
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| CH1 | Sale for A-1001, already in the hub from the client list | No new row | unit_client_h_ch1_sale_number_already_in_hub |
| CH2 | Sale for A-1033, first seen | A new row from the sales data | unit_client_h_ch2_sale_number_first_seen |
| CH3 | Sale of NF-100014 with an empty client number | The all-zeros key | unit_stg_sunbelt_policy_sale_ch3_empty_client_zero_key |
Logic area H: insured numbers (insured_h, stg_northfield_policy)
Dimensions: arrival (new, resent), policies per insured (one, several), number (present, empty). Brute force 2 x 2 x 2 = 8. Collapse: an empty number goes to the ghost record whatever its arrival. Unique paths 4:
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| IH1 | NLI-55003, new | A new row | unit_insured_h_ih1_new_insured |
| IH2 | NLI-55001 resent in load 2 | No new row | unit_insured_h_ih2_resend_no_new_row |
| IH3 | NLI-55001 on NF-100001 and NF-100002 | One hub row | unit_insured_h_ih3_one_insured_two_policies |
| IH4 | NF-100013 with an empty insured number | The all-zeros key | unit_stg_northfield_policy_ih4_empty_insured_zero_key |
Logic area I: roles on a policy (client_policy_l)
Dimensions: people per policy (one, two), roles per person (one, two), role code (documented, undocumented), and arrival (new, resent). Brute force 2 x 2 x 2 x 2 = 16. Collapse: the resend behaves alike for every role combination and is tested once (area J). Unique paths 4 here:
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| L1 | NF-100001, A-1001, owner | One link row | unit_client_policy_l_l1_one_person_one_role |
| L2 | NF-100006: A-1006 owner, A-1008 insured | Two link rows | unit_client_policy_l_l2_two_people_two_roles |
| L3 | NF-100010: A-1010 as owner and as insured | Two link rows, told apart by the role | unit_client_policy_l_l3_one_person_two_roles |
| L5 | NF-100001, A-1001, payor, in load 2 | One more link row; the same columns | unit_client_policy_l_l5_undocumented_role_new_row |
Logic area J: one person under two role keys, and the resend (insured_policy_l, client_policy_l)
Dimensions: the same person sent by both sources (yes, no), and arrival (new, resent). Brute force 4. Collapse: a person sent by one source only is the baseline of areas H and I. Unique paths 2:
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| L4 | NF-100007: A-1007 insured in the sale; NLI-55007 in the carrier row | The insured link’s policy key equals the client link’s, and its person key is the insured’s; no row joins A-1007 to NLI-55007 | unit_insured_policy_l_l4_same_policy_two_role_keys |
| L6 | nf-100001, A-1001, owner, resent in load 2 | No new link row | unit_client_policy_l_l6_resend_no_new_row |
Logic area K: agents (agent_h, stg_sunbelt_policy_sale)
Dimensions: which source names the agent (sales, carrier, both), policies per agent (one, several), number (present, empty). Brute force 3 x 2 x 2 = 12. Collapse: an empty number goes to the ghost record whatever its source. Unique paths 5 (profile P-19):
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| AG1 | 17001001 on NF-100001 in both sources, same load | One hub row | unit_agent_h_ag1_both_sources_one_row |
| AG2 | 17002001 in the carrier data only | One hub row from NFL | unit_agent_h_ag2_carrier_only |
| AG3 | 17001007 in the sales data only | One hub row from SSI | unit_agent_h_ag3_sales_only |
| AG4 | 17001001 on NF-100001 and NF-100007 | One hub row | unit_agent_h_ag4_one_agent_several_policies |
| AG5 | NF-100014 with an empty agent number | The all-zeros key | unit_stg_sunbelt_policy_sale_ag5_empty_agent_zero_key |
Logic area L: the agent on a policy (agent_policy_l)
Dimensions: the two sources agree on the policy’s agent (yes, no), and arrival (new, resent). Brute force 4. Collapse: agreement on a new pair is path AG1’s link row. Unique paths 2:
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| LA2 | NF-100011: 17001005 in the carrier row, 17001004 in the sale | Two link rows to one policy | unit_agent_policy_l_la2_sources_disagree_two_rows |
| LA3 | nf-100001 with 17001001, resent | No new link row | unit_agent_policy_l_la3_resend_no_new_row |
Logic area M: satellite versions (policy_northfield_s, insured_northfield_s, client_sunbelt_s, client_policy_sunbelt_s)
Dimensions: arrival (first, resent), values on a resend (unchanged, changed, letter case only), and presence in load 2 (present, absent). Brute force 2 x 3 x 2 = 12. Collapse: a first arrival has no prior values to compare, and absence applies only to a key already held. Unique paths 5 (profile P-15). The four satellites share the toolkit’s satellite macro: all five paths are proven on Northfield Life’s data, where the profile plants them, and ST1 to ST3 on each of the other three satellites (Ray, decision 1a, 2026-10-25):
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| ST1 | First carrier row of NF-100001 | One satellite row | unit_policy_northfield_s_st1_first_version |
| ST2 | NF-100002 resent unchanged | No new version | unit_policy_northfield_s_st2_unchanged_resend |
| ST3 | NF-100003: IF in load 1, LP in load 2 | A second version; the first kept | unit_policy_northfield_s_st3_changed_value_new_version |
| ST4 | NF-100008: 12 Elm St, Flint MI, then 12 ELM ST, FLINT MI | Staging gives the two rows different change hashes, so the satellite stores a second version; the satellite side is proven by unit_insured_northfield_s_st3_case_only_new_version | unit_stg_northfield_policy_st4_case_only_new_hashdiff |
| ST5 | NF-100001 absent from load 2 | No row added; the load 1 version stays the latest | unit_policy_northfield_s_st5_absent_stays_current |
| ST1 | First Northfield Life row of NLI-55008 | One satellite row | unit_insured_northfield_s_st1_first_version |
| ST2 | NLI-55008 resent unchanged | No new version | unit_insured_northfield_s_st2_unchanged_resend |
| ST3 | NLI-55008: the address changes in letter case only | A second version | unit_insured_northfield_s_st3_case_only_new_version |
| ST1 | First client list row of A-1001 | One satellite row | unit_client_sunbelt_s_st1_first_version |
| ST2 | A-1001 resent unchanged | No new version | unit_client_sunbelt_s_st2_unchanged_resend |
| ST3 | A-1001: state FL, then GA | A second version | unit_client_sunbelt_s_st3_changed_value_new_version |
| ST1 | First sale row of A-1001 owner on NF-100001 | One satellite row | unit_client_policy_sunbelt_s_st1_first_version |
| ST2 | The same sale resent unchanged | No new version | unit_client_policy_sunbelt_s_st2_unchanged_resend |
| ST3 | The same sale with plan Final Expense 10K | A second version | unit_client_policy_sunbelt_s_st3_changed_value_new_version |
Logic area N: policy number form (inspector_sunbelt_policy_number_form)
Dimension: the trimmed, uppercased policy number matches NF, a hyphen and six digits, or does not. Brute force 2, no collapse:
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| I3 | NF-100001 and nf-100001 | No finding | unit_inspector_sunbelt_policy_number_form_conforming_no_finding |
| I4 | NF100009 | One finding | unit_inspector_sunbelt_policy_number_form_nonconforming_one_finding |
Logic area O: each new source table against the policy hub (auditor_sunbelt_policy_hub, auditor_northfield_policy_hub)
Dimension, per auditor: distinct usable policy keys in the source table equal the policy hub rows that source fed, or do not. Brute force 2 per auditor, no collapse:
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| A3 | Sales data: 3 usable keys, 3 hub rows | No finding | unit_auditor_sunbelt_policy_hub_agree_no_finding |
| A4 | Sales data: 3 usable keys, 2 hub rows | One summary finding carrying both counts | unit_auditor_sunbelt_policy_hub_disagree_one_finding |
| A5 | Carrier data: 3 usable keys, 3 hub rows | No finding | unit_auditor_northfield_policy_hub_agree_no_finding |
| A6 | Carrier data: 3 usable keys, 2 hub rows | One summary finding carrying both counts | unit_auditor_northfield_policy_hub_disagree_one_finding |
Logic area P: change hashes (stg_sunbelt_client, stg_sunbelt_policy_sale, stg_northfield_policy)
Dimension: the descriptive columns of a key’s two rows are the same or differ. Brute force 2 per model, no collapse. Expected hashes are literals computed with the toolkit’s own expression, checked first against all 81 live staged rows (guide G-8):
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| HD1 | A-1001, Rosa Alvarez, FL, in both acts | The same change hash | unit_stg_sunbelt_client_hd1_unchanged_same_hash |
| HD2 | A-1001 with state FL, then GA | Different change hashes | unit_stg_sunbelt_client_hd2_changed_value_new_hash |
| HD1 | The sale of NF-100001 to A-1001, owner, in both acts | The same change hash | unit_stg_sunbelt_policy_sale_hd1_unchanged_same_hash |
| HD2 | The same sale with plan Senior Term 20, then Final Expense 10K | Different change hashes | unit_stg_sunbelt_policy_sale_hd2_changed_value_new_hash |
| HD1 | NF-100001 with status IF in both acts | The same change hash | unit_stg_northfield_policy_hd1_unchanged_same_hash |
| HD2 | NF-100001 with status IF, then LP | Different change hashes | unit_stg_northfield_policy_hd2_changed_value_new_hash |
Insured details are covered by ST4’s staging test (area M).
Logic area Q: load end dates (client_sunbelt_s1, client_policy_sunbelt_s1, insured_northfield_s1, policy_northfield_s1)
Dimension: a key holds one version or several. Brute force 2 per view, no collapse. A version ends 1 microsecond before the next version’s load time; the latest ends at the end of all times, 8888-12-31 23:59:59:
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| V1 | One version of a key | Load end date 8888-12-31 23:59:59 | unit_ |
| V2 | Two versions of a key, loaded 2026-10-01 02:00 and 2026-10-02 02:00 | The first ends 2026-10-02 01:59:59.999999; the second ends 8888-12-31 23:59:59 | unit_ |
Red proof for areas M (the 9 added tests), P and Q, 2026-10-25: each test failed for its content under a planted defect, with no compilation error, and passed after the defect was removed. Defects: a hash column dropped from each change hash; a satellite with no change detection, one that never adds a second version, and one that writes nothing; views with no end dating, and views that end each version at its own load time.
Every increment 2 unit test is built from the planted source rows of profile P-16, written and run before the code it proves; severity is not set on unit tests, which always fail as errors under the Fusion engine.
Logic area Z: missing keys (the known-key views, client_sunbelt_s, insured_northfield_s, policy_northfield_s and the missing-key inspectors)
Dimension: a source row’s business key is present or missing, as landing keeps the row, a blank key counting as missing (D-44, D-45). Brute force 2: the satellite side and the finding side are two consequences of the one dimension. A satellite built after the fix is a third path, since rows stored before the fix stay until D-46 removes them. Unique paths 3:
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| Z1 | Every key present | The row reaches its satellite; no finding | unit_inspector_sunbelt_client_key_missing_none_missing; unit_inspector_sunbelt_policy_sale_key_missing_none_missing; unit_inspector_northfield_policy_key_missing_none_missing |
| Z2 | A key missing | The row stays out of its satellite; one finding per row and missing key | unit_inspector_sunbelt_client_key_missing_one_finding_per_row; unit_inspector_sunbelt_policy_sale_key_missing_one_finding_per_missing_key; unit_inspector_northfield_policy_key_missing_one_finding_per_missing_key |
| Z3 | A satellite built after the fix | No source row on the zero key | uq_client_sunbelt_s_pk, in layer 1, which failed before the fix on the false client and passes after |
The ten satellite unit tests of area M give the satellites their new sources, the known-key views, with the same rows.
Logic area Y: the classification and the row of a finding (finding_fact)
Dimensions: the finder that wrote the finding (a form inspector, a missing-key inspector, an auditor) and the keys a row misses (one, two). Brute force 3 x 2 = 6. Collapse: the number of missing keys matters only for a missing-key inspector, so form and audit findings each give one path, and a row missing two keys is the one that shows finding_row naming it once. Unique paths 1, proved by one test that holds a finding of each finder and a row missing two keys:
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| Y1 | One form finding, one audit finding, and two missing-key findings for one row missing two keys | finding_kind reads form, audit and missing_key; the two missing-key findings name the same finding_row | unit_finding_fact_kind_and_row |
2.1 Coverage by changed file, all seven layers
Every file the branch changes or adds, from git diff --name-status -M origin/qa...HEAD at commit 94639b4, 2026-10-25 05:57Z: 70 files, one row each (COVERAGE: EVERY FILE, EVERY LAYER, K#2 I#226). Existing tests on a changed file are kept and named beside the new. Unit tests are named by their path; the full names are in section 2.
| File | Change | 1 Built-ins | 2 Expectations | 3 Unit tests | 4 Logic assertions | 5 Detectors | 6 Reconciliations | 7 Semantic surface |
|---|---|---|---|---|---|---|---|---|
| .gitignore | change: ignores build output and local secrets | n/a: configuration, no logic | n/a: configuration, no logic | n/a: configuration, no logic | n/a: configuration, no logic | n/a: configuration, no logic | n/a: configuration, no logic | n/a: no semantic models (baseline B-4) |
| dbt/dbt_project.yml | moved from the repository root; paths, schemas per layer, timestamp variable (D-5) | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: no semantic models (baseline B-4) |
| dbt/macros/development/dev_drop_orphans.sql | add: development cleanup of objects the project no longer defines | n/a: operations macro | n/a: operations macro | n/a: tested live by planting a leftover table and schema, listing, dropping and listing again; refusal tested against DV | n/a: operations macro | n/a: operations macro | n/a: operations macro | n/a: no semantic models (baseline B-4) |
| dbt/macros/landing_storage.sql | add (D-12) | n/a: macro, covered through its callers: the three landing sources’ tests read the database it names | n/a: covered through the source tests | n/a: no logic beyond an environment variable default | n/a: covered through its callers | covered through its callers: both inspectors write to the CONFIG schema it names | covered through its callers: the three auditors write to the CONFIG schema it names | n/a: no semantic models (baseline B-4) |
| dbt/macros/materializations/merge_into.sql | add (D-12) | n/a: materialization | n/a: materialization | n/a: a unit test cannot run a materialization; covered by every finder build | n/a: covered through its callers | inspector_sunbelt_client_number_form and inspector_sunbelt_policy_number_form build through it | auditor_sunbelt_client_hub, auditor_sunbelt_policy_hub and auditor_northfield_policy_hub build through it | n/a: no semantic models (baseline B-4) |
| dbt/macros/operations/land_act.sql | add, then extended to three tables in increment 2: the landing acts as a macro | n/a: operations macro | its acts are counted by expect_sunbelt_client_row_count and expect_increment_2_staging_keeps_every_landed_row | n/a: tested live by replaying act 2 with an identical fingerprint; refusals on production and on an already-loaded act | n/a: operations macro | n/a: operations macro | the three auditors count the rows it lands | n/a: no semantic models (baseline B-4) |
| dbt/macros/operations/vault_checks.sql | add, extended in increment 2: read-only routine counts | n/a: read-only report; its output compared with direct queries | n/a: read-only report; its output compared with direct queries | n/a: read-only report; its output compared with direct queries | n/a: read-only report; its output compared with direct queries | n/a: read-only report; its output compared with direct queries | n/a: read-only report; its output compared with direct queries | n/a: no semantic models (baseline B-4) |
| dbt/macros/pipeline/generate_schema_name.sql | add: a custom schema is used as written | n/a: covered by every build, which places models in STAGING, RAW_VAULT and REFERENCE | n/a: covered by every build, which places models in STAGING, RAW_VAULT and REFERENCE | n/a: covered by every build, which places models in STAGING, RAW_VAULT and REFERENCE | n/a: covered by every build, which places models in STAGING, RAW_VAULT and REFERENCE | n/a: covered by every build, which places models in STAGING, RAW_VAULT and REFERENCE | n/a: covered by every build, which places models in STAGING, RAW_VAULT and REFERENCE | n/a: no semantic models (baseline B-4) |
| dbt/macros/verification/baseline_metrics.sql | add in increment 2: the measurements the baseline facility takes | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: no semantic models (baseline B-4) |
| dbt/macros/verification/capture_baseline.sql | add (D-12), extended in increment 2 to every vault table | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: no semantic models (baseline B-4) |
| dbt/macros/verification/verify_build.sql | add (D-12), extended in increment 2 to every vault table | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: guardrail macro, section 3.1 | n/a: no semantic models (baseline B-4) |
| dbt/models/auditors/_auditors.yml | add: the auditors’ unit tests | n/a: holds tests | n/a: holds tests | holds A1 to A6 | n/a: holds tests | n/a: holds tests | n/a: holds tests | n/a: no semantic models (baseline B-4) |
| dbt/models/auditors/auditor_northfield_policy_hub.sql | add: auditor (D-10, guide step 31); corrected in increment 2 to check that each source key exists in its hub | n/a: auditor model; its findings are the proof | n/a: auditor model | unit_auditor_northfield_policy_hub_agree_no_finding and unit_auditor_northfield_policy_hub_disagree_one_finding (A5, A6) | n/a: auditor model | n/a: an auditor, not an inspector | is the auditor; expected no finding | n/a: no semantic models (baseline B-4) |
| dbt/models/auditors/auditor_sunbelt_client_hub.sql | add: auditor (D-10); corrected in increment 2 to check that each source key exists in its hub | n/a: auditor model; its findings are the proof | n/a: auditor model | unit_auditor_sunbelt_client_hub_agree_no_finding and unit_auditor_sunbelt_client_hub_disagree_one_finding (A1, A2) | n/a: auditor model | n/a: an auditor, not an inspector | is the auditor; expected no finding | n/a: no semantic models (baseline B-4) |
| dbt/models/auditors/auditor_sunbelt_policy_hub.sql | add: auditor (D-10, guide step 31); corrected in increment 2 to check that each source key exists in its hub | n/a: auditor model; its findings are the proof | n/a: auditor model | unit_auditor_sunbelt_policy_hub_agree_no_finding and unit_auditor_sunbelt_policy_hub_disagree_one_finding (A3, A4) | n/a: auditor model | n/a: an auditor, not an inspector | is the auditor; expected no finding | n/a: no semantic models (baseline B-4) |
| dbt/models/inspectors/_inspectors.yml | add: the inspectors’ unit tests | n/a: holds tests | n/a: holds tests | holds I1 to I4 | n/a: holds tests | n/a: holds tests | n/a: holds tests | n/a: no semantic models (baseline B-4) |
| dbt/models/inspectors/inspector_sunbelt_client_number_form.sql | add: inspector (D-9) | n/a: inspector model; its findings are the proof | n/a: inspector model | I1, I2 | n/a: inspector model | is the inspector; expected two findings, A1007 and A-01008 | n/a: an inspector, not an auditor | n/a: no semantic models (baseline B-4) |
| dbt/models/inspectors/inspector_sunbelt_policy_number_form.sql | add: inspector (D-30) | n/a: inspector model; its findings are the proof | n/a: inspector model | I3, I4 | n/a: inspector model | is the inspector; expected one finding, NF100009 | n/a: an inspector, not an auditor | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/_client_h.yml | add: client_h’s layer 1 tests and the unit tests P1 to P8; four fixtures rewritten in increment 2 to mock the second source | holds uq_client_h_hk_client_h, nn_client_h_hk_client_h | n/a: holds tests | holds P1 to P8 | n/a: assertions are files in dbt/tests | n/a: holds tests | n/a: holds tests | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/_increment_2.yml | add: increment 2’s layer 1 tests on its six hubs and links, and 48 of its unit tests | holds uq_ and nn_ on the hash keys of policy_h, insured_h, agent_h, client_policy_l, insured_policy_l, agent_policy_l, and D-40’s four rel_ tests from each satellite’s hash key to its parent | n/a: holds tests | holds the unit tests of areas E, G, H, I, J, K, L, M, P (client) and Q | n/a: assertions are files in dbt/tests | n/a: holds tests | n/a: holds tests | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/agent_h.sql | add: agent hub (D-35) | uq_agent_h_hk_agent_h; nn_agent_h_hk_agent_h | n/a: its row count is read by verify_build and the verification queries | AG1 to AG4 | assert_vault_record_sources_resolve; assert_increment_2_link_hub_keys_exist | n/a: inspectors read staging, not the vault | n/a: no auditor in the design for the agent hub; path AG1 is read by verification query 9 | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/agent_policy_l.sql | add: link (D-36) | uq_agent_policy_l_hk_agent_policy_l; nn_agent_policy_l_hk_agent_policy_l | n/a: its row count is read by verify_build | LA2, LA3 | assert_increment_2_link_hub_keys_exist; assert_vault_record_sources_resolve | n/a: inspectors read staging, not the vault | n/a: no auditor in the design for links; probe Q-6 reads them | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/client_h.sql | add; second source in increment 2 (D-32, G-14) | uq_client_h_hk_client_h; nn_client_h_hk_client_h | n/a: its row count is read by verify_build and the verification queries | P1, P2, P3, P8, CH1, CH2 | assert_client_h_no_blank_business_key; assert_client_h_covers_usable_source_keys; assert_client_h_ghost_keys_belong_to_ghosts; assert_vault_record_sources_resolve; assert_increment_2_link_hub_keys_exist | n/a: inspectors read staging, not the vault | auditor_sunbelt_client_hub | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/client_policy_l.sql | add: link (D-33) | uq_client_policy_l_hk_client_policy_l; nn_client_policy_l_hk_client_policy_l | n/a: its row count is read by verify_build | L1, L2, L3, L5, L6 | assert_increment_2_link_hub_keys_exist; assert_vault_record_sources_resolve | n/a: inspectors read staging, not the vault | n/a: no auditor in the design for links; probe Q-6 reads them | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/client_policy_sunbelt_s.sql | add: satellite, version 0 (D-34) | n/a: a satellite’s key repeats by design; its parent hub or link carries the key tests | n/a: its row count is read by verify_build | ST1 to ST3 of client_policy_sunbelt_s | n/a: no modeled truth beyond its parent’s; verification query 10 reads its versions | n/a: inspectors read staging | n/a: no auditor in the design for satellites | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/client_policy_sunbelt_s1.sql | add: version 1 view, load end dates (D-34, G-15) | n/a: view over its satellite | n/a: view over its satellite | V1, V2 of client_policy_sunbelt_s1 | n/a: no modeled truth beyond its satellite’s | n/a: inspectors read staging | n/a: no auditor in the design for views | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/client_sunbelt_s.sql | add: satellite, version 0 (D-34) | n/a: a satellite’s key repeats by design; its parent hub or link carries the key tests | n/a: its row count is read by verify_build | ST1 to ST3 of client_sunbelt_s | n/a: no modeled truth beyond its parent’s; verification query 10 reads its versions | n/a: inspectors read staging | n/a: no auditor in the design for satellites | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/client_sunbelt_s1.sql | add: version 1 view, load end dates (D-34, G-15) | n/a: view over its satellite | n/a: view over its satellite | V1, V2 of client_sunbelt_s1 | n/a: no modeled truth beyond its satellite’s | n/a: inspectors read staging | n/a: no auditor in the design for views | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/insured_h.sql | add: insured hub (D-32) | uq_insured_h_hk_insured_h; nn_insured_h_hk_insured_h | n/a: its row count is read by verify_build and the verification queries | IH1 to IH3 | assert_vault_record_sources_resolve; assert_increment_2_link_hub_keys_exist | n/a: inspectors read staging, not the vault | n/a: no auditor in the design for the insured hub; its keys are reached through probe Q-6 | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/insured_northfield_s.sql | add: satellite, version 0 (D-34) | n/a: a satellite’s key repeats by design; its parent hub or link carries the key tests | n/a: its row count is read by verify_build | ST1 to ST3 of insured_northfield_s; ST4 on staging | n/a: no modeled truth beyond its parent’s; verification query 10 reads its versions | n/a: inspectors read staging | n/a: no auditor in the design for satellites | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/insured_northfield_s1.sql | add: version 1 view, load end dates (D-34, G-15) | n/a: view over its satellite | n/a: view over its satellite | V1, V2 of insured_northfield_s1 | n/a: no modeled truth beyond its satellite’s | n/a: inspectors read staging | n/a: no auditor in the design for views | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/insured_policy_l.sql | add: link (D-33) | uq_insured_policy_l_hk_insured_policy_l; nn_insured_policy_l_hk_insured_policy_l | n/a: its row count is read by verify_build | L4 | assert_increment_2_link_hub_keys_exist; assert_vault_record_sources_resolve | n/a: inspectors read staging, not the vault | n/a: no auditor in the design for links; probe Q-6 reads them | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/policy_h.sql | add: policy hub (D-26) | uq_policy_h_hk_policy_h; nn_policy_h_hk_policy_h | n/a: its row count is read by verify_build and the verification queries | PH1 to PH4 | assert_vault_record_sources_resolve; assert_increment_2_link_hub_keys_exist | n/a: inspectors read staging, not the vault | auditor_sunbelt_policy_hub; auditor_northfield_policy_hub | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/policy_northfield_s.sql | add: satellite, version 0 (D-34) | n/a: a satellite’s key repeats by design; its parent hub or link carries the key tests | n/a: its row count is read by verify_build | ST1, ST2, ST3, ST5 | n/a: no modeled truth beyond its parent’s; verification query 10 reads its versions | n/a: inspectors read staging | n/a: no auditor in the design for satellites | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/policy_northfield_s1.sql | add: version 1 view, load end dates (D-34, G-15) | n/a: view over its satellite | n/a: view over its satellite | V1, V2 of policy_northfield_s1 | n/a: no modeled truth beyond its satellite’s | n/a: inspectors read staging | n/a: no auditor in the design for views | n/a: no semantic models (baseline B-4) |
| dbt/models/staging/_stg_northfield_policy.yml | add: unit tests IH4 and ST4 | n/a: holds tests | n/a: holds tests | holds IH4, ST4 | n/a: holds tests | n/a: holds tests | n/a: holds tests | n/a: no semantic models (baseline B-4) |
| dbt/models/staging/_stg_sunbelt_policy_sale.yml | add: unit tests PH5 to PH8, CH3, AG5 | n/a: holds tests | n/a: holds tests | holds PH5 to PH8, CH3, AG5 | n/a: holds tests | n/a: holds tests | n/a: holds tests | n/a: no semantic models (baseline B-4) |
| dbt/models/staging/_sunbelt__sources.yml | add: the three landing sources and their tests; Northfield Life and the sales data in increment 2 | nn_sunbelt_client_crm_row_id; nn_sunbelt_client_loaded_at; nn_sunbelt_policy_sale_loaded_at; nn_northfield_policy_loaded_at | uqc_sunbelt_client_loaded_at_crm_row_id; uqc_sunbelt_policy_sale_loaded_at_policy_client_role; uqc_northfield_policy_loaded_at_policy_number | n/a: declaration | n/a: declaration | n/a: declaration | n/a: declaration | n/a: no semantic models (baseline B-4) |
| dbt/models/staging/stg_northfield_policy.sql | add: staging with hard rules (D-24); NFL supplied (D-26) | n/a: view, tested through its paths | expect_increment_2_staging_keeps_every_landed_row | IH4, ST4; HD1, HD2 | n/a: its truths surface in the hubs’ and links’ assertions | n/a: no inspector in the design for Northfield Life’s forms | auditor_northfield_policy_hub reads it | n/a: no semantic models (baseline B-4) |
| dbt/models/staging/stg_sunbelt_client.sql | add (D-4); record source SSI (D-15); change hash added in increment 2 (D-34) | n/a: view, tested through its paths | expect_sunbelt_client_row_count reads its source | P4 to P7; HD1, HD2 | assert_client_h_covers_usable_source_keys reads it | inspector_sunbelt_client_number_form reads it | auditor_sunbelt_client_hub reads it | n/a: no semantic models (baseline B-4) |
| dbt/models/staging/stg_sunbelt_policy_sale.sql | add: staging with hard rules (D-24) | n/a: view, tested through its paths | expect_increment_2_staging_keeps_every_landed_row | PH5 to PH8, CH3, AG5; HD1, HD2 | n/a: its truths surface in the hubs’ and links’ assertions | inspector_sunbelt_policy_number_form reads it | auditor_sunbelt_policy_hub reads it | n/a: no semantic models (baseline B-4) |
| dbt/packages.yml | moved from the repository root; datavault4dbt pinned to the fork, dbt_utils added (G-9) | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: no semantic models (baseline B-4) |
| dbt/seeds/_seeds.yml | add: the seed’s description and its two built-in tests | holds uq_seed_source_system_code, nn_seed_source_system_code | n/a: holds tests | n/a: holds tests | n/a: holds tests | n/a: holds tests | n/a: holds tests | n/a: no semantic models (baseline B-4) |
| dbt/seeds/seed_build_expectations.csv | add (G-3), inc2 rows (G-17) | n/a: seed read by verify_build, section 3.1 | n/a: seed read by verify_build, section 3.1 | n/a: seed read by verify_build, section 3.1 | n/a: seed read by verify_build, section 3.1 | n/a: seed read by verify_build, section 3.1 | n/a: seed read by verify_build, section 3.1 | n/a: no semantic models (baseline B-4) |
| dbt/seeds/seed_source_system.csv | add: SSI, SYSTEM, ERROR (D-17, D-21); NFL in increment 2 (D-23) | uq_seed_source_system_code; nn_seed_source_system_code | n/a: four authored rows | n/a: data, no logic | assert_vault_record_sources_resolve joins it | n/a: reference data | n/a: reference data | n/a: no semantic models (baseline B-4) |
| dbt/selectors.yml | add: named selections for builds | n/a: configuration; proven by the builds that use it | n/a: configuration; proven by the builds that use it | n/a: configuration; proven by the builds that use it | n/a: configuration; proven by the builds that use it | n/a: configuration; proven by the builds that use it | n/a: configuration; proven by the builds that use it | n/a: no semantic models (baseline B-4) |
| dbt/tests/assert_client_h_covers_usable_source_keys.sql | add | n/a: is itself a test | n/a: is itself a test | n/a: is itself a test | is the assertion | n/a: is itself a test | n/a: is itself a test | n/a: no semantic models (baseline B-4) |
| dbt/tests/assert_client_h_ghost_keys_belong_to_ghosts.sql | add | n/a: is itself a test | n/a: is itself a test | n/a: is itself a test | is the assertion | n/a: is itself a test | n/a: is itself a test | n/a: no semantic models (baseline B-4) |
| dbt/tests/assert_client_h_no_blank_business_key.sql | add | n/a: is itself a test | n/a: is itself a test | n/a: is itself a test | is the assertion | n/a: is itself a test | n/a: is itself a test | n/a: no semantic models (baseline B-4) |
| dbt/tests/assert_increment_2_link_hub_keys_exist.sql | add in increment 2 | n/a: is itself a test | n/a: is itself a test | n/a: is itself a test | is the assertion | n/a: is itself a test | n/a: is itself a test | n/a: no semantic models (baseline B-4) |
| dbt/tests/assert_vault_record_sources_resolve.sql | add, rewritten in increment 2 to read every hub and link | n/a: is itself a test | n/a: is itself a test | n/a: is itself a test | is the assertion | n/a: is itself a test | n/a: is itself a test | n/a: no semantic models (baseline B-4) |
| dbt/tests/expect_increment_2_staging_keeps_every_landed_row.sql | add in increment 2 | n/a: is itself a test | is the expectation | n/a: is itself a test | n/a: is itself a test | n/a: is itself a test | n/a: is itself a test | n/a: no semantic models (baseline B-4) |
| dbt/tests/expect_sunbelt_client_row_count.sql | add | n/a: is itself a test | is the expectation | n/a: is itself a test | n/a: is itself a test | n/a: is itself a test | n/a: is itself a test | n/a: no semantic models (baseline B-4) |
| models/raw_vault/student_h.sql | removed in housekeeping (DIG-579): exploratory model | n/a: removed | n/a: removed | n/a: removed | n/a: removed | n/a: removed | n/a: removed | n/a: no semantic models (baseline B-4) |
| models/staging/stg_student.sql | removed in housekeeping (DIG-579): exploratory model | n/a: removed | n/a: removed | n/a: removed | n/a: removed | n/a: removed | n/a: removed | n/a: no semantic models (baseline B-4) |
| package-lock.yml | removed from the root; dbt deps writes the lock under dbt/ | n/a: removed | n/a: removed | n/a: removed | n/a: removed | n/a: removed | n/a: removed | n/a: no semantic models (baseline B-4) |
| packages.yml | moved to dbt/packages.yml | n/a: moved | n/a: moved | n/a: moved | n/a: moved | n/a: moved | n/a: moved | n/a: no semantic models (baseline B-4) |
| reader/build_course_page.py | add: builds the course’s reading page from Pilot (DIG-578) | n/a: course tooling outside the warehouse; checked by reading the page it builds | n/a: course tooling outside the warehouse; checked by reading the page it builds | n/a: course tooling outside the warehouse; checked by reading the page it builds | n/a: course tooling outside the warehouse; checked by reading the page it builds | n/a: course tooling outside the warehouse; checked by reading the page it builds | n/a: course tooling outside the warehouse; checked by reading the page it builds | n/a: no semantic models (baseline B-4) |
| seeds/student.csv | removed in housekeeping (DIG-579): exploratory model | n/a: removed | n/a: removed | n/a: removed | n/a: removed | n/a: removed | n/a: removed | n/a: no semantic models (baseline B-4) |
| setup/infrastructure/admin_separation.sql | add: administration roles | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: no semantic models (baseline B-4) |
| setup/infrastructure/developer_keys/RAYSERRANO.sql | add: a developer’s public key | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: no semantic models (baseline B-4) |
| setup/infrastructure/environment_tiers.sql | add: the four tiers (D-2) | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: no semantic models (baseline B-4) |
| setup/infrastructure/landing.sql | add (D-1, D-12), extended in increment 2 (step 22) | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: no semantic models (baseline B-4) |
| setup/infrastructure/landing_increment2_dev_claude_ws.sql | add: increment 2’s landing tables in the workstation clone (step 22, answer 1b) | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: no semantic models (baseline B-4) |
| setup/infrastructure/pilot_reader.sql | add: Pilot read access | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: no semantic models (baseline B-4) |
| setup/infrastructure/service_users.sql | add: service users | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL script, proven by reading back the objects it creates | n/a: no semantic models (baseline B-4) |
| setup/keys/new_developer_keypair.ps1 | add: creates a developer key pair | n/a: workstation script outside the warehouse; proven by the key it created | n/a: workstation script outside the warehouse; proven by the key it created | n/a: workstation script outside the warehouse; proven by the key it created | n/a: workstation script outside the warehouse; proven by the key it created | n/a: workstation script outside the warehouse; proven by the key it created | n/a: workstation script outside the warehouse; proven by the key it created | n/a: no semantic models (baseline B-4) |
| setup/runbooks/dbt_cloud_qa_environment.md | add: runbook | n/a: documentation, no code | n/a: documentation, no code | n/a: documentation, no code | n/a: documentation, no code | n/a: documentation, no code | n/a: documentation, no code | n/a: no semantic models (baseline B-4) |
| setup/runbooks/github_machine_account.md | add: runbook | n/a: documentation, no code | n/a: documentation, no code | n/a: documentation, no code | n/a: documentation, no code | n/a: documentation, no code | n/a: documentation, no code | n/a: no semantic models (baseline B-4) |
| setup/scripts/dev_scoped_rebuild.sh | add (D-20, G-12) | n/a: script; refusal outside developer databases tested live | n/a: script; refusal outside developer databases tested live | n/a: script; refusal outside developer databases tested live | n/a: script; refusal outside developer databases tested live | n/a: script; refusal outside developer databases tested live | n/a: script; refusal outside developer databases tested live | n/a: no semantic models (baseline B-4) |
The fix to release 1 (DIG-594) changes or adds 16 files, from git diff --name-status origin/qa...HEAD at commit 976744e on its branch, 2026-10-28 21:00Z, one row each:
| File | Change | 1 Built-ins | 2 Expectations | 3 Unit tests | 4 Logic assertions | 5 Detectors | 6 Reconciliations | 7 Semantic surface |
|---|---|---|---|---|---|---|---|---|
| dbt/dbt_project.yml | change: the on-run-end hook runs declare_vault_keys (D-43) | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: configuration; proven by every build | n/a: no semantic models (baseline B-4) |
| dbt/macros/declare_vault_keys.sql | add (D-43) | n/a: macro; its output is the 22 constraints read from the information schema after each build | n/a: macro | n/a: a unit test cannot run an on-run-end hook; proven live: 22 keys defined, a rerun adds none | n/a: macro | n/a: macro | n/a: macro | n/a: no semantic models (baseline B-4) |
| dbt/models/inspectors/_inspectors.yml | change: the six unit tests of paths Z1 and Z2 | n/a: holds tests | n/a: holds tests | holds Z1, Z2 | n/a: holds tests | n/a: holds tests | n/a: holds tests | n/a: no semantic models (baseline B-4) |
| dbt/models/inspectors/inspector_northfield_policy_key_missing.sql | add: inspector (D-45) | n/a: inspector model; its findings are the proof | n/a: inspector model | Z1, Z2 | n/a: inspector model | is the inspector; one finding per row and missing key | n/a: an inspector, not an auditor | n/a: no semantic models (baseline B-4) |
| dbt/models/inspectors/inspector_sunbelt_client_key_missing.sql | add: inspector (D-45) | n/a: inspector model; its findings are the proof | n/a: inspector model | Z1, Z2 | n/a: inspector model | is the inspector; one finding per row and missing key | n/a: an inspector, not an auditor | n/a: no semantic models (baseline B-4) |
| dbt/models/inspectors/inspector_sunbelt_policy_sale_key_missing.sql | add: inspector (D-45) | n/a: inspector model; its findings are the proof | n/a: inspector model | Z1, Z2 | n/a: inspector model | is the inspector; one finding per row and missing key | n/a: an inspector, not an auditor | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/_increment_2.yml | change: D-42’s 18 layer 1 tests; the ten satellite unit tests of area M given the known-key views | holds the 18 tests of D-42 beside the existing uq_, nn_ and rel_ tests | n/a: holds tests | holds area M, inputs changed | n/a: holds tests | n/a: holds tests | n/a: holds tests | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/client_sunbelt_s.sql | change: reads its known-key view (D-44) | uq_client_sunbelt_s_pk, nn_client_sunbelt_s_hk_client_h, nn_client_sunbelt_s_ldts (D-42); rel_client_sunbelt_s_hk_client_h (D-40) kept | n/a: its row count is read by verify_build | area M tests kept, given the known-key view; Z3 | n/a: no modeled truth beyond its parent | n/a: inspectors read staging | n/a: no auditor in the design for satellites | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/insured_northfield_s.sql | change: reads its known-key view (D-44) | uq_insured_northfield_s_pk, nn_insured_northfield_s_hk_insured_h, nn_insured_northfield_s_ldts (D-42); rel_insured_northfield_s_hk_insured_h (D-40) kept | n/a: its row count is read by verify_build | area M tests kept, given the known-key view | n/a: no modeled truth beyond its parent | n/a: inspectors read staging | n/a: no auditor in the design for satellites | n/a: no semantic models (baseline B-4) |
| dbt/models/raw_vault/policy_northfield_s.sql | change: reads its known-key view (D-44) | uq_policy_northfield_s_pk, nn_policy_northfield_s_hk_policy_h, nn_policy_northfield_s_ldts (D-42); rel_policy_northfield_s_hk_policy_h (D-40) kept | n/a: its row count is read by verify_build | area M tests kept, given the known-key view | n/a: no modeled truth beyond its parent | n/a: inspectors read staging | n/a: no auditor in the design for satellites | n/a: no semantic models (baseline B-4) |
| dbt/models/staging/stg_northfield_policy_known_insured.sql | add: known-key view (D-44) | n/a: view, proved through its satellite | n/a: view | n/a: a filter; the satellite tests mock it, and Z3 shows no zero-key row reaches a satellite | n/a: view | the missing-key inspectors report the rows it leaves out | n/a: view | n/a: no semantic models (baseline B-4) |
| dbt/models/staging/stg_northfield_policy_known_policy.sql | add: known-key view (D-44) | n/a: view, proved through its satellite | n/a: view | n/a: a filter; the satellite tests mock it, and Z3 shows no zero-key row reaches a satellite | n/a: view | the missing-key inspectors report the rows it leaves out | n/a: view | n/a: no semantic models (baseline B-4) |
| dbt/models/staging/stg_sunbelt_client_known_client.sql | add: known-key view (D-44) | n/a: view, proved through its satellite | n/a: view | n/a: a filter; the satellite tests mock it, and Z3 shows no zero-key row reaches a satellite | n/a: view | the missing-key inspectors report the rows it leaves out | n/a: view | n/a: no semantic models (baseline B-4) |
| infra/runbooks/dbt_cloud_prod_environment.md | change: the promotion’s one-time correction step (D-46) | n/a: documentation, no code | n/a: documentation, no code | n/a: documentation, no code | n/a: documentation, no code | n/a: documentation, no code | n/a: documentation, no code | n/a: no semantic models (baseline B-4) |
| infra/snowflake/correct_zero_key_satellite_rows.sql | add: one-time correction (D-46) | n/a: script; proven live on the development vault with production’s four rows copied in | n/a: script; proven live on the development vault with production’s four rows copied in | n/a: script; proven live on the development vault with production’s four rows copied in | n/a: script; proven live on the development vault with production’s four rows copied in | n/a: script; proven live on the development vault with production’s four rows copied in | n/a: script; proven live on the development vault with production’s four rows copied in | n/a: no semantic models (baseline B-4) |
| infra/snowflake/ddl/dv.sql | change: regenerated with the 22 keys (D-43) | n/a: generated; infra/scripts/vault_ddl.py –check compares it with a tier | n/a: generated; infra/scripts/vault_ddl.py –check compares it with a tier | n/a: generated; infra/scripts/vault_ddl.py –check compares it with a tier | n/a: generated; infra/scripts/vault_ddl.py –check compares it with a tier | n/a: generated; infra/scripts/vault_ddl.py –check compares it with a tier | n/a: generated; infra/scripts/vault_ddl.py –check compares it with a tier | n/a: no semantic models (baseline B-4) |
| infra/runbooks/github_machine_account.md | change: the reference architecture removed from its comments (D-48) | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard |
| infra/snowflake/admin_separation.sql | change: the reference architecture removed from its comments (D-48) | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard |
| infra/snowflake/environment_tiers.sql | change: the reference architecture removed from its comments (D-48) | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard |
| infra/snowflake/landing.sql | change: the reference architecture removed from its comments (D-48) | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard |
| infra/snowflake/refresh_landing_tier.sql | change: the reference architecture removed from its comments (D-48) | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard | n/a: comments only, no code changed; proven by the build’s guard |
| site/excluded_terms.txt | add: the terms no built page may carry (D-48) | n/a: a list | n/a: a list | n/a: a list | n/a: a list | n/a: a list | n/a: a list | n/a: read by the build guard |
| site/build_site.py | change: the guard writes no page carrying a listed term (D-48); the executive summary (D-49); the release page sends readers to the Ask page (D-50); the test count 137; the counts read from their sources (D-52) | n/a: the site builder | n/a | n/a | n/a | n/a | n/a | the guard: 120 hits refused before the removal, 22 pages written with none after; the summary first on the home page, its switch proven off and on; every internal address resolving |
| site/dev/qa_retest.py | change: runs inside the workstation container, accepting its gateway’s certificate only where installed, and counts spelled-out numbers (D-51) | n/a: a test script | n/a | n/a | n/a | n/a | n/a | 26 of 26 from the container against the QA function |
The release 1 mart, the views that serve the semantic layer, adds 6 files at commit f48c24b, one row each; the fix changes two of them and adds a seventh at commit 2a921a1 (D-47):
| File | Change | 1 Built-ins | 2 Expectations | 3 Unit tests | 4 Logic assertions | 5 Detectors | 6 Reconciliations | 7 Semantic surface |
|---|---|---|---|---|---|---|---|---|
| dbt/models/mart/_mart.yml | add: the mart views and their tests; change: finding_fact’s dimensions finding_kind and finding_row, the metrics records_not_accepted and rows_missing_key, and the unit test unit_finding_fact_kind_and_row (D-47) | holds uq_client_policy_fact_client_policy_key, uq_agent_policy_fact_agent_policy_key and uq_policy_fact_policy_key | holds unit_finding_fact_kind_and_row | n/a: holds tests | n/a: holds tests | n/a: holds tests | n/a: holds tests | records_not_accepted and rows_missing_key, read in dev: 3 and 6 |
| dbt/models/mart/client_policy_fact.sql | add: a mart view over the vault | uq_client_policy_fact_client_policy_key: one row per key | n/a: view | n/a: a plain view over tested vault models | n/a: view | n/a: view | n/a: view | n/a: the mart views serve the semantic layer, outside this plan |
| dbt/models/mart/agent_policy_fact.sql | add: a mart view over the vault | uq_agent_policy_fact_agent_policy_key: one row per key | n/a: view | n/a: a plain view over tested vault models | n/a: view | n/a: view | n/a: view | n/a: the mart views serve the semantic layer, outside this plan |
| dbt/models/mart/policy_fact.sql | add: a mart view over the vault | uq_policy_fact_policy_key: one row per key | n/a: view | n/a: a plain view over tested vault models | n/a: view | n/a: view | n/a: view | n/a: the mart views serve the semantic layer, outside this plan |
| dbt/models/mart/finding_fact.sql | add: a mart view; change: reads the findings through the landing_config source and derives finding_kind and finding_row (D-47) | n/a: no key test; its rows are the findings table | unit_finding_fact_kind_and_row: one finding of each finder, a row missing two keys naming one row | n/a: view | n/a: view | n/a: view | n/a: view | the two metrics above |
| dbt/models/mart/time_spine_day.sql | add: a mart view | n/a: no key test; a generated calendar | n/a: view | n/a: view | n/a: view | n/a: view | n/a: view | n/a: the mart views serve the semantic layer, outside this plan |
| dbt/models/mart/_landing_config__sources.yml | add: the landing’s CONFIG schema as a source, so finding_fact can be unit-tested (D-47) | n/a: declares a source | n/a: the unit test’s input | n/a | n/a | n/a | n/a | n/a |
2.2 Lab 1-2 coverage (Ray’s branch, planned)
Lab 1-2 lands Pinecrest Mutual’s policy data (design D-37 to D-39; profile 2.1.5 and P-20). It adds no business-logic model, so it has no logic area and no unit test; its proofs are layers 1 and 2 and the live proof of land_act. The files it changes, every layer walked:
| File | Change | 1 Built-ins | 2 Expectations | 3 Unit tests | 4 Logic assertions | 5 Detectors | 6 Reconciliations | 7 Semantic surface |
|---|---|---|---|---|---|---|---|---|
| setup/infrastructure/landing.sql | modify, by the teacher as the stand-in source (commit 0a83a38): the PINECREST schema and table (D-37) | n/a: DDL script, proven by reading back the objects it creates | n/a: DDL | n/a: DDL | n/a: DDL | n/a: DDL | n/a: DDL | n/a: no semantic models (baseline B-4) |
| dbt/macros/operations/land_act.sql | modify, by the teacher as the stand-in source (commit 0a83a38): the table pinecrest_policy and its twelve rows (D-38) | n/a: operations macro | its rows are checked by expect_pinecrest_policy_rows_as_profiled | n/a: proved live on 2026-10-25: the dry run listed 0 present, the loads left 8 and 4 rows, a reload was refused, LANDING_QA was refused | n/a: operations macro | n/a: operations macro | n/a: operations macro | n/a: no semantic models (baseline B-4) |
| dbt/models/staging/_sunbelt__sources.yml | modify: the source pinecrest.policy and its tests (D-39) | holds nn_pinecrest_policy_loaded_at | holds uqc_pinecrest_policy_loaded_at_policy_number | n/a: declaration | n/a: declaration | n/a: declaration | n/a: declaration | n/a: no semantic models (baseline B-4) |
| dbt/tests/expect_pinecrest_policy_rows_as_profiled.sql | add, written by the teacher before Ray’s code | n/a: is itself a test | is the expectation: the landed rows equal profile P-20’s twelve, in both directions | n/a: is itself a test | n/a: is itself a test | n/a: is itself a test | n/a: is itself a test | n/a: no semantic models (baseline B-4) |
2.3 Mart: the agreed design
The mart’s unit-test paths fall into seven logic areas. Each area’s paths sit in the tables of sections 2.3.1 to 2.3.3, beside the layer 1, 2 and 4 tests that guard the same objects.
| Area | Models | Dimensions | Brute force | Collapse and reason | Paths |
|---|---|---|---|---|---|
| R: a carrier’s organization record | stg_northfield_organization, stg_pinecrest_organization | A landed record with its carrier code and name | 1 per model | None: a record without its name is refused at landing by OL2 | OS1, one per model |
| S: an organization by carrier feed and load | organization_h | Feed (Northfield Life, Pinecrest Mutual); arrival (first load only, resent later, first seen later); hub state (first build, incremental) | 12 | The two feeds behave alike except when both send in one load; hub state is separated by the arrival paths, as in area B | OH1 to OH4 |
| T: organization versions | organization_northfield_s, organization_pinecrest_s | Arrival (first, resent); values on a resend (unchanged, changed) | 4 per satellite | A first arrival has no prior values to compare | OT1 to OT3, per satellite |
| U: ghost members | person_dim, organization_dim, policy_dim | Hub row (real, unknown, error) | 3 per dimension | Real rows are proved by the layer 1 key tests; the two ghost rows behave alike | DG1 to DG3 |
| V: an attribute from the most recent sale | person_dim (agent name), policy_dim (plan name) | Sales naming the attribute (one, several with different values) | 2 per dimension | One sale is the baseline every other area builds on | DL1, DL2 |
| W: one role per view | client_dim, insured_dim, agent_dim, carrier_dim | Base row’s role or feed (the view’s own, another) | 2 per view | One test with every role present proves both | DS1 to DS4 |
| X: a version’s validity | policy_terms_fact | Versions of a policy (one, several) | 2 | None | FV1, FV2 |
2.3.1 The carrier feed: landing, staging, organization hub and satellite
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| OL1 | Northfield Life’s landing table NORTHFIELD.ORGANIZATION as landed: one organization record per carrier code in each load | Unique: no carrier code twice in one load | uqc_northfield_organization_loaded_at_carrier_code, in layer 2 |
| OL2 | Every row of NORTHFIELD.ORGANIZATION | Each carries a carrier name: no carrier known by a code alone (D-11) | nn_northfield_organization_carrier_name, in layer 1 |
| OL1 | Pinecrest Mutual’s landing table PINECREST.ORGANIZATION as landed: one organization record per carrier code in each load | Unique: no carrier code twice in one load | uqc_pinecrest_organization_loaded_at_carrier_code, in layer 2 |
| OL2 | Every row of PINECREST.ORGANIZATION | Each carries a carrier name: no carrier known by a code alone (D-11) | nn_pinecrest_organization_carrier_name, in layer 1 |
| OS1 | A landed Northfield Life record with carrier code NFL and carrier name Northfield Life | One staging row with the code and the name as sent, the source system NFL named, and the hash key of the code | unit_stg_northfield_organization_os1_arrival_code_and_name |
| OS1 | A landed Pinecrest Mutual record with its carrier code and its carrier name | One staging row with the code and the name as sent, Pinecrest Mutual’s source system named, and the hash key of the code | unit_stg_pinecrest_organization_os1_arrival_code_and_name |
| OK1 | organization_h as built, with its ghost rows | hk_organization_h unique: rows equal keys | uq_organization_h_hk_organization_h, in layer 1 |
| OK2 | organization_h as built | hk_organization_h never empty | nn_organization_h_hk_organization_h, in layer 1 |
| OH1 | NFL in Northfield Life’s staging model in load 1 only, first build | One hub row, load 1 timestamp, record source NFL | unit_organization_h_oh1_new_key |
| OH2 | NFL in load 1 and resent in load 2 | One hub row with the load 1 timestamp | unit_organization_h_oh2_repeat_keeps_first |
| OH3 | Pinecrest Mutual’s code first seen in load 2, incremental build with NFL already in the hub | Pinecrest Mutual’s code inserted with the load 2 timestamp; NFL not inserted again | unit_organization_h_oh3_later_load_inserts |
| OH4 | Both carriers’ staging models in one load: NFL from Northfield Life, Pinecrest Mutual’s code from Pinecrest Mutual | Two hub rows, each with its own carrier’s record source | unit_organization_h_oh4_both_carrier_feeds |
| OK1 | organization_northfield_s as built | Unique on its parent hash key with its load time | uq_organization_northfield_s_pk, in layer 1 |
| OK2 | organization_northfield_s as built | Parent hash key never empty | nn_organization_northfield_s_hk_organization_h, in layer 1 |
| OK3 | organization_northfield_s as built | Load time never empty | nn_organization_northfield_s_ldts, in layer 1 |
| OK4 | Every hk_organization_h on organization_northfield_s | Each exists in organization_h: no orphans | rel_organization_northfield_s_hk_organization_h, in layer 1 |
| OT1 | First Northfield Life record of NFL, name Northfield Life | One satellite row | unit_organization_northfield_s_ot1_first_version |
| OT2 | NFL resent unchanged | No new version | unit_organization_northfield_s_ot2_unchanged_resend |
| OT3 | NFL: name Northfield Life in load 1, Northfield Life Insurance Company in load 2 | A second version; the first kept | unit_organization_northfield_s_ot3_changed_name_new_version |
| OK1 | organization_pinecrest_s as built | Unique on its parent hash key with its load time | uq_organization_pinecrest_s_pk, in layer 1 |
| OK2 | organization_pinecrest_s as built | Parent hash key never empty | nn_organization_pinecrest_s_hk_organization_h, in layer 1 |
| OK3 | organization_pinecrest_s as built | Load time never empty | nn_organization_pinecrest_s_ldts, in layer 1 |
| OK4 | Every hk_organization_h on organization_pinecrest_s | Each exists in organization_h: no orphans | rel_organization_pinecrest_s_hk_organization_h, in layer 1 |
| OT1 | First Pinecrest Mutual record of its code, name Pinecrest Mutual | One satellite row | unit_organization_pinecrest_s_ot1_first_version |
| OT2 | The same record resent unchanged | No new version | unit_organization_pinecrest_s_ot2_unchanged_resend |
| OT3 | The same code with a changed name in load 2 | A second version; the first kept | unit_organization_pinecrest_s_ot3_changed_name_new_version |
2.3.2 Dimensions: person_dim, organization_dim, policy_dim, source_dim, day_dim, and the role views client_dim, insured_dim, agent_dim, carrier_dim
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| DU1 | person_dim as built: client, insured and agent records with their ghost members | person_key unique: rows equal keys | uq_person_dim_person_key, in layer 1 |
| DG1 | The ghost rows of client_h, insured_h and agent_h | Each ghost key kept once in person_dim, with no role, and carried by every role view (mart design D-14) | unit_person_dim_dg1_ghost_members_kept |
| DL1 | Agent 17001001, joined by agent_policy_l to NF-100001 and NF-100007, whose sales, loaded 2026-10-01 02:00 and 2026-10-02 02:00, give two different agent names | The agent’s full_name is the name on the sale loaded 2026-10-02 02:00 | unit_person_dim_dl1_agent_name_from_latest_sale |
| DU2 | organization_dim as built: each organization record a carrier feed sends, with the ghost members | organization_key unique: rows equal keys | uq_organization_dim_organization_key, in layer 1 |
| DG2 | The ghost rows of organization_h | Kept in organization_dim as unknown and error members | unit_organization_dim_dg2_ghost_members_kept |
| DU3 | policy_dim as built: one policy number per carrier, with the ghost members | policy_key unique: rows equal keys | uq_policy_dim_policy_key, in layer 1 |
| DG3 | The ghost rows of policy_h; a sale with a blank policy number, joined to the unknown policy | Kept in policy_dim as unknown and error members; the unknown policy’s carrier reads (unknown) | unit_policy_dim_dg3_ghost_members_kept |
| DL2 | Two sales of NF-100001: plan Senior Term 20 loaded 2026-10-01 02:00, plan Final Expense 10K loaded 2026-10-02 02:00 | policy_dim’s plan_name for NF-100001 is Final Expense 10K | unit_policy_dim_dl2_plan_name_from_latest_sale |
| DR2 | Every policy_key on client_policy_role_fact, the unknown policy of a blank policy number included | Each exists in policy_dim: no orphans | rel_client_policy_role_fact_policy_key, in layer 1 |
| DR4 | Every policy_key on agent_policy_fact | Each exists in policy_dim: no orphans | rel_agent_policy_fact_policy_key, in layer 1 |
| DR6 | Every policy_key on policy_terms_fact | Each exists in policy_dim: no orphans | rel_policy_terms_fact_policy_key, in layer 1 |
| DU4 | source_dim as built over seed_source_system | source_key unique: rows equal keys | uq_source_dim_source_key, in layer 1 |
| DR5 | Every first_named_by_source_key on agent_policy_fact, SSI and NFL | Each exists in source_dim: no orphans | rel_agent_policy_fact_first_named_by_source_key, in layer 1 |
| DR7 | Every source_key on finding_fact, the findings’ SUNBELT and NORTHFIELD mapped in the view to SSI and NFL | Each exists in source_dim: no orphans | rel_finding_fact_source_key, in layer 1 |
| DU5 | day_dim as generated: the days of 2026 and 2027 | date_day unique: one row per calendar day | uq_day_dim_date_day, in layer 1 |
| DT1 | Every sold_date on client_policy_role_fact, empty where the sale gives none | Each date given exists in day_dim | rel_client_policy_role_fact_sold_date, in layer 1 |
| DT2 | Every first_known_date on client_policy_role_fact | Each exists in day_dim | rel_client_policy_role_fact_first_known_date, in layer 1 |
| DT3 | Every first_known_date on agent_policy_fact | Each exists in day_dim | rel_agent_policy_fact_first_known_date, in layer 1 |
| DT4 | Every valid_from_date on policy_terms_fact | Each exists in day_dim | rel_policy_terms_fact_valid_from_date, in layer 1 |
| DT5 | Every valid_to_date on policy_terms_fact, empty while the version is current | Each date given exists in day_dim | rel_policy_terms_fact_valid_to_date, in layer 1 |
| DT6 | Every effective_date on policy_terms_fact | Each exists in day_dim | rel_policy_terms_fact_effective_date, in layer 1 |
| DT7 | Every detected_date on finding_fact | Each exists in day_dim | rel_finding_fact_detected_date, in layer 1 |
| DU6 | client_dim as built | client_key unique: rows equal keys | uq_client_dim_client_key, in layer 1 |
| DS1 | person_dim holding A-1001 as client, NLI-55001 as insured and 17001001 as agent | client_dim returns only A-1001, its person_key as client_key, with its source_key and first_known_date, and the two ghost rows (mart design D-14) | unit_client_dim_ds1_client_role_only |
| DR1 | Every client_key on client_policy_role_fact, the zero key of a sale with an empty client number included | Each exists in client_dim: no orphans | rel_client_policy_role_fact_client_key, in layer 1 |
| DU7 | insured_dim as built | insured_key unique: rows equal keys | uq_insured_dim_insured_key, in layer 1 |
| DS2 | person_dim holding A-1001 as client, NLI-55001 as insured and 17001001 as agent | insured_dim returns only NLI-55001, its person_key as insured_key, and the two ghost rows (mart design D-14) | unit_insured_dim_ds2_insured_role_only |
| DU8 | agent_dim as built | agent_key unique: rows equal keys | uq_agent_dim_agent_key, in layer 1 |
| DS3 | person_dim holding A-1001 as client, NLI-55001 as insured and 17001001 as agent | agent_dim returns only 17001001, its person_key as agent_key and its number as agent_npn, and the two ghost rows (mart design D-14) | unit_agent_dim_ds3_agent_role_only |
| DR3 | Every agent_key on agent_policy_fact | Each exists in agent_dim: no orphans | rel_agent_policy_fact_agent_key, in layer 1 |
| DU9 | carrier_dim as built | carrier_key unique: rows equal keys | uq_carrier_dim_carrier_key, in layer 1 |
| DS4 | organization_dim holding NFL, sent through Northfield Life’s carrier feed, and an organization sent through no carrier feed | carrier_dim returns only NFL, its organization_key as carrier_key, with its carrier_code and carrier_name, and the two ghost rows (mart design D-14) | unit_carrier_dim_ds4_carrier_feed_organizations_only |
2.3.3 Facts: client_policy_role_fact, agent_policy_fact, policy_terms_fact, finding_fact
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| FG1 | client_policy_role_fact as built | Rows equal keys: client_policy_role_key unique, one row per client, policy and role | uq_client_policy_role_fact_client_policy_role_key |
| FK1 | Each client_key of client_policy_role_fact | Exists in client_dim; no orphans | rel_client_policy_role_fact_client_key |
| FK2 | Each policy_key of client_policy_role_fact, the unknown policy’s ghost key included | Exists in policy_dim; no orphans | rel_client_policy_role_fact_policy_key |
| FD1 | Each sold_date of client_policy_role_fact | Exists as a date_day in day_dim; an empty sold_date, where the sale gives none, is not checked | rel_client_policy_role_fact_sold_date |
| FD2 | Each first_known_date of client_policy_role_fact | Exists as a date_day in day_dim | rel_client_policy_role_fact_first_known_date |
| FG2 | agent_policy_fact as built | Rows equal keys: agent_policy_key unique, one row per agent and policy | uq_agent_policy_fact_agent_policy_key |
| FK3 | Each agent_key of agent_policy_fact | Exists in agent_dim; no orphans | rel_agent_policy_fact_agent_key |
| FK4 | Each policy_key of agent_policy_fact | Exists in policy_dim; no orphans | rel_agent_policy_fact_policy_key |
| FK5 | Each first_named_by_source_key of agent_policy_fact | Exists in source_dim; no orphans | rel_agent_policy_fact_first_named_by_source_key |
| FD3 | Each first_known_date of agent_policy_fact | Exists as a date_day in day_dim | rel_agent_policy_fact_first_known_date |
| FG3 | policy_terms_fact as built | Rows equal keys: policy_terms_key unique, one row per policy and load | uq_policy_terms_fact_policy_terms_key |
| FK6 | Each policy_key of policy_terms_fact | Exists in policy_dim; no orphans | rel_policy_terms_fact_policy_key |
| FD4 | Each valid_from_date of policy_terms_fact | Exists as a date_day in day_dim | rel_policy_terms_fact_valid_from_date |
| FD5 | Each valid_to_date of policy_terms_fact | Exists as a date_day in day_dim; an empty valid_to_date, the current version, is not checked | rel_policy_terms_fact_valid_to_date |
| FD6 | Each effective_date of policy_terms_fact | Exists as a date_day in day_dim | rel_policy_terms_fact_effective_date |
| FM1 | face_amount summed over every version in policy_terms_fact, against its sum over policy_northfield_s1 | Equal | assert_policy_terms_fact_face_amount_conserved |
| FV1 | One version of a policy, current: load end date 8888-12-31 23:59:59 | valid_to_date empty | unit_policy_terms_fact_fv1_current_version_valid_to_empty |
| FV2 | NF-100003: IF loaded 2026-10-01 02:00, LP loaded 2026-10-02 02:00 | The first version valid from 2026-10-01 to 2026-10-02; the second valid from 2026-10-02 with valid_to_date empty | unit_policy_terms_fact_fv2_earlier_version_valid_to_set |
| FG4 | finding_fact as built | Rows equal keys: finding_key unique, one row per finding | uq_finding_fact_finding_key |
| FK7 | Each source_key of finding_fact, the findings’ SUNBELT and NORTHFIELD mapped to SSI and NFL | Exists in source_dim; no orphans | rel_finding_fact_source_key |
| FD7 | Each detected_date of finding_fact | Exists as a date_day in day_dim | rel_finding_fact_detected_date |
2.3.4 Semantic layer and Mary’s questions: metrics, the six saved queries, the masking mock (D-9), consumer probes
| Path | Scenario | Expected result | Unit-test name |
|---|---|---|---|
| SR1 | policies_held grouped by client, carrier, policy and role, through MetricFlow and through a direct query on client_policy_l | The two routes give equal answers: the distinct count of policy keys in each group | recon_policies_held_two_routes, in layer 6 |
| SR2 | client_policy_roles grouped by client, carrier, policy and role, through MetricFlow and through a direct query on client_policy_l | The two routes give equal answers: the distinct count of role-row keys in each group | recon_client_policy_roles_two_routes, in layer 6 |
| SR3 | policies_sold grouped by agent, policy, carrier and first-named source, through MetricFlow and through a direct query on agent_policy_l | The two routes give equal answers: the distinct count of policy keys in each group | recon_policies_sold_two_routes, in layer 6 |
| SR4 | agents_named grouped by policy, through MetricFlow and through a direct query on agent_policy_l | The two routes give equal answers: the distinct count of agent keys per policy, 2 or more where the sources disagree (D-8) | recon_agents_named_two_routes, in layer 6 |
| SR5 | face_amount_current grouped by carrier, through MetricFlow and through a direct query on policy_northfield_s1 | The two routes give equal answers: the sum of face amount over current versions only, load end date 8888-12-31 (D-4) | recon_face_amount_current_two_routes, in layer 6 |
| SR6 | face_amount grouped by policy with valid-from and valid-to days, through MetricFlow and through a direct query on policy_northfield_s1 | The two routes give equal answers: the face amount of each version | recon_face_amount_two_routes, in layer 6 |
| SR7 | policy_versions grouped by policy with valid-from and valid-to days, through MetricFlow and through a direct query on policy_northfield_s1 | The two routes give equal answers: the distinct count of versions, one per policy and load | recon_policy_versions_two_routes, in layer 6 |
| SR8 | records_not_accepted grouped by source and finder type, through MetricFlow and through a direct query on CONFIG.DATA_FINDING | The two routes give equal answers: the distinct count of form findings in each group | recon_records_not_accepted_two_routes, in layer 6 |
| SR9 | rows_missing_key grouped by source and finder, through MetricFlow and through a direct query on CONFIG.DATA_FINDING | The two routes give equal answers: the distinct count of rows named by missing-key findings in each group | recon_rows_missing_key_two_routes, in layer 6 |
| SQ1 | Saved query q09_client_policies run: policies_held and client_policy_roles by client, carrier, policy and role | Equals the figure on Mary’s release page for Q-9 | sq_q09_client_policies_answer, in layer 7 |
| SQ2 | Saved query q10_coverage_by_carrier run: face_amount_current by carrier | Equals the figure on Mary’s release page for Q-10 | sq_q10_coverage_by_carrier_answer, in layer 7 |
| SQ3 | Saved query q11_agent_per_policy run: policies_sold and agents_named by agent and policy | Equals the figure on Mary’s release page for Q-11 | sq_q11_agent_per_policy_answer, in layer 7 |
| SQ4 | Saved query q13_client_arrivals run: policies_held and client_policy_roles by the client’s source and first-known date | Equals the figure on Mary’s release page for Q-13 | sq_q13_client_arrivals_answer, in layer 7 |
| SQ5 | Saved query q14_policy_versions run: policy_versions and face_amount by policy, valid-from day, valid-to day and status | Equals the figure on Mary’s release page for Q-14 | sq_q14_policy_versions_answer, in layer 7 |
| SQ6 | Saved query q15_records_not_accepted run: records_not_accepted and rows_missing_key by source and finder type | Equals the figure on Mary’s release page for Q-15 | sq_q15_records_not_accepted_answer, in layer 7 |
| SD1 | Every semantic model in _conformed_dm.yml | Each carries a description stating what one row is and which questions it serves | desc_semantic_models_described, in layer 7 |
| SD2 | Every metric of section 4.1 of the design | Each carries a description stating what it counts, how to read it, what it leaves out, what to pair it with, and the decision that defined it | desc_metrics_described, in layer 7 |
| SD3 | Every column of sections 3.2 and 3.3 of the design | Each carries a description stating what it holds, including when it is empty or unknown | desc_columns_described, in layer 7 |
| SM1 | insured_dim read as the governance role (D-9) | birth_date and address return the real values | assert_insured_dim_masking_governance_role_real_values, in layer 4 |
| SM2 | insured_dim read as another role (D-9) | The mask: birth_date gives the birth year only; address is reduced to its state | assert_insured_dim_masking_other_role_masked, in layer 4 |
| P-9 | DV Digest asked Q-9: policies_held and client_policy_roles by client, carrier, policy and role | DV Digest’s answer equals the direct query on DV_QA | probe_q09_client_policies, in consumer certification |
| P-10 | DV Digest asked Q-10: face_amount_current by carrier | DV Digest’s answer equals the direct query on DV_QA | probe_q10_coverage_by_carrier, in consumer certification |
| P-11 | DV Digest asked Q-11: policies_sold and agents_named by agent and policy | DV Digest’s answer equals the direct query on DV_QA | probe_q11_agent_per_policy, in consumer certification |
| P-13 | DV Digest asked Q-13: policies_held and client_policy_roles by the client’s source and first-known date | DV Digest’s answer equals the direct query on DV_QA | probe_q13_client_arrivals, in consumer certification |
| P-14 | DV Digest asked Q-14: policy_versions and face_amount by policy, valid-from day, valid-to day and status | DV Digest’s answer equals the direct query on DV_QA | probe_q14_policy_versions, in consumer certification |
| P-15 | DV Digest asked Q-15: records_not_accepted and rows_missing_key by source and finder type | DV Digest’s answer equals the direct query on DV_QA | probe_q15_records_not_accepted, in consumer certification |
3. Seven-layer proof plan
| Layer | Named artifacts | Expected result | Applicability and reason |
|---|---|---|---|
| 1 — Built-ins | Increments 1 and 1.1: nn_sunbelt_client_crm_row_id; nn_sunbelt_client_loaded_at; uq_client_h_hk_client_h; nn_client_h_hk_client_h; uq_seed_source_system_code; nn_seed_source_system_code. Increment 2: nn_sunbelt_policy_sale_loaded_at; nn_northfield_policy_loaded_at; Lab 1-2: nn_pinecrest_policy_loaded_at; uq_ and nn_ on the hash keys of policy_h, insured_h, agent_h, client_policy_l, insured_policy_l and agent_policy_l. D-40: rel_client_sunbelt_s_hk_client_h, rel_client_policy_sunbelt_s_hk_client_policy_l, rel_insured_northfield_s_hk_insured_h and rel_policy_northfield_s_hk_policy_h. D-42: rel_client_policy_l_hk_client_h, rel_client_policy_l_hk_policy_h, rel_insured_policy_l_hk_insured_h, rel_insured_policy_l_hk_policy_h, rel_agent_policy_l_hk_agent_h and rel_agent_policy_l_hk_policy_h; on each of the four satellites uq_ |
0 failures | Applies (design layer 1) |
| 2 — Expectations | uqc_sunbelt_client_loaded_at_crm_row_id; expect_sunbelt_client_row_count; uqc_sunbelt_policy_sale_loaded_at_policy_client_role; uqc_northfield_policy_loaded_at_policy_number; expect_increment_2_staging_keeps_every_landed_row; Lab 1-2: uqc_pinecrest_policy_loaded_at_policy_number and expect_pinecrest_policy_rows_as_profiled. 5 tests, and 2 more with Lab 1-2, severity warn. The mart: uqc_northfield_organization_loaded_at_carrier_code and uqc_pinecrest_organization_loaded_at_carrier_code | 0 failures | Applies (design layer 2). dbt_utils and singular tests stand in for dbt-expectations, which the workstation cannot install (deviation DEV-2). Increment 2’s counts compare a source query with a target query, with no fixed number (design section 8); increment 1’s row count checks the counts the profile specifies for each act |
| 3 — Unit tests | 81: the 12 of logic areas A to D (increments 1 and 1.1), the 62 of areas E to Q (increment 2) and the 7 of the fix to release 1 (area Z’s 6 and unit_finding_fact_kind_and_row, D-47), each named in section 2. The mart: 23 more, areas R to X (section 2.3) | v3’s tests ran red then green, recorded on DIG-574 at 2026-10-25 01:22 UTC; the 23 added in v4 ran red under planted defects, then green (areas M, P and Q); area Z’s 6 pass in the fix’s build of 2026-10-28 | Applies (design layer 3). Unit tests carry no severity: under the Fusion engine they always fail as errors |
| 4 — Logic assertions | assert_client_h_no_blank_business_key; assert_client_h_covers_usable_source_keys; assert_client_h_ghost_keys_belong_to_ghosts; assert_vault_record_sources_resolve, rewritten to read every hub and link; assert_increment_2_link_hub_keys_exist; D-41: assert_hashdiff_keeps_case_only_change, severity error. 6 tests, five at severity warn. The mart: assert_policy_terms_fact_face_amount_conserved, assert_insured_dim_masking_governance_role_real_values and assert_insured_dim_masking_other_role_masked | 0 rows each | Applies (design layer 4) |
| 5 — Detectors | inspector_sunbelt_client_number_form (D-9) and inspector_sunbelt_policy_number_form (D-30): one finding per nonconforming value; inspector_sunbelt_client_key_missing, inspector_sunbelt_policy_sale_key_missing and inspector_northfield_policy_key_missing (D-45): one finding per row and missing key; all in CONFIG.DATA_FINDING through merge_into; layer 5 is named inspector in this project | Ten findings: A1007, A-01008 and NF100009, and 7 missing-key findings | Applies (design layer 5) |
| 6 — Reconciliations | auditor_sunbelt_client_hub, auditor_sunbelt_policy_hub and auditor_northfield_policy_hub, each checking that every distinct usable key of its source exists in its hub; layer 6 is named auditor in this project. The mart: the nine two-route reconciliations recon_ of section 2.3.4 | No new finding; each mart reconciliation’s two routes agree. The two findings the auditors’ first versions wrote stay in CONFIG.DATA_FINDING, disclosed in the post-implementation guide (Ray, answer 1b) | Applies (design layer 6, D-10) |
| 7 — Semantic surface | The release 1 mart’s metrics records_not_accepted and rows_missing_key (D-47); the conformed mart’s six saved queries sq_q09 to sq_q15 and the three description checks desc_ of section 2.3.4 | records_not_accepted 3 and rows_missing_key 6 in dev; each saved query equals the figure on Mary’s release page; every model, metric and column described | Applies: the branch ships metrics (design D-47; mart design section 4) |
3.1 Full-build guardrails
| Artifacts | Expected result |
|---|---|
| capture_baseline before and verify_build after every build: one per landing act in each increment, and each full build | Every build clean (129 of 129 at commit 94639b4; the fix’s build 173 of 173 at commit f1f3ce0, run inside the facility: no table lost rows; its three growth expectations do not apply when no new data arrives, since each expects a landing act to add keys); verify_build names 5 warnings and no lookout: three rebuilds over unchanged acts, where a hub or link count did not increase, and two audit expectations reading the two retained findings |
4. Consumer-question probes
| Question | Runnable probe | Expected result |
|---|---|---|
| Q-1 | SELECT client_number, ldts, rsrc FROM the client hub WHERE rsrc = ‘SSI’ ORDER BY client_number | 35 rows: the client list’s 34 keys and A-1033, first seen in the sales data; A-1031, A-1032, A-1033 and the malformed A1007 and A-01008 at act 2’s load time, as landing first sent them; all others at act 1’s |
| Q-2 | SELECT the inspector_sunbelt_client_number_form findings from CONFIG.DATA_FINDING | Two findings, one naming A1007 and one naming A-01008 |
| Q-3 | SELECT the auditors’ findings from CONFIG.DATA_FINDING | No finding written by the auditors |
| Q-4 | Join the record source of every hub and link to the source system seed | Every row names its source: client and sales rows the Sunbelt Senior client file, carrier rows Northfield Life, ghost rows the vault itself |
| Q-5 | SELECT the client number, the policy key and the role FROM client_policy_l joined to client_h and policy_h | Each sale’s client with the role the sales data sends: owner, insured or payor; A-1010 holds two roles on NF-100010 |
| Q-6 | SELECT the policy hub row of NF-100007 with every link row that reaches it | One policy row; one client_policy_l row to A-1007, one insured_policy_l row to NLI-55007 and one agent_policy_l row to 17001001; no row joins A-1007 to NLI-55007 |
| Q-9, Q-10, Q-11, Q-13, Q-14, Q-15 | probe_q09_client_policies, probe_q10_coverage_by_carrier, probe_q11_agent_per_policy, probe_q13_client_arrivals, probe_q14_policy_versions and probe_q15_records_not_accepted (section 2.3.4) | DV Digest’s answer equals the direct query on DV_QA |
4.1 Finance workbook and initial UAT proofs
For finance reporting branches, name row/key/value parity checks against the shared report query, totals at the declared grain, Excel types/date/rounding checks and refresh preservation of consumer observations. State consumer-review cases, dispositions and acceptance evidence for the exact workbook revision under K#12 I#27. Technical verification does not imply consumer acceptance. Otherwise state NA with a reason.
Not applicable: this branch is not a finance reporting branch.
5. QA on production-shaped data
5.1 Added and changed tests on QA data
| Test | Expected result |
|---|---|
| Every test of sections 2 and 3: 137 tests, 81 unit and 56 data, 3 of the data tests on the release 1 mart views; the mart’s 85 tests of section 2.3 join this sweep once built | All pass in the QA job’s sweep (selector qa_build) on DV_QA over LANDING_QA, each recorded by name in the QA item, , section 6. Data tests’ expected values follow the QA item’s movement ledger, section 1.3 |
5.2 Regression against production
Before against after inside the same fresh QA environment, never QA against production (QA standard, 4.2): capture_baseline after the fresh clones and before the build, verify_build after it, both steps of the QA job. Every movement is declared in the QA item’s ledger (section 1.3); the first QA build creates every vault object, so each moves from absent to its declared count. Design D-13, which made this section not applicable, was superseded on 2026-10-25.
5.3 Consumer probes and reconciliations on QA data
Probes Q-1 to Q-6 (section 4) rerun on DV_QA and LANDING_QA.CONFIG, through the QA role, with the expected values the QA item declares for the landing state cloned; the three auditors are the reconciliations, expected to write no finding. Recorded in the QA item, section 9.
5.4 Layer 7 in the QA collection
Applies: the protected semantic set is the release 1 mart’s metrics records_not_accepted and rows_missing_key (D-47), and, once built, the conformed mart’s metrics and its six saved queries (section 2.3.4); the fix’s QA record, , lists them.
6. Test artifact inventory
| Artifact classification | Count | Sections that make up the count |
|---|---|---|
| Layer 1 built-in tests | 45: 42 for the vault and 3 for the release 1 mart views | 2.1, 3 |
| Layer 2 expectations | 5 | 2.1, 3 |
| Layer 3 unit tests | 81: 12 for increments 1 and 1.1, 62 for increment 2, 7 for the fix to release 1 | 1, 2, 3 |
| Layer 4 logic assertions | 6 | 2.1, 3 |
| Layer 5 inspectors and layer 6 auditors | 5 and 3 | 2.1, 3 |
| The conformed mart, planned before its code | 85: layer 1 39, layer 2 2, layer 3 23, layer 4 3, layer 6 9, layer 7 9; and 6 consumer probes | 2.3, 3 |
The 137 tests of layers 1 to 4 (45, 5, 81 and 6) equal the 137 that dbt ls --resource-type test --resource-type unit_test returns at commit 2a921a1. Lab 1-2 adds 3 tests (one in layer 1, two in layer 2) on Ray’s branch once its code exists. Guardrails: one capture and one verification per build (3.1). Consumer probes: 6 (4).
7. Origin
| Test or proof | Design decision proved |
|---|---|
| unit tests P1, P2, P3, P8 | D-3 (hub keyed by client number), D-11 (two landing acts) |
| unit tests P4, P5 | D-8 (toolkit hashing defaults) |
| unit test P6 | D-7 (ghost records) |
| unit test P7 | D-4 (blank to NULL) |
| layer 1 and layer 2 source tests | D-1 (LANDING source), D-11 |
| assert_hashdiff_keeps_case_only_change, layer 4 | D-41 (a case-only change is kept) |
| the four rel_ tests of layer 1 | D-40 (each satellite meets its parent; the links’ hub keys by assert_increment_2_link_hub_keys_exist) |
| layer 2 row counts | D-11 |
| assert_client_h_no_blank_business_key | D-4 |
| assert_client_h_covers_usable_source_keys | D-3, D-4 |
| inspector_sunbelt_client_number_form and unit tests I1, I2 | D-9 |
| auditor_sunbelt_client_hub and unit tests A1, A2 | D-10 |
| seed_source_system and its two built-in tests | D-21 |
| dev_drop_orphans, land_act, vault_checks | Standard: Operations as dbt Macros |
| assert_vault_record_sources_resolve | D-17 |
| dev_scoped_rebuild.sh | D-20 |
| SSI in stg_sunbelt_client and the client hub fixtures | D-15 |
| capture_baseline and verify_build | D-12 |
| unit tests PH1 to PH8, I3, I4 | D-24, D-26, D-30 |
| unit tests CH1 to CH3, IH1 to IH4 | D-24, D-32 |
| unit tests L1 to L6 | D-29, D-33 |
| unit tests ST1 to ST5 | D-8, D-34 |
| unit tests AG1 to AG5, LA2, LA3, A3 to A6 | D-10, D-35, D-36 |
| unit tests ST1 to ST3 of client_sunbelt_s, client_policy_sunbelt_s and insured_northfield_s | D-34 |
| unit tests HD1 and HD2 of the three staging models | D-8, D-34 |
| unit tests V1 and V2 of the four version 1 views | D-34; guide G-15 |
| uq_ and nn_ on the hash keys of the six new hubs and links | D-26, D-32, D-33, D-35, D-36 |
| nn_ and uqc_ on SUNBELT.POLICY_SALE and NORTHFIELD.POLICY; expect_increment_2_staging_keeps_every_landed_row | D-22, D-24 |
| assert_increment_2_link_hub_keys_exist | D-33, D-36 |
| nn_pinecrest_policy_loaded_at; uqc_pinecrest_policy_loaded_at_policy_number | D-39 |
| expect_pinecrest_policy_rows_as_profiled; the live proof of land_act | D-37, D-38 |
| rel_ on the six link-to-hub keys; uq_ |
D-42 |
| the 22 constraints in the information schema after the build, and the 22 constraint lines of infra/snowflake/ddl/dv.sql | D-43 |
| path Z3 (uq_client_sunbelt_s_pk) and the ten area M satellite tests on the known-key views | D-44 |
| paths Z1 and Z2, the six missing-key inspector unit tests | D-45 |
| correct_zero_key_satellite_rows.sql proven on the development vault | D-46 |
| unit_finding_fact_kind_and_row, red then green, and records_not_accepted 3 and rows_missing_key 6 read in dev | D-47 |
| the build guard refusing 120 hits before the removal and writing 22 pages with none after | D-48 |
| the executive summary first on the built home page, its Databricks switch proven off and on | D-49 |
| no connector instruction on any built page; the release page’s prompts as Ask page questions | D-50 |
| the QA retest 26 of 26 from the workstation container | D-51 |
| OL1, OL2, OS1, OK1 to OK4, OH1 to OH4 and OT1 to OT3 | mart design D-11 |
| DU1 to DU9, DG1 to DG3, DR1 to DR7 and DT1 to DT7 | mart design D-2, D-10, D-11, D-14 |
| DL1 | mart design D-10 |
| DL2 | mart design D-2 |
| DS1 to DS4 | mart design D-10 and D-11, D-14; DS1 also D-12 |
| FG1 to FG4, FK1 to FK7, FD1 to FD7 and FM1 | mart design D-1; FG1 also D-3, the role in the row’s identity; FG4 and FK7 also D-5 |
| FV1, FV2 | mart design D-4 |
| SR1 to SR9 | mart design D-1, D-4, D-8 and D-13, and its section 4.1 |
| SQ1 to SQ6, SD1 to SD3 | mart design section 4.1a |
| SM1, SM2 | mart design D-9 |
| P-9 to P-15 | mart design section 1.2 |
This plan cites the design’s decisions and adds none. A test requiring a missing decision returns to the design.
8. Compliance record
Built by the author before the reviewer reads the plan (Standard: Branch Delivery Documents, , compliance record before agreement), at 2026-10-28 21:15Z against commit f1f3ce0, and for the mart against the mart design at 2026-10-31 22:20Z. Verdict: compliant for the fix to release 1, with three deviations each carried by a recorded decision and one API gap recorded. For the mart, written before its code as the Test-Driven Development standard requires: logic areas R to X, 85 tests across layers 1 to 7, 6 consumer probes and the origin rows; its coverage by file (section 2.1) follows the code. Lab 1-2’s extension (section 2.2) walks every layer for each file Lab 1-2 changes, names its 3 tests by layer with their decisions in section 7, and states why it has no unit test: land_act is an operations macro, proved live.
8.1 Template
| # | Requirement | Result |
|---|---|---|
| 1 | Header: all eight fields present and filled | Yes, 8 of 8. The author line reads “Ray Serrano; edited by Claude”, overriding the template’s fixed text (Ray, 2026-10-22) |
| 2 | Every section present | Yes, 14 of 14: 1, 2, 2.1, 3, 3.1, 4, 4.1, 5, 5.1 to 5.4, 6, 7; and this section 8 |
| 3 | Written through the governed procedures | From v6, every change through the Pilot interface, ITEM_SPLICE, which records each body as a new version; earlier versions went through KNOWLEDGE_ITEM_UPDATE, and one write of 2026-10-28 at 17:44Z by direct update before the interface existed in this database (Linear DIG-595) |
8.2 Branch delivery documents standard, test plan section
| # | Requirement | Result |
|---|---|---|
| 1 | Executive summary, one row per model with business logic, counts agreeing with the logic areas | Yes; v3’s rows for areas F, G, H and K disagreed with their own sections and are corrected |
| 2 | Logic areas with dimensions, brute force, collapse and a path table; every path has a test | Areas A to Q, Y and Z: 72 path rows naming all 81 unit tests (V1 and V2 name one test per view). The mart: areas R to X, their paths naming its 23 unit tests |
| 3 | The seven layers walked in order, artifacts named or n/a with a reason; guardrails in their own section | Yes: sections 3 and 3.1; build 129 of 129 at 94639b4 |
| 4 | One runnable probe per consumer question | Yes: Q-1 to Q-6; Mary’s Q-9 to Q-11 and Q-13 to Q-15 by the probes of section 2.3.4 |
| 5 | QA item copied before the pull request to qa; inventory agreeing; origin by D-n | Yes since 2026-10-25: the QA item was copied from the QA template by the governed procedure, with no placeholder left, after D-13 was superseded; section 5 instantiates it. Inventory: yes, 137 tests with the fix’s, equal to dbt ls at commit 2a921a1. |
8.3 Testing standard (knowledge 2)
| # | Rule | Result |
|---|---|---|
| 1 | Coverage: every file, every layer; row count equals the diff | Yes: 70 rows for 70 files at 94639b4, 16 rows for the fix’s 16 files at 976744e, and 6 rows for the release 1 mart’s 6 files at f48c24b |
| 2 | Severity explicit: data tests warn, unit tests error | Data tests: yes, all 56 at explicit warn. Unit tests: deviation; under the Fusion engine they carry no severity and always fail as errors |
| 3 | Layer 2 by dbt-expectations, baselines from actual data | Deviation DEV-2: dbt_utils and singular tests, because the package hub is unreachable from the workstation; increment 2 compares source with target, with no fixed counts |
| 4 | Failures solved in unit tests, not builds | Yes: the auditor defects were reduced to A1 to A6, red, then fixed; the 23 tests added in v4 were each proven red under a planted defect |
| 5 | Every model the design changes, every layer | Yes. Tests in layers 1, 2, 3 and 4: sources and seed 6, 5, 0, 1; staging (3 models) 0, 1, 18, 1; hubs (4) 8, 0, 17, 5; links (3) 12, 0, 8, 2; satellites and views (8) 16, 0, 21, 0; known-key views (3) 0, 0, 0, 0, proved through their satellites and the inspectors; finders (8) 0, 0, 16, 0. No model is untested; each n/a carries its reason in section 2.1 |
8.4 Live design decisions not proved by a test, and what carries them
| # | Decision | Carrier |
|---|---|---|
| 1 | D-2 environment tiers | Development builds run in DEV__DV__CLAUDE_WS on DEV__LANDING__CLAUDE_WS (3.1); QA in DV_QA on LANDING_QA (section 5). D-13, development-only acceptance, was superseded on 2026-10-25 |
| 2 | D-5 load timestamps in UTC, without time zone | The LOADED_AT not_null tests and the unit fixtures’ load times; set in dbt_project.yml |
| 3 | D-23 the NFL row of the source system seed | assert_vault_record_sources_resolve, which reads every hub and link, Northfield Life’s included |
| 4 | D-14 patterns recorded as course items; D-31 no separate object for the client relationship | Not testable: a recording decision (course items 274 and 275) and a decision to build nothing |