Validate a status table

Enforce the columns, allowed values, required cells, and uniqueness of a Markdown table.

A status board that lets you type "sleeping" in the reactor's Status column is not a status board. It's a rumour.

Prompt for your coding agentOpen in Claude ↗

Add a mediva contract beside systems-board.md (systems-board.mdv.md) that locks its table's columns and allowed status values, then run npx mediva check systems-board.md --schema systems-board.mdv.md and fix every finding.

systems-board.mdv.md
<!-- mdv: section required -->
## Systems Board

<!-- mdv: table required columns.has=[System, Owner, Status] rows.min=1 strict rows.System.unique rows.Owner.required rows.Status.in=[nominal, degraded, offline] -->
| System | Owner | Status |
| ------ | ----- | ------ |
| Reactor | Dana | nominal |
| Life Support | Cole | nominal |
systems-board.md — every cell tells a small lie
## Systems Board

| System | Owner | Status | Notes |
| ------ | ----- | ------ | ----- |
| Reactor | Dana | sleeping | |
| Reactor |  | nominal | dup |
systems-board.md
  Shape: fix the form; this does not change what the document claims
  3  error  Column "Notes" not allowed in "Systems Board"  table-extra-columns
            help: Move the data into a declared column, or remove the column

✖ 1 problem (1 error, 0 warnings)
  mdv explain <rule-id> for details

Four lies, four findings, exit 1.

AtomChecks
requiredthe section holds a table
columns.has=[A, B]those columns, in order; extras allowed unless strict
strictno other columns
rows.min=1 / rows.max=Nrow count
rows.Owner.requiredthe cell is non-empty in every row
rows.Status.in=[a, b]the cell is one of the values
rows.Version.pattern=/^\d+\.\d+$/the cell matches a regex
rows.System.uniqueno value repeats down the column

Blank cells are skipped by in, pattern and unique; pair with required to demand a value. A column the table lacks raises table-unknown-column.

npx mediva check systems-board.md --schema systems-board.mdv.md

Or name the contract systems-board.mdv.md and let the scan find it.