joulespec: E4 reaches a real prover, an evaluation corpus, §9 narrowed, and the producer reads other specifications #567
Loading…
Reference in a new issue
No description provided.
Delete branch "joulespec/e4-bridge"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Two gaps, both from the same question: has the field already solved this, and does the top rung actually work?
§9 — the nearest prior art was missing
The section covered assurance cases, certified-airborne traceability, supply-chain provenance, mutation testing and carbon intensity, but not requirements-traceability tooling — which is the closest thing to an existing implementation of §3.
That family binds evidence to a requirement by
identifier~revision, and its strongest member reads the test runner's results rather than the sources: a citation on a test that never ran binds nothing. That is this standard'sE2, reached independently and from a different direction, soE2is not a contribution here and §9 now says so. Two things the family leaves open are what this standard closes:Also added: enforced spec-first frameworks hold tests immutable, which is not falsifiability — an immutable test that asserts nothing is immutably vacuous. The closing novelty claim is narrowed to four things rather than left broad.
E4now reaches a proverIt was specified and its logic tested, but no witness had ever come from one.
joulespec-clidrives a model checker and parses the property table, not the verdict line — a checker reports success for a harness whose assumptions emptied its domain in the same words it uses for one that examined all of it, so a gate reading the verdict passes vacuous proofs.Each harness carries a wall-clock budget, so an undecided run is a finding rather than a hang. The budget kills the process group, not the driver — killing only the driver was observed leaving the solver running.
Two statements are discharged over their whole input domain and both are refuted by a counter-artifact. Both sit at
E2, notE4, because nobody independent has cross-checked their formalizations, and the report says so in those words. The rung needs a second party, not more code.What it measured
The counter-artifact narrowing the ratio rule's arithmetic from 128 to 64 bits, where a large input overflows the parts-per-million scale:
u64::MAX / 1_000_000;E3andE4disagreeing on our own code, in the direction the ladder predicts.The cost is not uniform. Same function, same domain, same solver: totality settled in under a tenth of a second; the quotient bound, which needs the output bits of a 128-bit division, did not converge in twenty-four minutes and was abandoned. Only the first is claimed, and the harness says the second is deliberately unstated — a harness quietly narrowed until it converges reports the same success over a smaller claim. §8 records this: the top rung's affordability is a property of the statement, not the code.
A fourth defect, from extending it
Extracting two rules into named functions moved the text two existing counter-artifacts were aimed at — by one indentation level in one case — and both silently stopped describing any edit. The harvester refused to run, which was correct but late, so it now validates every anchor before running anything. Tolerating a missing anchor was the real risk: two clauses would have gone on looking falsifiably evidenced while nothing was mutated.
SPEC §2.5 also now states two rules the producer already followed but the standard never wrote down: a counter-artifact that does not build has demonstrated nothing, and a harness reporting success having run no checks is not evidence that any ran.
The producer now reads someone else's specification
Second commit. The extractor recognised exactly one document shape, which made this a tool for documents written like ours. Which shape a document uses is a fact about the document, so the manifest declares it:
Only the item opener varies. Under
heading-labela blank line does not close an item (a requirement's prose runs over paragraphs — the next heading of equal or shallower depth closes it); a heading with no identifier is a grouping heading, not a requirement; and a heading with no prose under it is dropped, because addressing the empty string would create an obligation nobody wrote and then grade it.The load-bearing property is that no existing obligation moved. The pinned address in that test is not a recording of what the new parser produces — it was computed by running the same fixture through the parser as it stood at the previous commit, in a separate worktree, and the two agree. The reference manifest declares no shape on purpose, so it stands as that check too.
§8 gains the limit this exposes: an obligation address depends on how the clause was extracted, so two producers reading one document under different conventions state different obligations about the same prose and both are correct. A conforming producer must disclose the convention it applied.
An evaluation corpus
Third commit. The wire vectors certify a receipt's bytes; they say nothing about whether an implementation reached the right verdict, because they carry one scenario.
conformance/v1/evaluation/is the other half — ten cases, each a full set of evaluation inputs plus the verdict §3 requires, chosen so a plausible but generous implementation disagrees:a mean where a minimum is required · an unevidenced obligation skipped instead of emptying the grade ·
E3on a killed counter-artifact whose anchor is unstated ·E4because a prover succeeded (declared grounding, and separately unchecked vacuity) · a witness bound to a superseded state counted · a witness for a clause's previous wording discarded instead of flagged · areviewedlabel taken at face value when the reviewer is the clause's own author.Each case states its direction. Most catch over-grading; one catches under-grading, and that one is load-bearing — an implementation that graded nothing at all would pass every over-grading case, so a single-direction corpus rewards a rule that refuses everything. A test asserts the shape of the set rather than trusting it was built as described.
The expectations are hand-written from §3 and never read back out of the implementation. A corpus whose expectations are whatever the code produced certifies agreement with itself. That earned its keep at once: seven of the ten were wrong on first authoring — all the same mistake, and mine rather than the evaluator's. They assumed the attestation axis came from who signed a witness, where §2.8 computes it from who authored the work; with no work declared it is absent. The fix was not to copy the observed value in, which would have buried the misunderstanding, but to declare work in every case so the axis is exercised at all.
What a second solver bought, and what it did not
The quotient-bound statement abandoned above was retried under a solver reasoning with a bitvector theory instead of bit-blasting to a propositional problem:
So the method moved the wall without removing it, and §8 now says that rather than implying a solver choice would fix it. The harness is kept as the reproducible record of a negative result, behind a
cfgnobody sets so an ordinary run does not hang on it.A second finding from those runs: a wall-clock wrapper around a prover is not enough. Both abandoned runs outlived the
timeoutmeant to bound them, because the prover is a driver that spawns the checker and a timeout reaches only the driver. The producer kills the process group — the design was right for a reason now observed twice.Verification
On the build host, all under
--locked:CI gains a proofs leg on a host that has a checker. The
linuxleg cannot gate this: with no prover installed the proof entries are correctly reported as not run, which is no gate at all. The new leg asserts every declared cover is reached and that a counter-artifact still refutes a proof. Its output parsing was tested underbashagainst a passing, a vacuous and a no-cover log before being trusted — an earlier version of that gate was wrong, and only the negative logs showed it.🤖 Generated with Claude Code
joulespec: the E4 rung reaches a real prover, and §9 gives the nearest prior art its dueto joulespec: E4 reaches a real prover, §9 gives the nearest prior art its due, and the producer reads other specificationsjoulespec: E4 reaches a real prover, §9 gives the nearest prior art its due, and the producer reads other specificationsto joulespec: E4 reaches a real prover, an evaluation corpus, §9 narrowed, and the producer reads other specifications