Skip to content

Part 3 of 7 · Certification expiry tracker series ~5 min read

How the certification register holds history

A certification register looks like a table of who currently holds what, and if you build it that way you will have built the wrong thing. The question that eventually gets asked, sometimes by somebody with a clipboard and sometimes by a solicitor, is not who is certified today. It is who was certified on a specific day eighteen months ago.

Key takeaways

  • A renewal appends a card; it never overwrites the previous one.
  • The current state is derived from the cards, so it cannot disagree with the history.
  • A gap between an expiry and the next card is recorded as a gap, not smoothed over.
  • The photograph is kept with each card, because a date without its evidence is an assertion.
  • “Who was certified on this date” is a single query, which is the point of the shape.

Cards, not rows

How a renewed certification card is recordedA vertical chain of four steps entered by a box labelled A new card, read and matched. Step one appends the card to an append-only DynamoDB cards table, keyed on person, type and issue date. Step two asks whether it overlaps the previous card, meaning it was issued before the old one expired; if so it exits to Clean renewal, with no gap. Step three records the gap, with its dates and length. Step four recomputes the current state from the cards. A note says the gap is a fact about the past and overwriting it would delete the only record of it.AWS ACCOUNTA new cardread and matchedAppend the cardperson + type + issuedDynamoDB cardsappend-onlyOverlaps the previous?issued before it expiredClean renewalno gapyesRecord the gapdates, and how longRecompute currentfrom the cardsThe gap is a fact about the past. Overwriting it would delete the only record of it.
Fig 1. How a renewal is recorded. The gap between an expired card and its replacement is a real fact that a state-based register silently erases.
  • Database
  • App integration
  • Machine learning
  • Management
  • Analytics
  • Front-end & mobile

Why the current state is derived

The register stores cards and computes “currently valid” from them, rather than storing a status that gets updated. That means the two can never disagree, which is the usual failure of a status column: something goes wrong in one code path, the status says valid, the cards say expired, and the status is what the dashboard shows.

Recomputation is cheap here. A person holds perhaps a dozen certifications with a handful of cards each, so “what does this person currently hold” is a query over maybe forty items.

Gaps

A gap between one card expiring and the next being issued is common, usually short, and usually nobody’s fault — a course was full, a card took three weeks to arrive. It is also the single most important thing the register can tell you afterwards, and a state-based register erases it completely.

How a gap between two certification cards is recordedA horizontal row of five boxes. Card A: expires the twelfth of September. Gap: nineteen days. Card B: issued the first of October. Recorded: the gap is stored permanently. Answerable: the question was this person certified on the twentieth of September has the answer no. A note says a register that overwrote card A could not answer the last box at all.A GAP IS A FACT, NOT A GLITCHCard Aexpires 12 SepGap19 daysCard Bissued 1 OctRecordedas a gap, permanentlyAnswerable'on 20 Sep?' -- noA register that overwrote card A could not answer the last box at all.
Fig 2. What a gap looks like in the register. The last box is the whole reason for the append-only shape.
  • Security & identity
  • Management
  • Analytics

What a gap does and does not trigger

A gap that has already happened does not generate an alert, because alerting somebody about a situation that resolved three weeks ago is noise. It is recorded, it appears in the compliance view as a historical gap, and it feeds one useful statistic: how often renewals are late, which is the measure of whether the lead times in your certification list are set correctly.

A gap that is happening right now is a different matter entirely, and it is the loudest thing the system does. Part 4 covers it.

The photograph

Every card keeps its photograph, and this matters more than it looks. An expiry date in a table is an assertion by whoever typed it; an expiry date next to a photograph of the card it was read from is evidence. When somebody asks to see proof of certification — a client, an auditor, an insurer — the answer is the card, not the spreadsheet.

The card row

  • Person and type, both matched to your own lists, never free text.
  • Issued and expires, with the expiry nullable for qualifications that do not expire.
  • Number and awarding body, verbatim as printed.
  • The photographs, front and back, unmodified.
  • Who registered it and when, which is usually the holder on their phone.
  • Never deleted. A card registered in error is superseded by a correction row, and both stay.

Next: the chasing, which is where the lead times earn their keep.

All posts