@agenticprimitives/witness 0.0.0-alpha.31 → 0.0.0-alpha.32

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
@@ -19,10 +19,13 @@ const evaluation = await evaluateDispute({
19
19
  record, // the spec-306 hash-linked evidence chain
20
20
  receipt, // the disputed spec-303 public receipt
21
21
  detail, // optional — released to the witness via releaseMode 'witness_escrow'
22
- verifyReceiptSignature,
22
+ verifyReceiptSignature, // REQUIRED — an unsigned receipt is refused as input
23
+ expectedReceiptSigner, // REQUIRED — the verifier the relationship's agreement names
24
+ authenticateRecord, // optional — else the attestation says recordAuthenticated: false
23
25
  });
24
- // → { outcome: 'in_scope' | 'out_of_scope' | 'revoked_before_execution'
25
- // | 'stale_status_used' | 'insufficient_evidence', ... }
26
+ // → { outcome: 'in_scope' | 'out_of_scope' | 'deferred' | 'not_evaluated' | 'undetermined'
27
+ // | 'revoked_before_execution' | 'stale_status_used' | 'insufficient_evidence', ... }
28
+ // A revocation condemns only a receipt issued under THAT grant, after it in the record.
26
29
 
27
30
  const attestation = await mintWitnessAttestation(
28
31
  { witness: witnessSa, relationshipId, evaluation, receipt, checkedDetail: !!detail, attestedAt },
package/dist/index.d.ts CHANGED
@@ -1,10 +1,20 @@
1
1
  import { type RelationshipRecordEntryV1 } from '@agenticprimitives/agreements';
2
- import { type ReceiptSignatureVerifier, type Sha256, type VerificationReceiptDetailV1, type VerificationReceiptV1 } from '@agenticprimitives/verification-receipts';
2
+ import { type ReceiptSignatureVerifier, type ReceiptVerifyReason, type Sha256, type VerificationReceiptDetailV1, type VerificationReceiptV1 } from '@agenticprimitives/verification-receipts';
3
3
  export declare const PACKAGE_NAME = "@agenticprimitives/witness";
4
4
  export declare const PACKAGE_STATUS = "w1-evaluate-attest";
5
5
  export declare const SPEC_REF = "specs/307-witness.md";
6
6
  export type Hex = `0x${string}`;
7
- export type WitnessOutcome = 'in_scope' | 'out_of_scope' | 'revoked_before_execution' | 'stale_status_used' | 'insufficient_evidence';
7
+ /**
8
+ * One attested value per fact (DATA-5, spec 445 — no collapsing):
9
+ * - the four `ScopeDecision`s each keep their own name: `in_scope`, `out_of_scope`, `deferred` (tool scope
10
+ * passed here, record scope judged at the resource server — R917-P-7), `not_evaluated` (the pipeline denied
11
+ * before scope ran);
12
+ * - `undetermined` — the evidence verified but does not decide (an unknown scope value; a revocation in the
13
+ * record that cannot be attributed because the receipt names no delegation). NEVER a negative finding;
14
+ * - the two revocation outcomes condemn only a receipt issued under the REVOKED grant, at or after the
15
+ * revocation's position in the record.
16
+ */
17
+ export type WitnessOutcome = 'in_scope' | 'out_of_scope' | 'deferred' | 'not_evaluated' | 'undetermined' | 'revoked_before_execution' | 'stale_status_used' | 'insufficient_evidence';
8
18
  export interface WitnessProof {
9
19
  type: string;
10
20
  signature: string;
@@ -20,6 +30,10 @@ export interface WitnessAttestationV1 {
20
30
  /** The disputed receipt. */
21
31
  receiptHash: Sha256;
22
32
  outcome: WitnessOutcome;
33
+ /** Whether the relationship RECORD was authenticated (an injected `authenticateRecord` port said yes).
34
+ * `false` = the record is a bare hash chain: linkage verified, authorship not. The receipt is ALWAYS
35
+ * signature-verified against its expected signer before any outcome other than `insufficient_evidence`. */
36
+ recordAuthenticated: boolean;
23
37
  /** Whether an OPENED detail (witness-escrow release) was part of the walk. */
24
38
  checkedDetail: boolean;
25
39
  /** Exact time — a dispute-grade artifact, deliberately not bucketed. */
@@ -30,12 +44,18 @@ export interface WitnessAttestationV1 {
30
44
  }
31
45
  export interface DisputeEvaluation {
32
46
  outcome: WitnessOutcome;
33
- /** The typed reason trail for `insufficient_evidence`; 'ok' otherwise. */
34
- evidenceReason: 'ok' | 'record_invalid' | 'receipt_invalid' | 'receipt_not_in_record' | 'detail_mismatch';
47
+ /** The typed reason trail for `insufficient_evidence` / `undetermined`; 'ok' otherwise. */
48
+ evidenceReason: 'ok' | 'record_invalid' | 'record_not_authentic' | 'receipt_verifier_missing' | 'receipt_invalid' | 'receipt_not_in_record' | 'detail_mismatch' | 'revocation_unattributable' | 'scope_unknown';
49
+ /** Why the receipt was refused as input (the verification-receipts reason), when it was. */
50
+ receiptReason?: ReceiptVerifyReason;
51
+ /** Whether the record's authorship was checked (see `WitnessAttestationV1.recordAuthenticated`). */
52
+ recordAuthenticated: boolean;
35
53
  /** Set when the chain verified. */
36
54
  recordHead?: Hex;
37
55
  /** The record seq of the receipt's entry, when found. */
38
56
  receiptSeq?: number;
57
+ /** The record seq of the revocation that decided a revocation outcome. */
58
+ revocationSeq?: number;
39
59
  }
40
60
  /** Deterministic JSON (sorted keys, undefined dropped) — the repo canonical form. */
41
61
  export declare function canonicalize(v: unknown): string;
@@ -47,14 +67,27 @@ export interface EvaluateDisputeInput {
47
67
  /** The opened detail — present ONLY when released to the witness
48
68
  * (DecryptGrant `releaseMode: 'witness_escrow'`, spec 307 W2). */
49
69
  detail?: VerificationReceiptDetailV1;
50
- /** Injected receipt-signature check (same port as verification-receipts). */
51
- verifyReceiptSignature?: ReceiptSignatureVerifier;
70
+ /** REQUIRED: the injected receipt-signature check (same port as verification-receipts). Without it the
71
+ * receipt is refused as input — a witness does not attest over a receipt nobody signed (DATA-5). */
72
+ verifyReceiptSignature: ReceiptSignatureVerifier;
73
+ /** REQUIRED: the verifier the witness expects signed the receipt (from the relationship's agreement,
74
+ * never from the receipt's own `proof.signer`). */
75
+ expectedReceiptSigner: string;
76
+ /** Optional: authenticate the record's authorship against its verified head (anchored head, party
77
+ * signatures — the consumer's mechanism). Supplied and false → `record_not_authentic`. Absent → the walk
78
+ * proceeds and the attestation says `recordAuthenticated: false`. */
79
+ authenticateRecord?: (head: Hex, record: readonly RelationshipRecordEntryV1[]) => Promise<boolean>;
80
+ /** Open a pre-2026-11-10 receipt's detail (bound only by principal / args / day). Default: refused. */
81
+ acceptLegacyPartialDetail?: boolean;
52
82
  }
53
83
  /**
54
84
  * The deterministic walk (spec 307 §design). Total + ordered — two witnesses
55
85
  * given identical inputs MUST produce the identical outcome (INV-307-1):
56
- * evidence integrity → record membership → revocation timeline → scope.
57
- * Every unverifiable input maps to `insufficient_evidence` (INV-307-2).
86
+ * record chain → record authorship (when a port is given) → receipt SIGNATURE
87
+ * → record membership → detail opening → revocation timeline FOR THIS GRANT →
88
+ * scope. Every unverifiable input maps to `insufficient_evidence` (INV-307-2);
89
+ * verified-but-undecidable evidence maps to `undetermined`; neither is ever a
90
+ * negative finding.
58
91
  */
59
92
  export declare function evaluateDispute(input: EvaluateDisputeInput): Promise<DisputeEvaluation>;
60
93
  export interface MintWitnessAttestationInput {
@@ -69,11 +102,16 @@ export interface MintWitnessAttestationInput {
69
102
  export declare function mintWitnessAttestation(input: MintWitnessAttestationInput, opts?: {
70
103
  sign?: (attestationHash: Sha256) => Promise<WitnessProof>;
71
104
  }): Promise<WitnessAttestationV1>;
72
- export type AttestationVerifyReason = 'ok' | 'wrong_type' | 'hash_mismatch' | 'proof_missing' | 'proof_invalid';
73
- /** Standalone attestation check (hash recompute + injected proof port). */
74
- export declare function verifyWitnessAttestation(attestation: WitnessAttestationV1, opts?: {
75
- verifySignature?: (attestationHash: Sha256, proof: WitnessProof) => Promise<boolean>;
76
- requireProof?: boolean;
105
+ export type AttestationVerifyReason = 'ok' | 'wrong_type' | 'hash_mismatch' | 'verifier_missing' | 'witness_mismatch' | 'proof_missing' | 'proof_malformed' | 'proof_invalid';
106
+ export type WitnessSignatureVerifier = (attestationHash: Sha256, proof: WitnessProof, expectedWitness: string) => Promise<boolean>;
107
+ /**
108
+ * Verify an attestation: hash recompute, the body's `witness` equals the EXPECTED witness, and the proof
109
+ * verifies against it through the injected port. Both inputs are REQUIRED for `valid: true` — an unsigned
110
+ * attestation, a `proof: {}`, or a call with no verifier is not valid (the same rule as DATA-8).
111
+ */
112
+ export declare function verifyWitnessAttestation(attestation: WitnessAttestationV1, opts: {
113
+ verifySignature: WitnessSignatureVerifier;
114
+ expectedWitness: string;
77
115
  }): Promise<{
78
116
  valid: boolean;
79
117
  reason: AttestationVerifyReason;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -24,47 +24,90 @@ async function sha256Hex(input) {
24
24
  .join('');
25
25
  return `sha256:${hex}`;
26
26
  }
27
+ const eqHex = (a, b) => a.toLowerCase() === b.toLowerCase();
27
28
  /**
28
29
  * The deterministic walk (spec 307 §design). Total + ordered — two witnesses
29
30
  * given identical inputs MUST produce the identical outcome (INV-307-1):
30
- * evidence integrity → record membership → revocation timeline → scope.
31
- * Every unverifiable input maps to `insufficient_evidence` (INV-307-2).
31
+ * record chain → record authorship (when a port is given) → receipt SIGNATURE
32
+ * → record membership → detail opening → revocation timeline FOR THIS GRANT →
33
+ * scope. Every unverifiable input maps to `insufficient_evidence` (INV-307-2);
34
+ * verified-but-undecidable evidence maps to `undetermined`; neither is ever a
35
+ * negative finding.
32
36
  */
33
37
  export async function evaluateDispute(input) {
34
38
  // 1. The record chain must verify end-to-end.
35
39
  const chain = verifyRecordChain(input.record);
36
40
  if (!chain.valid || !chain.head)
37
- return { outcome: 'insufficient_evidence', evidenceReason: 'record_invalid' };
38
- // 2. The receipt must verify (hash + proof when a verifier is supplied).
39
- const receiptOk = await verifyVerificationReceipt(input.receipt, {
40
- ...(input.verifyReceiptSignature ? { verifySignature: input.verifyReceiptSignature, requireProof: true } : {}),
41
- });
41
+ return { outcome: 'insufficient_evidence', evidenceReason: 'record_invalid', recordAuthenticated: false };
42
+ const head = chain.head;
43
+ // 1b. Record authorship — only when the consumer has a mechanism; the result is carried either way.
44
+ let recordAuthenticated = false;
45
+ if (input.authenticateRecord) {
46
+ let ok = false;
47
+ try {
48
+ ok = (await input.authenticateRecord(head, input.record)) === true;
49
+ }
50
+ catch {
51
+ ok = false;
52
+ }
53
+ if (!ok)
54
+ return { outcome: 'insufficient_evidence', evidenceReason: 'record_not_authentic', recordAuthenticated: false, recordHead: head };
55
+ recordAuthenticated = true;
56
+ }
57
+ const base = { recordAuthenticated, recordHead: head };
58
+ // 2. The receipt must VERIFY: hash, expected signer, signature. No verifier = refused, never "accepted on hash".
59
+ if (typeof input.verifyReceiptSignature !== 'function' || !input.expectedReceiptSigner)
60
+ return { outcome: 'insufficient_evidence', evidenceReason: 'receipt_verifier_missing', ...base };
61
+ const verifyOpts = { verifySignature: input.verifyReceiptSignature, expectedSigner: input.expectedReceiptSigner };
62
+ const receiptOk = await verifyVerificationReceipt(input.receipt, verifyOpts);
42
63
  if (!receiptOk.valid)
43
- return { outcome: 'insufficient_evidence', evidenceReason: 'receipt_invalid', recordHead: chain.head };
64
+ return { outcome: 'insufficient_evidence', evidenceReason: 'receipt_invalid', receiptReason: receiptOk.reason, ...base };
44
65
  // 3. The receipt must BE an entry of this record.
45
66
  const entry = input.record.find((e) => e.kind === 'verification_receipt' && e.artifactCommitment === input.receipt.receiptHash);
46
67
  if (!entry)
47
- return { outcome: 'insufficient_evidence', evidenceReason: 'receipt_not_in_record', recordHead: chain.head };
68
+ return { outcome: 'insufficient_evidence', evidenceReason: 'receipt_not_in_record', ...base };
69
+ const at = { ...base, receiptSeq: entry.seq };
48
70
  // 4. A supplied detail must open the receipt — a lying detail is not evidence.
49
71
  if (input.detail) {
50
- const opened = await openReceipt(input.receipt, input.detail);
72
+ const opened = await openReceipt(input.receipt, input.detail, {
73
+ ...verifyOpts,
74
+ acceptLegacyPartialBinding: input.acceptLegacyPartialDetail === true,
75
+ });
51
76
  if (!opened.valid)
52
- return { outcome: 'insufficient_evidence', evidenceReason: 'detail_mismatch', recordHead: chain.head, receiptSeq: entry.seq };
77
+ return { outcome: 'insufficient_evidence', evidenceReason: 'detail_mismatch', receiptReason: opened.reason, ...at };
78
+ }
79
+ // 5. Revocation timeline — ONLY revocations of the grant this receipt was issued under
80
+ // (`artifactCommitment` = the revoked delegation's hash), and only those positioned BEFORE the
81
+ // receipt's entry: a receipt under grant A issued before A's revocation, and any receipt under grant B,
82
+ // are untouched.
83
+ const priorRevocations = input.record.filter((e) => e.kind === 'revocation_assertion' && e.seq < entry.seq);
84
+ const grant = input.receipt.delegationHash;
85
+ if (grant) {
86
+ const revocation = priorRevocations.find((e) => eqHex(e.artifactCommitment, grant));
87
+ if (revocation) {
88
+ const outcome = input.receipt.decision === 'deny' ? 'revoked_before_execution' : 'stale_status_used';
89
+ return { outcome, evidenceReason: 'ok', ...at, revocationSeq: revocation.seq };
90
+ }
53
91
  }
54
- // 5. Revocation timeline: the earliest revocation_assertion BEFORE the
55
- // receipt's entry decides between the two revocation outcomes.
56
- const priorRevocation = input.record.some((e) => e.kind === 'revocation_assertion' && e.seq < entry.seq);
57
- if (priorRevocation) {
58
- const outcome = input.receipt.decision === 'deny' ? 'revoked_before_execution' : 'stale_status_used';
59
- return { outcome, evidenceReason: 'ok', recordHead: chain.head, receiptSeq: entry.seq };
92
+ else if (priorRevocations.length > 0) {
93
+ // Revocations precede the receipt and the receipt names no grant: which grant it ran under is unknown.
94
+ // Neither condemn it nor clear it.
95
+ return { outcome: 'undetermined', evidenceReason: 'revocation_unattributable', ...at };
60
96
  }
61
97
  // A receipt that itself recorded 'revoked' yet ALLOWED is the stale-status
62
- // contradiction even without a record entry.
98
+ // contradiction even without a record entry (its own signed statement about its own grant).
63
99
  if (input.receipt.status.revocation === 'revoked' && input.receipt.decision === 'allow')
64
- return { outcome: 'stale_status_used', evidenceReason: 'ok', recordHead: chain.head, receiptSeq: entry.seq };
65
- // 6. Scope: the receipt's own attested verdict.
66
- const outcome = input.receipt.scopeDecision === 'in_scope' ? 'in_scope' : 'out_of_scope';
67
- return { outcome, evidenceReason: 'ok', recordHead: chain.head, receiptSeq: entry.seq };
100
+ return { outcome: 'stale_status_used', evidenceReason: 'ok', ...at };
101
+ // 6. Scope: the receipt's own attested verdict, each value under its own name.
102
+ switch (input.receipt.scopeDecision) {
103
+ case 'in_scope':
104
+ case 'out_of_scope':
105
+ case 'deferred':
106
+ case 'not_evaluated':
107
+ return { outcome: input.receipt.scopeDecision, evidenceReason: 'ok', ...at };
108
+ default:
109
+ return { outcome: 'undetermined', evidenceReason: 'scope_unknown', ...at };
110
+ }
68
111
  }
69
112
  /** Assemble + hash (+ optionally sign) the attestation over a completed walk. */
70
113
  export async function mintWitnessAttestation(input, opts) {
@@ -78,6 +121,7 @@ export async function mintWitnessAttestation(input, opts) {
78
121
  recordHead: input.evaluation.recordHead ?? `0x${'0'.repeat(64)}`,
79
122
  receiptHash: input.receipt.receiptHash,
80
123
  outcome: input.evaluation.outcome,
124
+ recordAuthenticated: input.evaluation.recordAuthenticated === true,
81
125
  checkedDetail: input.checkedDetail,
82
126
  attestedAt: input.attestedAt,
83
127
  };
@@ -87,19 +131,32 @@ export async function mintWitnessAttestation(input, opts) {
87
131
  attestation.proof = await opts.sign(attestationHash);
88
132
  return attestation;
89
133
  }
90
- /** Standalone attestation check (hash recompute + injected proof port). */
134
+ /**
135
+ * Verify an attestation: hash recompute, the body's `witness` equals the EXPECTED witness, and the proof
136
+ * verifies against it through the injected port. Both inputs are REQUIRED for `valid: true` — an unsigned
137
+ * attestation, a `proof: {}`, or a call with no verifier is not valid (the same rule as DATA-8).
138
+ */
91
139
  export async function verifyWitnessAttestation(attestation, opts) {
92
- if (attestation.type !== 'WitnessAttestationV1')
140
+ if (!attestation || attestation.type !== 'WitnessAttestationV1')
93
141
  return { valid: false, reason: 'wrong_type' };
94
142
  const { attestationHash, proof, ...body } = attestation;
95
143
  if ((await sha256Hex(canonicalize(body))) !== attestationHash)
96
144
  return { valid: false, reason: 'hash_mismatch' };
97
- if (opts?.requireProof || opts?.verifySignature) {
98
- if (!proof)
99
- return { valid: false, reason: 'proof_missing' };
100
- if (opts.verifySignature && !(await opts.verifySignature(attestationHash, proof)))
101
- return { valid: false, reason: 'proof_invalid' };
145
+ if (typeof opts?.verifySignature !== 'function' || !opts.expectedWitness)
146
+ return { valid: false, reason: 'verifier_missing' };
147
+ if (typeof attestation.witness !== 'string' || attestation.witness.toLowerCase() !== opts.expectedWitness.toLowerCase())
148
+ return { valid: false, reason: 'witness_mismatch' };
149
+ if (proof === undefined || proof === null)
150
+ return { valid: false, reason: 'proof_missing' };
151
+ if (typeof proof !== 'object' || typeof proof.type !== 'string' || !proof.type || typeof proof.signature !== 'string' || !proof.signature)
152
+ return { valid: false, reason: 'proof_malformed' };
153
+ let ok = false;
154
+ try {
155
+ ok = (await opts.verifySignature(attestationHash, proof, opts.expectedWitness)) === true;
156
+ }
157
+ catch {
158
+ ok = false;
102
159
  }
103
- return { valid: true, reason: 'ok' };
160
+ return ok ? { valid: true, reason: 'ok' } : { valid: false, reason: 'proof_invalid' };
104
161
  }
105
162
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agenticprimitives/witness",
3
- "version": "0.0.0-alpha.31",
3
+ "version": "0.0.0-alpha.32",
4
4
  "description": "Evidentiary dispute attestation (spec 307 / G-11): deterministically walk a relationship record + verification receipt and attest in_scope / out_of_scope / revoked_before_execution / stale_status_used / insufficient_evidence. Facts, never remedies.",
5
5
  "homepage": "https://agenticprimitives.dev",
6
6
  "bugs": {
@@ -36,7 +36,7 @@
36
36
  "devDependencies": {
37
37
  "vitest": "^4.1.11",
38
38
  "@types/node": "^22.7.0",
39
- "@agenticprimitives/types": "1.0.0-alpha.46"
39
+ "@agenticprimitives/types": "1.0.0-alpha.47"
40
40
  },
41
41
  "keywords": [
42
42
  "agentic",
@@ -52,11 +52,11 @@
52
52
  "agentic-trust"
53
53
  ],
54
54
  "dependencies": {
55
- "@agenticprimitives/agreements": "0.0.0-alpha.43",
56
- "@agenticprimitives/verification-receipts": "0.0.0-alpha.21"
55
+ "@agenticprimitives/agreements": "0.0.0-alpha.44",
56
+ "@agenticprimitives/verification-receipts": "0.0.0-alpha.22"
57
57
  },
58
58
  "peerDependencies": {
59
- "@agenticprimitives/types": "^1.0.0-alpha.46"
59
+ "@agenticprimitives/types": "^1.0.0-alpha.47"
60
60
  },
61
61
  "scripts": {
62
62
  "build": "tsc -p tsconfig.build.json",