The Stalwart UNSAT certificate, format version 1

Normative. © Stalwart Technologies Ltd, published under the Creative Commons Attribution 4.0 International licence (CC BY 4.0): you may copy, quote and adapt it, in a filing or anywhere else, with attribution.

Worked examples of both kinds of certificate, with the files to check them against, are at /certificates/ beside this specification.

1. Conventions

The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY and OPTIONAL are to be interpreted as described in RFC 2119. This specification is normative in English.

A certificate is a JSON object that records why a system of polynomial equations over GF(2) -- the compilation of a policy together with the question asked of it -- has no solution. A checker is any program that reads a certificate and decides what it establishes. A reader is the person who acts on what a checker reports.

A certificate is found either as a document of its own or as the value of the certificate member of a larger report. A checker MUST accept both: where the top-level object has no operations member and has a certificate member that is an object, that object is the certificate.

2. What a checker may conclude

A certificate establishes that a derivation or a refutation is valid: that its premises -- the equations section 5 names -- have no common solution. It does not establish that those equations are the policy. Closing that second step needs the policy compiled again and compared, which is more than a certificate carries. A checker's report MUST NOT say, and a reader MUST NOT conclude from it, that a policy is safe.

3. Versioning

format_version is the first member of every certificate this specification describes, and its value is 1. A document without the member is version 1. A checker MUST refuse a document whose version it does not know rather than read it: a misread document checks to a confident wrong answer rather than to an error.

Adding a member is a compatible change, and the version does not move: a checker MUST ignore members it does not know. Removing a member, retyping one, or changing what one means is a breaking change, and it increases format_version.

4. The two kinds of certificate

certificate_type is the second member of every certificate, and it names which of two kinds the document is. The solver decides a system in phases, and the kind is the phase that refuted it.

A checker MUST read certificate_type before anything else it checks, and MUST treat a document as failed where it is neither value, or where it is phase0 and final_step is not Phase 0's asserted row, or the reverse.

5. The equation grammar, and the premises

Every equation in a certificate is a string in this grammar:

equation := terms " = " ("0" | "1")
terms    := "0" | term (" + " term)*
term     := "1" | variable ("*" variable)*
variable := "x" digits         ; no leading zero unless the variable is x0

Each term is a monomial: the product of the variables it names, over GF(2). A repeated factor is the same monomial (x1*x1 is x1), and a monomial appearing twice cancels (x1 + x1 is 0). The term 1 is the constant and moves to the right-hand side, flipping it. 0 = 1 is the contradiction; 0 = 0 holds of every assignment. Anything outside the grammar is failed. Where a field holds a single monomial rather than an equation -- the refutation record's normal set and border monomials -- it is spelled as one term.

A variable xN is the system's variable with index N. variables names them for a reader, and named_equation and reads_as render equations for a reader; a checker MUST NOT need any of them, and MUST check against equation alone.

The premises are the system's own equations: the leaves whose source is original-S1 or original-S2. They are the compiled policy, the question's pins, the patch and any padding, and the citations beside a leaf (colang, pin, origin) say which. Every other leaf MUST carry oracle: true or internal_assertion: true: it was asserted rather than derived, by the procedure its source names. A leaf from any other source that carries neither flag is a statement the document chose to make, and a checker MUST treat the document as failed -- a derivation from it would refute the system together with that statement, not the system alone.

6. The operations

operations is the derivation, as a list of rows. Each row has an id that no other row in the document has, and an op:

  1. INSERT adds a leaf. Its equation is the leaf. An INSERT without an equation MUST carry oracle: true or internal_assertion: true.
  2. ADD sums the two rows its parents name: the symmetric difference of their monomials, and the exclusive or of their right-hand sides.
  3. MULTIPLY multiplies the row base_id names by the variable multiplier: each monomial gains the variable (unchanged where it already has it), equal monomials then cancel in pairs, and a right-hand side of 1 becomes the monomial of that variable alone, with the right-hand side then 0.

The rows are in depth-first post-order: every row a row names appears before it. A row naming a row that does not appear earlier makes the document malformed. Every row is a consequence of the leaves it descends from, so a row descending only from premises holds wherever the premises do.

7. The withheld final step

The row that produces 0 = 1 is not in operations. It is final_step, and the reader performs it. That places two obligations on a checker:

  1. Executing operations MUST NOT produce 0 = 1 at any row. A document whose operations already reach the contradiction did not withhold the step, and is malformed.
  2. Under derived, applying final_step to the rows operations produced MUST produce 0 = 1: the empty set of monomials with right-hand side 1. For ADD, inputs names exactly two rows; for MULTIPLY, exactly one row and a multiplier. A derived document with no final_step is failed.

A final_step whose op is INSERT is a contradiction asserted directly, by the procedure its source names: Phase 0's (phase0), an external procedure's (external_oracle), or this tool's own conclusion from an exhausted candidate set (exhaustion, carrying internal_assertion: true), which the refutation record proves.

8. The honesty fields

Four members say what kind of claim a certificate makes, and what a reader may not conclude from it.

9. The provenance blocks

provenance, control_integrity and detection are present on every certificate. They say what the refutation's leaves rest on: the systems of record that assert each cited control, whether a requester's wording can reach a control through a classifier, and how often a misclassification could let the action through. They are keyed on variable indices (x12), never on names, because one identifier can name two kinds -- and because renumbering the rows' ids, which canonicalisation does, leaves variable indices intact. They take no part in checking; their fields are in section 14.

10. Checking a certificate

A checker MUST take these steps, in order, and report one of three outcomes: verified, not_self_contained or failed. failed names its reason. The step that decides ends the check.

  1. Read the document as JSON, and take the certificate from it (section 1). A document that is not JSON, or holds no object, is failed.
  2. Read format_version (section 3). A version other than 1 is failed.
  3. Check the format invariants. Each violation is failed: certificate_type agrees with final_step (section 4); status agrees with origin_class (section 8); every INSERT without an equation is flagged as asserted (section 6); a derived document carries no asserted row (section 8); and proof_log, phase0_system and origin_class: external_proof occur together or not at all.
  4. Read origin_class and go to the step it names: derived to step 5, exhaustion to step 6, external_oracle to step 7, external_proof to step 8. Any other value is failed.
  5. Replay. Execute operations in order (section 6), holding each row by its id. A malformed row, a reused id, a row naming a row not yet defined, an equation outside the grammar, a leaf that is neither a premise nor flagged (section 5), or a row that is 0 = 1 is failed. Then apply final_step (section 7); a result other than 0 = 1 is failed. Otherwise the outcome is verified.
  6. The refutation record. Execute operations as in step 5. final_step MUST be an INSERT carrying internal_assertion: true. Check refutation as section 12 sets out; a record that does not check is failed, and one that does is verified.
  7. An external oracle. Nothing in the document checks the asserted rows. The outcome is not_self_contained, naming every entry of oracle_dependencies.
  8. A proof log. Read the CNF file proof_log.cnf_file names. A missing file, a digest that is not 64 lowercase hexadecimal digits, or a file whose SHA-256 is not proof_log.cnf_sha256 is failed. Decode it (section 13) and compare it with phase0_system; any discrepancy is failed. Otherwise the outcome is not_self_contained, naming the command that checks the refutation of the CNF -- frat-rs elab <frat_file> <cnf_file> -- which the checker does not run.

A certificate issued before phase0_system was written carries proof_log without it, and fails step 3: nothing in a document says when it was issued, so a missing field cannot be told from a removed one. A checker MAY read such a document when its reader asks for it explicitly, skipping that invariant and the decode of step 8. The CNF is then tied to the document by proof_log.cnf_sha256 alone, and the outcome MUST say that nothing ties it to the equations.

A checker's report MUST state that it establishes a derivation or a refutation, not that the policy is safe (section 2).

11. Why an exhaustion refutes the system

Write I for the ideal the premises generate, in the ring of Boolean polynomials in x0 .. x(n-1) (each variable squares to itself), and V(I) for its points: the assignments satisfying every premise. The system is unsatisfiable exactly when V(I) is empty.

Phase 3 does not always reach 0 = 1 as a row. It may instead close the quotient: it finds a set N of monomials, the normal set, and for every border monomial -- a product x_i * t of a variable and a member of N that is not itself in N -- a relation of I reducing it to members of N. Write J for the ideal those relations generate. Every relation is derived from the premises, so J is contained in I and V(I) is contained in V(J).

N bounds V(J). Let S be span(N) + J. N holds 1, so S holds 1. For every member t of N and every variable x_i, x_i * t is in N or is a border monomial, which J reduces into span(N); so x_i * S is contained in S. A subspace holding 1 and closed under every variable is the whole ring, so the quotient by J is spanned by N, and its dimension is at most |N|. The quotient of the Boolean ring by J is the ring of functions on V(J), whose dimension is |V(J)|; so |V(J)| <= |N|.

The points are all of V(J). The record lists |N| distinct assignments, each satisfying every border relation, so each is a point of V(J). There are |N| of them and V(J) has at most |N| points, so they are all of V(J).

None of them is a solution. Each point falsifies a premise, so none is in V(I). V(I) is contained in V(J) and meets none of its points, so V(I) is empty.

The certificate carries every part of that argument: the border relations as rows of operations, derived from the premises; N; and the points, each citing the premise it falsifies. Nothing in it is taken on the run's word. Phase 2's rank shortcut -- the expansion leaving exactly one candidate -- is the case N = {1}: its border monomials are the n variables, and its relations fix each to the candidate's value.

12. The refutation record

A checker checks refutation in these steps; any one that does not hold is failed.

  1. variable_count is a whole number n, and no row of operations names a variable at or above it. candidates is a whole number of at least 1. unsubstantiated is absent or 0, and closure_gap is absent.
  2. Every member of normal_set parses as a term (section 5) over variables below n, no member appears twice, and 1 is a member. Call the set N.
  3. Each entry of border_relations names a monomial that parses as a term, is not in N and is named by no other entry, and an operation that is a row of operations. That row's monomials MUST be the entry's monomial and members of N, and nothing else; its right-hand side is free, since 1 is in N.
  4. For every member t of N and every variable x_i with i below n that t does not contain, x_i * t is in N or is the monomial of a border relation.
  5. points lists exactly candidates entries, and candidates is |N|.
  6. Each point's assignment is a string of exactly n characters, each 0 or 1, the i-th the value of x(i-1). No two points are equal.
  7. Each point satisfies every border relation: the exclusive or of the relation's monomials whose variables are all 1 equals its right-hand side.
  8. Each point's falsifies.operation is the id of a premise leaf (section 5), and the point does not satisfy that leaf's equation.

A record that passes all eight proves the premises have no common solution (section 11), and the outcome is verified.

13. The proof log and the CNF decode

Where Phase 0's SAT solver refuted the system and a proof was logged, proof_log names two files: the CNF the solver refuted, in DIMACS form, and the FRAT log of the refutation, which frat-rs elaborates to LRAT and checks. Their digests are 64 lowercase hexadecimal digits. The certificate's phase0_system lists the equations Phase 0 was handed, in order. Checking the refutation of the CNF is frat-rs's; tying the CNF to phase0_system is this decode's.

Phase 0 is handed equations of degree at most 2, and the encoding below names a product of two variables and no more. An equation of phase0_system with a monomial of degree 3 or more is a discrepancy.

The CNF file is DIMACS: comment lines beginning c, one p cnf <variables> <clauses> header, then the clauses, each a list of non-zero literals ended by 0. Variable v in the file is the system's variable x(v-1). A comment line c original_variables <n> gives the number of the system's own variables; every file variable above n is an auxiliary or a connector. A file without that comment, or whose clause count is not the header's, is failed.

Decode the clauses in order, as blocks:

  1. A definition is three consecutive clauses (-x -y z), (x -z), (y -z), in that order, with z an auxiliary: z stands for the product of x and y. The two MUST be distinct system variables, and an auxiliary MUST NOT be defined as two different products.
  2. A parity block over k variables (1 to 3), named in the same order in every clause, is the 2^(k-1) clauses that each forbid one assignment of the wrong parity: a clause negating exactly the variables set to 1 in the assignment it forbids. All its clauses negate an odd number of variables, or all an even number; the block asserts that the variables' exclusive or is 1 where the number is even, and 0 where it is odd.
  3. An equation is a single parity block over one or two variables, or a chain: blocks over three variables (a, b, c1), (c1, d, c2), ..., (c_(m-1), y, c_m) of parity 0, closed by a block over two variables (c_m, z) of any parity. Each c is a connector, and the chain asserts that the exclusive or of a, b, d, ..., y, z is the closing block's parity.
  4. The empty clause is the equation 0 = 1.

Anything that is none of these, a chain left open at the end of the file, a connector that is a system variable or is defined as a product or appears in more than the two blocks it joins, and a connector that is also a term of an equation, are discrepancies.

Then compare: drop every 0 = 0 from phase0_system. The decoded equations and what remains MUST be equal in number. Replace each auxiliary in the i-th decoded equation by the product it stands for; it MUST name no monomial twice, and it MUST have the same right-hand side as the i-th remaining equation and the same set of monomials, that equation's monomials taken after section 5's normalisation (repeated factors collapse, a monomial appearing twice cancels). Each difference is a discrepancy.

14. Field reference

Every member a certificate can carry. A path names a member from the certificate's top level: [] is an array's elements, <variable> a key that is a variable index (x12) and <name> a variable's name. Required means the member is present wherever its parent is -- on every certificate, for a member at the top level. The four origin_class= rows are the values of origin_class.

PathTypeRequiredMeaning
format_versionintegeryesThe format's version, first in the document so a reader can decide whether it understands the rest before reading it. This specification describes version 1; a document without the field is version 1, and a reader MUST refuse a version it does not know rather than read it.
certificate_typestringyesphase0 or algebraic: which kind of refutation this is, and so which check applies. phase0 is Phase 0's SAT solver refuting the CNF encoding of the system, checked through proof_log and the CNF decode. algebraic is everything Phases 1 to 3 conclude over GF(2): a derivation to 0 = 1, or an exhaustion with its refutation record. Present on every certificate, second after format_version.
statusstringyesWho stands behind the contradiction: verified_unsat where this tool produced it (origin_class derived or exhaustion), proof_unsat where Phase 0's SAT solver asserted it and proof_log attaches a proof a named checker confirms (external_proof), oracle_unsat where an external decision procedure asserted it and nothing attached can confirm it (external_oracle). Always agrees with origin_class, which is the finer discriminator.
detailstringyesAlways full: the certificate carries its whole derivation. A run that builds no certificate writes none rather than a partial one.
origin_classstringyesHow the contradiction came to be: derived, exhaustion, external_oracle or external_proof. It decides how the document is checked, and what a reader may conclude from it; see the honesty fields.
origin_class=derivedvaluenoEvery row was derived from the premises, and replaying operations then final_step reaches 0 = 1. A reader may conclude the derivation is valid; a reader MUST NOT conclude that the premises are the policy, which needs the circuit re-derived and compared.
origin_class=exhaustionvaluenoThe contradiction is concluded from an exhausted candidate set, and the refutation record proves the exhaustion: border relations derived from the premises bound the variety by the normal set, and every point of that bound falsifies a premise. Checked by the refutation record, not by replay to 0 = 1.
origin_class=external_oraclevaluenoThe contradiction rests on rows an external decision procedure asserted, named in oracle_dependencies. Nothing in the document lets a third party check that part; a reader MUST NOT treat it as a proof.
origin_class=external_proofvaluenoThe refutation was asserted by Phase 0's SAT solver and a proof of it is attached: proof_log names the CNF and the FRAT log, which frat-rs elaborates to LRAT and checks. Not replayable here, and checkable by a named external checker.
self_containedbooleanyesWhether the document alone suffices to check it: nothing external was asserted, every leaf renders in named variables, and an exhaustion's record is complete. False is honest about a step that could not be derived; a reader MUST NOT read false as failure, nor true as a statement about the policy.
notestringnoA sentence stating the weaker claim the document makes where a row was asserted rather than derived: by an external procedure, or by this tool with or without a refutation record.
policyobjectnoWhat was proved about: the policy file, its digest, the parse diagnostics and the unroll depth. Present where the run read a policy.
policy.filestringyesThe policy file's name as the run was given it.
policy.sha256stringnoThe SHA-256 of the policy file's bytes, so the certificate can be tied to the reviewed file.
policy.parse_diagnosticsintegeryesHow many parse diagnostics the run reported. Non-zero means the circuit may lack edges the file describes.
policy.unroll_deptharrayyesThe unroll depth of each loop the compiler expanded, in order: the bound the proof holds within.
policy.unroll_depth[]integeryesOne loop's unroll depth, as the compiler used it.
questionobjectnoThe question refuted: the action, the obligation's context and every pin. A guardrail certificate refutes the policy together with these, and a pin quietly added would turn a finding into a pass.
question.actionstringnoThe action whose obligation was asked about.
question.obligation_contextstringnoThe context the action must not fire without, held false by the question.
question.pinsarrayyesEvery value the question held fixed, the attack's and the caller's alike.
question.pins[]objectyesOne pinned value, with the variable it fixes.
question.pins[].namestringyesThe pinned value's name as the policy writes it.
question.pins[].variableintegeryesThe variable index the pin fixes.
question.pins[].valueintegeryesThe value it is fixed to: 0 or 1.
question.pins[].sourcestringyesWhere the pin came from: the question itself, or a caller's conditioning pin.
variablesobjectnoA name for every variable the operations cite, keyed by its index (x12), closed under the definitions of the variables the compiler invented. A rendering for a reader; replay does not read it.
variables.<variable>objectyesOne cited variable, and what names it.
variables.<variable>.kindstringyesWhat the variable is in the compiled policy: an input the policy reads, an action, a context, or a wire the compiler introduced.
variables.<variable>.subkindstringnoA finer kind, where the compiler records one.
variables.<variable>.namestringnoThe name the policy gives it, where it has one.
variables.<variable>.qualifiedbooleannoTrue where the name was qualified to tell two declarations of one identifier apart.
variables.<variable>.colangobjectnoWhere in the policy the variable is declared.
variables.<variable>.colang.filestringyesThe policy file the line is in, as the run named it.
variables.<variable>.colang.flowstringnoThe flow the declaration sits in, where it sits in one.
variables.<variable>.colang.lineintegeryesThe line in the policy file, counted from 1.
variables.<variable>.definitionstringnoFor a variable the compiler invented, the product or sum it stands for, over variable indices.
variables.<variable>.named_definitionstringnoThe definition rendered over names, present wherever definition is.
variables.<variable>.derived_fromarraynoThe variables the definition is over, each with an entry of its own.
variables.<variable>.derived_from[]stringyesOne operand of the definition, as xN.
variables.<variable>.introduced_becausestringnoWhy the compiler introduced the variable, in a sentence.
oracle_dependenciesarraynoThe external decision procedures whose assertions the derivation rests on, each named once. Present exactly where an external oracle asserted a row.
oracle_dependencies[]stringyesOne procedure, by the source name its rows carry.
encoding_checkobjectnoWhether the CNF Phase 0 refuted decodes back to the equations it was given. Present where Phase 0 ran and an oracle is depended on.
encoding_check.heldbooleanyesTrue where every auxiliary stands for the product it claims and every clause is one equation with its auxiliaries substituted.
encoding_check.equationsintegeryesHow many equations the CNF was compared against.
encoding_check.definitionsintegeryesHow many auxiliary variables the encoding introduced.
encoding_check.meansstringyesWhat the check establishes, and what it leaves unchecked, in a sentence.
proof_logobjectnoThe proof of a Phase 0 refutation: present exactly when origin_class is external_proof, and only where the encoding check held, since that check alone ties the CNF to these equations.
proof_log.formatstringyesAlways frat: the proof format the solver logs.
proof_log.cnf_filestringyesThe CNF the solver refuted, by file name. Where it lives is the caller's; the digest binds it.
proof_log.cnf_sha256stringyesThe SHA-256 of the CNF file's bytes.
proof_log.frat_filestringyesThe FRAT log of the refutation, by file name.
proof_log.frat_sha256stringyesThe SHA-256 of the FRAT file's bytes.
proof_log.checkerstringyesThe checker the proof is for: frat-rs, which is then part of what a reader trusts.
proof_log.elaborates_tostringyesAlways lrat: what the checker elaborates the FRAT log to, so any LRAT checker can confirm it.
proof_log.solverstringyesThe SAT solver and its version that wrote the log.
proof_log.tbuddybooleanyesWhether the solver was built with tbuddy, which logs its Gauss-Jordan steps. Always true on a conforming document: without it the log omits steps and still looks complete.
phase0_systemarraynoThe equations Phase 0 was handed, in the order the CNF encodes them: what a reader decodes proof_log's CNF back to. Present exactly where proof_log is. A document issued before the field was written carries proof_log alone and does not conform; a checker MAY read it on the reader's explicit request, tying the CNF to the document by its digest alone and saying so.
phase0_system[]objectyesOne equation of the system Phase 0 encoded.
phase0_system[].equationstringyesThe equation, in the equation grammar.
phase0_system[].named_equationstringnoThe same equation over names, where the run had a symbol table.
proof_log_omittedobjectnoWhy a proof the run wrote was not kept. The document is then the one the run gives without the proof: no proof_log, and origin_class external_oracle.
proof_log_omitted.reasonstringyesself_check_failed (frat-rs did not verify it, or a file was missing) or artefact_limit (keeping it would pass the key's proof size limit).
proof_log_omitted.bytesintegernoUnder artefact_limit, the size of the proof that was not kept, CNF and FRAT together.
refutationobjectnoThe proof of an exhaustion: a normal set N, a derived relation for every border monomial of N, and every point of the variety those relations cut out, each falsifying a premise. Present where origin_class is exhaustion and a record was kept.
refutation.kindstringyesquotient-exhaustion or candidate-verification: whether the candidates came from a Phase 3 quotient, or from Phase 2's rank leaving exactly one.
refutation.variable_countintegeryesThe system's variable count n. Every point is an assignment to x0 .. x(n-1), and the closure is over all n variables.
refutation.candidatesintegeryesHow many candidate points the enumeration produced. A checker MUST require exactly this many points, and exactly as many as the normal set has members.
refutation.unsubstantiatedintegernoCandidates the enumeration rejected that satisfy the system on re-checking. Where present and non-zero the record does not refute on its own.
refutation.incompletestringnoThe sentence stating that the record lists fewer points than were rejected, and why.
refutation.closure_gapstringnoWhy the closure evidence is incomplete: a border monomial whose normal form left N, or a relation no derivation was recorded for. Where present the record does not check.
refutation.normal_setarrayyesN, the normal set, each member a monomial spelled as a term. It MUST hold 1.
refutation.normal_set[]stringyesOne member of N, as a term: 1, or variables joined by *.
refutation.border_relationsarrayyesOne entry per border monomial of N: every product of a variable and a member of N that is not itself in N.
refutation.border_relations[]objectyesOne border monomial, and the row of operations that reduces it over N.
refutation.border_relations[].monomialstringyesThe border monomial, as a term.
refutation.border_relations[].operationintegeryesThe id of the row in operations deriving the relation: the monomial plus members of N, derived from the premises.
refutation.pointsarrayyesEvery candidate point, none omitted and none sampled.
refutation.points[]objectyesOne candidate point, and the premise it falsifies.
refutation.points[].indexintegeryesThe point's position in the enumeration.
refutation.points[].assignmentstringyesThe whole point: n binary digits, the i-th the value of x(i-1). Points MUST be distinct, and each MUST satisfy every border relation.
refutation.points[].falsifiesobjectyesThe premise the point violates.
refutation.points[].falsifies.operationintegeryesThe id of the premise leaf in operations. Substituting the point MUST leave it violated.
refutation.points[].falsifies.systemstringyesS1 or S2: which half of the system the row is in.
refutation.points[].falsifies.rowintegeryesThe row's index within that half.
refutation.points[].named_assignmentobjectnoThe point on the falsified premise's variables, keyed by name, where the run had a symbol table. A reading aid; the checker reads assignment.
refutation.points[].named_assignment.<name>integeryesOne named variable's value: 0 or 1.
steps_to_contradictionintegeryesHow many entries operations has: the derivation's length, the final step excluded.
operationsarrayyesThe derivation, in depth-first post-order: every operand appears before the operation consuming it. Empty where the contradiction was asserted directly.
operations[]objectyesOne row of the derivation: a leaf, a sum or a product.
operations[].idintegeryesThe row's id, unique in the document; later rows name it.
operations[].opstringyesINSERT, ADD or MULTIPLY: a leaf, a sum of two rows, or a row times a variable.
operations[].parentsarraynoFor ADD: the two rows summed, by id.
operations[].parents[]integeryesOne summed row's id, defined earlier in operations.
operations[].base_idintegernoFor MULTIPLY: the row multiplied, by id.
operations[].multiplierstringnoFor MULTIPLY: the variable the row is multiplied by, as xN.
operations[].sourcestringnoFor INSERT: where the leaf comes from. original-S1 and original-S2 are the premises; any other source names the procedure that asserted the row, which then carries oracle or internal_assertion.
operations[].oraclebooleannoFor INSERT: true where an external decision procedure asserted the row.
operations[].internal_assertionbooleannoFor INSERT: true where this tool asserted the row; the refutation block is its evidence.
operations[].equationstringnoFor INSERT: the leaf, in the equation grammar. The normative form; every unasserted INSERT carries it.
operations[].named_equationstringnoThe leaf over names, where the run had a symbol table: always the same equation as equation.
operations[].reads_asstringnoThe leaf read as a sentence about the policy, where one can be said.
operations[].colangobjectnoFor a leaf compiled from the policy: where in it.
operations[].colang.filestringyesThe policy file the line is in, as the run named it.
operations[].colang.flowstringnoThe flow, where the line sits in one.
operations[].colang.lineintegeryesThe line in the policy file, counted from 1.
operations[].pinobjectnoFor a leaf that is a pin: the pinned name and its value.
operations[].pin.namestringyesThe pinned value's name as the policy writes it.
operations[].pin.valueintegeryesThe value the pin fixes it to: 0 or 1.
operations[].originstringnoFor a leaf that is neither policy nor pin: expandability-padding, patch or negated-patch.
operations[].pivotintegernoThe pivot bucket the row was reduced into, a trace of where the solver found it.
final_stepobject or nullyesThe operation that produces 0 = 1, withheld from operations so a reader performs it: replaying operations MUST NOT reach 0 = 1, and applying this step MUST. Null where there is no derivation.
final_step.opstringyesADD, MULTIPLY, or INSERT where the contradiction was asserted directly.
final_step.inputsarraynoFor ADD the two rows, for MULTIPLY the one row, by id.
final_step.inputs[]integeryesOne input row's id, defined in operations.
final_step.multiplierstringnoFor MULTIPLY: the variable, as xN.
final_step.sourcestringnoFor INSERT: the procedure that asserted 0 = 1.
final_step.oraclebooleannoFor INSERT: true where an external decision procedure asserted it.
final_step.internal_assertionbooleannoFor INSERT: true where this tool asserted it.
final_step.instructionstringyesWhat to do with the step, in a sentence.
provenanceobjectyesWhere each control the refutation cites is asserted from: the systems of record a source manifest declares. Present on every certificate, empty where no manifest was given.
provenance.declaredbooleanyesWhether a source manifest was supplied to the run. False means every control below is undeclared because nothing was declared, not because the manifest omitted it.
provenance.manifest_sha256stringnoThe SHA-256 of the source manifest the run read, so the declarations can be traced to the reviewed file that made them. Absent where no manifest was supplied.
provenance.controlsobjectyesThe declared controls the refutation cites, keyed by the certificate's own variable index rather than by name, because one identifier can name two kinds.
provenance.controls.<variable>objectyesOne cited control and the source the manifest says asserts it.
provenance.controls.<variable>.namestringyesThe control's name as the policy writes it, without the leading $.
provenance.controls.<variable>.sourcestringyesThe manifest's name for the source that asserts the control.
provenance.controls.<variable>.systemstringyesThe system of record the source is, as the manifest names it for a reader.
provenance.controls.<variable>.authoritystringyesauthoritative, derived or advisory: whether the source is the system of record for the value, computes it from one, or only suggests it.
provenance.controls.<variable>.model_writablebooleanyesWhether the model can write the value the control reads. True means the guarantee rests on a value the thing it constrains can set.
provenance.controls.<variable>.versionstringyesheader, endpoint or none: how a reading of the source is tied to a version of the record it came from.
provenance.controls.<variable>.freshness_secondsintegernoHow old a reading may be, in seconds, where the manifest states a window.
provenance.controls.<variable>.freshness_citationstringnoWhere the freshness window comes from: the rule, contract or design document that sets it.
provenance.undeclaredarrayyesThe cited controls no source in the manifest asserts, by variable index. The proof still holds; what it rests on is unattributed.
provenance.undeclared[]stringyesOne cited control no source asserts, as xN.
provenance.limitsarrayyesWhat provenance cannot establish, stated on every certificate: the residuals that remain after every check, each with what bounds it.
provenance.limits[]stringyesOne residual provenance cannot close, and what bounds it.
control_integrityobjectyesWhether any control the refutation cites can be reached from a classifier's verdict on the requester's intent, which would let the requester's wording satisfy the guard.
control_integrity.checkedbooleanyesWhether the question was asked for this certificate. False is not a pass: nothing was examined.
control_integrity.cleanbooleannoWhether no cited control is reachable from an intent. Present only where the question was checked, and always the opposite of whether findings is non-empty.
control_integrity.findingsarrayyesEach cited control an intent can reach, with the path that reaches it.
control_integrity.findings[]objectyesOne cited control an intent can reach, and how.
control_integrity.findings[].controlstringyesThe control an intent can reach.
control_integrity.findings[].intentstringyesThe intent whose classifier verdict reaches the control.
control_integrity.findings[].patharrayyesThe wires from the intent to the control, in order, as the circuit names them.
control_integrity.findings[].path[]stringyesOne wire on the path, as the circuit names it.
detectionobjectyesWhether the obligation rests on a classifier being right, and if so the bound on how often it is wrong.
detection.computedbooleanyesWhether the partition was computed for this certificate. False means the question was not asked, not that the answer was independent.
detection.dependentbooleannoWhether the control rests on an intent or a classifier concept. Independent means the proof holds over every classifier output, misclassifications included.
detection.atomsarrayyesThe intents and classifier concepts the control rests on, each with its calibration where it has one.
detection.atoms[]objectyesOne intent or concept the control rests on.
detection.atoms[].namestringyesThe intent or concept the control rests on.
detection.atoms[].kindstringyesintent or concept: which kind of classifier verdict the atom is.
detection.atoms[].calibratedbooleanyesWhether the atom carries a complete calibration: a false-negative rate, its corpus, the corpus size and when it was measured.
detection.atoms[].fn_ratenumbernoThe atom's measured false-negative rate, printed so that it reads back as the same number.
detection.atoms[].corpusstringnoThe corpus the rate was measured on, as the calibration names it.
detection.atoms[].nintegernoHow many examples the corpus held.
detection.atoms[].measuredstringnoWhen the rate was measured, as the calibration states it.
detection.boundnumber or nullyesThe union bound over the atoms' rates: how often, per emission, a misclassification can let the action through. Null where any atom is uncalibrated, because a sum missing a term is not a bound.
detection.uncalibratedarrayyesThe atoms with no complete calibration, which are why bound is null.
detection.uncalibrated[]stringyesOne atom with no complete calibration, by name.
residualobjectnoWhere the refutation rests on classifier verdicts named by a concept manifest: the union bound on how often a misclassification lets the action through, over the atoms in this certificate's support.
residual.supportstringyesAlways certificate: the bound is over this derivation's atoms, not the whole circuit.
residual.boundnumberyesThe union bound over the atoms' residuals.
residual.bound_textstringyesThe bound written for a reader.
residual.methodstringyesHow the bound is computed, and why it needs no independence assumption.
residual.statementstringyesWhat the bound means for this certificate, in a sentence.
residual.conceptsarrayyesThe concepts the atoms belong to.
residual.concepts[]objectyesOne concept the derivation's atoms belong to.
residual.concepts[].namestringyesThe concept's name in the manifest.
residual.concepts[].bound_bystringyesdecoder or classifier: what bounds the concept's error.
residual.concepts[].judgestringyesThe judge that decides the concept.
residual.concepts[].independentbooleanyesWhether the concept's judge is independent of the others.
residual.concepts[].thresholdnumbernoThe judge's decision threshold, where it has one.
residual.concepts[].residualnumberyesThe concept's error rate, as calibrated.
residual.concepts[].countedbooleanyesWhether the concept's residual is a term of the bound.
residual.concepts[].calibrationobjectnoWhere the residual was measured.
residual.concepts[].calibration.corpusstringyesThe corpus the residual was measured on.
residual.concepts[].calibration.nintegeryesHow many examples the calibration corpus held.
residual.concepts[].calibration.measuredstringyesWhen the residual was measured.
residual.atomsarrayyesThe classifier verdicts in the derivation's support.
residual.atoms[]objectyesOne classifier verdict the derivation rests on.
residual.atoms[].namestringyesThe atom's name in the concept manifest.
residual.atoms[].variablestringyesThe variable the atom is, as xN.
residual.atoms[].conceptstringyesThe concept the atom belongs to, by name.
residual.atoms[].bound_bystringyesdecoder or classifier: what bounds the atom's error.
residual.atoms[].judgestringyesThe judge that decides the atom's verdict.
residual.atoms[].independentbooleanyesWhether its judge is independent of the others.
residual.atoms[].consulted_onarraynoThe phases that consulted the atom.
residual.atoms[].consulted_on[]stringyesOne phase that consulted the atom, by name.
residual.atoms[].loop_iterationintegernoThe loop iteration the atom belongs to, where it is unrolled.
residual.atoms[].chain_stepintegernoThe chain step the atom belongs to, where the question spans several.
residual.atoms[].supportarrayyesThe operation ids the atom is cited in.
residual.atoms[].support[]integeryesOne operation id in whose leaf the atom appears.
residual.decoder_bound_residualstringnoWhere an atom is bounded by a constrained decoder, why its term is 0 rather than calibrated.

This specification as Markdown · Licence: CC BY 4.0