agentfootprint 10.1.0 → 10.2.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.
Files changed (215) hide show
  1. package/CAPABILITIES.md +1 -0
  2. package/dist/adapters/llm/AnthropicProvider.js +17 -1
  3. package/dist/adapters/llm/AnthropicProvider.js.map +1 -1
  4. package/dist/adapters/llm/anthropicMessageProjection.js +26 -1
  5. package/dist/adapters/llm/anthropicMessageProjection.js.map +1 -1
  6. package/dist/adapters/llm/anthropicMessagesWire.js +42 -37
  7. package/dist/adapters/llm/anthropicMessagesWire.js.map +1 -1
  8. package/dist/adapters/llm/anthropicReplayLayout.js +63 -12
  9. package/dist/adapters/llm/anthropicReplayLayout.js.map +1 -1
  10. package/dist/adapters/llm/anthropicToolArguments.js +122 -0
  11. package/dist/adapters/llm/anthropicToolArguments.js.map +1 -0
  12. package/dist/adapters/types.js.map +1 -1
  13. package/dist/answer-validation/validate.js +7 -107
  14. package/dist/answer-validation/validate.js.map +1 -1
  15. package/dist/core/Agent.js +5 -0
  16. package/dist/core/Agent.js.map +1 -1
  17. package/dist/core/agent/arguments/resolve.js +4 -0
  18. package/dist/core/agent/arguments/resolve.js.map +1 -1
  19. package/dist/core/agent/arguments/subflow.js +1 -0
  20. package/dist/core/agent/arguments/subflow.js.map +1 -1
  21. package/dist/core/agent/findings/types.js.map +1 -1
  22. package/dist/core/agent/findings/verificationCheck.js +99 -0
  23. package/dist/core/agent/findings/verificationCheck.js.map +1 -0
  24. package/dist/core/agent/findings/verificationCheckpoint.js +110 -0
  25. package/dist/core/agent/findings/verificationCheckpoint.js.map +1 -0
  26. package/dist/core/agent/findings/verificationConfig.js +119 -0
  27. package/dist/core/agent/findings/verificationConfig.js.map +1 -0
  28. package/dist/core/agent/findings/verificationRow.js +181 -0
  29. package/dist/core/agent/findings/verificationRow.js.map +1 -0
  30. package/dist/core/agent/findings/verificationState.js +152 -0
  31. package/dist/core/agent/findings/verificationState.js.map +1 -0
  32. package/dist/core/agent/findings/verificationTypes.js +23 -0
  33. package/dist/core/agent/findings/verificationTypes.js.map +1 -0
  34. package/dist/core/agent/outputEnforcement.js +5 -0
  35. package/dist/core/agent/outputEnforcement.js.map +1 -1
  36. package/dist/core/agent/stages/toolCalls.js +20 -3
  37. package/dist/core/agent/stages/toolCalls.js.map +1 -1
  38. package/dist/core/agent/toolArgsValidation.js +12 -1
  39. package/dist/core/agent/toolArgsValidation.js.map +1 -1
  40. package/dist/core/runCheckpoint.js +45 -4
  41. package/dist/core/runCheckpoint.js.map +1 -1
  42. package/dist/esm/adapters/llm/AnthropicProvider.js +17 -1
  43. package/dist/esm/adapters/llm/AnthropicProvider.js.map +1 -1
  44. package/dist/esm/adapters/llm/anthropicMessageProjection.js +26 -1
  45. package/dist/esm/adapters/llm/anthropicMessageProjection.js.map +1 -1
  46. package/dist/esm/adapters/llm/anthropicMessagesWire.d.ts +9 -3
  47. package/dist/esm/adapters/llm/anthropicMessagesWire.js +42 -37
  48. package/dist/esm/adapters/llm/anthropicMessagesWire.js.map +1 -1
  49. package/dist/esm/adapters/llm/anthropicReplayLayout.d.ts +1 -1
  50. package/dist/esm/adapters/llm/anthropicReplayLayout.js +63 -12
  51. package/dist/esm/adapters/llm/anthropicReplayLayout.js.map +1 -1
  52. package/dist/esm/adapters/llm/anthropicToolArguments.d.ts +31 -0
  53. package/dist/esm/adapters/llm/anthropicToolArguments.js +118 -0
  54. package/dist/esm/adapters/llm/anthropicToolArguments.js.map +1 -0
  55. package/dist/esm/adapters/types.d.ts +17 -0
  56. package/dist/esm/adapters/types.js.map +1 -1
  57. package/dist/esm/answer-validation/validate.js +1 -101
  58. package/dist/esm/answer-validation/validate.js.map +1 -1
  59. package/dist/esm/core/Agent.js +5 -0
  60. package/dist/esm/core/Agent.js.map +1 -1
  61. package/dist/esm/core/agent/arguments/resolve.d.ts +1 -0
  62. package/dist/esm/core/agent/arguments/resolve.js +4 -0
  63. package/dist/esm/core/agent/arguments/resolve.js.map +1 -1
  64. package/dist/esm/core/agent/arguments/subflow.js +1 -0
  65. package/dist/esm/core/agent/arguments/subflow.js.map +1 -1
  66. package/dist/esm/core/agent/findings/types.d.ts +2 -1
  67. package/dist/esm/core/agent/findings/types.js.map +1 -1
  68. package/dist/esm/core/agent/findings/verificationCheck.d.ts +24 -0
  69. package/dist/esm/core/agent/findings/verificationCheck.js +95 -0
  70. package/dist/esm/core/agent/findings/verificationCheck.js.map +1 -0
  71. package/dist/esm/core/agent/findings/verificationCheckpoint.d.ts +10 -0
  72. package/dist/esm/core/agent/findings/verificationCheckpoint.js +104 -0
  73. package/dist/esm/core/agent/findings/verificationCheckpoint.js.map +1 -0
  74. package/dist/esm/core/agent/findings/verificationConfig.d.ts +30 -0
  75. package/dist/esm/core/agent/findings/verificationConfig.js +115 -0
  76. package/dist/esm/core/agent/findings/verificationConfig.js.map +1 -0
  77. package/dist/esm/core/agent/findings/verificationRow.d.ts +16 -0
  78. package/dist/esm/core/agent/findings/verificationRow.js +174 -0
  79. package/dist/esm/core/agent/findings/verificationRow.js.map +1 -0
  80. package/dist/esm/core/agent/findings/verificationState.d.ts +39 -0
  81. package/dist/esm/core/agent/findings/verificationState.js +143 -0
  82. package/dist/esm/core/agent/findings/verificationState.js.map +1 -0
  83. package/dist/esm/core/agent/findings/verificationTypes.d.ts +55 -0
  84. package/dist/esm/core/agent/findings/verificationTypes.js +20 -0
  85. package/dist/esm/core/agent/findings/verificationTypes.js.map +1 -0
  86. package/dist/esm/core/agent/outputEnforcement.js +5 -0
  87. package/dist/esm/core/agent/outputEnforcement.js.map +1 -1
  88. package/dist/esm/core/agent/stages/toolCalls.js +21 -4
  89. package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
  90. package/dist/esm/core/agent/toolArgsValidation.d.ts +2 -0
  91. package/dist/esm/core/agent/toolArgsValidation.js +10 -0
  92. package/dist/esm/core/agent/toolArgsValidation.js.map +1 -1
  93. package/dist/esm/core/agent/types.d.ts +1 -0
  94. package/dist/esm/core/runCheckpoint.d.ts +11 -1
  95. package/dist/esm/core/runCheckpoint.js +45 -4
  96. package/dist/esm/core/runCheckpoint.js.map +1 -1
  97. package/dist/esm/integrity/claim-binding/admit.d.ts +12 -0
  98. package/dist/esm/integrity/claim-binding/admit.js +204 -0
  99. package/dist/esm/integrity/claim-binding/admit.js.map +1 -0
  100. package/dist/esm/integrity/claim-binding/bindEvidence.d.ts +8 -0
  101. package/dist/esm/integrity/claim-binding/bindEvidence.js +144 -0
  102. package/dist/esm/integrity/claim-binding/bindEvidence.js.map +1 -0
  103. package/dist/esm/integrity/claim-binding/capture.d.ts +25 -0
  104. package/dist/esm/integrity/claim-binding/capture.js +143 -0
  105. package/dist/esm/integrity/claim-binding/capture.js.map +1 -0
  106. package/dist/esm/integrity/claim-binding/scope.d.ts +23 -0
  107. package/dist/esm/integrity/claim-binding/scope.js +149 -0
  108. package/dist/esm/integrity/claim-binding/scope.js.map +1 -0
  109. package/dist/esm/integrity/claim-binding/types.d.ts +99 -0
  110. package/dist/esm/integrity/claim-binding/types.js +23 -0
  111. package/dist/esm/integrity/claim-binding/types.js.map +1 -0
  112. package/dist/esm/integrity/unsupported-claim/check.js +33 -55
  113. package/dist/esm/integrity/unsupported-claim/check.js.map +1 -1
  114. package/dist/esm/integrity/unsupported-claim/evaluate.d.ts +18 -0
  115. package/dist/esm/integrity/unsupported-claim/evaluate.js +34 -0
  116. package/dist/esm/integrity/unsupported-claim/evaluate.js.map +1 -0
  117. package/dist/esm/lib/boundedJson.d.ts +3 -0
  118. package/dist/esm/lib/boundedJson.js +104 -0
  119. package/dist/esm/lib/boundedJson.js.map +1 -0
  120. package/dist/esm/lib/time-travel/receipt.js +4 -0
  121. package/dist/esm/lib/time-travel/receipt.js.map +1 -1
  122. package/dist/esm/memory/identity/encode.d.ts +7 -0
  123. package/dist/esm/memory/identity/encode.js +14 -0
  124. package/dist/esm/memory/identity/encode.js.map +1 -1
  125. package/dist/esm/redaction/conversation.js +3 -0
  126. package/dist/esm/redaction/conversation.js.map +1 -1
  127. package/dist/esm/redaction/knownStrings.js +8 -0
  128. package/dist/esm/redaction/knownStrings.js.map +1 -1
  129. package/dist/esm/thinking/replay.d.ts +6 -1
  130. package/dist/esm/thinking/replay.js.map +1 -1
  131. package/dist/integrity/claim-binding/admit.js +211 -0
  132. package/dist/integrity/claim-binding/admit.js.map +1 -0
  133. package/dist/integrity/claim-binding/bindEvidence.js +148 -0
  134. package/dist/integrity/claim-binding/bindEvidence.js.map +1 -0
  135. package/dist/integrity/claim-binding/capture.js +152 -0
  136. package/dist/integrity/claim-binding/capture.js.map +1 -0
  137. package/dist/integrity/claim-binding/scope.js +159 -0
  138. package/dist/integrity/claim-binding/scope.js.map +1 -0
  139. package/dist/integrity/claim-binding/types.js +26 -0
  140. package/dist/integrity/claim-binding/types.js.map +1 -0
  141. package/dist/integrity/unsupported-claim/check.js +32 -54
  142. package/dist/integrity/unsupported-claim/check.js.map +1 -1
  143. package/dist/integrity/unsupported-claim/evaluate.js +38 -0
  144. package/dist/integrity/unsupported-claim/evaluate.js.map +1 -0
  145. package/dist/lib/boundedJson.js +109 -0
  146. package/dist/lib/boundedJson.js.map +1 -0
  147. package/dist/lib/time-travel/receipt.js +4 -0
  148. package/dist/lib/time-travel/receipt.js.map +1 -1
  149. package/dist/memory/identity/encode.js +16 -1
  150. package/dist/memory/identity/encode.js.map +1 -1
  151. package/dist/redaction/conversation.js +3 -0
  152. package/dist/redaction/conversation.js.map +1 -1
  153. package/dist/redaction/knownStrings.js +8 -0
  154. package/dist/redaction/knownStrings.js.map +1 -1
  155. package/dist/thinking/replay.js.map +1 -1
  156. package/dist/types/adapters/llm/AnthropicProvider.d.ts.map +1 -1
  157. package/dist/types/adapters/llm/anthropicMessageProjection.d.ts.map +1 -1
  158. package/dist/types/adapters/llm/anthropicMessagesWire.d.ts +9 -3
  159. package/dist/types/adapters/llm/anthropicMessagesWire.d.ts.map +1 -1
  160. package/dist/types/adapters/llm/anthropicReplayLayout.d.ts +1 -1
  161. package/dist/types/adapters/llm/anthropicReplayLayout.d.ts.map +1 -1
  162. package/dist/types/adapters/llm/anthropicToolArguments.d.ts +32 -0
  163. package/dist/types/adapters/llm/anthropicToolArguments.d.ts.map +1 -0
  164. package/dist/types/adapters/types.d.ts +17 -0
  165. package/dist/types/adapters/types.d.ts.map +1 -1
  166. package/dist/types/answer-validation/validate.d.ts.map +1 -1
  167. package/dist/types/core/Agent.d.ts.map +1 -1
  168. package/dist/types/core/agent/arguments/resolve.d.ts +1 -0
  169. package/dist/types/core/agent/arguments/resolve.d.ts.map +1 -1
  170. package/dist/types/core/agent/arguments/subflow.d.ts.map +1 -1
  171. package/dist/types/core/agent/findings/types.d.ts +2 -1
  172. package/dist/types/core/agent/findings/types.d.ts.map +1 -1
  173. package/dist/types/core/agent/findings/verificationCheck.d.ts +25 -0
  174. package/dist/types/core/agent/findings/verificationCheck.d.ts.map +1 -0
  175. package/dist/types/core/agent/findings/verificationCheckpoint.d.ts +11 -0
  176. package/dist/types/core/agent/findings/verificationCheckpoint.d.ts.map +1 -0
  177. package/dist/types/core/agent/findings/verificationConfig.d.ts +31 -0
  178. package/dist/types/core/agent/findings/verificationConfig.d.ts.map +1 -0
  179. package/dist/types/core/agent/findings/verificationRow.d.ts +17 -0
  180. package/dist/types/core/agent/findings/verificationRow.d.ts.map +1 -0
  181. package/dist/types/core/agent/findings/verificationState.d.ts +40 -0
  182. package/dist/types/core/agent/findings/verificationState.d.ts.map +1 -0
  183. package/dist/types/core/agent/findings/verificationTypes.d.ts +56 -0
  184. package/dist/types/core/agent/findings/verificationTypes.d.ts.map +1 -0
  185. package/dist/types/core/agent/outputEnforcement.d.ts.map +1 -1
  186. package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
  187. package/dist/types/core/agent/toolArgsValidation.d.ts +2 -0
  188. package/dist/types/core/agent/toolArgsValidation.d.ts.map +1 -1
  189. package/dist/types/core/agent/types.d.ts +1 -0
  190. package/dist/types/core/agent/types.d.ts.map +1 -1
  191. package/dist/types/core/runCheckpoint.d.ts +11 -1
  192. package/dist/types/core/runCheckpoint.d.ts.map +1 -1
  193. package/dist/types/integrity/claim-binding/admit.d.ts +13 -0
  194. package/dist/types/integrity/claim-binding/admit.d.ts.map +1 -0
  195. package/dist/types/integrity/claim-binding/bindEvidence.d.ts +9 -0
  196. package/dist/types/integrity/claim-binding/bindEvidence.d.ts.map +1 -0
  197. package/dist/types/integrity/claim-binding/capture.d.ts +26 -0
  198. package/dist/types/integrity/claim-binding/capture.d.ts.map +1 -0
  199. package/dist/types/integrity/claim-binding/scope.d.ts +24 -0
  200. package/dist/types/integrity/claim-binding/scope.d.ts.map +1 -0
  201. package/dist/types/integrity/claim-binding/types.d.ts +100 -0
  202. package/dist/types/integrity/claim-binding/types.d.ts.map +1 -0
  203. package/dist/types/integrity/unsupported-claim/check.d.ts.map +1 -1
  204. package/dist/types/integrity/unsupported-claim/evaluate.d.ts +19 -0
  205. package/dist/types/integrity/unsupported-claim/evaluate.d.ts.map +1 -0
  206. package/dist/types/lib/boundedJson.d.ts +4 -0
  207. package/dist/types/lib/boundedJson.d.ts.map +1 -0
  208. package/dist/types/lib/time-travel/receipt.d.ts.map +1 -1
  209. package/dist/types/memory/identity/encode.d.ts +7 -0
  210. package/dist/types/memory/identity/encode.d.ts.map +1 -1
  211. package/dist/types/redaction/conversation.d.ts.map +1 -1
  212. package/dist/types/redaction/knownStrings.d.ts.map +1 -1
  213. package/dist/types/thinking/replay.d.ts +6 -1
  214. package/dist/types/thinking/replay.d.ts.map +1 -1
  215. package/package.json +3 -2
@@ -0,0 +1,16 @@
1
+ import type { ResultIdentity } from '../../../integrity/claim-binding/types.js';
2
+ import { type ClaimVerificationRow } from './verificationTypes.js';
3
+ /** Reuse receipt bounds; declared values have the compact binding-request cap. */
4
+ export declare const VERIFICATION_LIMITS: Readonly<{
5
+ rowBytes: number;
6
+ valueBytes: 8192;
7
+ identityText: number;
8
+ }>;
9
+ /** A runtime-reserved claim occurrence cannot collide with a result occurrence. */
10
+ export declare function claimIdentityOf(raw: ResultIdentity): string;
11
+ /** Canonical claim tuple reader, shared with checkpoint lineage/counter checks. */
12
+ export declare function readClaimIdentity(value: unknown): ResultIdentity;
13
+ /** Validate the recorded protocol without evaluating whether its value agrees. */
14
+ export declare function readClaimVerificationRow(raw: unknown): ClaimVerificationRow;
15
+ /** Non-throwing checkpoint union guard; admission uses the same strict reader. */
16
+ export declare function isClaimVerificationRow(raw: unknown): raw is ClaimVerificationRow;
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Strict saved claim-verification protocol. Role: validate and detach a recorded
3
+ * check, never reconstruct evidence or rerun its checker. Storage authenticity
4
+ * and caller authorization are the surrounding checkpoint owner's responsibility.
5
+ */
6
+ import { copyJson, ownData } from '../../../lib/boundedJson.js';
7
+ import { canonicalJson } from '../../../lib/canonicalJson.js';
8
+ import { decodePresentIdentityField, encodeIdentityField, } from '../../../memory/identity/encode.js';
9
+ import { comparableValueOf, participates } from '../../../integrity/assertion/types.js';
10
+ import { BINDING_LIMITS, boundedText } from '../../../integrity/claim-binding/scope.js';
11
+ import { validateCoverage } from '../../../integrity/claim-binding/admit.js';
12
+ import { readResultIdentity } from '../../../integrity/claim-binding/capture.js';
13
+ import { periodProblem } from '../coverage/period.js';
14
+ import { STANDING_VALUES } from './types.js';
15
+ import { VERIFICATION_UNVERIFIED_REASONS } from './verificationTypes.js';
16
+ /** Reuse receipt bounds; declared values have the compact binding-request cap. */
17
+ export const VERIFICATION_LIMITS = Object.freeze({
18
+ rowBytes: BINDING_LIMITS.resultBytes,
19
+ valueBytes: BINDING_LIMITS.scopeBytes,
20
+ identityText: BINDING_LIMITS.resultIdText + 'claim-verification'.length - 'claim-result'.length,
21
+ });
22
+ /** A runtime-reserved claim occurrence cannot collide with a result occurrence. */
23
+ export function claimIdentityOf(raw) {
24
+ const identity = ownData(raw, ['namespace', 'runId', 'ordinal']);
25
+ if (!boundedText(identity.namespace) ||
26
+ !boundedText(identity.runId) ||
27
+ typeof identity.ordinal !== 'number' ||
28
+ !Number.isSafeInteger(identity.ordinal) ||
29
+ identity.ordinal < 1)
30
+ throw new TypeError('Invalid runtime claim identity.');
31
+ return `claim-verification/${encodeIdentityField(identity.namespace)}/${encodeIdentityField(identity.runId)}/${identity.ordinal}`;
32
+ }
33
+ /** Canonical claim tuple reader, shared with checkpoint lineage/counter checks. */
34
+ export function readClaimIdentity(value) {
35
+ if (typeof value !== 'string' || value.length > VERIFICATION_LIMITS.identityText)
36
+ throw new TypeError('Invalid saved claim identity.');
37
+ const parts = value.split('/');
38
+ if (parts.length !== 4 || parts[0] !== 'claim-verification')
39
+ throw new TypeError('Invalid saved claim identity.');
40
+ const identity = {
41
+ namespace: decodePresentIdentityField(parts[1]),
42
+ runId: decodePresentIdentityField(parts[2]),
43
+ ordinal: Number(parts[3]),
44
+ };
45
+ if (value !== claimIdentityOf(identity))
46
+ throw new TypeError('Noncanonical saved claim identity.');
47
+ return Object.freeze(identity);
48
+ }
49
+ function integer(value, minimum) {
50
+ return typeof value === 'number' && Number.isSafeInteger(value) && value >= minimum;
51
+ }
52
+ function eligibleAssertion(raw) {
53
+ const assertion = ownData(raw, ['subject', 'predicate', 'value', 'stratum', 'provenance']);
54
+ const subject = ownData(assertion.subject, ['kind', 'id']);
55
+ const comparable = comparableValueOf(assertion.value);
56
+ if (subject.kind !== 'entity' ||
57
+ !boundedText(subject.id) ||
58
+ !boundedText(assertion.predicate) ||
59
+ assertion.stratum !== 'asserted' ||
60
+ typeof assertion.provenance !== 'string' ||
61
+ !Object.hasOwn(assertion, 'value') ||
62
+ !participates(assertion.value) ||
63
+ comparable === null ||
64
+ comparable === undefined ||
65
+ comparable === 'unknown')
66
+ throw new TypeError('Invalid eligible assertion.');
67
+ return assertion;
68
+ }
69
+ function validateResolved(row, claimIdentity) {
70
+ const resolved = ownData(row.resolved, [
71
+ 'resultId',
72
+ 'rule',
73
+ 'scope',
74
+ 'coverage',
75
+ 'period',
76
+ 'evidence',
77
+ 'claim',
78
+ ]);
79
+ const rule = ownData(resolved.rule, ['id', 'version']);
80
+ const scope = ownData(copyJson(resolved.scope, BINDING_LIMITS.scopeBytes, true));
81
+ const resultIdentity = readResultIdentity(resolved.resultId);
82
+ if (resultIdentity.namespace !== claimIdentity.namespace ||
83
+ resolved.resultId !== row.declaredResult ||
84
+ !boundedText(rule.id) ||
85
+ rule.id !== row.declaredRule ||
86
+ !boundedText(rule.version) ||
87
+ Object.keys(scope).length === 0 ||
88
+ Object.keys(scope).length > BINDING_LIMITS.dimensions ||
89
+ !Object.keys(scope).every(boundedText))
90
+ throw new TypeError('Invalid verification association.');
91
+ validateCoverage(resolved.coverage);
92
+ if (Object.hasOwn(resolved, 'period') && periodProblem(resolved.period, 'camel') !== undefined)
93
+ throw new TypeError('Invalid verification period.');
94
+ const evidence = eligibleAssertion(resolved.evidence);
95
+ const claim = eligibleAssertion(resolved.claim);
96
+ if (canonicalJson(evidence.subject) !== canonicalJson(claim.subject) ||
97
+ evidence.predicate !== claim.predicate ||
98
+ evidence.provenance !== `result ${resolved.resultId}` ||
99
+ claim.provenance !== `rule ${rule.id}` ||
100
+ canonicalJson(claim.value) !== canonicalJson(row.declaredValue))
101
+ throw new TypeError('Invalid verification pair association.');
102
+ }
103
+ /** Validate the recorded protocol without evaluating whether its value agrees. */
104
+ export function readClaimVerificationRow(raw) {
105
+ const detached = copyJson(raw, VERIFICATION_LIMITS.rowBytes, true);
106
+ const row = ownData(detached, [
107
+ 'kind',
108
+ 'claimId',
109
+ 'declaredOn',
110
+ 'standing',
111
+ 'iteration',
112
+ 'turn',
113
+ 'checker',
114
+ 'declaredResult',
115
+ 'declaredRule',
116
+ 'declaredValue',
117
+ 'outcome',
118
+ 'reason',
119
+ 'resolved',
120
+ ]);
121
+ const checker = ownData(row.checker, ['id', 'version']);
122
+ const claimIdentity = readClaimIdentity(row.claimId);
123
+ if (row.kind !== 'claim-verification' ||
124
+ typeof row.standing !== 'string' ||
125
+ !STANDING_VALUES.includes(row.standing) ||
126
+ !integer(row.iteration, 0) ||
127
+ (Object.hasOwn(row, 'turn') && !integer(row.turn, 1)) ||
128
+ checker.id !== 'claim-pair' ||
129
+ checker.version !== 1 ||
130
+ !Object.hasOwn(row, 'declaredValue') ||
131
+ (Object.hasOwn(row, 'declaredResult') &&
132
+ (typeof row.declaredResult !== 'string' ||
133
+ row.declaredResult.length > BINDING_LIMITS.resultIdText)) ||
134
+ (Object.hasOwn(row, 'declaredRule') && !boundedText(row.declaredRule)))
135
+ throw new TypeError('Invalid claim-verification row.');
136
+ copyJson(row.declaredValue, VERIFICATION_LIMITS.valueBytes, true);
137
+ if (row.declaredOn !== 'answer') {
138
+ const at = ownData(row.declaredOn, ['toolCallId']);
139
+ if (!boundedText(at.toolCallId))
140
+ throw new TypeError('Invalid claim declaration location.');
141
+ }
142
+ if (row.outcome === 'unverified') {
143
+ if (typeof row.reason !== 'string' ||
144
+ !VERIFICATION_UNVERIFIED_REASONS.includes(row.reason) ||
145
+ Object.hasOwn(row, 'resolved') ||
146
+ (row.standing === 'noise' && row.reason !== 'ineligible-noise') ||
147
+ (row.reason === 'ineligible-noise' && row.standing !== 'noise') ||
148
+ (row.reason === 'missing-check' && Object.hasOwn(row, 'declaredRule')) ||
149
+ (!['missing-check', 'malformed-check', 'ineligible-noise'].includes(row.reason) &&
150
+ (!Object.hasOwn(row, 'declaredRule') ||
151
+ (row.reason !== 'missing-result' && !Object.hasOwn(row, 'declaredResult')))))
152
+ throw new TypeError('Invalid unverified claim row.');
153
+ }
154
+ else {
155
+ if (row.standing === 'noise' ||
156
+ !((row.outcome === 'supported' &&
157
+ (row.reason === 'no-conflict' || row.reason === 'numeric-leniency')) ||
158
+ (row.outcome === 'contradicted' && row.reason === 'conflict')))
159
+ throw new TypeError('Invalid compared claim row.');
160
+ validateResolved(row, claimIdentity);
161
+ }
162
+ return detached;
163
+ }
164
+ /** Non-throwing checkpoint union guard; admission uses the same strict reader. */
165
+ export function isClaimVerificationRow(raw) {
166
+ try {
167
+ readClaimVerificationRow(raw);
168
+ return true;
169
+ }
170
+ catch {
171
+ return false;
172
+ }
173
+ }
174
+ //# sourceMappingURL=verificationRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verificationRow.js","sourceRoot":"","sources":["../../../../../src/core/agent/findings/verificationRow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { EvidenceSnapshot, ResultEvidence, ResultIdentity } from '../../../integrity/claim-binding/types.js';
2
+ export interface ClaimVerificationState {
3
+ readonly version: 1;
4
+ readonly evidence: EvidenceSnapshot;
5
+ readonly nextResultOrdinal: number;
6
+ readonly nextClaimOrdinal: number;
7
+ /** Sticky refusal: older receipts remain; later evidence is not substituted. */
8
+ readonly limited?: true;
9
+ }
10
+ /**
11
+ * Read only after the checkpoint's owner/namespace authority is established.
12
+ * The caller MUST derive largestClaimOrdinal from its validated claim rows;
13
+ * this carrier does not contain those rows and cannot infer their maximum.
14
+ * Stage commits clone changed state. At entry, admit the tracked raw value
15
+ * and publish this detached carrier before the batch; subsequent raw reads
16
+ * can reuse its immutable evidence. A live scope proxy is not that identity.
17
+ */
18
+ export declare function readVerificationState(raw: unknown, largestClaimOrdinal: number): ClaimVerificationState;
19
+ /** Called only when opted in. No randomness is consumed at module load. */
20
+ export declare function createVerificationState(runId: string, namespaceSource?: () => string): ClaimVerificationState;
21
+ /** A resume keeps its namespace/counters, including when a process reuses runId. */
22
+ export declare function continueVerificationState(state: ClaimVerificationState, runId: string): ClaimVerificationState;
23
+ /** Publish the returned state before awaiting execution, even if it later fails. */
24
+ export declare function reserveResultIdentity(state: ClaimVerificationState, runId: string): {
25
+ readonly state: ClaimVerificationState;
26
+ readonly identity: ResultIdentity;
27
+ readonly id: string;
28
+ };
29
+ /** One occurrence, not a text key. The caller publishes state before evaluation. */
30
+ export declare function reserveClaimIdentity(state: ClaimVerificationState, runId: string): {
31
+ readonly state: ClaimVerificationState;
32
+ readonly ordinal: number;
33
+ readonly id: string;
34
+ };
35
+ /**
36
+ * Retain only a finalized, previously reserved receipt. Capacity refusal is
37
+ * sticky and never replaces an earlier result; the writer reports the limit.
38
+ */
39
+ export declare function retainVerificationEvidence(state: ClaimVerificationState, receipt: ResultEvidence): ClaimVerificationState;
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Private, immutable evidence carrier for the explicit findings verifier.
3
+ * Role: reservation and bounded retention; no schema, events or Agent wiring.
4
+ * The checkpoint owner authenticates provenance and supplies the ledger's
5
+ * largest claim ordinal. Shape validation alone never authorizes a record.
6
+ */
7
+ import { appendEvidenceSnapshot, readEvidenceSnapshot, } from '../../../integrity/claim-binding/admit.js';
8
+ import { resultIdentityOf } from '../../../integrity/claim-binding/capture.js';
9
+ import { BINDING_LIMITS, boundedText } from '../../../integrity/claim-binding/scope.js';
10
+ import { ownData } from '../../../lib/boundedJson.js';
11
+ import { claimIdentityOf } from './verificationRow.js';
12
+ const positiveOrdinal = (value) => typeof value === 'number' && Number.isSafeInteger(value) && value > 0;
13
+ /**
14
+ * Read only after the checkpoint's owner/namespace authority is established.
15
+ * The caller MUST derive largestClaimOrdinal from its validated claim rows;
16
+ * this carrier does not contain those rows and cannot infer their maximum.
17
+ * Stage commits clone changed state. At entry, admit the tracked raw value
18
+ * and publish this detached carrier before the batch; subsequent raw reads
19
+ * can reuse its immutable evidence. A live scope proxy is not that identity.
20
+ */
21
+ export function readVerificationState(raw, largestClaimOrdinal) {
22
+ const source = ownData(raw, [
23
+ 'version',
24
+ 'evidence',
25
+ 'nextResultOrdinal',
26
+ 'nextClaimOrdinal',
27
+ 'limited',
28
+ ]);
29
+ if (source.version !== 1 ||
30
+ !positiveOrdinal(source.nextResultOrdinal) ||
31
+ !positiveOrdinal(source.nextClaimOrdinal) ||
32
+ !Number.isSafeInteger(largestClaimOrdinal) ||
33
+ largestClaimOrdinal < 0 ||
34
+ source.nextClaimOrdinal <= largestClaimOrdinal ||
35
+ (Object.hasOwn(source, 'limited') && source.limited !== true))
36
+ throw new Error('Invalid findings verification carrier.');
37
+ const evidence = readEvidenceSnapshot(source.evidence);
38
+ if (evidence.runIds.length === 0)
39
+ throw new Error('Verification carrier requires its recorded run lineage.');
40
+ const ordinals = new Set();
41
+ for (const result of evidence.results) {
42
+ if (result.identity.namespace !== evidence.namespace ||
43
+ !evidence.runIds.includes(result.identity.runId) ||
44
+ result.identity.ordinal >= source.nextResultOrdinal ||
45
+ ordinals.has(result.identity.ordinal))
46
+ throw new Error('Invalid verification receipt lineage or ordinal.');
47
+ ordinals.add(result.identity.ordinal);
48
+ }
49
+ return Object.freeze({
50
+ version: 1,
51
+ evidence,
52
+ nextResultOrdinal: source.nextResultOrdinal,
53
+ nextClaimOrdinal: source.nextClaimOrdinal,
54
+ ...(source.limited === true && { limited: true }),
55
+ });
56
+ }
57
+ /** Called only when opted in. No randomness is consumed at module load. */
58
+ export function createVerificationState(runId, namespaceSource = () => globalThis.crypto.randomUUID()) {
59
+ const namespace = namespaceSource();
60
+ if (!boundedText(runId) || !boundedText(namespace))
61
+ throw new Error('Invalid verification recording identity.');
62
+ return readVerificationState({
63
+ version: 1,
64
+ evidence: { version: 1, namespace, runIds: [runId], results: [] },
65
+ nextResultOrdinal: 1,
66
+ nextClaimOrdinal: 1,
67
+ }, 0);
68
+ }
69
+ const limited = (state) => state.limited === true ? state : Object.freeze({ ...state, limited: true });
70
+ /** A resume keeps its namespace/counters, including when a process reuses runId. */
71
+ export function continueVerificationState(state, runId) {
72
+ if (!boundedText(runId))
73
+ throw new Error('Invalid verification run identity.');
74
+ if (state.evidence.runIds.includes(runId))
75
+ return state;
76
+ if (state.evidence.runIds.length >= BINDING_LIMITS.results)
77
+ throw new Error('Verification run lineage capacity exhausted.');
78
+ try {
79
+ const evidence = readEvidenceSnapshot({
80
+ ...state.evidence,
81
+ runIds: [...state.evidence.runIds, runId],
82
+ });
83
+ return Object.freeze({ ...state, evidence });
84
+ }
85
+ catch {
86
+ // Identity cannot be reserved for an unrecorded run. The input is an
87
+ // admitted carrier; adding one bounded run can exceed only its budget.
88
+ // Refuse this continuation rather than evicting old lineage or evidence.
89
+ throw new Error('Verification run lineage capacity exhausted.');
90
+ }
91
+ }
92
+ /** Publish the returned state before awaiting execution, even if it later fails. */
93
+ export function reserveResultIdentity(state, runId) {
94
+ state = continueVerificationState(state, runId);
95
+ const ordinal = state.nextResultOrdinal;
96
+ if (!positiveOrdinal(ordinal) || ordinal === Number.MAX_SAFE_INTEGER)
97
+ throw new Error('Verification result identity capacity exhausted.');
98
+ const identity = Object.freeze({ namespace: state.evidence.namespace, runId, ordinal });
99
+ return Object.freeze({
100
+ state: Object.freeze({ ...state, nextResultOrdinal: ordinal + 1 }),
101
+ identity,
102
+ id: resultIdentityOf(identity),
103
+ });
104
+ }
105
+ /** One occurrence, not a text key. The caller publishes state before evaluation. */
106
+ export function reserveClaimIdentity(state, runId) {
107
+ state = continueVerificationState(state, runId);
108
+ const ordinal = state.nextClaimOrdinal;
109
+ if (!positiveOrdinal(ordinal) || ordinal === Number.MAX_SAFE_INTEGER)
110
+ throw new Error('Verification claim identity capacity exhausted.');
111
+ return Object.freeze({
112
+ state: Object.freeze({ ...state, nextClaimOrdinal: ordinal + 1 }),
113
+ ordinal,
114
+ id: claimIdentityOf({ namespace: state.evidence.namespace, runId, ordinal }),
115
+ });
116
+ }
117
+ /**
118
+ * Retain only a finalized, previously reserved receipt. Capacity refusal is
119
+ * sticky and never replaces an earlier result; the writer reports the limit.
120
+ */
121
+ export function retainVerificationEvidence(state, receipt) {
122
+ if (state.limited === true)
123
+ return state;
124
+ const singleton = readEvidenceSnapshot({ ...state.evidence, results: [receipt] });
125
+ const admitted = singleton.results[0];
126
+ if (admitted.identity.namespace !== state.evidence.namespace ||
127
+ !state.evidence.runIds.includes(admitted.identity.runId) ||
128
+ admitted.identity.ordinal >= state.nextResultOrdinal ||
129
+ state.evidence.results.some((prior) => prior.identity.ordinal === admitted.identity.ordinal))
130
+ throw new Error('Verification receipt was not uniquely reserved in this recording.');
131
+ if (state.evidence.results.length >= BINDING_LIMITS.results)
132
+ return limited(state);
133
+ try {
134
+ const evidence = appendEvidenceSnapshot(state.evidence, singleton);
135
+ return Object.freeze({ ...state, evidence });
136
+ }
137
+ catch {
138
+ // Both the carrier and individual receipt were already admitted. Their
139
+ // combined bytes exceed the snapshot cap; preserve the earlier snapshot.
140
+ return limited(state);
141
+ }
142
+ }
143
+ //# sourceMappingURL=verificationState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verificationState.js","sourceRoot":"","sources":["../../../../../src/core/agent/findings/verificationState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { ClaimBinding } from '../../../integrity/claim-binding/types.js';
2
+ import type { ClaimPairEvaluation } from '../../../integrity/unsupported-claim/evaluate.js';
3
+ import type { DeclaredOn, Standing } from './types.js';
4
+ export declare const VERIFICATION_UNVERIFIED_REASONS: readonly ["invalid-claim", "unknown-rule", "invalid-rule", "missing-result", "ambiguous-result", "foreign-result", "incomplete-result", "withheld-evidence", "unassociated-result", "invalid-evidence", "missing-scope", "scope-mismatch", "scope-version-mismatch", "missing-fact", "ambiguous-fact", "unasserted-value", "coverage-undeclared", "coverage-partial", "coverage-unknown", "coverage-stale", "missing-check", "malformed-check", "ineligible-noise", "assertion-mismatch", "retention-limit", "evidence-unavailable", "claim-nonparticipating", "doubt-against-value", "both-doubt"];
5
+ export type ClaimVerificationUnverifiedReason = (typeof VERIFICATION_UNVERIFIED_REASONS)[number];
6
+ export type ClaimVerificationReason = ClaimVerificationUnverifiedReason | ClaimPairEvaluation;
7
+ /** The model may cite a rule, never provide scope or resolved evidence. */
8
+ export interface FindingClaimRequest {
9
+ readonly value: unknown;
10
+ readonly check?: {
11
+ readonly rule: string;
12
+ };
13
+ }
14
+ /** A legacy full assertion adds identity, not authority to choose evidence. */
15
+ export interface FullFindingClaimRequest extends FindingClaimRequest {
16
+ readonly subject: {
17
+ readonly kind: string;
18
+ readonly id: string;
19
+ };
20
+ readonly predicate: string;
21
+ }
22
+ export type ClaimVerificationAssociation = Omit<Extract<ClaimBinding, {
23
+ kind: 'bound';
24
+ }>, 'kind'>;
25
+ interface ClaimVerificationBase {
26
+ readonly kind: 'claim-verification';
27
+ /** Runtime-reserved declaration occurrence, not a provider tool id. */
28
+ readonly claimId: string;
29
+ readonly declaredOn: DeclaredOn;
30
+ readonly standing: Standing;
31
+ readonly iteration: number;
32
+ readonly turn?: number;
33
+ readonly checker: {
34
+ readonly id: 'claim-pair';
35
+ readonly version: 1;
36
+ };
37
+ readonly declaredResult?: string;
38
+ readonly declaredRule?: string;
39
+ /** The literal bounded JSON declaration, never replaced by a resolved value. */
40
+ readonly declaredValue: unknown;
41
+ }
42
+ export type ClaimVerificationRow = ClaimVerificationBase & ({
43
+ readonly outcome: 'supported';
44
+ readonly reason: 'no-conflict' | 'numeric-leniency';
45
+ readonly resolved: ClaimVerificationAssociation;
46
+ } | {
47
+ readonly outcome: 'contradicted';
48
+ readonly reason: 'conflict';
49
+ readonly resolved: ClaimVerificationAssociation;
50
+ } | {
51
+ readonly outcome: 'unverified';
52
+ readonly reason: ClaimVerificationUnverifiedReason;
53
+ readonly resolved?: never;
54
+ });
55
+ export {};
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Internal typed-finding protocol: model declarations and library checks stay
3
+ * separate. A supported row concerns only its resolved rule and executed scope;
4
+ * it is not verification of arbitrary prose or an entire answer.
5
+ * Role: plain data shared by the pure writer and the strict saved-row reader.
6
+ */
7
+ import { BINDING_REASONS } from '../../../integrity/claim-binding/types.js';
8
+ export const VERIFICATION_UNVERIFIED_REASONS = Object.freeze([
9
+ ...BINDING_REASONS,
10
+ 'missing-check',
11
+ 'malformed-check',
12
+ 'ineligible-noise',
13
+ 'assertion-mismatch',
14
+ 'retention-limit',
15
+ 'evidence-unavailable',
16
+ 'claim-nonparticipating',
17
+ 'doubt-against-value',
18
+ 'both-doubt',
19
+ ]);
20
+ //# sourceMappingURL=verificationTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verificationTypes.js","sourceRoot":"","sources":["../../../../../src/core/agent/findings/verificationTypes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAK5E,MAAM,CAAC,MAAM,+BAA+B,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3D,GAAG,eAAe;IAClB,eAAe;IACf,iBAAiB;IACjB,kBAAkB;IAClB,oBAAoB;IACpB,iBAAiB;IACjB,sBAAsB;IACtB,wBAAwB;IACxB,qBAAqB;IACrB,YAAY;CACJ,CAAC,CAAC"}
@@ -36,6 +36,7 @@
36
36
  import { fnv1a } from '../slots/helpers.js';
37
37
  import { applyOutputSchema } from '../outputSchema.js';
38
38
  import { SCHEMA_CHECK_FRAME_PREFIX } from '../../lib/saidByPerson.js';
39
+ import { formatToolArgIssues, streamedToolArgIssues } from './toolArgsValidation.js';
39
40
  /**
40
41
  * Append one row to the run's output-attempt ledger.
41
42
  *
@@ -133,6 +134,10 @@ export function readSchemaToolAnswer(response) {
133
134
  const call = response.toolCalls.find((tc) => tc.name === SCHEMA_TOOL_NAME);
134
135
  if (!call)
135
136
  return undefined;
137
+ // A fixed non-JSON refusal follows the existing output-attempt/retry path.
138
+ // Even a parser accepting {} must never validate an SDK repair as an answer.
139
+ if (call.argumentsFailure !== undefined)
140
+ return formatToolArgIssues(call.name, streamedToolArgIssues(call.argumentsFailure));
136
141
  return JSON.stringify(call.args);
137
142
  }
138
143
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"outputEnforcement.js","sourceRoot":"","sources":["../../../../src/core/agent/outputEnforcement.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"outputEnforcement.js","sourceRoot":"","sources":["../../../../src/core/agent/outputEnforcement.ts"],"names":[],"mappings":"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"}
@@ -88,7 +88,7 @@ import { withUnsettledRows } from '../findings/unsettled.js';
88
88
  import { sourceClockRow, sourceClocksOf } from '../../time/rows.js';
89
89
  import { evidenceFromHistory, exemptFromRun, } from '../evidence/evidenceIndex.js';
90
90
  import { noteRepeatedCall, repeatedCallLedgers } from '../repeatedCall.js';
91
- import { formatToolArgIssues, validateToolArgs, } from '../toolArgsValidation.js';
91
+ import { formatToolArgIssues, streamedToolArgIssues, validateToolArgs, } from '../toolArgsValidation.js';
92
92
  import { safeStringify } from '../validators.js';
93
93
  import { capToolResult } from '../toolResultCap.js';
94
94
  import { applyResultCeiling } from '../resultCeiling.js';
@@ -3131,7 +3131,19 @@ export function buildToolCallsHandler(deps) {
3131
3131
  }
3132
3132
  // Tool-args validation (#9) and the inputs layer's refusals share one
3133
3133
  // flag: the call is refused for its ARGUMENTS and lands in one shape.
3134
- let argsRejected = false;
3134
+ let argsRejected = tc.argumentsFailure !== undefined;
3135
+ if (!denied && tc.argumentsFailure !== undefined) {
3136
+ const issues = streamedToolArgIssues(tc.argumentsFailure);
3137
+ typedEmit(scope, 'agentfootprint.validation.args_invalid', {
3138
+ toolName: tc.name,
3139
+ toolCallId: tc.id,
3140
+ iteration,
3141
+ issues,
3142
+ enforced: true,
3143
+ });
3144
+ error = true;
3145
+ result = formatToolArgIssues(tc.name, issues);
3146
+ }
3135
3147
  // A check-in that tripped in a batch whose one human question was the
3136
3148
  // inputs layer's ask (`oneQuestionAsked`) — refused, never asked.
3137
3149
  let checkInRefused = false;
@@ -3146,9 +3158,11 @@ export function buildToolCallsHandler(deps) {
3146
3158
  // the layer NOT mounted — any call whose tool declares rules (fail
3147
3159
  // closed). Neither applies to a tool that declares nothing — and
3148
3160
  // neither awaits for one (`unmountedRules` answers it synchronously).
3149
- const unmounted = unmountedRules(tool, tc.name);
3161
+ const unmounted = argsRejected ? undefined : unmountedRules(tool, tc.name);
3150
3162
  warnUnmountedToolPeriod(tool, tc.name);
3151
- const rulesRefusal = resolution?.refused ?? (unmounted === undefined ? undefined : await unmounted);
3163
+ const rulesRefusal = argsRejected
3164
+ ? undefined
3165
+ : resolution?.refused ?? (unmounted === undefined ? undefined : await unmounted);
3152
3166
  if (!denied && rulesRefusal !== undefined) {
3153
3167
  argsRejected = true;
3154
3168
  error = true;
@@ -4241,6 +4255,9 @@ export function buildToolCallsHandler(deps) {
4241
4255
  toolCallId: tc.id,
4242
4256
  toolName: tc.name,
4243
4257
  ...(layerNote !== '' && { toolChars: deliveredResult.length }),
4258
+ ...(tc.argumentsFailure !== undefined && {
4259
+ toolArgumentsFailure: { ...tc.argumentsFailure },
4260
+ }),
4244
4261
  });
4245
4262
  // ── Dynamic ReAct wiring ───────────────────────────────
4246
4263
  //