DV Digest · Learn

DIGEST Data Vault Course

Course guide: Digest Insurance Distributors, and how this course works

Course DIGEST Data Vault Course
Read Before lesson 1 of part 1. This guide is front matter, not a lesson.

Part A: the business

A1. Insurance in five terms

Each term is defined before it is used again. The insurance lexicon holds them all, with more detail.

Notes

  1. NAIC definitions of insurer, insured, policy and premium, as published in the Dictionary of Insurance: https://itsallwidgets.com/dictionary-of-insurance, read 2026-10-23.
  2. AgentSync glossary (carriers hire underwriters, handle claims and issue payments): https://agentsync.io/glossary, read 2026-10-23.
  3. North Carolina General Statutes, section 58-33-10 (definition of agent and producer): https://library.ncleg.gov/EnactedLegislation/Statutes/HTML/BySection/Chapter_58/GS_58-33-10.html, read 2026-10-23.
  4. New Mexico Administrative Code 13.4.2 (definition of appointment): https://www.srca.nm.gov/nmac/nmregister/xxxv/13.4.2.pdf, read 2026-10-23.
  5. Vertafore glossary of insurance terms (agency and carrier relationship): https://vertafore.com/glossary, read 2026-10-23.
  6. IRMI, insurance definitions, agent: an agent solicits, negotiates or instigates policies on behalf of one or more insurers, as their legal representative: https://irmi.com/term/insurance-definitions/agent ; and Achievable, insurance licensing course, producer authority: a managing general agent may countersign insurance contracts when the insurer authorizes it: https://app.achievable.me/study/insurance-property-casualty/learn/general-insurance-concepts-marketing-systems-and-producer-authority. Read 2026-10-26.
Check yourself

A carrier and an insurance agency both deal in policies. What does each one do?

Show the answerHide the answer

The carrier is the insurance company: it issues the policy, charges the premium and pays claims. The agency represents carriers and sells their policies on their behalf; the policies remain the carrier’s contracts.

A2. The company: Digest Insurance Distributors

The course follows one fictional company, Digest Insurance Distributors, called the distributor from here on. It is modeled on a real insurance distributor in the United States, simplified to the parts the course uses.

The distributor is not a carrier: it does not write policies. It works with many carriers and sells their policies through a large network of agents and insurance agencies, and it handles contracting and back-office work for them. It earns a share of the commission on each policy sold, the commission being what the carrier pays for a sale: for life insurance, a percentage of the premium, largest in the policy’s first year [6]; for Medicare plans, a fixed amount per enrollment that Medicare caps every year [7]. Section A3 explains each of these, with its sources. Figure A2-1 shows the business as a whole.

The policies it sells, in the parts of the course that use them:

Product What it is
Medicare plans Medicare is the federal health insurance program for people 65 and older, certain younger people with disabilities, and people with permanent kidney failure [1]; private carriers approved by Medicare sell plans within it, such as Medicare Advantage [2]
Life insurance A policy that pays a death benefit if the insured dies while it is in effect, in exchange for premiums [3], to the beneficiaries the policy names [4]
Annuities A contract with an insurance company that promises to pay income on a regular basis for a chosen period, including the rest of the buyer’s life [5]

Figure A2-1. The distributor’s business model. Each carrier contracts once with the distributor; the distributor brings in an acquired agency, which arrives with its own client records, and contracted independent agents, who do not; both sell policies, which are between the client and the carrier.

The distributor's business modelThree carriers each contract once with Digest Insurance Distributors, which brings in an acquired agency, Sunbelt Senior Insurance, and contracted independent agents; both sell policies to clients. Northfield Lifecarrier: writes policies Pinecrest Mutualcarrier: writes policies Atlas Health Planscarrier: writes policies Digest Insurance Distributorsone contract per carrier; brings agents in; earns an override on their sales Sunbelt Senior Insuranceacquired: brings its own client records Independent agentscontracted, not owned Clientsbuy policies; the policy is between the client and the carrier Tap to enlarge

Notes

  1. University Health, Medicare overview: https://www.universityhealth.com/patient-visitor-resources/patients/financial-assistance-health-coverage/medicare, read 2026-10-23.
  2. Blue Cross and Blue Shield of Oklahoma, how you qualify for Medicare: https://bcbsok.com/medicare/basics/how-you-qualify, read 2026-10-23.
  3. NAIC Life Insurance Buyer’s Guide: https://content.naic.org/sites/default/files/publication-lig-lp-consumer-life.pdf, read 2026-10-23.
  4. New Mexico Office of Superintendent of Insurance, life insurance: https://www.osi.state.nm.us/en/consumer-assistance/insurance-types/life/, read 2026-10-23.
  5. NAIC Buyer’s Guide for Fixed Deferred Annuities: https://www.nj.gov/dobi/division_insurance/pdfs/naicdeferredannuities.pdf, read 2026-10-23.
  6. Sonant, life insurance commission rates explained: a percentage of premium, front-loaded into a large first-year commission followed by smaller renewal commissions: https://www.sonant.ai/blog/life-insurance-commission-rates, read 2026-10-26.
  7. CMS, contract year 2026 agent and broker compensation memo: fixed maximum amounts per enrollment, initial and renewal (renewal at most 50 percent of fair market value), as published by Ritter: https://medicareful.ritterim.com/documents/cms-memos/memo-agent-broker-compensation-and-training-and-testing-requirements-cy2026.pdf, read 2026-10-26.
Check yourself

The distributor does not write policies. Then what does it do, and how does it earn?

Show the answerHide the answer

It works with many carriers and sells their policies through a network of agents and agencies, handling contracting and back-office work for them. It earns a share of the commission on each policy sold.

A3. Why a distributor exists

Picture the industry without one. Every carrier would have to recruit, contract, license-check, train and pay thousands of independent agents one by one, each selling a modest number of policies. Every agent would have to contract separately with each carrier whose policies they want to sell, and would rarely sell enough of any one carrier’s policies to earn its better commission levels. In practice, carriers contracting with independent agents one by one is unusual [1].

A distributor sits in the middle. It holds contracts with many carriers and brings agents in under those contracts; it does not employ the agents and does not write policies [2]. The industry calls such a firm a marketing organization, under several names that mean much the same thing; this course says distributor.

For The distributor provides
Carriers One relationship that brings a whole network of agents, already contracted and trained; for Medicare plans, federal rules require that agents be trained and tested every year on Medicare rules and on the plans they sell [5]
Agents and agencies Many carriers’ policies through one relationship; better commission levels, because carriers pay by volume and the distributor’s combined volume earns rates no single agent reaches; marketing, sales leads, technology and back-office help

It earns an override: a share of each sale’s commission, paid by the carrier to the distributor on top of the agent’s commission. In one common arrangement the carrier splits the payment about 7 to 3 or 8 to 2, the agent keeping the larger share [3].

So the chain runs carrier, distributor, agency, agent, client, and each step in it exists because it is cheaper than the alternative (Figure A3-1).

Figure A3-1. The chain, and where the money goes. The policy is sold along the chain (solid arrows); the money takes a different route (dashed, marked $): the client pays the premium to the carrier, and the carrier pays the agent’s commission and the distributor’s override. This is the simplest common arrangement; depending on the contracts, commissions are sometimes paid through the distributor or the agency instead.

The distribution chain and where the money goesCarrier, distributor, agency, agent and client in a row. Dashed lines marked with dollar signs show the money: the client pays the premium to the carrier; the carrier pays commission to the agent and an override to the distributor. The policy is sold along the chain; the money takes a different route Carrierwrites policies Distributorconnects both Agencyemploys agents Agentsells policies Clientbuys a policy $ override $ commission $ premium Tap to enlarge

The same pattern in data. Without a middle, every carrier deals with every agency: N carriers times M agencies relationships, each with its own terms. With the distributor, each connects once: N plus M (Figure A3-2). Three carriers and three agencies show the shape: 9 contracts against 6. The gap grows with the network: 50 carriers and 2,000 agencies would need 100,000 direct contracts, against 2,050 through the middle. Data has the same problem and the same answer: a data integration layer that every source is mapped into once, and every report reads from once. This is a known pattern in data integration, the Canonical Data Model, from Hohpe and Woolf’s Enterprise Integration Patterns: a common model independent of any one application, so that adding a participant needs only one new translation, into the common model [4]. Their arithmetic counts translations among peers, every application talking to every other: six applications need 30 translations without the common model and 12 with it [4]. The distributor applies the same idea between two sides, carriers and agencies, and shows it is a business pattern as much as a data one. It is why, later in the course, we apply the Canonical Data Model to the vault: the vault keeps each agency’s records faithfully apart, and one common model in the middle integrates them, as the distributor does for the business.

Figure A3-2. Every-to-every against once-to-the-middle. The same three carriers and three agencies, connected directly (left) and through the distributor (right).

Nine direct connections against six through a middleLeft: three carriers each connected to three agencies, nine connections. Right: the same carriers and agencies each connected once to Digest Insurance Distributors, six connections. Every carrier with every agency Each connects once, to the middle Carrier Carrier Carrier Agency Agency Agency Carrier Carrier Carrier Digest Insurance Distributors Agency Agency Agency 3 × 3 = 9 contracts 3 + 3 = 6 contracts Tap to enlarge

Notes

  1. AgentSync, “Insurance 101: FMOs vs IMOs vs NMOs”, https://agentsync.io/blog/distribution-channels/insurance-101-fmos-vs-imos-vs-nmos, read 2026-10-23.
  2. “What is an IMO in insurance?”, https://advisor-calculators.lovable.app/blog/what-is-an-imo-in-insurance, read 2026-10-23.
  3. AgentSync, the same article as note 1.
  4. Gregor Hohpe and Bobby Woolf, Enterprise Integration Patterns, the Canonical Data Model pattern: https://www.enterpriseintegrationpatterns.com/patterns/messaging/CanonicalDataModel.html, read 2026-10-23.
  5. Centers for Medicare & Medicaid Services, Agent and Broker Training and Testing Guidelines: https://www.cms.gov/files/document/cy2026agentbrokertrainingtestingguidelinespdf.pdf, read 2026-10-23.
Check yourself

Three carriers and three agencies: how many contracts without a distributor, and how many with one?

Show the answerHide the answer

Nine without one, every carrier with every agency; six with one, each side contracting once with the distributor. Data has the same shape, and the data integration layer is its distributor.

A4. How it grows, and why that is a data problem

The distributor grows in two ways. Most of its agents are independent: they sell under contract with the distributor and remain their own businesses, and their sales reach the distributor as policies placed through it, recorded in its own systems as they happen. It also buys businesses outright, insurance agencies and smaller distributors, and that is what creates the data problem: each acquired business arrives with its own client records, kept in its own system, with its own way of numbering clients and years of history behind them. One agency numbers its clients A-1001, A-1002 and onward; another uses entirely different numbers; a person who was a client of two agencies appears in both, under two unrelated numbers.

The company needs every acquired agency’s records in one place, with nothing lost and every record traceable to where it came from. That is the job of the data vault this course builds: a way of storing data that keeps every source’s records, unchanged, with when and where each arrived. Lesson 1 explains what it does and what it does not do. Data Vault has two layers: the raw vault, which keeps the data sources send, and the business vault, which applies business rules on top of it [1][2]. Until the course introduces the business vault, the vault means the raw vault.

The first acquired agency in the course is Sunbelt Senior Insurance. Its nightly client list is the first data the vault receives.

Notes

  1. “Data Vault 2.0 on Azure” (the raw data vault and the business vault as the two sub-layers between raw data and information marts): https://thewindowsupdate.com/2023/06/30/data-vault-2-0-on-azure/, read 2026-10-23.
  2. N-iX, Data Vault 2.0 overview (the business vault sits on top of the raw vault and applies business rules): https://www.n-ix.com/data-vault-2-0/, read 2026-10-23.
Check yourself

Why does buying agencies create a data problem that the independent agents do not?

Show the answerHide the answer

Each acquired agency arrives with its own system, its own client numbering and years of history, and one person can be a client of two agencies under two unrelated numbers. From the day an independent agent contracts with the distributor, the sales he makes through it are recorded in the distributor’s own systems.

A5. The ten questions the vault must answer

The course has a consumer: the distributor’s director of data architecture and governance. Everything the course builds is meant, in the end, to answer her questions through an assistant she can ask in plain words. Here are the ten the course expects her to ask first, written before she has seen anything; her own questions, once she uses what is built, will replace or extend them. A policy can name several people in different roles: the owner, who holds the contract; the insured, whose life or health it covers; and the payor, who pays its premium.

  1. How many distinct people are our clients, across every agency we have acquired?
  2. Which clients came to us through more than one agency?
  3. Which policies does each client hold, with which carriers, and in which roles: owner, insured or payor?
  4. How much business does each carrier write through us?
  5. Which agent wrote each policy, and where do our sources disagree about it?
  6. Which independent agents sell through us without an agency?
  7. Where did this client’s record come from, and when did we first know it?
  8. What did we know about this policy on a given date, and what has changed since?
  9. How many records arrive in a form we do not accept, and from which source?
  10. When we acquire the next agency, how much of its book already overlaps ours?

They split in two. Questions about where a record came from, when it arrived and what changed (7, 8 and 9), and about who holds which policy with which agent (3 and 5), are what the vault keeps by design, from the first lessons on. Questions that need one person recognized across different numbers (1, 2 and 10) cannot be answered by the vault alone: they need the data integration layer of section A3, built later in the course. Questions 4 and 6 need a measure or a rule the sources do not carry yet. Each lesson moves at least one of the ten forward.

Check yourself

Which of the ten questions can the vault answer on its own, and which need the data integration layer?

Show the answerHide the answer

Where a record came from, when it arrived, what changed, and who holds which policy with which agent (questions 3, 5, 7, 8 and 9) are what the vault keeps by design. Recognizing one person across different numbers (questions 1, 2 and 10) needs the data integration layer.

A6. What the course builds

Before the lessons take it apart piece by piece, here is the whole of what the course builds, in two pictures: the source data as it arrives, and the vault built from it. Both are entity relationship diagrams (ERDs). In an ERD each table is a box listing its columns, and each relationship is a line between two boxes. The marks at a line’s ends say how many rows on one side can meet one row on the other: a bar means exactly one, a circle means none at all is allowed, and the three-pronged foot, called a crow’s foot, means many. A line is dashed when nothing declares the relationship and it holds only where the values happen to match.

Figure A6-1 shows the source data as it lands [1]. Two sources come first: Sunbelt Senior, the acquired agency, sends its client list and its policy sales, and Northfield Life, a carrier, sends its policy data. A third, Pinecrest Mutual, another carrier, is the source of your labs. No source says how its rows relate to another table’s, so every line is dashed. A sale’s client number is found in the client list for 10 of the 11 client numbers the sales carry. A sale’s carrier code and policy number are found in Northfield Life’s data for 3 of the 9 Northfield policy numbers the sales name. The agent appears in every source, but only as a number, the national producer number. In insurance law, a person licensed to sell, solicit or negotiate insurance is called a producer, a word that covers agents [2]; the national producer number is the unique identifier the National Association of Insurance Commissioners (NAIC) assigns to a producer through the licensing process, to track producers nationally [3]. No source sends a list of agents, so the agent is drawn dashed too.

The course's source data, as it landsFour source tables from three sources: Sunbelt Senior's client list and policy sales data, Northfield Life's policy data, and Pinecrest Mutual's policy data for the learner's labs. No source declares how its rows relate to another table's; the dashed relationships hold only where the values match, and the agent is an entity no source sends.Sunbelt Senior's client listSUNBELT.CLIENTCRM_ROW_IDCLIENT_NUMBERFIRST_NAMELAST_NAMESTATELOADED_ATSunbelt Senior's policy salesSUNBELT.POLICY_SALESALE_ROW_IDPOLICY_NUMBERCLIENT_NUMBERCARRIER_CODEROLESOLD_ONAGENT_NAMEAGENT_NPNPLAN_NAMELOADED_ATAgent, sent by no sourceknown only by the producer numberNorthfield Life's policy dataNORTHFIELD.POLICYPOLICY_NUMBERINSURED_IDINSURED_NAMEBIRTH_DATEADDRESSFACE_AMOUNTSTATUSEFFECTIVE_DATEWRITING_AGENT_NPNLOADED_ATPinecrest Mutual's policy dataPINECREST.POLICY, for your labsPOLICY_NUMBERPLAN_NAMEFACE_AMOUNTSTATUSEFFECTIVE_DATEWRITING_AGENT_NPNLOADED_ATclient numbercarrier and policy numberproducer numberSunbelt Senior (SSI)Northfield Life (NFL)Pinecrest MutualTap to enlarge

Figure A6-1. The source data as it lands: four tables from three sources, each with its real columns. Every relationship is dashed, because no source declares it.

Figure A6-2 shows the vault the course builds from that data [1]. It holds three types of table, and each type gets its own lesson; in one line each, a hub keeps business keys, such as client numbers; a link records which keys belong together, such as a client and a policy; and a satellite keeps one source’s details about a hub or a link, with their history. In the figure each table carries a plain name and its type in parentheses. The colors show which source fed each satellite, and the dashed satellite is what your labs add.

The vault the course buildsFour hubs keep the business keys, three links record which keys belong together, and satellites keep each source's details with their history. Pinecrest Mutual's policy details, drawn dashed, are what the learner's labs add.Sale details(satellite) Sunbelt SeniorPolicy details(satellite) Northfield LifeClient on policy(link) with the roleInsured on policy(link)Client(hub) client numberPolicy(hub) carrier's policy numberInsured(hub) insured numberClient details(satellite) Sunbelt SeniorAgent on policy(link)Insured details(satellite) Northfield LifeAgent(hub) producer numberPolicy details(satellite) Pinecrest MutualSunbelt SeniorNorthfield LifeYour labsHubs and linksTap to enlarge

Figure A6-2. The vault the course builds: four hubs, three links and four satellites, named in plain words with each table’s type in parentheses. Simplified: the dated views the build adds beside each satellite are left out.

Notes

  1. Verified: read from the course’s warehouse on 2026-10-26, the source tables in LANDING and the vault’s tables in the development tier; the matches counted the same day.
  2. North Carolina General Statutes, section 58-33-10 (an insurance producer is a person required to be licensed to sell, solicit or negotiate insurance, and includes an agent and a broker): https://library.ncleg.gov/EnactedLegislation/Statutes/HTML/BySection/Chapter_58/GS_58-33-10.html, read 2026-10-26.
  3. National Insurance Producer Registry, NPN lookup (the National Producer Number is a unique NAIC identifier assigned through the licensing application process and used to track producers on a national basis): https://pdb.nipr.com/html/PacNpnSearch.html, read 2026-10-26.
Check yourself

In Figure A6-1, why is every relationship drawn dashed, and what does that mean for finding a sale’s client?

Show the answerHide the answer

No source declares how its rows relate to another table’s, so each relationship holds only where the values match. A sale finds its client only when its client number is written the same way in the client list: 10 of the 11 client numbers in the sales do.

Part B: how this course works

B1. Four terms from software teams

The course is built the way a software team builds things, so four of its terms come from that world. Each is used only after this point.

Notes

  1. GitHub glossary (repository, commit, branch, pull request): https://docs.github.com/enterprise/2.0/user/articles/github-glossary, with the repository definition as adapted in https://pychron.readthedocs.io/en/latest/user_guide/glossary.html, read 2026-10-23.
Check yourself

What is a branch, and which branch holds the course’s finished work?

Show the answerHide the answer

A parallel version of the repository, so that work in progress stays apart until it is merged. Finished work merges into qa, where it is tested, and is then promoted to main.

B2. The pieces

Piece What it is
Textbook All the lessons, arranged in parts, delivered as one web page; every section ends with a question whose answer stays hidden until the learner opens it
Part The lessons for one piece of the vault, built for real before the part is written, ending with that piece’s review
Lesson One concept area, numbered “lesson N of M” within its part, read in order
Flashcards One deck per part: a card for each term and key idea, to practice recall
Review The part’s final exam: the learner reviews the actual work the part describes
Check yourself

What is the review, in this course?

Show the answerHide the answer

The part’s final exam: the learner reviews the actual work the part describes.

B3. How a part runs

  1. The teacher builds the part’s piece of the vault in the course’s repository, under the same delivery process a professional team follows: documents first, tests before code, then the build.
  2. The textbook teaches it, with a question after each section that the learner answers to the teacher before opening its hidden answer; using rows from the tables that were actually built, so every example can be checked in the warehouse.
  3. The learner reviews it. The work arrives as a pull request (lesson 8 of part 1 explains what that is). Reviewing it is the part’s final exam, graded by a published rubric: the grading rubric for pull-request reviews. Its five criteria and three grades are known before the review starts, and the teacher’s answer key is sealed before the review so it cannot change afterwards.

After each lesson from lesson 2 on, a lab: a small increment the learner builds in their own branch and environment, exercising that lesson, with the teacher’s code as template and the teacher’s tests written first. A lab passes when the teacher’s review approves its pull request and it merges. The labs carry a second carrier, Pinecrest Mutual, into the same vault, so the learner’s increments and the teacher’s form one vault. From time to time a defect drill: the teacher introduces a defect into the shared branch qa and reports only its symptom, and the learner finds it, writes the test that catches it, and fixes it. Each lesson is read one at a time; the learner’s questions while reading become edits, applied together at the lesson’s end, before the next lesson is written.

Check yourself

What happens after each lesson from lesson 2 on, and what is a defect drill?

Show the answerHide the answer

A lab: the learner builds a small increment exercising the lesson, in their own branch, to the teacher’s tests. In a defect drill the teacher introduces a defect into qa and gives only its symptom; the learner finds it, writes the test that catches it, and fixes it.

B4. The five delivery documents

“Documents first” means five documents for each branch of work, written in this order and each agreed by the learner before the next begins. The course’s delivery process defines them, and lesson 8’s review reads them first.

Document What it says Written
Profile What the sources in scope contain, and which situations their rows deliberately carry, each with a check First, before anything is designed
Design Each decision about what will be built, with its reason and evidence After the profile is agreed
Test plan How each design decision will be proved: the tests, and the queries that verify the build After the design, before any code
Implementation guide The steps that build it, file by file, each with how to verify it After the test plan
Post-implementation guide What actually shipped, and every difference from the plan and why After the build is verified

The profile opens with an entity relationship diagram of the sources as they land, and the design with one of what it builds, each drawn before any analysis or decision (A6 shows both kinds).

The order is iterative, not one-way: when a later document finds a gap in an earlier one, the earlier one is amended with a decision that resolves it, and agreed again before anything builds on it.

Check yourself

In what order are the five delivery documents written?

Show the answerHide the answer

Profile, design, test plan, implementation guide, post-implementation guide, each agreed before the next begins; when a later one finds a gap in an earlier one, the earlier one is amended and agreed again.

B5. Three engineers, each with an environment

The course runs the way a professional team does, with three engineers: the teacher, who is the lead developer; the learner; and Kimi, a reviewer and second developer for business vault work. Each has their own environment: their own copy of the source data and their own vault database, separated from the others and from production (Kimi’s is being set up). The learner’s labs are increments of the same vault that complement the teacher’s: each adds what the other does not have, and both merge into qa. The learner’s environment builds the whole vault, the teacher’s increments and the learner’s own, so a review can check both against real rows. The engineers talk in the comments of Linear sub-issues, each comment signed. To start sooner, the learner’s branch began as a copy of the teacher’s, a one-time exception; once the teacher’s work is merged into qa, it is rebased onto qa.

Check yourself

How do the learner’s labs and the teacher’s increments end up in one vault?

Show the answerHide the answer

Both merge into qa, and they complement each other: the labs add what the teacher’s increments do not have, such as the second carrier, Pinecrest Mutual.

B6. Every stall improves the course

If a sentence stops the learner, whether a term used before it was explained, a passage that needs rereading, or a step carrying too much at once, that is a defect in the course, not in the reader. The learner says so in their own words; the teacher records it in the course’s acceptance log, fixes it where it lives, and checks the rest of the course for the same problem. By the end, the course has been tested by its first learner, line by line.

Check yourself

A sentence stops you while reading. Whose defect is it, and what happens next?

Show the answerHide the answer

The course’s. You say so in your own words; the teacher records it in the acceptance log, fixes it where it lives, and checks the rest of the course for the same problem.

Part 1, lesson 1 of 8: what the vault does and does not do

Course DIGEST Data Vault Course, part 1 (arrival and identity)
New terms source, history, lineage

1. One real instance

Digest Insurance Distributors, the company the course guide introduces, has acquired a small insurance agency, Sunbelt Senior Insurance. Every night Sunbelt Senior sends its client list as source data, one row per client. Two nights of it have arrived, on October 1 and on October 2, and the course’s vault has been built from them. Here are three of the rows Sunbelt Senior sent [1]:

Row Client number Client Arrived
7 A-1007 Irene Garrity October 1
39 A1007 Irene Garrity October 2
31 (none) Pia Esposito October 1

Irene Garrity appears twice. On October 1 her client number was typed A-1007. On October 2 it was typed A1007, without the hyphen. Pia Esposito arrived with no client number at all.

Here is what the vault kept for Irene [2]:

Client number First arrived Came from
A-1007 October 1, 02:00 SSI (Sunbelt Senior’s code)
A1007 October 2, 02:00 SSI (Sunbelt Senior’s code)

The vault kept two client numbers for Irene, each with the moment it first arrived and the source it came from. For Pia it kept no client number, because none was sent. Across both nights Sunbelt Senior’s client list sent 43 rows, and from them the vault kept 34 distinct client numbers [3]. A separate check built alongside the vault reported A1007 as a client number not written in Sunbelt Senior’s usual form [4]. The check reported it; it did not change it.

Check yourself

Sunbelt Senior sent Irene Garrity’s client number two ways. How many client numbers did the vault keep for her, and what did it keep with each?

Show the answerHide the answer

Two: A-1007 and A1007, each exactly as written. With each it kept the moment the number first arrived (October 1 and October 2, at 02:00) and the source it came from, SSI.

2. What the vault does

Three terms describe what happened, each defined here before it is used again.

So the instance shows the vault’s whole job, stated generally: the vault keeps every client number each source sends, with its history and its lineage, and it never changes or removes what it has kept [5]. A-1007 and A1007 are both kept, exactly as written, each with the time it arrived and the source that sent it.

Check yourself

Name this section’s three terms and what each records.

Show the answerHide the answer

Source: the system a row comes from, here Sunbelt Senior’s, coded SSI. History: when each thing arrived, here the moment a client number was first seen. Lineage: where each thing came from, the source’s code carried by every kept number.

3. What the vault does not do

The vault does not decide that A-1007 and A1007 belong to the same person. It cannot: the two numbers are written differently, and nothing in the source data says they refer to one client. A person looking at the rows sees the same name and suspects a typo; the vault sees two client numbers.

The same holds more widely. The vault does not combine Sunbelt Senior’s clients with another agency’s clients, and it does not correct values it believes are wrong. All three are decisions about what the data means, and the people who wrote the Data Vault method place every such decision after the vault, not inside it [6].

This is the question the course keeps returning to. It is tempting to think of the vault as the place where data from many sources comes together. What it actually does is keep each source’s data apart, faithfully and with its history and lineage. Deciding that two kept records describe one client, and combining them, is separate work that comes after.

Check yourself

Why does the vault not decide that A-1007 and A1007 are one client?

Show the answerHide the answer

The two numbers are written differently and nothing in the source data says they name one client. Deciding that they do is a decision about meaning, and the Data Vault method places such decisions after the vault, not inside it.

4. A worked example

The names here are invented. An agency sends Rosa Diaz as client A-2001 on Monday. On Wednesday its source data lists her as A2001. The vault keeps both client numbers, A-2001 first seen Monday and A2001 first seen Wednesday, both from the agency’s client list. If an analyst counts the vault’s clients, Rosa is counted twice. Nothing is lost and nothing is wrong in what the vault kept; what is missing is the decision that A-2001 and A2001 are one person, and that decision is not the vault’s to make.

Check yourself

An analyst counts the vault’s clients and counts Rosa Diaz twice. Is the vault wrong?

Show the answerHide the answer

No. It kept what was sent: A-2001 and A2001, each with its arrival and its source. What is missing is the decision that the two numbers are one person, and that decision is not the vault’s to make.

5. What to keep from this lesson

The vault keeps every client number each source sends, exactly as sent, with history (when it arrived) and lineage (where it came from). It does not decide what belongs together. When the same client arrives under two numbers, the vault keeps two.

Notes

  1. Verified: read from the course’s warehouse on 2026-10-23 (the source table SUNBELT.CLIENT and the vault’s client hub). Re-read on 2026-10-23 at 18:41 UTC after record sources became codes, and on 2026-10-25.
  2. Verified: the same query as note 1.
  3. Verified: counted in the course’s warehouse on 2026-10-23, and again on 2026-10-25. By then the client hub held 35 client numbers under SSI: these 34, and A-1033, which reached the vault from Sunbelt Senior’s policy sales data in a later part of the course.
  4. Verified: read from the course’s warehouse on 2026-10-23 (the findings the check recorded).
  5. N-iX, Data Vault 2.0 overview (a hub loads by one rule, inserting a business key only if it does not already exist, and once a key exists its row never changes): https://www.n-ix.com/data-vault-2-0/, read 2026-10-23; and the course’s client hub, verified as in note 1.
  6. VaultSpeed, Data Vault 2.0 concepts (the business vault applies soft business rules, transformations and logic): https://docs.vaultspeed.com/space/VPD/3011870744.md; “Data Vault 2.0 on Azure” (a business vault entity exists only if a business rule needs to be applied): https://thewindowsupdate.com/2023/06/30/data-vault-2-0-on-azure/; waitingforcode, Data Vault 2 in big data (the same-as link, which links a concept written differently to its correct definition, is a business vault construct): https://www.waitingforcode.com/general-big-data/data-vault-2-big-data/read. All read 2026-10-23.

Part 1, lesson 2 of 8: where data comes from

Course DIGEST Data Vault Course, part 1 (arrival and identity)
Builds on Lesson 1: source, history, lineage
New terms source table, load timestamp, record source

1. One real instance

Sunbelt Senior Insurance’s client A-1001 is Rosa Alvarez. She was in both nights’ client lists, so the warehouse holds two rows for her [1]:

Row Client number Client LOADED_AT, as sent
1 A-1001 Rosa Alvarez 2026-10-01T02:00:00
1 A-1001 Rosa Alvarez 2026-10-02T02:00:00

The two rows are identical except for one column: LOADED_AT, the time Sunbelt Senior’s system stamped on each night’s rows. It arrives as text. Altogether October 1 brought 33 rows and October 2 brought 10 [2].

The vault’s first step, which lesson 3 names and explains, reads these rows and adds two columns to every one of them [3]:

Row LOADED_AT, as sent LDTS RSRC
1 2026-10-01T02:00:00 2026-10-01 02:00:00 SSI
1 2026-10-02T02:00:00 2026-10-02 02:00:00 SSI

LDTS holds the same moment as LOADED_AT, now stored as a real timestamp instead of text. RSRC holds the same short code on every row, SSI: a permanent code for the source the row came from. Looking SSI up in the source system seed gives its name today, as the seed spells it: Sunbelt Senior client file [4].

Check yourself

Rosa Alvarez’s two rows in the source table differ in one column only. Which column, and which two columns does the vault’s first step add?

Show the answerHide the answer

LOADED_AT, the time Sunbelt Senior’s system stamped each night’s rows. The first step adds LDTS and RSRC.

2. Three terms

Check yourself

LOADED_AT and LDTS hold the same moment. What is the difference, and why does RSRC hold a code instead of a name?

Show the answerHide the answer

LOADED_AT is text, as sent; LDTS is a real timestamp in UTC. RSRC holds a code because the code never changes: the name lives in one place, the source system seed, so renaming a source changes one row of the seed and no row in the vault.

3. Why every row carries both

Later, rows from different nights, and in later parts from different sources, end up side by side in the same vault tables. Once rows from many deliveries sit in the same table, there is nothing else to look at: the only way to know where and when a row came from is to read it from the row itself. So each row carries its own load timestamp and record source from the moment it enters. Rosa’s two rows show it: the same client, the same details, told apart only by their load timestamps, and both traceable to Sunbelt Senior by their record source, SSI.

Check yourself

Rows from many deliveries now sit in one vault table. How do you tell where and when one of them came from?

Show the answerHide the answer

Read it from the row itself: its record source, RSRC, says where, and its load timestamp, LDTS, says when.

4. A worked example

The names here are invented. A dental plan sends its member list every Monday and Thursday. Member M-77, Ana Ruiz, is in both deliveries of one week. The source table holds two rows for her. After the vault’s first step, both rows carry the record source DPM, the dental plan’s code; one carries Monday’s load timestamp and the other Thursday’s. Six months later, an analyst who finds Ana’s Monday row in a vault table can still say exactly which source it came from and when it arrived, without asking anyone. If the dental plan is renamed in the meantime, the rows still say DPM, and the source system seed gives the new name.

Check yourself

The dental plan is renamed six months later. What do Ana Ruiz’s vault rows say, and where is the new name?

Show the answerHide the answer

They still say DPM; the source system seed gives the new name.

5. What to keep from this lesson

A source’s data lands unchanged in a source table. On the way into the vault, every row gains two columns: its load timestamp (LDTS, when it arrived) and its record source (RSRC, a permanent code for where it came from, named in the source system seed). They are history and lineage, written on each row.

Your lab. Lesson 2 has a lab: Lab 1-2 in the workbook, declaring a second carrier’s landed table as a source of the vault. Open it here: https://claude.ai/artifact/ELCnMhz2GPtV6AiuzW5rzB#lab-1-2

Notes

  1. Verified: read from the course’s warehouse on 2026-10-23, and again on 2026-10-25.
  2. Verified: counted in the course’s warehouse on 2026-10-23.
  3. Verified: the same query as note 1, re-read on 2026-10-23 at 18:39 UTC after record sources became codes.
  4. Verified: the source system seed, read on 2026-10-23.
  5. datavault4dbt documentation, staging macro: the ldts column holds the load date timestamp (https://github.com/rayserrano2735/datavault4dbt/blob/694df249/docs/01_macro-instructions/02_staging/02_staging.md); Red Gate, Data Vault modeling basics: the load date tells the first time the data warehouse knew about a business key (https://www.red-gate.com/blog/data-vault-series-data-vault-2-0-modeling-basics/). Read 2026-10-23.
  6. datavault4dbt documentation: the record source column gives information about where the source data is coming from (https://github.com/rayserrano2735/datavault4dbt/blob/694df249/docs/01_macro-instructions/01_documentation/01_documentation.md). Read 2026-10-23.

Part 1, lesson 3 of 8: the vault’s first step

Course DIGEST Data Vault Course, part 1 (arrival and identity)
New terms business key, staging, hard rule, hash key

1. One real instance

Lesson 2 showed Rosa Alvarez’s two rows gaining a load timestamp and a record source. Rows with other client numbers show what else happens on the way into the vault. Here are five rows of Sunbelt Senior’s client list as they landed in the source table SUNBELT.CLIENT, each client number shown between brackets so that a space after it is visible [1]:

Row Arrived Client number, as sent
4 October 1 [A-1004]
37 October 2 [a-1004]
5 October 1 [A-1005]
38 October 2 [A-1005 ]
32 October 1 []

Row 37 is A-1004 typed in lower case. Row 38 is A-1005 with a space after it. Row 32 sent an empty value, and one more row, row 41 on October 2, sent three spaces and nothing else.

Here are the same rows after the vault’s first step [2]:

Row Client number Hash key
4 A-1004 d451d5e07e1297d40e4e211e07d63c87
37 a-1004 d451d5e07e1297d40e4e211e07d63c87
5 A-1005 97dcf5db15fab07747135a359e89eb79
38 A-1005 97dcf5db15fab07747135a359e89eb79
32 (none) 00000000000000000000000000000000

Three things happened. The space after A-1005 is gone. The empty value became no value at all, and row 41’s three spaces did the same. And every row gained a new column, the hash key: rows 4 and 37 share one, rows 5 and 38 share another, although each pair was written two ways.

Check yourself

Which rows share a hash key, and how did the rows of each pair differ as sent?

Show the answerHide the answer

Rows 4 and 37 share one: A-1004 and a-1004 differ only in letter case. Rows 5 and 38 share another: A-1005 and A-1005 with a space after it.

2. Four terms

Check yourself

Turning an empty client number into no value: hard rule or soft rule, and why?

Show the answerHide the answer

A hard rule: it changes how the value is stored, not what it means. Soft rules change meaning and belong to the business vault.

3. How the hash key is made, and what it ignores

The toolkit trims the spaces around the client number, writes it in capitals, puts it between quotation marks and computes its MD5 [6][7]. For A-1001, Rosa’s number, that is the MD5 of “A-1001”, which is 2eec4d22ff4ec7df061cc883ac8d1b04; Rosa’s row in the vault carries exactly that key [8]. Any reader can repeat the calculation.

Because the number is written in capitals before it is hashed, a-1004 and A-1004 give one key; because spaces around it are trimmed, A-1005 with a space and A-1005 without give one key. Both are hard rules: letter case and surrounding spaces do not change which client a number names, and the toolkit is set to treat business keys that way [6]. The hash key does not remove the hyphen, though. A1007 and A-1007 give two keys, as lesson 1 showed, because deciding that they name one client is a decision about meaning, and that is not the raw vault’s to make.

The empty values needed a rule of their own. Without it, an empty client number would be hashed like any other value and become a key that looks real but names no client. When the course first built staging without the rule, a test showed exactly that: the empty value hashed to a key beginning 9d4568c0 [9]. With the rule, staging turns an empty or space-only client number into no value first, and every row with no client number receives the same reserved key, 32 zeros. What the vault does with that key is lesson 5’s subject.

Check yourself

Why do A-1007 and A1007 get different hash keys, while a-1004 and A-1004 get one?

Show the answerHide the answer

The hash key ignores letter case and the spaces around a number, and nothing else. A missing hyphen is a different spelling; deciding that A1007 is A-1007 is a decision about meaning, which the raw vault does not make.

4. A worked example

The names here are invented. A dental plan sends member M-77, Ana Ruiz, on Monday. On Thursday its member list writes her number as m-77, and on Friday as M-77 with a space before it. Staging gives all three rows one hash key, because letter case and surrounding spaces are ignored. A week later the plan sends M77, without the hyphen: staging gives that row a different key, and the vault keeps it as a second member number until someone decides, outside the raw vault, that the two are one member. A row with an empty member number receives the key of 32 zeros.

Check yourself

Which of M-77, m-77, M-77 with a space before it, and M77 share a hash key?

Show the answerHide the answer

The first three: they differ only in letter case or surrounding spaces. M77 gets its own key and stays a second member number until someone decides, outside the raw vault, that the two are one member.

5. What to keep from this lesson

Staging is the vault’s first step: one per source table, it applies hard rules only, which change how values are stored and never what they mean. It computes each row’s hash key from its business key, ignoring letter case and the spaces around it, and nothing else. Two spellings that differ in more than that stay two keys.

Notes

  1. Verified: read from the course’s warehouse on 2026-10-25 (the source table SUNBELT.CLIENT in the developer landing database).
  2. Verified: the staging view stg_sunbelt_client, read on 2026-10-25 and joined to the source table by row and load time.
  3. datavault4dbt documentation, standard hub: the hash key is the hub’s primary key, and the business keys are the input of the hash key: https://github.com/rayserrano2735/datavault4dbt/blob/694df249/docs/01_macro-instructions/06_hubs/06_standard-hub.md, read 2026-10-25.
  4. datavault4dbt documentation, staging: the staging layer is mainly for hashing, one stage is created per source table, and it is not there to harmonize data: https://github.com/rayserrano2735/datavault4dbt/blob/694df249/docs/01_macro-instructions/02_staging/02_staging.md, read 2026-10-25.
  5. VaultSpeed, Data Vault 2.0 concepts (hard business rules are type casting, formatting and null handling; the raw vault applies no transformations beyond hard rules; the business vault applies soft business rules): https://docs.vaultspeed.com/space/VPD/3011870744.md, read 2026-10-25.
  6. datavault4dbt project settings, at the version the course pins: the hash algorithm is MD5, and hash key input is not case-sensitive: https://github.com/rayserrano2735/datavault4dbt/blob/694df249/dbt_project.yml, read 2026-10-25.
  7. The branch design (Pilot knowledge 35 item 270), section 6.3, the hash rule step by step, read from the toolkit’s code on 2026-10-22.
  8. Verified: MD5 of “A-1001” computed in the course’s warehouse on 2026-10-25 and compared with the client hub’s row for A-1001.
  9. The branch post-implementation guide (Pilot knowledge 35 item 273), section 3: unit test P7, red on 2026-10-23, before the rule was added.

Part 1, lesson 4 of 8: the hub

Course DIGEST Data Vault Course, part 1 (arrival and identity)
New terms hub, insert-only

1. One real instance

Lesson 3 ended with every row of Sunbelt Senior’s client list carrying a hash key. Here are six of those rows, with their client numbers as sent [1]:

Row Arrived Client number, as sent
1 October 1 A-1001
1 October 2 A-1001
4 October 1 A-1004
37 October 2 a-1004
35 October 2 A-1031
10 and 33 October 1, both A-1010 and a-1010

And here is what the vault’s client table holds for those numbers [2]:

Client number Hash key First arrived Came from
A-1001 2eec4d22ff4ec7df061cc883ac8d1b04 October 1, 02:00 SSI
A-1004 d451d5e07e1297d40e4e211e07d63c87 October 1, 02:00 SSI
A-1031 210760676c52f84825af4c9a4c97b040 October 2, 02:00 SSI
A-1010 854fb226c402caa6d757b70aba3330c2 October 1, 02:00 SSI

Six rows became four. A-1001 arrived twice and has one row, dated October 1. A-1004 arrived again on October 2, spelled a-1004, and nothing changed: the row still shows October 1 and the spelling first sent. A-1031 arrived only on October 2 and has a row dated October 2. A-1010 arrived twice in the same night, spelled two ways, and has one row.

Check yourself

How many rows does the client table hold for A-1001, and which arrival does that row record?

Show the answerHide the answer

One row, recording its first arrival: October 1 at 02:00, from SSI. The second arrival, on October 2, added nothing.

2. Two terms

This is lesson 1’s job, built: the hub keeps every client number Sunbelt Senior sends, with its history (first arrival) and its lineage (record source), and never changes what it has kept.

Check yourself

Why does A-1004’s hub row still read October 1 and A-1004, although a-1004 arrived on October 2?

Show the answerHide the answer

The hub is insert-only. a-1004 has the same hash key as A-1004, so on October 2 the hub already held that key and added nothing; its row keeps the first arrival and the spelling first sent.

3. What “first” means, and when the data cannot say

On October 1, Sunbelt Senior’s list carried A-1010 in row 10 and a-1010 in row 33. Both spellings have one hash key, both arrived in the same night with the same load timestamp, and the hub must keep one row. Both are first. The hub keeps one of the two spellings, and nothing in the data decides which: in the course’s first build the hub held a-1010; rebuilt from the same rows on 2026-10-25, it holds A-1010 [7]. Either way the key is the same, and so is everything the vault will later attach to it.

The spelling a hub keeps can therefore be a typo, whenever two spellings of one key arrive together. That is a known property of the course’s vault, disclosed in its delivery documents, not a fault in either build [7].

Check yourself

Why did two builds of the same rows store A-1010 in two different spellings?

Show the answerHide the answer

Both spellings have the same hash key and arrived in the same load at the same moment, so both are the first arrival. The hub keeps one row, and nothing in the data decides which spelling it takes.

4. Counting the hub

Across both nights, Sunbelt Senior’s client list sent 43 rows. They give 34 hub rows: 30 client numbers first seen on October 1, and four first seen on October 2, A-1031, A-1032, A1007 and A-01008 [8]. The other nine rows were second arrivals of numbers the hub already held, spellings that hash to a key it already held, or rows with no client number, which lesson 5 explains. The hub holds a few more rows than these 34: two the vault adds itself, which lesson 5 also explains, and in part 2, numbers arriving from another source.

Check yourself

Sunbelt Senior sent 43 rows and the hub holds 34 client numbers from them. Name the three reasons a row adds no hub row.

Show the answerHide the answer

Its number had arrived before; it was spelled differently but hashes to a key the hub already held; or it carried no client number at all.

5. A worked example

The names here are invented. The dental plan sends member M-77, Ana Ruiz, on Monday; the member hub gains one row: M-77, its hash key, Monday’s load timestamp and the code DPM. On Thursday Ana is sent again and nothing changes. On Friday the plan sends M77, without the hyphen: its hash key is different, so the hub gains a second row, dated Friday. The hub now holds two member numbers for one person, each with its first arrival, and will hold them both for as long as the vault exists.

Check yourself

After Friday, how many hub rows does the dental plan’s member hub hold for Ana Ruiz, and why?

Show the answerHide the answer

Two: M-77, first seen Monday, and M77, first seen Friday. Their hash keys differ, because the hyphen is not ignored, and the hub never merges or removes a key.

6. What to keep from this lesson

A hub holds one row per distinct business key: its hash key, the key as first seen, when it first arrived and which source first sent it. It is insert-only, so later arrivals add nothing and nothing kept ever changes. When two spellings of one key arrive together, the hub keeps one, and the data does not decide which.

Notes

  1. Verified: read from the course’s warehouse on 2026-10-25 (the source table SUNBELT.CLIENT).
  2. Verified: the client hub client_h, read on 2026-10-25.
  3. datavault4dbt documentation, standard hub: a hub is built from stage models, its hash key is its primary key, and its business keys are loaded into it: https://github.com/rayserrano2735/datavault4dbt/blob/694df249/docs/01_macro-instructions/06_hubs/06_standard-hub.md, read 2026-10-25.
  4. Verified: the columns of client_h, read from the warehouse’s information schema on 2026-10-25.
  5. N-iX, Data Vault 2.0 overview (a hub loads by one rule, inserting a business key only if it does not already exist, and once a key exists its row never changes): https://www.n-ix.com/data-vault-2-0/, read 2026-10-23.
  6. Red Gate, Data Vault modeling basics (the load date tells the first time the data warehouse knew about a business key): https://www.red-gate.com/blog/data-vault-series-data-vault-2-0-modeling-basics/, read 2026-10-23.
  7. The branch post-implementation guide (Pilot knowledge 35 item 273), section 5, known characteristics, corrected on 2026-10-25 when the rebuilt hub held A-1010; and the branch design (Pilot knowledge 35 item 270), section 6.3: the hub keeps the first sighting.
  8. Verified: counted in the client hub on 2026-10-25, among the rows whose record source is SSI.

Part 1, lesson 8 of 8: reviewing a pull request

Course DIGEST Data Vault Course, part 1 (arrival and identity); taught once here, cited by every later part
New terms pull request, diff, rubric

1. One real instance

Everything built for part 1 lives on one branch of the course repository, claude_ws/dig-574-arrival-and-identity. On 2026-10-23 a request was opened on GitHub, numbered 1, asking to add that branch’s work to the branch qa, where the course’s finished work collects. When it was opened, the request carried 29 commits touching 36 files [1]. The course’s rule is that none of that work reaches qa until the reviewer approves it. GitHub does not enforce that rule here: the qa branch has no protection rule, and a repository’s owners can merge a pull request even without an approving review [2][3]. The person who decides is the reviewer, and for part 1 the reviewer is the learner. Request 1 was later closed and reopened as request 2 from the teacher’s own GitHub account, because GitHub does not let the author of a request approve it [3], and request 1 had been opened under the learner’s account. Request 2 has since grown: by 2026-10-25 it carried 58 commits touching 70 files, because the same branch also holds the work of later parts [6]. Then the course met a real-life pressure. The product’s first consumer could ask at any moment, so its first release was expedited for time to market: on 2026-10-26 the owner, who is also the learner, merged request 2 into qa without the review [7]. Owners can do that, and the rule exists to keep it rare and deliberate. The second release returns to the planned process: its request is reviewed before it merges, and that review is part 1’s exam.

Check yourself

Who decides whether part 1’s work reaches qa, and why does GitHub not enforce that decision here?

Show the answerHide the answer

The reviewer, and for part 1 the reviewer is the learner. GitHub does not enforce it because the qa branch has no protection rule, and a repository’s owners can merge without an approving review.

2. Two terms

Approving a pull request means: I have read this diff, I understand what it does and why, I have checked it against real data, and I accept it into qa.

Check yourself

What does approving a pull request mean?

Show the answerHide the answer

I have read this diff, I understand what it does and why, I have checked it against real data, and I accept it into qa.

3. How to read a pull request

The delivery process’s code review standard sets the order, and the order matters:

Step Read Why first
1 The documents, whole: design, implementation guide, test plan They say what the code is supposed to do; without them, a reviewer can only check that code runs, not that it is right
2 The diff, file by file Now each change can be judged against what the documents promised
3 The data, in your own environment Tests prove what their author thought to test; the data shows what actually happened

Step 3 is why the course gave the learner a separate developer environment: a reviewer builds the branch and queries the results, instead of trusting the author’s report.

Check yourself

In what order do you read a pull request, and why do the documents come first?

Show the answerHide the answer

The documents, then the diff, then the data in your own environment. The documents say what the code is supposed to do; without them a reviewer can only check that code runs, not that it is right.

4. How the course grades a review

The course’s rubric for pull-request reviews has five criteria:

# Criterion What it asks of the reviewer
1 Explain what was built and why State the key design decisions in your own words
2 Account for every changed file Each file reviewed, or set aside with a reason
3 Validate against data Check your own build against what the design promises
4 Find what matters Name the risks, defects and surprising behaviors the work contains
5 Decide and justify Approve or request changes, each finding with its evidence and seriousness

It has three grades. Pass with distinction: all five criteria, plus a valid finding the teacher did not expect. Pass: all five criteria, with most expected findings caught. Not yet: a criterion missed; the grading names the lessons to reread and the learner reviews again, a normal outcome.

Check yourself

What separates Pass from Pass with distinction?

Show the answerHide the answer

Pass: all five criteria, with most expected findings caught. Pass with distinction: all five criteria, plus a valid finding the teacher did not expect.

5. Why the answer key is sealed

Criterion 4 needs a reference: the teacher’s list of findings a strong reviewer should catch, called the answer key. The teacher writes it before the review and posts a fingerprint of its exact text (a SHA-256 hash) on the course’s master issue. At grading the key is opened and fingerprinted again. If even one character changed, the fingerprints would, with very high probability, differ [5]. So the teacher cannot add findings after seeing the review, and the learner knows the grading was fixed in advance.

Check yourself

How does the fingerprint keep the answer key from changing after the review?

Show the answerHide the answer

The teacher posts the key’s SHA-256 fingerprint before the review. At grading the key is fingerprinted again; if even one character changed, the fingerprints would, with very high probability, differ.

6. A worked example

The names here are invented. A pull request adds a second agency’s client list. The documents say every client number is kept with its arrival time. In the diff, the reviewer sees a test that requires exactly 52 rows. In the data, the reviewer’s own build shows 52 rows, so the test passes. A strong review still reports the test: it will fail the day the agency sends a third night’s rows, because the expected count is written into the test instead of read from the data. That finding is criterion 4 at work: the build passed, and the reviewer found a defect anyway.

Check yourself

The test in the worked example passes. Why does a strong review still report it?

Show the answerHide the answer

It requires exactly 52 rows, a count written into the test instead of read from the data, so it will fail the day the agency sends a third night’s rows.

7. What to keep from this lesson

Approve a pull request only after reading the documents, then the diff, then your own data. The course grades that review by a rubric known in advance, against an answer key sealed before you start.

Notes

  1. Verified: GitHub’s reply when the request was opened, 2026-10-23 at 12:35 UTC.
  2. Verified: GitHub’s API for this repository, read 2026-10-23 (no branch protection and no rulesets on qa).
  3. GitHub documentation, approving a pull request with required reviews (authors cannot approve their own pull requests; owners and administrators can merge without an approving review): https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/approving-a-pull-request-with-required-reviews, read 2026-10-23.
  4. GitHub glossary (pull requests are proposed changes accepted or rejected by a repository’s collaborators; the diff shows what was added or removed): https://docs.github.com/enterprise/2.0/user/articles/github-glossary, read 2026-10-23.
  5. NIST, FIPS 180-4, Secure Hash Standard (any change to a message will, with a very high probability, result in a different message digest): https://csrc.nist.gov/files/pubs/fips/180-4/final/docs/fips180-4.pdf, read 2026-10-23.
  6. Verified: GitHub’s API for this repository, read 2026-10-25 (request 1 closed unmerged on 2026-10-23 at 13:37 UTC; request 2 open, 58 commits, 70 files).
  7. Verified: GitHub’s API for this repository, read 2026-10-27 (request 2 merged into qa by rayserrano2735 on 2026-10-26 at 20:03 UTC, with no review). The decision to expedite: Ray, 2026-10-26, for time to market; the second release follows the full process, Ray, 2026-10-27.

Appendix 1: Questions for a Data Vault architecture conversation

Course DIGEST Data Vault Course, appendix 1

The course’s conclusions, gathered in one place: how to frame the course’s argument, the questions it leads to, the terms they use, and how far the course’s own vault has been built.

The framing, in two sentences

Data Vault keeps every source’s history faithfully, with full lineage; on its own it does not decide what a client, a policy or a status is across sources. This course finishes an approach John Giles began, the Universal Data Vault: hubs built from universal data model patterns (appendix 2), completed with the patterns Giles set aside (party, party role, party relationship and role within a transaction), as Silverston’s universal data model patterns define them. It is the Canonical Data Model applied inside the vault: one common model for what things are, which every source is translated into once.

Why “canonical” matters: the Canonical Data Model is Hohpe and Woolf’s pattern from Enterprise Integration Patterns. With a common model, adding a participant needs only one new translation; by their count, six applications need 30 translations without one and 12 with it.

The ten questions

Ask them as an architect learning how a team handles each case, not as objections.

# Ask What it rests on
1 When a source sends sales with an ISBN, where does your team decide that a book is a concept the business tracks, and who owns that decision? The raw vault creates hubs for concepts no source sent; that is a business decision
2 When two sources identify the same thing with different keys, where in your architecture are they made one? A hub only matches identical key strings; it reuses sameness an issuer already created
3 Where does your team’s integrated view of a client live, and how many places define “client”? Integration deferred past the vault is not removed; done per mart it multiplies
4 How does your team integrate ten carriers’ policy statuses and product categories into one view? The business vault resolves identity at best; status and classification need typed rows
5 How does your team absorb a source whose entities change month to month, and how long does remapping take? The raw vault cannot load a table until its entities are decided
6 Where is source history kept before the vault, and how are full-snapshot sources reduced to versions? Toolkits and practitioners (Datavault Builder, Roelant Vos) place a persistent staging area beside the vault
7 If an auditor asks for a source table exactly as it arrived on a given day, how is it produced? Once staging is cleared, the source’s own table must be re-assembled from hubs, links and satellites
8 When a modeling decision in the raw vault turns out wrong, how is history repaired? Sources without change capture cannot be reloaded
9 How are hundreds of columns assigned to hubs, links and satellites, and what happens to a link when a source adds a code? A satellite has one parent; a new code means a new link
10 What part of your vault’s build is automated, and what part is still decided by people? Generators write the objects after people make the decisions
11 How does your team key a source row that arrives without its business key, and where does that row’s history live? A shared zero key collides in a satellite’s key; keeping the row in persistent staging and raising a finding keeps it without a false entity

The likely objection: performance

The answer: query speed is the marts’ job, in this design as in Data Vault. The data integration layer’s cost is the build, and the expensive joins are built in stages as materialized steps, incremental with change data capture, run in parallel.

Point Support
Consumers query marts, not the data integration layer Data Vault itself is described as a data integration layer, not a consumption layer; teams that query the vault directly find its joins unwieldy [1]
Generalized, pattern-based structures can be built at enterprise scale Giles built them for 83 merged organizations and about 8,000 source tables (appendix 2); his articles give no timings
Build cost is managed by staging A large join is materialized in parts (ten tables as two five-table steps, then combined), each build processes only changes, and independent steps run in parallel: practice from the author’s own work on IMDb data, to be shown with timings as the course’s builds use it

Notes

  1. Navicat, Designing better databases with Data Vault 2.0: https://www.navicat.com/company/aboutus/blog/3970-designing-better-databases-with-data-vault-2-0-and-navicat-data-modeler-4, read 2026-10-23.

Areas for further study

Four directions this course is exploring, offered as open questions rather than settled positions.

# Area The question
1 Is any part of the vault raw? A hub’s structure is designed from the business view; only each row’s provenance is raw or rule-derived. John Giles reaches the same observation in The Elephant in the Fridge and suggests dropping the labels “raw” and “business” Data Vault. What changes if a team stops calling any layer raw?
2 Can the UDM integrate satellites? Giles integrates satellites with a business-centric “conformed” satellite, still in columns. What if satellites took the UDM’s typed, dated rows instead (person name, postal address, status), so every source meets once per type?
3 Universal hubs in a Data Vault form Universal hubs for the keys, UDM satellites and links on them, record source on every row. How much of a team’s Data Vault practice carries over unchanged?
4 History on demand If storage keeps every version of every source row, the integrated model at any past moment can be rebuilt from storage, code and reference data in git. Does the data integration layer still need its own insert-only history?

Terms, checked against the method’s sources

Term Meaning
Hub One row per business key, shared by every source that carries it
Link A relationship or event between hubs
Satellite One source’s descriptive columns with their history, on one hub or link
Raw vault Keeps what sources send; only hard rules applied
Business vault Applies soft business rules on top of the raw vault; sparse, and never rewrites it
Hard rules Technical changes such as type casting, formatting and null handling
Soft rules Changes made for business requirements
Same-as link A business vault link recording that two keys are one thing
Ghost record A placeholder row that lets point-in-time joins stay equi-joins

How far the course’s vault is built

Prior art: the Universal Data Vault

John Giles published a way to combine Silverston’s universal data model patterns with Data Vault and named it the Universal Data Vault [1]. It puts the patterns into the vault itself: generalized hubs such as Asset, Activity and Agreement hold every subtype, each subtype a row in a hand-made type table, with the type and the business code together making a key unique. He set party and party role aside as a possibly contentious topic, adding that the UDV structures could accommodate the alternative modeling choices [2].

This course builds on that design rather than departing from it. Its hubs are universal too, and its contribution is the part Giles left aside: party, party role, party relationship and role within a transaction, taken from Silverston’s universal data model patterns. Its first example is one hub for people, keyed by issuer and identifier, with a person-policy link that carries the role.

Notes

  1. John Giles, Universal Data Vault, Part 1, TDAN: https://tdan.com/?p=19072, read 2026-10-24.
  2. John Giles, Universal Data Vault, Part 2, TDAN: https://tdan.com/?p=19245, read 2026-10-24.

Appendix 2: Study of John Giles’s Universal Data Vault

Course DIGEST Data Vault Course, appendix 2
Sources John Giles, “Universal Data Vault: Case Study in Combining ‘Universal’ Data Model Patterns with Data Vault Architecture”, TDAN, Part 1 (https://tdan.com/?p=19072) and Part 2 (https://tdan.com/?p=19245), both read in full on 2026-10-24
Method Sections 1 to 6 report what Giles wrote, paraphrased. Section 7 is the course’s own reasoning, labeled as such. Section 8 lists what the articles do not settle.

1. Who he is and what he set out to do

Giles is an independent consultant in information architecture, working in IT since the late 1960s, a Fellow of the Australian Computer Society, and the author of The Nimble Elephant: Agile Delivery of Data Models Using a Pattern-based Approach (Part 1, author note). He asks whether combining universal data model patterns with Data Vault keeps the benefits of both or cancels them out (Part 1, opening).

2. The case that produced it

3. The dilemma

4. The design

Construct What Giles specifies
Generalized hub One hub per pattern (his examples: Asset, Activity; also Account, Agreement, Event, Location, Product), holding every subtype; named from the ELDM’s chosen patterns (Part 2)
Hub type table A self-referencing table of subtypes and their parent and child hierarchy (Helicopter and Fixed-Wing Plane under Aircraft); configuration data written by the design team, not a Data Vault table, with no source or load date; a new subtype is a new row, not a new hub (Part 2)
Abstract or concrete flag Marks types used only to group others; optional (Part 2)
Hub uniqueness Type plus business code, because a generalized hub could hold an aircraft and a truck with the same registration number (Part 2)
Generalized link Links generalized the same way, each row pointing to its link type; his banking example: signatory, guarantor, witness and approver links between parties and agreements (Part 2)
Link type table Defines each allowed specialized link between generalized hubs; configuration, not a Data Vault table; new link types added as rows (Part 2)
Roles on self-referencing links Where it is unclear which side contains the other (truck and crew, office block and treatment plant), the link type table names each participant’s role (Part 2)
Satellites Regular Data Vault satellites, which can hang at any level of the hierarchy and on links (Part 2)
Rules Kept as metadata, such as expected cardinality in link types, used to report breaches of loaded data, never to exclude data from the load (Part 2)
Visualization Structure held as data is harder to see; he suggests generating XMI files from the type tables for UML tools (Part 2)

5. What he set aside and what he found hard

6. His results and guidance

7. The course’s reading (the course’s reasoning, not Giles’s)

  1. The course’s position is universal hubs inside the vault, as Giles’s are; it finishes his approach rather than offering an alternative. Provisional: this rests on the two articles; his later Data Vault book (section 9) includes a Party pattern, and until it is read the course does not claim he left party unfinished. Increment 2’s design shows it: one hub for people keyed by issuer and identifier (type-plus-code uniqueness, in Giles’s terms), the policy hub qualified by carrier, and the person-policy link carrying the role, close to his link types that name each participant’s role.
  2. What it adds: party, party role, party relationship and role within a transaction, from Silverston’s universal data model patterns, the area Giles set aside. By his own words the UDV structures can hold those choices, so adding them completes rather than corrects him.
  3. What he solves and the course keeps: specialization as rows, not new hubs, which partly answers the course’s contradictions 4 and 9.
  4. His hub type tables have no source or load date; the course’s source system seed makes the same move.
  5. Open: contradictions 1, 5 and 8 say entity decisions made at load are costly when wrong. Universal hubs reduce how often a new hub is needed, but still decide at load which pattern and type a row belongs to. How the course answers that is not settled.

Dated note: an earlier reading (2026-10-24) held that the universal model should stay outside the raw vault as a separate canonical layer. Ray reopened it the same day (“what we’re exploring is universal hubs”), and the course’s position became finishing Giles’s approach.

8. Not settled by the articles

9. His books, and what to read first

Giles has three books: The Nimble Elephant (2012), on data model patterns in agile delivery; The Elephant in the Fridge (2019, 290 pages), on Data Vault built from business-centered models; and The Data Elephant in the Board Room, on an enterprise-wide conceptual model he calls the Data Town Plan [3][4]. The Elephant in the Fridge is the one that matters here: its four tasks are defining how the business sees its data, designing the Data Vault from that view, mapping sources to the vault bottom-up, and defining the business rules; it closes with summaries of controversial Data Vault topics and an appendix of patterns that can be added to a Data Vault, such as Party and Agreement [4][5].

Reading list, in order of value for this course:

# Part of The Elephant in the Fridge Why
1 Chapter 2, “Untangling ‘raw’ and ‘business’ Data Vault” The course’s contradiction 1: a raw vault that cannot be raw
2 Chapter 2, “Tool vendors, and ‘source system Data Vault’” and “Consultants, and ‘source system Data Vault’” Contradiction 10, on automation, and the course’s earlier, withdrawn use of the term
3 Task 2, designing the Data Vault from the business view His universal hubs as practiced by 2019
4 The appendix’s Party pattern Whether he finished what the articles set aside
5 Task 3, mapping sources bottom-up Contradictions 5 and 9: entity decisions at load

Read on the Kindle; highlights export from the reader’s notebook, and each finding is added here cited to chapter.

Notes for section 9

  1. Technics Publications, The Data Elephant in the Board Room: https://technicspub.com/data-elephant/, read 2026-10-24.
  2. Technics Publications, The Elephant in the Fridge, contents: https://technicspub.com/fridge/, read 2026-10-24.
  3. Steve Hoberman, The Book Look: The Elephant in the Fridge, TDAN: https://tdan.com/?p=25041, read 2026-10-24.

10. First finding from The Elephant in the Fridge

In chapter 2, “Untangling ‘raw’ and ‘business’ Data Vault,” Giles separates two questions: whether a hub, link or satellite’s structure reflects the business view or a raw source view, and whether each instance, by its record source, came from a raw source feed or from a business rule. His example is an Employee hub holding instances from payroll and HR feeds alongside contractors added by a business rule: neither a “raw” nor a “business” hub. He suggests avoiding both phrases, and noting structure and sourcing instead. For integrating satellites, he describes one source-shaped satellite per feed plus a business-centric “conformed” satellite.

For further study: the course’s appendix 1 asks whether that conformed satellite could take the UDM’s typed rows instead of columns.