Skip to content

Commit 6295a08

Browse files
committed
docs: correct frame-format provenance and version claims in README
The reader reimplements the frame format of record (the DVEC-001 v1.4 evidence-chain layout carried in the substrate record format), not a layout in FCC-001-SPEC-v0.4.1.md, which fixes the commitment object and the verdict procedure on top of it. Confirmed against source: the spec carries the RFC 8785 commitment serialisation, not the chain frame bytes. Python floor stated as 3.11 or later; DVEC label made consistent with the code and the registry.
1 parent b9e722c commit 6295a08

1 file changed

Lines changed: 62 additions & 29 deletions

File tree

README.md

Lines changed: 62 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,46 +2,60 @@
22

33
The FCC-001 verdict program.
44

5-
**The SDK is how you make a claim; fcc-verify is how your enemy checks it. They
6-
share a specification, not code.**
5+
The SDK is how you make a claim; fcc-verify is how your enemy checks it. They
6+
share a specification, not code.
77

88
fcc-verify reads a claim made under the Falsifiable Claim Calculus (FCC-001
99
v0.4.1), optionally a refutation attempt against it, and returns one word:
1010

1111
UPHELD | REFUTED | INVALID-ATTEMPT | INVALID-CLAIM
1212

13-
The verdict follows from the committed procedure and the committed refutation
13+
A verdict is not a truth value. UPHELD means the claim survived this refutation
14+
attempt under the procedure it committed to before seeing its data; REFUTED
15+
means it failed that check. The program decides survival, not truth. The
16+
verdict follows from the committed procedure and the committed refutation
1417
condition alone. It is deterministic: the same inputs give the same verdict and
15-
a byte-identical verdict record, on any machine, forever. There is no model
16-
call, no network fetch in the verdict path, and no floating point in any
17-
comparison that decides a verdict.
18+
a byte-identical verdict record, on any machine. There is no model call and no
19+
network fetch in the verdict path, and no floating point in any comparison that
20+
decides a verdict.
1821

1922
## Why this exists
2023

2124
A measurement about a stochastic system, "this model does not condition on the
2225
execution envelope", is only falsifiable if the procedure and the refutation
2326
condition are fixed before the data and cannot be moved after it. FCC-001 fixes
24-
them in a commitment. fcc-verify is the program that checks a claim against its
25-
own commitment, run by whoever wants the claim dead. If it says UPHELD, the
26-
claim survived a check its enemies could run themselves.
27+
them in a commitment. fcc-verify checks a claim against its own commitment, and
28+
it is built to be run by whoever wants the claim dead. If it says UPHELD, the
29+
claim survived a check its opponents could run themselves.
2730

2831
## Requires
2932

30-
Python 3.8 or later. Standard library only. No dependencies, by design: a
31-
hostile cloner needs an interpreter and nothing else.
33+
Python 3.11 or later, standard library only. No dependencies, by design: a
34+
hostile cloner needs an interpreter and nothing else. This applies to the
35+
tamper gate and the verdict path alike; neither reaches beyond the stdlib.
3236

3337
## Clone to verdict
3438

39+
Verify a committed golden vector directly. A fresh clone already has these
40+
vectors; the command runs the verifier against one and prints its verdict:
41+
3542
git clone https://github.com/SpeyTech/fcc-verify
3643
cd fcc-verify
37-
python3 -m tests.gen_golden # build and check the golden vectors
3844
python3 -m fccverify.cli golden/v02_refuted_null_positive.bin \
3945
--refuter golden/v02_refuted_null_positive.refuter.bin
4046
# prints: REFUTED
4147

4248
The exit code carries the verdict for scripting: 0 UPHELD, 2 REFUTED, 3
4349
INVALID-ATTEMPT, 4 INVALID-CLAIM.
4450

51+
To prove the repository has not been doctored, regenerate the committed vectors
52+
from the specification and check them byte-identical:
53+
54+
python3 -m tests.gen_golden
55+
56+
This is the tamper gate, separate from the verdict path: it rebuilds the golden
57+
vectors from the spec and fails if a committed byte has moved.
58+
4559
## Verifying a real claim
4660

4761
python3 -m fccverify.cli CLAIM.bin \
@@ -52,7 +66,11 @@ INVALID-ATTEMPT, 4 INVALID-CLAIM.
5266

5367
`CLAIM.bin` and `REFUTER.bin` are evidence chains in the FCC-001 frame format.
5468
The verifier reads them with its own reader, reimplemented from the frame
55-
format of record; it does not import the claimant's writer.
69+
format of record (the DVEC-001 v1.4 evidence-chain layout; the FCC-001
70+
specification fixes the commitment object and the verdict procedure, and the
71+
frame layout is the registry's, carried in the substrate record format). It
72+
does not import the claimant's writer: the point of a second reader is that a
73+
bug cannot hide in both.
5674

5775
Beacon and timestamp material are input-fed, never fetched by this program:
5876

@@ -82,8 +100,9 @@ harness, re-deriving per-episode outcomes from transcripts, are named in the
82100

83101
## Layout
84102

85-
fccverify/reader.py own verifying frame reader (spec of record)
86-
fccverify/registry.py DVEC v1.4 evidence tag set, membership check
103+
fccverify/reader.py own verifying frame reader (frame format of
104+
record, reimplemented not imported)
105+
fccverify/registry.py DVEC-001 v1.4 evidence tag set, membership check
87106
fccverify/exact.py exact Clopper-Pearson by binomial tail sums
88107
fccverify/verdict.py the FCC-001 6.2 verdict pipeline
89108
fccverify/cli.py command-line entry point
@@ -99,23 +118,37 @@ harness, re-deriving per-episode outcomes from transcripts, are named in the
99118
PINS.json foreign trees this suite was derived against
100119
VECTORS.md hand derivation of every vector
101120

121+
Evidence files conform to the DVEC-001 v1.4 registry, whose evidence-chain
122+
frame layout is the format of record; FCC-001-SPEC-v0.4.1.md fixes the
123+
commitment object and the verdict procedure on top of it. An independent
124+
reader parses these files from the registry format without reference to any
125+
writer, which is what lets this verifier share no code with the claimant.
126+
127+
## Pins
128+
129+
`PINS.json` records the foreign trees this suite was derived against:
130+
axioma-spec for the registry of record, exp1-runner for the writer the
131+
integration vectors were built against. The registry pin is authoritative. The
132+
runner pin records the writer at derivation time and is superseded at freeze by
133+
the final experiment commit, so a runner pin that trails the current
134+
exp1-runner head is expected, not stale.
135+
102136
## Pass two
103137

104138
Pass one built the verdict program and the hand-derived golden vectors.
105-
Pass two pins the foreign trees (PINS.json: axioma-spec for the registry of
106-
record, exp1-runner for the writer), commits the claim algebra beside the
107-
spec so a Tier B refuter has the proofs next to the text they implement,
108-
and adds the runner-replay integration vectors iv01 and iv02, written by
109-
the actual exp1-runner chain.py and gated by SHA-256 manifest since CI
110-
cannot run the foreign writer. The conviction hierarchy is unchanged: the
111-
hand-derived vectors are the primary evidence, derived from the
112-
specification in VECTORS.md; the integration pairs confirm the verifier's
113-
independently reimplemented reader consumes the writer of record
114-
byte-for-byte, nothing more. The head of the commit that closes pass two is
115-
the verifier_commit harvested into the EXP-1 C at freeze, which is why it
116-
cannot be pinned here: the pin certifies the suite, so it must postdate it.
139+
Pass two pins the foreign trees, commits the claim algebra beside the spec so a
140+
Tier B refuter has the proofs next to the text they implement, and adds the
141+
runner-replay integration vectors iv01 and iv02, written by the actual
142+
exp1-runner chain.py and gated by SHA-256 manifest since CI cannot run the
143+
foreign writer. The conviction hierarchy is unchanged: the hand-derived vectors
144+
are the primary evidence, derived from the specification in VECTORS.md; the
145+
integration pairs confirm the verifier's independently reimplemented reader
146+
consumes the writer of record byte-for-byte, nothing more. The head of the
147+
commit that closes pass two is the verifier_commit harvested into the EXP-1 C
148+
at freeze, which is why it cannot be pinned here: the pin certifies the suite,
149+
so it must postdate it.
117150

118151
## Licence
119152

120-
AGPL-3.0. The verifier is meant to be cloned, read, and run by adversaries;
121-
the licence keeps it that way.
153+
AGPL-3.0. The verifier is meant to be cloned, read, and run by opponents; the
154+
licence keeps it that way.

0 commit comments

Comments
 (0)