@mikeargento/bitgraph-player 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,9 +5,9 @@ Deterministic evaluation of causal rules over BitGraph proof bundles.
5
5
  BitGraph records. Player evaluates.
6
6
 
7
7
  A BitGraph proof bundle establishes facts: these bits were recorded at
8
- these causal positions, anchored to a public timeline. Player
8
+ these causal positions, tied to a public timeline. Player
9
9
  evaluates a rule over those facts and produces a verdict anyone can
10
- reproduce from the bundle alone — no network, no clock, no account, no
10
+ reproduce from the bundle alone: no network, no clock, no account, no
11
11
  trust in the machine that ran it first.
12
12
 
13
13
  evidence + rule = conclusion
@@ -20,24 +20,35 @@ trust in the machine that ran it first.
20
20
 
21
21
  bitgraph-play rule.json bundle/ > verdict.json
22
22
 
23
- The bundle is a directory, `.tar`, or `.tar.gz` of BitGraph exports (the
24
- folders the BitGraph Folder writes). Exit codes: `0` TRUE, `1` FALSE,
23
+ The bundle is a directory, `.tar`, or `.tar.gz` of BitGraph proofs:
24
+ `proof.json` files beside the files they record, Frame files
25
+ (`bitgraph-fuse/1`), Ethereum anchor witnesses for proofs made before
26
+ the Base floor. This build reads through
27
+ `@mikeargento/bitgraph-audit` 0.7.x, which does not read the export
28
+ (`bitgraph-export/1`) a tree/1 BitGraph is kept with. So Player does not
29
+ read exports yet; a file with its export is checked with
30
+ `npx -p @mikeargento/bitgraph-sdk bitgraph verify <file> <export.json>`
31
+ or with bitgraph-audit 0.9.0. Exit codes: `0` TRUE, `1` FALSE,
25
32
  `2` UNDETERMINED, `3` error. `--out file` writes the verdict to a file;
26
33
  `--summary` prints a bundle reconnaissance to stderr.
27
34
 
28
35
  ## Check a bundle
29
36
 
30
- bitgraph-play check "BitGraph (photo.jpg)/"
37
+ bitgraph-play check recordings/
31
38
  bitgraph-play check proof.json photo.jpg --json
32
39
 
33
- No rule needed. `check` reads an export (a folder or archive, or a
40
+ No rule needed. `check` reads a bundle (a folder or archive, or a
34
41
  proof.json beside the file it records) and says, offline, what the bundle
35
42
  establishes about each recording in it: that the file in hand hashes to
36
43
  the recorded digest, that the Ed25519 signature and position binding verify,
37
44
  that the AWS Nitro attestation validates to the AWS root and binds this
38
45
  exact proof, that the attested PCR0 is a published BitGraph enclave
39
- measurement, and, from block headers in the bundle, which Ethereum blocks
40
- the recording sits between. Every line is TRUE, FALSE, or UNDETERMINED:
46
+ measurement (enclave v9 included), and, from block headers in the bundle,
47
+ the Ethereum block the recording comes after (its floor, a time) and the
48
+ later anchor it was committed before (a position, never a clock time).
49
+ This build predates the Base floor (`commit.slotFloor`): it states the
50
+ floor of Ethereum-anchored proofs only.
51
+ Every line is TRUE, FALSE, or UNDETERMINED:
41
52
  FALSE only when evidence in hand contradicts the recording (an edited
42
53
  signature, a block header that does not hash to its anchor), UNDETERMINED
43
54
  when the evidence does not decide (the file is not in the bundle, a
@@ -46,7 +57,7 @@ no offline check can establish, stated rather than implied. `--json`
46
57
  prints the `bitgraph-check/1` report; exit codes match evaluation.
47
58
 
48
59
  The same check runs in a browser: `verify.html`, built from this package
49
- to `dist-web/verify.html`. Open it and choose or drop an export, offline,
60
+ to `dist-web/verify.html`. Open it and choose or drop a bundle, offline,
50
61
  and it renders the same report from the same code. bitgraph.ing stopped
51
62
  serving a copy on 8 September 2026: loading a checker from the party
52
63
  being checked is not an offline check. A copy you already have still
@@ -59,7 +70,7 @@ network request.
59
70
 
60
71
  `init` hashes the files you name and writes a rule skeleton with the
61
72
  cast filled in: one role per file, digests computed, role names from
62
- filenames. The skeleton does not run as written — `requires.ordering`
73
+ filenames. The skeleton does not run as written: `requires.ordering`
63
74
  is a placeholder you must replace, because the trust floor is the
64
75
  rule's own security policy and has no default, from the scaffolder or
65
76
  anywhere else. Choose the floor, say what each digest means, refine the
@@ -98,7 +109,7 @@ ambiguous rather than silently picking a mode.
98
109
 
99
110
  `cast` is everything taken on the rule author's word: which digest means
100
111
  what, which occurrence is meant, who is said to have signed it. `claim`
101
- is only what BitGraph derives. `then` is a label — no field of a rule can
112
+ is only what BitGraph derives. `then` is a label: no field of a rule can
102
113
  cause an action. Player decides; whatever stakes money on a TRUE sits
103
114
  above it.
104
115
 
@@ -113,7 +124,7 @@ wrong on some input.
113
124
 
114
125
  The verdict splits `derived` (BitGraph established this) from `declared`
115
126
  (a named party asserted this), and its last declared entry is always the
116
- closed world itself — absence is asserted only among the roles the author
127
+ closed world itself: absence is asserted only among the roles the author
117
128
  declared, and nothing establishes that the cast is complete.
118
129
 
119
130
  ## Determinism
@@ -126,7 +137,7 @@ agree with it.
126
137
 
127
138
  ## API
128
139
 
129
- One call runs the whole pipeline — the CLI is built on the same
140
+ One call runs the whole pipeline; the CLI is built on the same
130
141
  function, so embedding Player cannot drift from it:
131
142
 
132
143
  ```ts
@@ -159,7 +170,7 @@ browser page share:
159
170
  import { ingestBundle, ingestEntries } from "@mikeargento/bitgraph-audit";
160
171
  import { checkIngest, renderCheckText } from "@mikeargento/bitgraph-player";
161
172
 
162
- const report = await checkIngest(await ingestBundle("BitGraph (photo.jpg)/"));
173
+ const report = await checkIngest(await ingestBundle("recordings/"));
163
174
  // or, from bytes already in hand (a browser drop):
164
175
  // await checkIngest(await ingestEntries([{ path: "proof.json", open: () => bytes }]));
165
176
  process.stdout.write(renderCheckText(report));
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base-floor-check.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-floor-check.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/base-floor-check.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,163 @@
1
+ // Copyright (c) 2024-2026 Argento Computing Inc. Licensed under the MIT License. See LICENSE.
2
+ /**
3
+ * Base floors (enclave v10) in `check` and `compare`.
4
+ *
5
+ * From enclave v10 a recording signs its floor as a Base block
6
+ * (commit.slotFloor) instead of an Ethereum anchor. An audit that reads it
7
+ * reports a not-before segment bound with source "signed-floor" and chain
8
+ * "base", a TemporalAnalysis.signedFloors record per floor, and
9
+ * floorProblems. The Player reads those fields structurally (it still builds
10
+ * against an older audit), so these tests hand it AuditResult shapes with
11
+ * them, exactly as the fixtures elsewhere do. No ledger writes, no network.
12
+ */
13
+ import { describe, it } from "node:test";
14
+ import * as assert from "node:assert/strict";
15
+ import { buildCheckReport, renderCheckText } from "../check.js";
16
+ import { compare } from "../order.js";
17
+ import { digestFor, makeAudit, makeBound, proofHashOf } from "./fixtures.js";
18
+ const BASE_BLOCK = 52271417;
19
+ const BASE_TIME = 1791332181;
20
+ const BASE_HASH = "0x71d926aeae9847fcc15fad2d4de8871923f56862d42db7a7463e95a838f8f9b0";
21
+ function complete(audit, temporal) {
22
+ return {
23
+ ...audit,
24
+ anomalies: { anomalies: [], divergences: [], boundaryEntryPoints: [] },
25
+ authorities: { groups: [], anomalies: [], sharedSignersAcrossEpochs: [] },
26
+ anchors: { anchors: [], metadataOnlyProofHashes: [], findings: [] },
27
+ witnesses: { outcomes: [], findings: [] },
28
+ attestations: {
29
+ records: [],
30
+ findings: [],
31
+ counts: {
32
+ proofsWithDeclaredMeasurement: 0, proofsWithDocument: 0, documentsValidated: 0, documentsFailed: 0,
33
+ pcr0Matches: 0, pcr0Mismatches: 0, userDataBound: 0, userDataUnbound: 0,
34
+ },
35
+ },
36
+ temporal: { ...audit.temporal, ...temporal },
37
+ };
38
+ }
39
+ function baseBound(proofName, opts) {
40
+ return {
41
+ ...makeBound({
42
+ kind: "not-before",
43
+ anchorProofHash: proofHashOf(proofName),
44
+ blockHash: BASE_HASH,
45
+ blockNumber: String(opts?.blockNumber ?? BASE_BLOCK),
46
+ timestamp: opts?.timestamp ?? BASE_TIME,
47
+ evidence: (opts?.evidence ?? "signed-floor"),
48
+ claim: "fixture Base floor bound",
49
+ }),
50
+ source: "signed-floor",
51
+ chain: "base",
52
+ timeSource: opts?.timeSource ?? "header",
53
+ };
54
+ }
55
+ function floorRecord(proofName, opts) {
56
+ return {
57
+ proofHash: proofHashOf(proofName),
58
+ chain: "base",
59
+ blockNumber: BASE_BLOCK,
60
+ blockHash: BASE_HASH,
61
+ blockTimestamp: BASE_TIME,
62
+ header: "checked",
63
+ headerPath: "base-floor/floor-header.json",
64
+ bound: "not-before",
65
+ ...(opts ?? {}),
66
+ };
67
+ }
68
+ function segment(names, lower, upper = [], epochId = "E10") {
69
+ return {
70
+ partition: { publicKeyB64: "key-A", chainId: "bitgraph:main", epochId },
71
+ memberProofHashes: names.map(proofHashOf),
72
+ status: lower.length > 0 && upper.length > 0 ? "lower-bounded-with-following-anchor" : lower.length > 0 ? "lower-bounded" : upper.length > 0 ? "upper-bounded" : "ordered-but-unanchored",
73
+ lowerBounds: lower,
74
+ upperBounds: upper,
75
+ };
76
+ }
77
+ function oneRecording(temporal, attribution) {
78
+ const audit = makeAudit({ proofs: [{ name: "r", digestB64: digestFor("r"), epochId: "E10", counter: "4", slotCounter: "3" }] });
79
+ if (attribution !== undefined) {
80
+ audit.ingest.proofs[0].proof["attribution"] = attribution;
81
+ }
82
+ return complete(audit, temporal);
83
+ }
84
+ describe("check: a recording that signs a Base floor", () => {
85
+ it("is bounded after its Base block, with the header checked, and no upper bound", () => {
86
+ const report = buildCheckReport(oneRecording({ segments: [segment(["r"], [baseBound("r")])], signedFloors: [floorRecord("r")] }));
87
+ const rec = report.recordings[0];
88
+ assert.equal(rec.bounds.status, "lower-bounded");
89
+ assert.equal(rec.bounds.notBefore?.chain, "base");
90
+ assert.equal(rec.bounds.notBefore?.evidence, "signed-floor");
91
+ assert.equal(rec.bounds.notBefore?.blockNumber, String(BASE_BLOCK));
92
+ assert.equal(rec.bounds.notAfter, undefined);
93
+ assert.match(rec.bounds.detail, /after Base block 52271417 \(its floor, header checked in this bundle\)/);
94
+ assert.doesNotMatch(rec.bounds.detail, /Ethereum/);
95
+ assert.ok(report.notChecked.some((n) => /Base floor blocks are Base's own/.test(n)));
96
+ assert.doesNotMatch(renderCheckText(report), /[–—]/);
97
+ });
98
+ it("without the header, says the block needs a Base lookup", () => {
99
+ const report = buildCheckReport(oneRecording({ segments: [segment(["r"], [baseBound("r", { timeSource: "signed" })])], signedFloors: [floorRecord("r", { header: "not-carried" })] }));
100
+ assert.match(report.recordings[0].bounds.detail, /confirming the block needs a Base lookup/);
101
+ });
102
+ it("compares bounds across chains by time, never by block number", () => {
103
+ // Ethereum block 25,000,000 is later in time than this Base block,
104
+ // whose NUMBER is larger: the tightest not-before is the Ethereum one.
105
+ const eth = makeBound({ kind: "not-before", anchorProofHash: "anchor-eth", blockNumber: "25000000", timestamp: BASE_TIME + 600 });
106
+ const report = buildCheckReport(oneRecording({ segments: [segment(["r"], [baseBound("r"), eth])], signedFloors: [floorRecord("r")] }));
107
+ const nb = report.recordings[0].bounds.notBefore;
108
+ assert.equal(nb.chain, undefined);
109
+ assert.equal(nb.blockNumber, "25000000");
110
+ });
111
+ it("a fuse/3 recording's fused floor is the Base block it signs", () => {
112
+ const report = buildCheckReport(oneRecording({ segments: [segment(["r"], [baseBound("r")])], signedFloors: [floorRecord("r")] }, { name: "bitgraph-fuse/3", title: "trailer/1" }));
113
+ const fused = report.recordings[0].fused;
114
+ assert.equal(fused.floor?.chain, "base");
115
+ assert.equal(fused.floor?.evidence, "signed-floor");
116
+ assert.equal(fused.floor?.blockNumber, String(BASE_BLOCK));
117
+ assert.match(fused.floorDetail, /Base block #52271417 .*the Base block this recording signs as its floor/);
118
+ });
119
+ it("a withheld floor bounds nothing and says why", () => {
120
+ const why = "the floor block is stamped after the attestation document was made";
121
+ const report = buildCheckReport(oneRecording({ segments: [segment(["r"], [])], signedFloors: [floorRecord("r", { bound: "withheld", withheldReason: why })] }, { name: "bitgraph-fuse/3", title: "trailer/1" }));
122
+ const rec = report.recordings[0];
123
+ assert.equal(rec.bounds.notBefore, undefined);
124
+ assert.match(rec.bounds.detail, /not used as a bound/);
125
+ assert.equal(rec.fused.floor, null);
126
+ assert.match(rec.fused.floorDetail, /not used as a bound/);
127
+ });
128
+ it("a floor problem (a recording that signs two floors) is a contradiction: FALSE", () => {
129
+ const report = buildCheckReport(oneRecording({
130
+ segments: [segment(["r"], [])],
131
+ floorProblems: [{ code: "floor-ambiguous", proofHash: proofHashOf("r"), message: "the proof signs two floors" }],
132
+ }));
133
+ assert.equal(report.result, "FALSE");
134
+ assert.ok(report.contradictions.some((c) => c.detail.startsWith("floor-ambiguous")));
135
+ });
136
+ });
137
+ describe("compare: a Base floor orders no epoch", () => {
138
+ it("an anchor's not-after in one epoch and a later Base floor in another answer unordered", () => {
139
+ const base = makeAudit({
140
+ proofs: [
141
+ { name: "old", digestB64: digestFor("old"), epochId: "E9", counter: "2" },
142
+ { name: "new", digestB64: digestFor("new"), epochId: "E10", counter: "2", publicKeyB64: "key-B" },
143
+ ],
144
+ partitions: [
145
+ { epochId: "E9", members: ["old"] },
146
+ { epochId: "E10", members: ["new"], publicKeyB64: "key-B" },
147
+ ],
148
+ });
149
+ const anchorUpper = makeBound({ kind: "not-after", anchorProofHash: "anchor-9", blockNumber: "25000000", timestamp: 1_700_000_000 });
150
+ const audit = complete(base, {
151
+ segments: [segment(["old"], [], [anchorUpper], "E9"), segment(["new"], [baseBound("new")], [], "E10")],
152
+ signedFloors: [floorRecord("new")],
153
+ });
154
+ const byName = (n) => audit.ingest.proofs.find((p) => p.proofHash === proofHashOf(n));
155
+ assert.equal(compare(byName("old"), byName("new"), audit).relation, "unordered");
156
+ assert.equal(compare(byName("new"), byName("old"), audit).relation, "unordered");
157
+ // The same shape with an anchor not-before on the new side does order them (old behaviour kept).
158
+ const anchorLower = makeBound({ kind: "not-before", anchorProofHash: "anchor-10", blockNumber: "25000100", timestamp: 1_700_001_200 });
159
+ const anchored = complete(base, { segments: [segment(["old"], [], [anchorUpper], "E9"), segment(["new"], [anchorLower], [], "E10")] });
160
+ assert.equal(compare(byName("old"), byName("new"), anchored).relation, "before");
161
+ });
162
+ });
163
+ //# sourceMappingURL=base-floor-check.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-floor-check.test.js","sourceRoot":"","sources":["../../src/__tests__/base-floor-check.test.ts"],"names":[],"mappings":"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"}
@@ -125,7 +125,7 @@ describe("check: real export fixture (disk)", () => {
125
125
  it("recognizes the enclave v5 measurement from PINS.md", () => {
126
126
  const enclave = report.recordings[0].lines.find((l) => l.name === "enclave");
127
127
  assert.match(enclave.detail, /enclave v5/);
128
- assert.equal(KNOWN_ENCLAVE_MEASUREMENTS.length, 8);
128
+ assert.equal(KNOWN_ENCLAVE_MEASUREMENTS.length, 9);
129
129
  });
130
130
  it("serializes deterministically: no timestamps, no machine paths", async () => {
131
131
  const again = await checkIngest(await ingestBundle(FIXTURE));
package/dist/check.d.ts CHANGED
@@ -53,6 +53,32 @@
53
53
  import type { AnchorRecord, AuditResult, IngestResult, TemporalSegment } from "@mikeargento/bitgraph-audit";
54
54
  import type { FuseVerifyResult } from "@mikeargento/bitgraph-verify";
55
55
  import type { ThreeValued } from "./types.js";
56
+ /**
57
+ * What an audit that reads Base floors adds (bitgraph-audit after 0.9.0:
58
+ * TemporalAnalysis.signedFloors and floorProblems, and source / chain /
59
+ * timeSource on a segment bound). Read structurally, so the Player builds and
60
+ * behaves exactly as before against an audit without them; every field is
61
+ * optional and absent means an Ethereum anchor bound.
62
+ * TODO(release): bump the bitgraph-audit dependency to the release that
63
+ * carries signedFloors, then these can be the audit's own exported types.
64
+ */
65
+ export interface SignedFloorRecord {
66
+ proofHash: string;
67
+ chain: "base";
68
+ blockNumber: number;
69
+ blockHash: string;
70
+ blockTimestamp: number;
71
+ header: "checked" | "not-carried";
72
+ headerPath?: string;
73
+ bound: "not-before" | "withheld";
74
+ withheldReason?: string;
75
+ }
76
+ export interface FloorProblem {
77
+ code: string;
78
+ proofHash?: string;
79
+ path?: string;
80
+ message: string;
81
+ }
56
82
  /**
57
83
  * Published BitGraph enclave PCR0 measurements, per PINS.md, oldest first.
58
84
  * Each remains correct for proofs minted during its own period; a proof
@@ -70,15 +96,24 @@ export interface CheckLine {
70
96
  result: ThreeValued;
71
97
  detail: string;
72
98
  }
73
- /** A verified Ethereum bound on a recording, from a witness in the bundle. */
99
+ /**
100
+ * A verified bound on a recording: an Ethereum anchor's, from a witness in
101
+ * the bundle, or (enclave v10) the Base block a recording signs as its floor,
102
+ * which is a not-before only.
103
+ */
74
104
  export interface CheckBound {
105
+ /** Absent for Ethereum (an anchor); "base" for a Base floor (commit.slotFloor). */
106
+ chain?: "base";
75
107
  blockNumber?: string;
76
108
  blockHash: string;
77
- /** Unix seconds from the verified block header. */
109
+ /** Unix seconds: from the verified block header, or for a Base floor without one, the time the proof signs. */
78
110
  timestamp: number;
111
+ /** The anchor proof, or for a Base floor the recording that signs it. */
79
112
  anchorProofHash: string;
80
- evidence: "chain-link" | "counter-order";
113
+ evidence: "chain-link" | "counter-order" | "signed-floor";
81
114
  weaker: boolean;
115
+ /** Base floors only: "header" checked in the bundle, or "signed" (confirming the block needs a Base lookup). */
116
+ timeSource?: "header" | "signed";
82
117
  }
83
118
  export interface CheckBounds {
84
119
  status: "lower-bounded-with-following-anchor" | "lower-bounded" | "upper-bounded" | "unanchored";
@@ -87,18 +122,26 @@ export interface CheckBounds {
87
122
  detail: string;
88
123
  }
89
124
  /**
90
- * The wall-clock floor of a fused artifact: the last verified anchored
91
- * block preceding its SLOT counter in the same epoch chain. Counter-order
92
- * evidence by construction (no hash path reaches a slot record), reported
93
- * with the same "genuine block" assumption as every other bound.
125
+ * The wall-clock floor of a fused artifact. Ethereum floors (enclave v9 and
126
+ * before): the last verified anchored block preceding its SLOT counter in
127
+ * the same epoch chain, counter-order evidence by construction (no hash path
128
+ * reaches a slot record). Base floors (enclave v10): the block the recording
129
+ * itself signs as commit.slotFloor, which a bitgraph-fuse/3 commitment binds
130
+ * ("signed-floor"). Either is reported with the same "genuine block"
131
+ * assumption as every other bound.
94
132
  */
95
133
  export interface CheckFloor {
134
+ /** Absent for Ethereum; "base" for the recording's own Base floor. */
135
+ chain?: "base";
96
136
  blockNumber?: string;
97
137
  blockHash: string;
98
- /** Unix seconds from the verified block header. */
138
+ /** Unix seconds from the verified block header, or for a Base floor without one, the signed time. */
99
139
  timestamp: number;
140
+ /** The anchor proof, or for a Base floor the recording itself. */
100
141
  anchorProofHash: string;
101
- evidence: "counter-order";
142
+ evidence: "counter-order" | "signed-floor";
143
+ /** Base floors only: "header" checked in the bundle, or "signed" (confirming the block needs a Base lookup). */
144
+ timeSource?: "header" | "signed";
102
145
  }
103
146
  /** What the bundle establishes about a recording marked fused (profile bitgraph-fuse/1, working name). */
104
147
  export interface CheckFused {
@@ -201,6 +244,12 @@ export declare function buildCheckReport(audit: AuditResult, options?: CheckOpti
201
244
  */
202
245
  export declare const ANCHORED_CHAIN = "bitgraph:main";
203
246
  export declare function fusedFloor(segment: TemporalSegment | undefined, anchorByHash: ReadonlyMap<string, AnchorRecord> | undefined, slotCounter: string | undefined, chainId?: string): CheckFloor | null;
247
+ /**
248
+ * The fused floor of a recording that signs a Base floor (enclave v10): the
249
+ * block itself, which a bitgraph-fuse/3 commitment binds. Null when the audit
250
+ * withheld it as a bound (the reason is in the floor detail).
251
+ */
252
+ export declare function ownBaseFloor(floor: SignedFloorRecord): CheckFloor | null;
204
253
  export declare function renderCheckText(report: CheckReport): string;
205
254
  /** Deterministic JSON bytes for the report: two-space indent, one trailing newline. */
206
255
  export declare function serializeCheckReport(report: CheckReport): string;
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"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"}