Where is closure actually defined in each substrate?

In the rulebook, once — and then each substrate emits that one declaration with its native machinery: WITH RECURSIVE in Postgres, owl:TransitiveProperty in OWL, explicit traversals in Python, Go, TypeScript, and Entity Framework. A film series walks through each one.
The declaration lives in one place: the rulebook. A field like LeadsToClosure with "type": "closure" (optionally carrying an EdgeFilterColumn to close over a filtered edge set). Everything below is an emission of that one declaration:
-
Postgres — a
WITH RECURSIVEview (e.g.vw_step_transitions_closure, withhop_distance), plus_closure_where_*views for filtered-edge closures. -
OWL — an
owl:TransitiveProperty; the reasoner materializes the inferred pairs. -
Python — an explicit graph traversal over the relationship.
-
Go / TypeScript / Entity Framework — the same traversal, idiomatically, per language.
-
Excel — nothing yet, honestly. The xlsx transpiler has no closure engine, so closure-derived cells fail the conformance run (205 cells in the latest grading) instead of being quietly skipped. It needs an iterative closure sheet; until then the red cells stay visible.
Downstream fields don't care which substrate they're in: SelfReachCount, IsOnReworkLoop, and IsGateBypassedPublication consume the closure like any other field, and the harness grades them everywhere.
Each substrate's emission is getting its own episode in a film series — one declaration, every engine — tracked in the back stories below as each episode is published.
The back story
Every answer here has a story behind it — and each story is (or becomes) a film.
Closure, Substrate by Substrate — Ep. 1: Postgres and WITH RECURSIVE
film not yet publishedOne declared field becomes a recursive common table expression: how rulebook-to-postgres turns "type": "closure" into a WITH RECURSIVE view with hop distances, and what the _closure_where_* views do for filtered edge sets.
Closure, Substrate by Substrate — Ep. 2: OWL and the reasoner
film not yet publishedThe same declaration becomes an owl:TransitiveProperty, and the inferred pairs come from a reasoner that has never seen Postgres — yet the harness proves they match it, pair for pair.
Closure, Substrate by Substrate — Ep. 3: Python, Go, TypeScript, Entity Framework
film not yet publishedFour idiomatic graph traversals, generated, not hand-written — and the cyclic case: what it means for a step to reach itself, and how SelfReachCount and IsOnReworkLoop fall out of the closure for free.
Closure, Substrate by Substrate — Ep. 4: Excel, the missing engine
film not yet publishedThe honest episode: the xlsx transpiler has no closure engine yet, so 205 cells fail the conformance run in public instead of being quietly skipped. What an iterative closure sheet looks like, and why a visible red cell beats a silent omission.
