4.4. Evidence and verdicts
A turn that changes code ends with a verdict that SPEAR computes, not one the model writes. There are two kinds of evidence behind it, and they are never allowed to stand in for each other:
- Implementation evidence
what the turn’s own tools did to the tree and what its checks showed — builds, tests, a look at the result. It says whether the change works as written.
- Normative evidence
evidence that a constraint taken from the bound standard holds in the final source: a deterministic reading of the source, or a project check bound to that provision. It says whether the change does what the standard requires.
A passing build is not normative evidence, and a model’s reading of a provision is neither.
4.4.1. Implementation evidence
Every change-making turn on the coding core ends with one of three states:
State |
Meaning |
|---|---|
|
source changed, and the checks that show what the answer claims ran and passed on the final source |
|
source changed, and nothing that ran on the final source shows it works — or something that ran on it failed |
|
no source changed |
VERIFIED is exactly as strong as the checks that ran: the configured
validation passed on the final source, and nothing more is claimed. A project
whose tests do not exercise a property can be VERIFIED while that property
is wrong – an external oracle may still find it. Whether a change does what a
bound standard requires is the normative status, which stays
NOT_DEMONSTRATED until normative evidence establishes it; a passing build
never does.
An UNVERIFIED answer opens with the verdict and its reason, and every
sentence in it that claims success without hedging is marked
(not verified) where it stands, so the answer cannot say one thing while the
verdict says another.
4.4.1.1. The final-state principle
A validation proves the source state that existed when it ran
Every successful change to delivered source opens a new source epoch. A
check counts for the verdict only if it ran in the final epoch — after the
last change. edit → build PASS → edit does not verify the final tree: the
build proved a tree that no longer exists.
Consequences that follow directly:
A failed project build verifies nothing. SPEAR runs the project’s own build and test commands on the final tree. A failure there makes the turn
UNVERIFIEDwhatever else passed; a build that could not run proves nothing either way.Declared commands win over probed ones. A project needs no configuration to be checked: its build and test commands are probed from the files it has (a CMake tree, a Makefile, cargo, go, npm, a Python package). What the project declares (Projects and corpora) takes precedence kind by kind — a declared build is the build, and a failing one is never replaced by an easier guess; a probe only fills a kind the project left undeclared. Each run is recorded with its origin,
configuredorprobed.A Makefile that only prints its help is not a build. When a bare
makewould print the help (as a generated Sphinx Makefile does), it is not probed as the build: it would have “passed” every change.Evidence is claim-specific. “It builds” needs a build; “the tests pass” needs a test run; “the link survives a clean and a rebuild” needs a clean, a build and a look at the result, in that order, all in the final epoch. A build alone does not show persistence across a clean.
An individual BitBake task is not a full build.
bitbake -c configure xvalidates that task; it is not thebitbake x(or-c compile) a build claim needs, andbitbake -n,-eor-grun nothing at all.A failure behind a filter is still a failure.
make | tailreturns the exit status oftail; withoutpipefail, what the output says decides.A command sent to the background shows nothing.
make &returns at once with the shell’s 0, beforemakehas done anything, so it is not a check – nor is any command of a list that ends with&.Compiling loose files is not the project’s verification. When the project has its own build or test command, declared or probed, a turn whose only check was compiling the files it touched is
UNVERIFIED.Build outputs are not source changes. What a build writes into its own output areas (
build/tmp,generated/, git-ignored files) does not open a new epoch, so a build that writes its artefacts still counts.
Technically correct code can still be UNVERIFIED. The verdict is about what
was shown, not about what is true — and an honest “not shown” is the result
the operator can act on.
4.4.2. Normative evidence
On a MIXED turn (Mixed mode), each constraint of the packet receives an authoritative status:
Status |
Meaning |
|---|---|
|
decisive authoritative evidence on the final source shows it holds |
|
decisive authoritative evidence on the final source shows it does not |
|
nothing authoritative establishes it either way |
|
the provision itself could not be resolved in the standard as stored |
|
two authoritative providers disagree about the same final source |
Only two providers are authoritative today: deterministic source predicates and conformance checks a project has explicitly bound to a provision (Mixed mode). A model’s opinion of a constraint — and a second model’s opinion of that opinion — is recorded as advice and decides nothing.
4.4.3. Composite verdicts
A MIXED turn reports both dimensions in one line:
Verdict |
When |
|---|---|
|
every applicable requirement established, implementation verified |
|
every applicable requirement established; the change is not shown to work |
|
every applicable requirement established on an unchanged tree |
|
an applicable requirement is established as violated |
|
not every applicable requirement is established, or applicability or coverage is incomplete |
|
an applicable requirement is ambiguous in the standard as stored |
|
authoritative evidence disagrees about a requirement |
COMPLIANT needs all of the following at once: complete structural coverage,
every applicable SHALL constraint established SATISFIED, none VIOLATED,
no requirement whose applicability is unresolved, no evidence conflict, and all
of that on the final source epoch. SHOULD and MAY constraints keep their force:
they are reported, and they never block.
4.4.4. COMPLIANCE NOT DEMONSTRATED
Not demonstrated is not non-compliant
A project may compile, pass its tests, and even be correct — and still
receive COMPLIANCE NOT DEMONSTRATED. It means SPEAR does not hold
authoritative evidence for every applicable requirement. It does not
mean SPEAR found a violation.
This is the intended result whenever the evidence is insufficient, and in practice the most common one for real protocol and register requirements: “one acknowledgement packet per requested type” or “program the frequency register during boot” cannot be read off source literals, and no model judgement is allowed to stand in for the missing evidence.
The verdict comes with its counts, so it is clear what is missing:
Coverage: COMPLETE — 5 cited, 1 added by the document's structure,
0 excluded as not applicable.
Required: 6 — applicable 0 (satisfied 0, violated 0, not demonstrated 0),
applicability unresolved 6, evidence conflicts 0.
There are two ways to turn it into COMPLIANT, and both are explicit project
decisions: declare which provisions apply to the project, and bind a
conformance check to each requirement that the source cannot show by itself
(Projects and corpora).
4.4.5. Evidence conflict
When two authoritative providers disagree about the same final source — say a
source predicate reads the count as four (SATISFIED) while a decisive bound
check fails (VIOLATED) — the constraint is EVIDENCE_CONFLICT and the
verdict is EVIDENCE CONFLICT. Neither provider wins because it ran later,
and no repair is attempted: one of the two is wrong about the project, and only
a person can say which.
4.4.6. Examples
An unverified change.
**UNVERIFIED** — src/ring.c changed, and the final change was not
revalidated after the last source modification: what passed ran on an
earlier state of the tree.
ring_next() now wraps at size, and the build succeeds *(not verified)*.
Compliance not demonstrated. A synthetic standard requires a field to carry exactly four entries and a mode to be 2 when a flag is set; the turn also cites a timing rule nothing deterministic can check.
MIXED VERDICT: COMPLIANCE NOT DEMONSTRATED — SYNTH-STD 1, constraint set
ncs-… (3 constraint(s); compliance is judged against these only).
- C1 Rule 4.2.1-1 (SHALL, when flag X is set; applicability APPLICABLE):
SATISFIED — CONDITIONAL_VALUE: the provision states 2, the final source
gives 2 (record.py:2 `mode = 2 if flag_x else 1`) [record.py:2]
- C2 Rule 4.2.1-2 (SHALL; applicability APPLICABLE): SATISFIED —
EXACT_COUNT: the provision states 4, the final source gives 4
(record.py:3 `count = [0, 0, 0, 0]`) [record.py:3]
- C3 Rule 4.3-1 (SHALL; applicability APPLICABLE): NOT_DEMONSTRATED —
not independently established (the model check found a possible
satisfaction: …)
Implementation evidence: VERIFIED. Normative: NOT_DEMONSTRATED.
An evidence conflict.
- C2 Rule 4.2.1-2 (SHALL; applicability APPLICABLE): EVIDENCE_CONFLICT —
authoritative evidence disagrees: EXACT_COUNT: the provision states 4,
the final source gives 4 (record.py:3 `count = [0, 0, 0, 0]`); project
check count-four (`python3 -B tests/check_count.py`) failed (exit 1);
its binding makes a failure decisive [record.py:3]
See also