# Capability matrix This page puts the twenty directions of the comparison program side by side, one property per column. Each cell records what the research reports established by reading documentation, standards, papers, and pinned sources as of September 2026, on the version named on the system's own page. No cell is an execution result: nothing was installed, built, or run to fill this matrix, and a "Supported" cell means the property is documented, not that it was observed in a run. Only confirmed cells are published. Where the sources studied say nothing, the cell is left marked as open. The matrix gives no ranking and has no total column. A row is a starting point; the system's page carries the nuance, the scenario, and the evidence passport. ## Legend - **Supported** — the documentation or sources show the property as a built-in form of the language, engine, or standard. - **Needs wrapping** — the property is reachable only through extra author code, external tooling, or with a stated caveat. - **Out of scope** — the property lies outside what the system is for, or outside the comparison as designed. - **—** — not established by the sources studied; open, not impossible. A short qualifier after a label repeats the reason recorded in the source, in plain words. "Not executed here" means the feature is documented but was not run in this program. Rows follow the groups of the [section index](/comparisons/): computing amounts, drawing conclusions, authorization and business rules, contracts, exchange formats, and interviews and language models. The Arxo row comes last. Its reasoning cells come from Arxo's side of the same comparison contracts in the same reports; its engineering cells come from this documentation ([editor](/guide/editor/), [from code](/guide/from-code/), [MCP](/guide/mcp/)). The same rule applies: documented, not executed. ## Reasoning properties The first table covers how a system treats facts, conflicts, time, and normative positions. | System | Missing fact | Explicit denial | Conflicting norms | Time and editions | Deontic positions | |---|---|---|---|---|---| | [Catala](/comparisons/catala/) | Supported: absent or present optional values | Needs wrapping: false is an ordinary value | Supported: conflict error; detection, not status | Needs wrapping: dates yes; working days, editions by hand | Out of scope | | [OpenFisca](/comparisons/openfisca/) | Supported: unset input falls back to default | — | — | Supported: periods, dated formulas and parameters | Out of scope | | [M / Mlang](/comparisons/mlang/) | Supported: undeclared variable reads as undefined | — | Supported: last assignment wins | Out of scope: each edition is a yearly release | Out of scope | | [PolicyEngine](/comparisons/policyengine/) | — | — | — | Needs wrapping: dated values; text in force not modelled | Out of scope | | [RegelRecht](/comparisons/regelrecht/) | Needs wrapping: null handling present; semantics not established | — | — | Needs wrapping: date addition and validity dates | — | | [Logical English](/comparisons/logical-english/) | Supported: unknowns and assumable facts | Supported: negation as failure to prove | — | Needs wrapping: dates yes; working days, editions not | Needs wrapping: library pattern, not language form | | [PROLEG](/comparisons/proleg/) | Supported: unproven fact counts against its burden side | Supported: failure negation plus explicit negation form | Needs wrapping: nested exceptions; no automatic priorities | — | — | | [Blawx](/comparisons/blawx/) | Supported: default negation with constructive proof | Supported: classical strong negation | Supported: section defeat with a guard | Needs wrapping: dates yes; calendar semantics approximate | Out of scope | | [L4](/comparisons/l4/) | Supported: optional values | Supported: classical negation; unless as and-not | Needs wrapping: rule plus exception written by hand | Needs wrapping: dates yes; working days, editions not | Supported: must, may, must-not; fulfilment and breach | | [OPA / Rego](/comparisons/opa/) | Supported: missing key is undefined; defaults | Supported: negation as failure with safety | Supported: evaluation error on two values | Needs wrapping: time functions; "as of" through input | Needs wrapping: allow and deny are ordinary rules | | [Cedar](/comparisons/cedar/) | Supported: missing attribute errors; has-guard | — | Out of scope: forbid always wins | Out of scope | Needs wrapping: permit and forbid, no position lifecycle | | [DMN](/comparisons/dmn/) | Needs wrapping: null input underspecified by the standard | — | Supported: named hit policies | Needs wrapping: date and duration functions | — | | [Drools / DRL](/comparisons/drools/) | Supported: not and exists patterns | — | Supported: salience, agenda and activation groups | Out of scope: event processing excluded from comparison | — | | [Accord / Cicero](/comparisons/accord/) | Needs wrapping: optional field ignored by logic | — | Out of scope: one clause, one procedure | Needs wrapping: deadlines read the wall clock | Needs wrapping: answer plus events, no position lifecycle | | [Symboleo](/comparisons/symboleo/) | — | — | — | Needs wrapping: date addition, event predicates | Supported: obligations, powers, fulfilment, violation | | [Stipula](/comparisons/stipula/) | — | — | — | — | Supported: powers as states, calls bound to state | | [LegalRuleML](/comparisons/legalruleml/) | Needs wrapping: negation forms mapped before a run | Needs wrapping: negation forms mapped before a run | Supported: rule strengths and superiority, model level | Needs wrapping: temporal axes mapped before a run | Needs wrapping: modalities present; reparations checked before a run | | [Akoma Ntoso](/comparisons/akoma-ntoso/) | Out of scope: markup, not a rule language | Out of scope: markup, not a rule language | Out of scope: markup, not a rule language | Supported: lifecycle, temporal groups, point in time | Out of scope | | [docassemble](/comparisons/docassemble/) | Needs wrapping: question asked again; no undecided outcome | — | Out of scope | Needs wrapping: deadlines are author code | Needs wrapping: legal logic is author Python | | [LLM / RAG](/comparisons/llm-rag/) | — | — | — | Needs wrapping: snapshot fixed by date and fingerprint | — | | Arxo | Supported: "not established", names the missing premise | Supported: explicit negation, separate from absence | Supported: dual status; declared priorities | Supported: edition snapshot and as-of policy | Supported: duty and power; satisfied and violated | The second table covers open-textured terms, explanations, arithmetic, and the link back to the source text. | System | Evaluative terms | Explanation of yes and no | Numbers and rounding | Source provenance | |---|---|---|---|---| | [Catala](/comparisons/catala/) | — | Needs wrapping: trace; explanation tool early-stage | Supported: exact decimal, money to the cent | Out of scope | | [OpenFisca](/comparisons/openfisca/) | — | Supported: tracers and computation log | Supported: half-to-even rounding | — | | [M / Mlang](/comparisons/mlang/) | Out of scope | — | Supported: binary floating point; precision modes | Out of scope | | [PolicyEngine](/comparisons/policyengine/) | — | Needs wrapping: computation tree trace, not executed here | Needs wrapping: single-precision floats; tolerance in contract | Needs wrapping: parameters link to law; no derivation link | | [RegelRecht](/comparisons/regelrecht/) | — | Needs wrapping: explanation trail declared, not executed here | Needs wrapping: number types; rounding and units not established | Supported: article anchors to the official publication | | [Logical English](/comparisons/logical-english/) | Supported: judged and open-textured terms, second edition | Supported: proof tree in the rules' words | Needs wrapping: arithmetic yes; units, rounding not established | Supported: provenance badge with a quote check | | [PROLEG](/comparisons/proleg/) | — | Supported: dispute-shaped trace | — | — | | [Blawx](/comparisons/blawx/) | — | Supported: justification trees | Needs wrapping: numbers and dates present | Out of scope: no provenance to official text | | [L4](/comparisons/l4/) | — | Needs wrapping: trace to graph, not executed here | Needs wrapping: numbers yes; units, rounding not established | — | | [OPA / Rego](/comparisons/opa/) | — | Supported: explain modes and tracing | Needs wrapping: JSON numbers, no money arithmetic | — | | [Cedar](/comparisons/cedar/) | Needs wrapping: attribute declared, read by no policy | Supported: deciding policies and errors in the answer | — | — | | [DMN](/comparisons/dmn/) | — | Supported: audit trail of matched and selected rules | Supported: 128-bit decimal | — | | [Drools / DRL](/comparisons/drools/) | — | Needs wrapping: listeners and loggers, no certificate | — | — | | [Accord / Cicero](/comparisons/accord/) | — | Needs wrapping: answer plus event, no proof graph | Needs wrapping: binary float amounts | Needs wrapping: text-to-data grammar; no hash link | | [Symboleo](/comparisons/symboleo/) | — | Supported: model checker counterexamples, conformance checker | — | — | | [Stipula](/comparisons/stipula/) | — | Needs wrapping: observable trace, not a proof graph | — | — | | [LegalRuleML](/comparisons/legalruleml/) | — | Out of scope: the format defines no proofs | Out of scope: the format defines no arithmetic | Supported: authority, sources, references to articles | | [Akoma Ntoso](/comparisons/akoma-ntoso/) | Out of scope | Out of scope | Out of scope | Supported: work-expression-manifestation levels, element addressing | | [docassemble](/comparisons/docassemble/) | Needs wrapping: question to a person, author branching | Needs wrapping: no built-in trace; screens and document | Needs wrapping: author types; no units or rounding | Needs wrapping: document assembly; no link to article | | [LLM / RAG](/comparisons/llm-rag/) | — | — | — | Needs wrapping: retrieval gives source wording; invented quotes possible | | Arxo | Supported: requires-judgment request to a named body | Supported: proof graph and why-not | Supported: exact arithmetic; refuses inexact division | Supported: source anchors and content hashes | One reasoning property is not shown: edits and affected cases. Every direction has a prepared bank of edit cases, so that column describes the comparison protocol rather than the systems, and it would read the same in every row. ## Engineering The first table covers how rules are tested, checked, given a semantics, and debugged. | System | Tests | Static analysis | Formal semantics | Editor and debugging | |---|---|---|---|---| | [Catala](/comparisons/catala/) | Supported: scope tests, assertions, cram tests | Supported: opt-in solver-backed proof plugin | Supported: core translation mechanized; backends not covered | Needs wrapping: trace; editor not established | | [OpenFisca](/comparisons/openfisca/) | Supported: YAML tests with a 1% margin | — | — | Supported: tracers and computation log | | [M / Mlang](/comparisons/mlang/) | Supported: fixed-format tests, cram tests, CI | — | Supported: Coq semantics; numbers formalized too | — | | [PolicyEngine](/comparisons/policyengine/) | Supported: YAML tests with absolute margins | Needs wrapping: releases checked against an external calculator | — | Needs wrapping: computation tree trace, not executed here | | [RegelRecht](/comparisons/regelrecht/) | Supported: behavior scenarios beside the law | — | — | Needs wrapping: explanation trail declared, not executed here | | [Logical English](/comparisons/logical-english/) | Supported: scenario expectations, run on every load | Supported: integrity constraints | Needs wrapping: runs on Prolog; mechanization not established | Supported: VS Code extensions, SWISH | | [PROLEG](/comparisons/proleg/) | — | Needs wrapping: nested exceptions; no priority inference | — | Needs wrapping: dispute trace, not executed here | | [Blawx](/comparisons/blawx/) | Supported: tests inside the blocks | Needs wrapping: defeat guards; completeness not established | Supported: answer-set semantics of s(CASP) | Supported: block editor, scenario explorer | | [L4](/comparisons/l4/) | Supported: in-file asserts; failed assert exits zero | Needs wrapping: exceptions by hand; no priority inference | — | Needs wrapping: trace to graph, not executed here | | [OPA / Rego](/comparisons/opa/) | Supported: test files with input overrides | Supported: strict check, linter, formatter | — | Supported: linter, debugger, language server | | [Cedar](/comparisons/cedar/) | — | Supported: schema validation, symbolic policy analysis | Supported: Lean proofs of engine properties | Needs wrapping: CLI with exit codes; editor not established | | [DMN](/comparisons/dmn/) | Supported: community conformance suite | Supported: named hit policies | — | Supported: KIE DMN Editor, Camunda Modeler | | [Drools / DRL](/comparisons/drools/) | — | Needs wrapping: ordering controls; completeness not established | — | Needs wrapping: listeners and debug loggers | | [Accord / Cicero](/comparisons/accord/) | Supported: per-template unit tests | — | Needs wrapping: Coq-built compiler toward a formal specification | Needs wrapping: Template Playground; no proof graph | | [Symboleo](/comparisons/symboleo/) | Needs wrapping: samples and checker traces; test language not established | Supported: model checker, conformance checker | Needs wrapping: paper semantics versus code generator | Supported: Xtext IDE, web editor, headless CLI | | [Stipula](/comparisons/stipula/) | Needs wrapping: example files; test runner not established | Supported: liquidity analyzer, bisimulation | Needs wrapping: bisimulation stated, formal text not read | Needs wrapping: Java interpreter, not executed here | | [LegalRuleML](/comparisons/legalruleml/) | Needs wrapping: no own tests; schema and mapping table | Supported: rule strengths and superiority, model level | — | — | | [Akoma Ntoso](/comparisons/akoma-ntoso/) | — | Supported: schema validation, identifier and date checks | Needs wrapping: standard and schema; markup, not inference | — | | [docassemble](/comparisons/docassemble/) | Needs wrapping: external tool, 15 to 30 minutes per run | Out of scope: logic is author Python | Out of scope: platform, not an inference language | Supported: Playground | | [LLM / RAG](/comparisons/llm-rag/) | Out of scope: no test language | Out of scope: answers, not an inference language | Out of scope: answers, not an inference semantics | Out of scope: no rule editor or debugger | | Arxo | Supported: scenario files plus a static check | Supported: static check before execution | Supported: core semantics mechanized in Lean 4 | Supported: VS Code and Cursor extension, language server | The second table covers embedding, versions, and license. | System | Embedding | Versions and reproducibility | License | |---|---|---|---| | [Catala](/comparisons/catala/) | Supported: compiles to C, Python, OCaml, Java | Supported: pinned release 1.2.1 | Supported: Apache-2.0 | | [OpenFisca](/comparisons/openfisca/) | Supported: pip install, web API extra | Supported: France package 176.0.9, core 44.7.1 | Supported: AGPL-3.0 | | [M / Mlang](/comparisons/mlang/) | Supported: interpreter, C and Python backends | Supported: tagged releases | Supported: GPL-3.0-or-later; tax sources' license undetermined | | [PolicyEngine](/comparisons/policyengine/) | Supported: pip and HuggingFace distribution | Supported: core 3.32.11, pinned commits | Supported: AGPL-3.0 | | [RegelRecht](/comparisons/regelrecht/) | Needs wrapping: harvester present; API not established | Supported: schema v0.7.1, head of 30 September 2026 | Supported: EUPL-1.2; corpus license unstated | | [Logical English](/comparisons/logical-english/) | Supported: SWISH, JavaScript API, Docker | Supported: both editions pinned by commit | Supported: Apache-2.0; second edition by README only | | [PROLEG](/comparisons/proleg/) | — | — | Needs wrapping: no declared engine license | | [Blawx](/comparisons/blawx/) | Supported: REST API, s(CASP) export | Needs wrapping: editor pinned; engine image floats | Supported: MIT; s(CASP) Apache-2.0 | | [L4](/comparisons/l4/) | Supported: REST and MCP service export, declared | Needs wrapping: model pinned; engine built from source | Supported: engine Apache-2.0, model MIT | | [OPA / Rego](/comparisons/opa/) | Supported: server APIs, bundles, WASM, Go module | Supported: v1.21.0 | Supported: Apache-2.0 | | [Cedar](/comparisons/cedar/) | Supported: Rust SDK; WASM not established | Supported: language 4.5, SDK 4.13.0 | Supported: Apache-2.0 | | [DMN](/comparisons/dmn/) | Supported: Java and Scala libraries, platform REST | Supported: dmn-scala 1.12.3, KIE 10.0.0 | Supported: Apache-2.0 | | [Drools / DRL](/comparisons/drools/) | Supported: Java library via Maven Central | Supported: 8.44.2.Final | Supported: Apache-2.0 | | [Accord / Cicero](/comparisons/accord/) | Supported: model compiler, server wrapper, npm packages | Supported: tag v0.4.0 | Supported: Apache-2.0 | | [Symboleo](/comparisons/symboleo/) | Needs wrapping: JavaScript generation; API not established | Supported: pinned commits, CLI v1.0.1 | Supported: MIT | | [Stipula](/comparisons/stipula/) | Needs wrapping: npm install; API not established | Supported: editions, grammars, analyzers pinned | Needs wrapping: analyzers GPL-3.0; no root license | | [LegalRuleML](/comparisons/legalruleml/) | Needs wrapping: XSLT between serializations; runtime not established | Supported: OASIS Standard 1.0, August 2021 | Needs wrapping: OASIS standard; license text not read | | [Akoma Ntoso](/comparisons/akoma-ntoso/) | Needs wrapping: Bluebell and Indigo tooling; API not established | Supported: version 1.0 (2018), schema 3.0 | Supported: OASIS standard; schema CC-BY 4.0 | | [docassemble](/comparisons/docassemble/) | Supported: Docker image, PyPI, partial REST API | Supported: 1.10.12, pinned tag | Supported: MIT | | [LLM / RAG](/comparisons/llm-rag/) | Needs wrapping: engine reached through tools | Needs wrapping: snapshot by date and fingerprint | — | | Arxo | Supported: TypeScript client, MCP server, WebAssembly build | Supported: versioned packages, hashed pinned inputs | Supported: Apache-2.0 | ## Machine author These columns ask how a representation treats a model that writes rules and a person who accepts them: whether diagnostics are usable by a model, whether code is tied to the source text, and what can be accepted without running anything. | System | Diagnostics for a model | Link between code and source text | Checkable without execution | |---|---|---|---| | [Catala](/comparisons/catala/) | Supported: assertions and cram tests in the standard check | Out of scope: provenance not kept | Needs wrapping: static only with the opt-in proof plugin | | [OpenFisca](/comparisons/openfisca/) | Supported: tests with a margin, computation log | — | Needs wrapping: no machine check against the text | | [M / Mlang](/comparisons/mlang/) | Supported: build, source parse, test self-check | Out of scope | Needs wrapping: checked by running; private suite unavailable | | [PolicyEngine](/comparisons/policyengine/) | Supported: YAML tolerance of one cent | Needs wrapping: parameter links; no derivation to fragment | Supported: dated values plus trace | | [RegelRecht](/comparisons/regelrecht/) | Needs wrapping: schema pin, evaluation, text drift control | Supported: article anchors; harvester of official XML | Supported: schema plus date and null conformance | | [Logical English](/comparisons/logical-english/) | Supported: scenario expectations run on load | Supported: provenance badge with a quote check | Supported: scenarios, constraints, explanations in rule words | | [PROLEG](/comparisons/proleg/) | Needs wrapping: message trace, not executed here | — | Needs wrapping: burden read from markup, not checked | | [Blawx](/comparisons/blawx/) | Supported: justification trees, human-readable output | Out of scope: no provenance to official text | Supported: justifications and constraints as objects | | [L4](/comparisons/l4/) | Needs wrapping: failed assert still exits zero | — | Needs wrapping: evaluations explore, do not assert | | [OPA / Rego](/comparisons/opa/) | Supported: strict check and verbose tests | — | Supported: strict check and tests before execution | | [Cedar](/comparisons/cedar/) | Supported: validate and authorize with exit codes | — | Supported: strict validation, symbolic analysis | | [DMN](/comparisons/dmn/) | Needs wrapping: conformance suite and engine incidents | — | Supported: hit policies plus audit trail | | [Drools / DRL](/comparisons/drools/) | Needs wrapping: listeners and loggers; no certificate | — | Needs wrapping: runtime observation only | | [Accord / Cicero](/comparisons/accord/) | Supported: template tests as the standard check | Needs wrapping: text-to-data grammar; no hash link | Needs wrapping: tests and compile; no proof graph | | [Symboleo](/comparisons/symboleo/) | Supported: headless CLI with JSON diagnostics | — | Supported: model checking over all paths | | [Stipula](/comparisons/stipula/) | Supported: syntax errors with exit code; liquidity feedback | — | Supported: liquidity and timeout events observable | | [LegalRuleML](/comparisons/legalruleml/) | Needs wrapping: schema validation; no own tests | Supported: authority, sources, references to articles | Supported: schema, mapping table, constant checks | | [Akoma Ntoso](/comparisons/akoma-ntoso/) | Supported: schema validation, identifier and date checks | Supported: work-expression-manifestation levels, element addressing | Supported: schema plus lifecycle structure | | [docassemble](/comparisons/docassemble/) | Needs wrapping: no built-in trace | Needs wrapping: document assembly; no link to article | Needs wrapping: platform and author pattern not separated | | [LLM / RAG](/comparisons/llm-rag/) | Out of scope: free-text justification cannot be checked | Needs wrapping: retrieval gives wording; invented quotes possible | Out of scope: no checkable representation | | Arxo | Supported: proof graph and why-not | Supported: source anchors checked byte for byte | Supported: static check without execution | Two machine-author properties are not shown: the review volume per norm and documentation that fits a fixed context budget. The sources do not measure the first for any system, and for the second they record the budget the program sets rather than a property of the systems. ## How to read a gap A dash is not a "no". It means the documentation and sources studied for that version did not settle the question, and the question stays open until a source or a run does. Three more rules keep the matrix honest: - **Not found is not impossible.** A property missing from the documentation is never read as a property the system cannot have. - **Labels describe the studied profile.** A cell belongs to the version and, where noted, the studied model; a later release or a different model may move it. - **Language, engine, model, and tooling stay apart.** "Needs wrapping" often means the language allows the property but the engine, the studied model, or the toolchain does not provide it directly. The system's page says which. A cell changes the same way a page grows: a new source or an executed run settles the question, and the page records the date and the version. The [methodology](/comparisons/methodology/) page explains the contracts, outcome classes, and openness rules behind every cell.