Interesting approach using Postgres as the storage layer. Curious how you're handling the object model since Git's content-addressable storage maps pretty differently to relational tables. Are you storing blobs as bytea or going with something like a JSONB tree structure for the commit graph?
The division example is a perfect illustration of why this matters — [-∞, +∞] as an answer is technically correct but operationally useless. The union representation actually preserves information that standard interval arithmetic throws away.
Curious about the composition behavior: if you chain multiple operations that each produce disjoint unions, does the number of intervals in the result grow exponentially in the worst case? And how does the implementation handle that — is there a merging/simplification step, or do you let it grow?
The tan() implementation must have been painful given the infinite number of discontinuities.
The table syntax extension in the top comment is interesting — it solves the readability problem without breaking unrendered markdown. The ::y1 approach degrades gracefully.
One thing I keep running into with these markdown supersets: the rendering gap. You write locally, push somewhere, and suddenly the :::columns block is just raw text. Marp handles this well because the VSCode plugin closes that loop immediately.
Curious how MDV handles the renderer portability problem — is the spec open enough that editors could pick it up, or does it depend on the MDV CLI being in the chain?