Topic · decision tables

What are decision tables, and how do I keep the cells true in CI?

Gist

A decision table maps every reachable input combination to an output. Proof treats that table as a first-class artifact in domain.tables. proof check tables specs/system requirement_state names a missing cell, a duplicate cell, or a drift cell between two linked tables. Camunda still runs DMN. A spreadsheet still lists the rows someone remembered. Jama still authors.

proof check tables specs/system requirement_state

Keep Camunda if you execute business rules at runtime. Keep Jama if you author the programme. Proof does not paper a silent cell with a default you did not write.

01 · The cell nobody wrote

Listed rows are not the cross-product.

A source document can enumerate the cases it already thought of. It cannot prove the cases it never mentioned.

The vectors-from-the-shall H1 lives on requirements based testing. The condition-independence H1 lives on MC/DC for Go. This page is the lookup surface: finite inputs, one output per cell, every cell decided or named.

Declare the table in the component .vars.yaml. Inputs are enum or bool. Completeness without a default: is one bounded Z3 query. A sat model decodes to named input=value pairs. Consistency is validation-derived: two rows on the same cell fail proof validate, and the check does not pretend that is SMT. Equivalence is one query per equivalent_to link.

proof check tables specs/system requirement_state
proof audit --check table_complete --verbose
proof var table show

On this install the 144-cell verification_state_derivation table is the tripwire for the derivation switch. A table that only transcribes the source document's listed rows will never find the silent cell.

02 · The exhibit

Same matrix. A silent cell, or a named one.

The spreadsheet still matches the rows the source already listed. The check will name the combination nobody wrote. Click the tabs.

Source document

  • status published, draft
  • action publish, customize, delete
  • listed (published, publish), (published, customize), (draft, *)
Rows the author remembered

This push

(published, delete) is reachable. The sheet never said so.

Silent cell

Source document

Still last week's listed rows. Still no delete-on-published.

Keep the sheet

Proof

  • Ask every cell in the product
  • Gate table_complete, then the audit
status=published action=delete

Same matrix. A silent cell, or a named one. Click the tabs.

Surface What they do What Proof does
Decision tables Map finite conditions to actions. Wikipedia, GeeksforGeeks, Hillel Wayne. proof check tables on domain.tables. Completeness is Z3. A missing cell is named.
Camunda / DMN Execute a decision table at runtime as a process engine Not this product. Proof does not deploy DMN, and it does not replace the engine.
IBM ODM / BAW Scheduled rule logic in an enterprise decision manager Not this product. A YAML table in git is not a rule app.
Decision table testing Black-box cases from the listed condition combinations Same cluster, shorter head. Vectors from a compiled shall live on requirements based testing as proof testgen.
Spreadsheet Rows the author remembered, no proof the product is covered The sheet stays a working artifact. The committed table is the subset a requirement references.
MC/DC Independence of boolean conditions in a decision That H1 lives on MC/DC for Go. A complete table is not MC/DC.
Jama / DOORS Author and store the programme Jama still authors. Proof holds the table to the graph and fails the merge when a cell is silent or drifting.

The teaching table in the public check docs is a lifecycle matrix: status × action → allowed. Completeness without a default is total. Do not add default: false to hide (published, delete). That converts a finding into an invented decision.

domain:
  tables:
    - name: theme_lifecycle
      inputs:
        - {name: status, type: enum, values: [published, draft]}
        - {name: action, type: enum, values: [publish, customize, delete]}
      output: {name: allowed, type: bool}
      rows:
        - {status: draft, action: publish, allowed: true}
        - {status: draft, action: customize, allowed: true}
        - {status: draft, action: delete, allowed: true}
        - {status: published, action: publish, allowed: true}
        - {status: published, action: customize, allowed: true}
proof check tables specs/system requirement_state
proof audit --check table_complete --verbose
proof var table show

Five listed rows. Six cells in the product. The sixth is the finding. Equivalence is a different ask: two documents, one permission matrix, equivalent_to, a drift cell with both outputs. We have not run this against a frozen Camunda / IBM ODM corpus, and we have not claimed the check executes DMN. The loss is named, not scored.

03 · The honest loss

A green table run is not a decision engine.

Proof proves cells on a declared table. It does not fire those cells in production. Jama still authors. Camunda still executes.

Consistency is validation-derived. Two concrete enum/bool rows on the same cell fail proof validate. No SMT query runs for that verdict, and none is pretended. Int-range row conditions are deferred. Cell spaces larger than 65536 must be partitioned. FRETish cannot compare an enum to a value literal; the requirement references the table's output boolean. A table no requirement consumes is an orphan. Object-code coverage on C still wants the qualified toolchain. That H1 lives on MC/DC for Go and on Proof vs LDRA.

The vectors-from-the-shall H1 stays on requirements based testing. Jama still authors.

04 · Nearby questions

What people type next.

What is decision table testing? Same cluster, shorter head. Same command. Not a twin. ISTQB cases from listed combinations are not completeness of the product.

What is requirements based testing? Vectors from the compiled shall, one program. requirements based testing.

How do I measure MC/DC coverage for my Go code? Independence of conditions, not cells in a lookup. MC/DC for Go.

How do I write machine-checkable requirements? FRETish compiles the shall. The table is the enum lookup FRETish cannot write as status = published. FRETish.

How do I know every requirement is actually covered by code and a test? Traceability is a different H1. every requirement covered.

Is Proof a Camunda alternative? No. Camunda executes DMN. Proof names a silent cell in git.