@zelari/core 2.5.0 → 2.6.1

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 (76) hide show
  1. package/dist/core/AgentHarness.d.ts +17 -0
  2. package/dist/core/AgentHarness.d.ts.map +1 -1
  3. package/dist/core/AgentHarness.js +43 -0
  4. package/dist/core/AgentHarness.js.map +1 -1
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/mission/budgetContinuation.d.ts +36 -0
  10. package/dist/mission/budgetContinuation.d.ts.map +1 -0
  11. package/dist/mission/budgetContinuation.js +66 -0
  12. package/dist/mission/budgetContinuation.js.map +1 -0
  13. package/dist/runtime/fingerprints.d.ts +17 -0
  14. package/dist/runtime/fingerprints.d.ts.map +1 -0
  15. package/dist/runtime/fingerprints.js +31 -0
  16. package/dist/runtime/fingerprints.js.map +1 -0
  17. package/dist/runtime/harnessManifest.d.ts +103 -0
  18. package/dist/runtime/harnessManifest.d.ts.map +1 -0
  19. package/dist/runtime/harnessManifest.js +117 -0
  20. package/dist/runtime/harnessManifest.js.map +1 -0
  21. package/dist/runtime/index.d.ts +4 -1
  22. package/dist/runtime/index.d.ts.map +1 -1
  23. package/dist/runtime/index.js +4 -1
  24. package/dist/runtime/index.js.map +1 -1
  25. package/dist/runtime/profiles.d.ts +7 -0
  26. package/dist/runtime/profiles.d.ts.map +1 -1
  27. package/dist/runtime/profiles.js +10 -0
  28. package/dist/runtime/profiles.js.map +1 -1
  29. package/dist/runtime/resourceBudget.d.ts +77 -0
  30. package/dist/runtime/resourceBudget.d.ts.map +1 -0
  31. package/dist/runtime/resourceBudget.js +106 -0
  32. package/dist/runtime/resourceBudget.js.map +1 -0
  33. package/dist/runtime/resourcePolicy.d.ts +56 -0
  34. package/dist/runtime/resourcePolicy.d.ts.map +1 -0
  35. package/dist/runtime/resourcePolicy.js +77 -0
  36. package/dist/runtime/resourcePolicy.js.map +1 -0
  37. package/dist/session/compactionState.d.ts.map +1 -1
  38. package/dist/session/compactionState.js +20 -2
  39. package/dist/session/compactionState.js.map +1 -1
  40. package/dist/session/index.d.ts +1 -0
  41. package/dist/session/index.d.ts.map +1 -1
  42. package/dist/session/index.js +1 -0
  43. package/dist/session/index.js.map +1 -1
  44. package/dist/session/invariants.d.ts +5 -0
  45. package/dist/session/invariants.d.ts.map +1 -1
  46. package/dist/session/invariants.js +66 -0
  47. package/dist/session/invariants.js.map +1 -1
  48. package/dist/session/modelSurface.d.ts +19 -1
  49. package/dist/session/modelSurface.d.ts.map +1 -1
  50. package/dist/session/modelSurface.js +65 -1
  51. package/dist/session/modelSurface.js.map +1 -1
  52. package/dist/session/taskContract.d.ts +103 -0
  53. package/dist/session/taskContract.d.ts.map +1 -0
  54. package/dist/session/taskContract.js +173 -0
  55. package/dist/session/taskContract.js.map +1 -0
  56. package/dist/session/types.d.ts +9 -1
  57. package/dist/session/types.d.ts.map +1 -1
  58. package/dist/session/types.js +20 -0
  59. package/dist/session/types.js.map +1 -1
  60. package/dist/verification/index.d.ts +1 -0
  61. package/dist/verification/index.d.ts.map +1 -1
  62. package/dist/verification/index.js +1 -0
  63. package/dist/verification/index.js.map +1 -1
  64. package/dist/verification/metrics.d.ts +20 -0
  65. package/dist/verification/metrics.d.ts.map +1 -1
  66. package/dist/verification/metrics.js +18 -0
  67. package/dist/verification/metrics.js.map +1 -1
  68. package/dist/verification/resourceReserveGate.d.ts +39 -0
  69. package/dist/verification/resourceReserveGate.d.ts.map +1 -0
  70. package/dist/verification/resourceReserveGate.js +56 -0
  71. package/dist/verification/resourceReserveGate.js.map +1 -0
  72. package/dist/version.d.ts +7 -0
  73. package/dist/version.d.ts.map +1 -0
  74. package/dist/version.js +7 -0
  75. package/dist/version.js.map +1 -0
  76. package/package.json +1 -1
@@ -0,0 +1,173 @@
1
+ /**
2
+ * session/taskContract.ts — first-class task contract (2.6 Track A, doc §14).
3
+ *
4
+ * Goal + constraints + acceptance criteria extracted from user prose into a
5
+ * versioned, append-only structure (`task.contract` / `task.contract_updated`
6
+ * events). Authority is explicit: user > agent-derived. A derived item may
7
+ * never contradict a user constraint, rewrite the goal, or drop a required
8
+ * user criterion. CompactionStateSnapshot prefers the contract; the legacy
9
+ * regex extraction stays as fallback compatibility.
10
+ */
11
+ import { z } from 'zod';
12
+ export const TaskConstraintSchema = z.object({
13
+ id: z.string().min(1),
14
+ text: z.string().min(1),
15
+ source: z.enum(['user', 'agent-derived']),
16
+ required: z.boolean(),
17
+ });
18
+ export const TaskCriterionSchema = z.object({
19
+ id: z.string().min(1),
20
+ text: z.string().min(1),
21
+ source: z.enum(['user', 'agent-derived']),
22
+ required: z.boolean(),
23
+ verificationHint: z
24
+ .object({
25
+ kind: z.enum(['command', 'tool', 'semantic', 'manual']),
26
+ value: z.string().optional(),
27
+ })
28
+ .optional(),
29
+ });
30
+ export const TaskContractSchema = z.object({
31
+ version: z.number().int().positive(),
32
+ goal: z.string().min(1),
33
+ constraints: z.array(TaskConstraintSchema),
34
+ acceptanceCriteria: z.array(TaskCriterionSchema),
35
+ source: z.object({
36
+ /** Seq of the user.message the contract was extracted from. */
37
+ userSeq: z.number().int().positive(),
38
+ }),
39
+ });
40
+ export class TaskContractConflictError extends Error {
41
+ reason;
42
+ code = 'TASK_CONTRACT_CONFLICT';
43
+ constructor(reason) {
44
+ super(`task contract update rejected: ${reason}`);
45
+ this.reason = reason;
46
+ this.name = 'TaskContractConflictError';
47
+ }
48
+ }
49
+ /** Apply an update under the authority rules (doc §14.3). Pure. */
50
+ export function applyTaskContractUpdate(contract, update) {
51
+ if (update.goal !== undefined && update.goal !== contract.goal) {
52
+ // Goal changes only when the update itself is user-driven (nextUserSeq
53
+ // present = a new user message authorized the rewrite).
54
+ if (update.nextUserSeq === undefined) {
55
+ throw new TaskContractConflictError('agent-derived update may not rewrite the goal');
56
+ }
57
+ }
58
+ const constraints = contract.constraints.filter((c) => {
59
+ if (!update.removeConstraintIds?.includes(c.id))
60
+ return true;
61
+ if (c.source === 'user' && c.required) {
62
+ throw new TaskContractConflictError(`required user constraint "${c.id}" cannot be removed`);
63
+ }
64
+ return false;
65
+ });
66
+ const criteria = contract.acceptanceCriteria.filter((c) => {
67
+ if (!update.removeCriterionIds?.includes(c.id))
68
+ return true;
69
+ if (c.source === 'user' && c.required) {
70
+ throw new TaskContractConflictError(`required user criterion "${c.id}" cannot be removed`);
71
+ }
72
+ return false;
73
+ });
74
+ for (const add of update.addConstraints ?? []) {
75
+ if (constraints.some((c) => c.id === add.id) || (update.addConstraints ?? []).filter((x) => x.id === add.id).length > 1) {
76
+ throw new TaskContractConflictError(`duplicate constraint id "${add.id}"`);
77
+ }
78
+ }
79
+ for (const add of update.addCriteria ?? []) {
80
+ if (criteria.some((c) => c.id === add.id) || (update.addCriteria ?? []).filter((x) => x.id === add.id).length > 1) {
81
+ throw new TaskContractConflictError(`duplicate criterion id "${add.id}"`);
82
+ }
83
+ }
84
+ return TaskContractSchema.parse({
85
+ version: contract.version + 1,
86
+ goal: update.goal ?? contract.goal,
87
+ constraints: [...constraints, ...(update.addConstraints ?? [])],
88
+ acceptanceCriteria: [...criteria, ...(update.addCriteria ?? [])],
89
+ source: {
90
+ userSeq: update.nextUserSeq ?? contract.source.userSeq,
91
+ },
92
+ });
93
+ }
94
+ /** Project the contract onto the compaction state shape (§14.5). */
95
+ export function contractToCompactionFields(contract) {
96
+ return {
97
+ goal: contract.goal,
98
+ userConstraints: contract.constraints.filter((c) => c.source === 'user' && c.required).map((c) => c.text),
99
+ activeCriteria: contract.acceptanceCriteria.map((c) => ({ id: c.id, required: c.required })),
100
+ };
101
+ }
102
+ /**
103
+ * Derive an initial contract from the first user message (heuristic, CLI-side seed).
104
+ *
105
+ * 2.6.1 parser fix (closure plan §3): a line becomes an acceptance criterion
106
+ * ONLY when it carries an explicit marker — a checkbox (`- [ ]` / `- [x]`,
107
+ * with or without the list dash) or a keyword lead-in (`Acceptance:`,
108
+ * `Criterion:`, `Verify:`, `Test:`, `Success:` with an explicit `:`/`#`
109
+ * separator). Prose without markers NEVER produces criteria (no more false
110
+ * criteria from arbitrary lines); normative lines stay constraints.
111
+ */
112
+ const CHECKBOX_CRITERION = /^\[([ xX])\]\s*(.+)$/;
113
+ const KEYWORD_CRITERION = /^(acceptance|criterion|criteria|verify|test|success)\s*[:#]\s*(.+)$/i;
114
+ /** Command-looking values on Verify:/Test: lines become a command hint. */
115
+ const COMMAND_HINT = /^(npm|pnpm|yarn|bun|npx|node|vitest|jest|tsc|eslint|prettier|git)\b/;
116
+ const CONSTRAINT_LEAD = /^(do not|don't|never|no\s|non\s|without changing|keep|must not|avoid)\b/i;
117
+ export function deriveInitialContract(userSeq, text) {
118
+ const lines = text.split(/\r?\n/).map((l) => l.trim()).filter(Boolean);
119
+ // Strip list markers before heuristic matching ("- do not…" → "do not…").
120
+ const stripped = lines.map((l) => l.replace(/^[-*]\s+/, ''));
121
+ const acceptanceCriteria = [];
122
+ const criterionLines = new Set();
123
+ stripped.forEach((line, i) => {
124
+ const checkbox = CHECKBOX_CRITERION.exec(line);
125
+ if (checkbox) {
126
+ criterionLines.add(i);
127
+ acceptanceCriteria.push({
128
+ id: `ac-${acceptanceCriteria.length + 1}`,
129
+ text: checkbox[2].trim(),
130
+ source: 'user',
131
+ required: true,
132
+ });
133
+ return;
134
+ }
135
+ const keyword = KEYWORD_CRITERION.exec(line);
136
+ if (keyword) {
137
+ criterionLines.add(i);
138
+ const value = keyword[2].trim();
139
+ const lead = keyword[1].toLowerCase();
140
+ const hint = (lead === 'verify' || lead === 'test') && COMMAND_HINT.test(value)
141
+ ? { kind: 'command', value }
142
+ : undefined;
143
+ acceptanceCriteria.push({
144
+ id: `ac-${acceptanceCriteria.length + 1}`,
145
+ text: value,
146
+ source: 'user',
147
+ required: true,
148
+ ...(hint ? { verificationHint: hint } : {}),
149
+ });
150
+ }
151
+ });
152
+ const isConstraint = (i) => !criterionLines.has(i) && CONSTRAINT_LEAD.test(stripped[i] ?? '');
153
+ const constraints = stripped
154
+ .map((text, i) => ({ text, i }))
155
+ .filter(({ i }) => isConstraint(i))
156
+ .map(({ text }, i) => ({
157
+ id: `uc-${i + 1}`,
158
+ text,
159
+ source: 'user',
160
+ required: true,
161
+ }));
162
+ // Goal: the first line that is neither a criterion nor a constraint.
163
+ const goalIdx = lines.findIndex((_, i) => !criterionLines.has(i) && !isConstraint(i));
164
+ const goal = goalIdx >= 0 ? lines[goalIdx] : (lines[0] ?? text.slice(0, 200));
165
+ return TaskContractSchema.parse({
166
+ version: 1,
167
+ goal,
168
+ constraints,
169
+ acceptanceCriteria,
170
+ source: { userSeq },
171
+ });
172
+ }
173
+ //# sourceMappingURL=taskContract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskContract.js","sourceRoot":"","sources":["../../src/session/taskContract.ts"],"names":[],"mappings":"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"}
@@ -33,7 +33,7 @@ export type SessionActor = z.infer<typeof SessionActorSchema>;
33
33
  * `session.compacted` with `{fromSeq,toSeq,checkpoint}` shadows that range
34
34
  * in deriveMessages(); `{summary}` without a range is legacy (append-only).
35
35
  */
36
- export declare const SESSION_EVENT_KINDS: readonly ["session.started", "session.resumed", "session.ended", "session.forked", "user.message", "assistant.message", "tool.call", "tool.result", "tool.interrupted", "context.injected", "session.compacted", "task.created", "task.updated", "kraken.task", "council.member", "mission.phase", "mission.replan", "mission.progress", "verification.run", "verification.evidence", "note"];
36
+ export declare const SESSION_EVENT_KINDS: readonly ["session.started", "session.resumed", "session.ended", "session.forked", "session.harness_manifest", "session.harness_drift", "user.message", "assistant.message", "tool.call", "tool.result", "tool.interrupted", "context.injected", "session.compacted", "task.created", "task.updated", "task.contract", "task.contract_updated", "kraken.task", "council.member", "mission.phase", "mission.replan", "mission.progress", "verification.run", "verification.evidence", "resource.snapshot", "resource.limit_reached", "resource.reserve_entered", "resource.overrun", "note"];
37
37
  export type SessionEventKind = (typeof SESSION_EVENT_KINDS)[number];
38
38
  export declare const SessionEventEnvelopeSchema: z.ZodObject<{
39
39
  schemaVersion: z.ZodLiteral<1>;
@@ -46,6 +46,8 @@ export declare const SessionEventEnvelopeSchema: z.ZodObject<{
46
46
  "session.resumed": "session.resumed";
47
47
  "session.ended": "session.ended";
48
48
  "session.forked": "session.forked";
49
+ "session.harness_manifest": "session.harness_manifest";
50
+ "session.harness_drift": "session.harness_drift";
49
51
  "user.message": "user.message";
50
52
  "assistant.message": "assistant.message";
51
53
  "tool.call": "tool.call";
@@ -55,6 +57,8 @@ export declare const SessionEventEnvelopeSchema: z.ZodObject<{
55
57
  "session.compacted": "session.compacted";
56
58
  "task.created": "task.created";
57
59
  "task.updated": "task.updated";
60
+ "task.contract": "task.contract";
61
+ "task.contract_updated": "task.contract_updated";
58
62
  "kraken.task": "kraken.task";
59
63
  "council.member": "council.member";
60
64
  "mission.phase": "mission.phase";
@@ -62,6 +66,10 @@ export declare const SessionEventEnvelopeSchema: z.ZodObject<{
62
66
  "mission.progress": "mission.progress";
63
67
  "verification.run": "verification.run";
64
68
  "verification.evidence": "verification.evidence";
69
+ "resource.snapshot": "resource.snapshot";
70
+ "resource.limit_reached": "resource.limit_reached";
71
+ "resource.reserve_entered": "resource.reserve_entered";
72
+ "resource.overrun": "resource.overrun";
65
73
  }>;
66
74
  actor: z.ZodObject<{
67
75
  type: z.ZodEnum<{
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,sFAAsF;AACtF,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,eAAO,MAAM,kBAAkB;;;;;;;;;;iBAK7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,+XA4BtB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBASrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,qFAAqF;AACrF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,0BAA0B;AAC1B,eAAO,MAAM,UAAU,EAAE,YAA+B,CAAC;AACzD,eAAO,MAAM,WAAW,EAAE,YAAgC,CAAC;AAC3D,eAAO,MAAM,YAAY,EAAE,YAAiC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,sFAAsF;AACtF,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,eAAO,MAAM,kBAAkB;;;;;;;;;;iBAK7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,6jBAgDtB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBASrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,qFAAqF;AACrF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,0BAA0B;AAC1B,eAAO,MAAM,UAAU,EAAE,YAA+B,CAAC;AACzD,eAAO,MAAM,WAAW,EAAE,YAAgC,CAAC;AAC3D,eAAO,MAAM,YAAY,EAAE,YAAiC,CAAC"}
@@ -32,6 +32,13 @@ export const SESSION_EVENT_KINDS = [
32
32
  'session.resumed',
33
33
  'session.ended',
34
34
  'session.forked',
35
+ // 2.6 Track A (harness manifest): canonical harness fingerprint recorded
36
+ // once at session start / manifest change. State-only (never model-surface):
37
+ // data = {manifest, manifestHash}. Schema review per ADR-0021.
38
+ 'session.harness_manifest',
39
+ // 2.6.1 (closure plan §6): resume-time harness drift record. State-only:
40
+ // data = {originalManifestHash, currentManifestHash}. Non-blocking signal.
41
+ 'session.harness_drift',
35
42
  'user.message',
36
43
  'assistant.message',
37
44
  'tool.call',
@@ -42,6 +49,11 @@ export const SESSION_EVENT_KINDS = [
42
49
  'session.compacted',
43
50
  'task.created',
44
51
  'task.updated',
52
+ // 2.6 Track A (doc §14): first-class task contract. Append-only,
53
+ // monotone versioning (task.contract_updated supersedes, never rewrites).
54
+ // State-only: compaction projects it into CompactionStateSnapshot.
55
+ 'task.contract',
56
+ 'task.contract_updated',
45
57
  'kraken.task',
46
58
  'council.member',
47
59
  'mission.phase',
@@ -54,6 +66,14 @@ export const SESSION_EVENT_KINDS = [
54
66
  // the session-log anchor EvidenceRef.seq points at (command output, fs
55
67
  // observation, digest). Not model-surface. Schema review per ADR-0021.
56
68
  'verification.evidence',
69
+ // 2.6 Track B (resource-aware execution, doc §9-§12): host-owned resource
70
+ // state. `resource.snapshot` is model-surface with LATEST-ONLY projection
71
+ // (doc §10.2 — see modelSurface.ts); limit/reserve events are state-only.
72
+ 'resource.snapshot',
73
+ 'resource.limit_reached',
74
+ 'resource.reserve_entered',
75
+ // 2.6.1 (closure plan §9): hard-limit overrun telemetry — state-only.
76
+ 'resource.overrun',
57
77
  'note',
58
78
  ];
59
79
  export const SessionEventEnvelopeSchema = z.object({
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,sFAAsF;AACtF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAExC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC7D,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAChC,wDAAwD;IACxD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAGH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,iBAAiB;IACjB,iBAAiB;IACjB,eAAe;IACf,gBAAgB;IAChB,cAAc;IACd,mBAAmB;IACnB,WAAW;IACX,aAAa;IACb,qEAAqE;IACrE,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,cAAc;IACd,cAAc;IACd,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,6EAA6E;IAC7E,0EAA0E;IAC1E,kBAAkB;IAClB,kBAAkB;IAClB,wEAAwE;IACxE,uEAAuE;IACvE,uEAAuE;IACvE,uBAAuB;IACvB,MAAM;CACE,CAAC;AAGX,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC;IAChD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,6EAA6E;IAC7E,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAClC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;IACjC,KAAK,EAAE,kBAAkB;IACzB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;CACxC,CAAC,CAAC;AAUH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,UAAU,GAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzD,MAAM,CAAC,MAAM,WAAW,GAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,sFAAsF;AACtF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAExC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC7D,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAChC,wDAAwD;IACxD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAGH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,iBAAiB;IACjB,iBAAiB;IACjB,eAAe;IACf,gBAAgB;IAChB,yEAAyE;IACzE,6EAA6E;IAC7E,+DAA+D;IAC/D,0BAA0B;IAC1B,yEAAyE;IACzE,2EAA2E;IAC3E,uBAAuB;IACvB,cAAc;IACd,mBAAmB;IACnB,WAAW;IACX,aAAa;IACb,qEAAqE;IACrE,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,cAAc;IACd,cAAc;IACd,iEAAiE;IACjE,0EAA0E;IAC1E,mEAAmE;IACnE,eAAe;IACf,uBAAuB;IACvB,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,6EAA6E;IAC7E,0EAA0E;IAC1E,kBAAkB;IAClB,kBAAkB;IAClB,wEAAwE;IACxE,uEAAuE;IACvE,uEAAuE;IACvE,uBAAuB;IACvB,0EAA0E;IAC1E,0EAA0E;IAC1E,0EAA0E;IAC1E,mBAAmB;IACnB,wBAAwB;IACxB,0BAA0B;IAC1B,sEAAsE;IACtE,kBAAkB;IAClB,MAAM;CACE,CAAC;AAGX,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC;IAChD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,6EAA6E;IAC7E,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAClC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;IACjC,KAAK,EAAE,kBAAkB;IACzB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;CACxC,CAAC,CAAC;AAUH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,UAAU,GAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzD,MAAM,CAAC,MAAM,WAAW,GAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC"}
@@ -10,4 +10,5 @@ export * from './criteriaPack.v1.js';
10
10
  export * from './metrics.js';
11
11
  export * from './verifier.js';
12
12
  export * from './scopeDiscipline.js';
13
+ export * from './resourceReserveGate.js';
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/verification/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/verification/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC"}
@@ -10,4 +10,5 @@ export * from './criteriaPack.v1.js';
10
10
  export * from './metrics.js';
11
11
  export * from './verifier.js';
12
12
  export * from './scopeDiscipline.js';
13
+ export * from './resourceReserveGate.js';
13
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/verification/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/verification/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC"}
@@ -23,4 +23,24 @@ export declare function computeFalseDoneRate(samples: readonly TaskOutcomeSample
23
23
  export declare function verifiedSolveRate(samples: readonly TaskOutcomeSample[]): number;
24
24
  /** Verification cost ratio; null when total time is unknown/zero. */
25
25
  export declare function verificationCostRatio(verificationMs: number, totalMs: number): number | null;
26
+ /**
27
+ * 2.6 Track B (doc section 15): unified cost-per-verified-solve metrics.
28
+ * Core-side aggregation over cost-bearing samples — the full RunCost type
29
+ * lives in tools/eval/cost.ts (eval tooling boundary); here we accept the
30
+ * minimal cost shape so the core stays dependency-free.
31
+ */
32
+ export interface CostedTaskSample extends TaskOutcomeSample {
33
+ modelCostUsd: number;
34
+ wallMs: number;
35
+ toolCalls: number;
36
+ }
37
+ export interface CostPerVerifiedSolveStats {
38
+ verifiedSolves: number;
39
+ totalCostUsd: number;
40
+ costPerVerifiedSolve: number | null;
41
+ wallMsPerVerifiedSolve: number | null;
42
+ toolCallsPerVerifiedSolve: number | null;
43
+ }
44
+ /** North-star aggregation: quality (verified) over quantity (cost). */
45
+ export declare function costPerVerifiedSolve(samples: readonly CostedTaskSample[]): CostPerVerifiedSolveStats;
26
46
  //# sourceMappingURL=metrics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/verification/metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,WAAW,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GAAG,cAAc,CAQ1F;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GAAG,MAAM,CAG/E;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG5F"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/verification/metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,WAAW,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GAAG,cAAc,CAQ1F;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GAAG,MAAM,CAG/E;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG5F;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,GAAG,yBAAyB,CAapG"}
@@ -26,4 +26,22 @@ export function verificationCostRatio(verificationMs, totalMs) {
26
26
  return null;
27
27
  return verificationMs / totalMs;
28
28
  }
29
+ /** North-star aggregation: quality (verified) over quantity (cost). */
30
+ export function costPerVerifiedSolve(samples) {
31
+ const solved = samples.filter((s) => s.verified === true);
32
+ const totalCostUsd = samples.reduce((sum, s) => sum + s.modelCostUsd, 0);
33
+ const totalWallMs = samples.reduce((sum, s) => sum + s.wallMs, 0);
34
+ const totalToolCalls = samples.reduce((sum, s) => sum + s.toolCalls, 0);
35
+ const n = solved.length;
36
+ return {
37
+ verifiedSolves: n,
38
+ totalCostUsd: round(totalCostUsd),
39
+ costPerVerifiedSolve: n > 0 ? round(totalCostUsd / n) : null,
40
+ wallMsPerVerifiedSolve: n > 0 ? Math.round(totalWallMs / n) : null,
41
+ toolCallsPerVerifiedSolve: n > 0 ? round(totalToolCalls / n) : null,
42
+ };
43
+ }
44
+ function round(v) {
45
+ return Math.round(v * 1e6) / 1e6;
46
+ }
29
47
  //# sourceMappingURL=metrics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/verification/metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,mFAAmF;AACnF,MAAM,UAAU,oBAAoB,CAAC,OAAqC;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;IAC7D,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,MAAM;QACvB,SAAS,EAAE,SAAS,CAAC,MAAM;QAC3B,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;KACnE,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,iBAAiB,CAAC,OAAqC;IACrE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;AAC5E,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,qBAAqB,CAAC,cAAsB,EAAE,OAAe;IAC3E,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,cAAc,GAAG,OAAO,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/verification/metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,mFAAmF;AACnF,MAAM,UAAU,oBAAoB,CAAC,OAAqC;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;IAC7D,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,MAAM;QACvB,SAAS,EAAE,SAAS,CAAC,MAAM;QAC3B,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;KACnE,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,iBAAiB,CAAC,OAAqC;IACrE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;AAC5E,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,qBAAqB,CAAC,cAAsB,EAAE,OAAe;IAC3E,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,cAAc,GAAG,OAAO,CAAC;AAClC,CAAC;AAsBD,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAAC,OAAoC;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAClE,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,OAAO;QACL,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC;QACjC,oBAAoB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAC5D,sBAAsB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAClE,yBAAyB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;KACpE,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,CAAS;IACtB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACnC,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * verification/resourceReserveGate.ts — resource-aware completion interaction
3
+ * (2.6 Track B, doc §11.5, ADR-0023 untouched).
4
+ *
5
+ * The budget NEVER decides PASS. It only decides whether the required
6
+ * evidence is still PRODUCIBLE:
7
+ *
8
+ * verdict === PASS → PASS (deterministic PASS ends
9
+ * even with residual budget)
10
+ * verdict !== PASS AND evidence still
11
+ * affordable (repair + verification
12
+ * reserve not exhausted) → verdict unchanged (REPAIR_REQUIRED / BLOCKED)
13
+ * verdict !== PASS AND no budget left
14
+ * to produce required evidence → BLOCKED / resource-exhausted
15
+ *
16
+ * false-done is impossible by construction: unknown ≠ pass stays.
17
+ */
18
+ import type { ResourceBudget } from '../runtime/resourceBudget.js';
19
+ import type { CompletionEvaluation } from './completionPolicy.js';
20
+ export interface ResourceReserveGateInput {
21
+ evaluation: CompletionEvaluation;
22
+ budget: ResourceBudget;
23
+ }
24
+ export interface ResourceReserveGateResult {
25
+ verdict: CompletionEvaluation['verdict'];
26
+ /** Original deterministic verdict (never overwritten — audit trail). */
27
+ deterministicVerdict: CompletionEvaluation['verdict'];
28
+ /** True when the gate downgraded the verdict to BLOCKED. */
29
+ resourceExhausted: boolean;
30
+ /** True when the remaining budget can still run verification/repair calls. */
31
+ evidenceAffordable: boolean;
32
+ summary: string;
33
+ }
34
+ /**
35
+ * Evidence is affordable while the protected verification reserve has not
36
+ * been consumed by non-verify work AND the repair headroom is not negative.
37
+ */
38
+ export declare function evaluateResourceReserveGate(input: ResourceReserveGateInput): ResourceReserveGateResult;
39
+ //# sourceMappingURL=resourceReserveGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceReserveGate.d.ts","sourceRoot":"","sources":["../../src/verification/resourceReserveGate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,oBAAoB,CAAC;IACjC,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACzC,wEAAwE;IACxE,oBAAoB,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACtD,4DAA4D;IAC5D,iBAAiB,EAAE,OAAO,CAAC;IAC3B,8EAA8E;IAC9E,kBAAkB,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,wBAAwB,GAAG,yBAAyB,CAiCtG"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * verification/resourceReserveGate.ts — resource-aware completion interaction
3
+ * (2.6 Track B, doc §11.5, ADR-0023 untouched).
4
+ *
5
+ * The budget NEVER decides PASS. It only decides whether the required
6
+ * evidence is still PRODUCIBLE:
7
+ *
8
+ * verdict === PASS → PASS (deterministic PASS ends
9
+ * even with residual budget)
10
+ * verdict !== PASS AND evidence still
11
+ * affordable (repair + verification
12
+ * reserve not exhausted) → verdict unchanged (REPAIR_REQUIRED / BLOCKED)
13
+ * verdict !== PASS AND no budget left
14
+ * to produce required evidence → BLOCKED / resource-exhausted
15
+ *
16
+ * false-done is impossible by construction: unknown ≠ pass stays.
17
+ */
18
+ /**
19
+ * Evidence is affordable while the protected verification reserve has not
20
+ * been consumed by non-verify work AND the repair headroom is not negative.
21
+ */
22
+ export function evaluateResourceReserveGate(input) {
23
+ const { evaluation, budget } = input;
24
+ if (evaluation.verdict === 'PASS') {
25
+ return {
26
+ verdict: 'PASS',
27
+ deterministicVerdict: 'PASS',
28
+ resourceExhausted: false,
29
+ evidenceAffordable: true,
30
+ summary: evaluation.summary,
31
+ };
32
+ }
33
+ // Remaining outside the reserve is spendable on verify/repair; the reserve
34
+ // itself exists exactly for those calls. Evidence stops being affordable
35
+ // when BOTH the spendable headroom and the reserve are gone.
36
+ const spendable = Math.max(0, budget.toolCalls.remaining - budget.reserve.verification);
37
+ const affordable = spendable + budget.reserve.verification > 0 && budget.toolCalls.remaining > 0;
38
+ if (affordable) {
39
+ return {
40
+ verdict: evaluation.verdict,
41
+ deterministicVerdict: evaluation.verdict,
42
+ resourceExhausted: false,
43
+ evidenceAffordable: true,
44
+ summary: evaluation.summary,
45
+ };
46
+ }
47
+ const summary = `${evaluation.summary} · resource-exhausted: ${budget.toolCalls.used}/${budget.toolCalls.limit} tool calls used, no budget left for required evidence — BLOCKED, not a false done`;
48
+ return {
49
+ verdict: 'BLOCKED',
50
+ deterministicVerdict: evaluation.verdict,
51
+ resourceExhausted: true,
52
+ evidenceAffordable: false,
53
+ summary,
54
+ };
55
+ }
56
+ //# sourceMappingURL=resourceReserveGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceReserveGate.js","sourceRoot":"","sources":["../../src/verification/resourceReserveGate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAqBH;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAA+B;IACzE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACrC,IAAI,UAAU,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAClC,OAAO;YACL,OAAO,EAAE,MAAM;YACf,oBAAoB,EAAE,MAAM;YAC5B,iBAAiB,EAAE,KAAK;YACxB,kBAAkB,EAAE,IAAI;YACxB,OAAO,EAAE,UAAU,CAAC,OAAO;SAC5B,CAAC;IACJ,CAAC;IACD,2EAA2E;IAC3E,yEAAyE;IACzE,6DAA6D;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACxF,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;IACjG,IAAI,UAAU,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,oBAAoB,EAAE,UAAU,CAAC,OAAO;YACxC,iBAAiB,EAAE,KAAK;YACxB,kBAAkB,EAAE,IAAI;YACxB,OAAO,EAAE,UAAU,CAAC,OAAO;SAC5B,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,UAAU,CAAC,OAAO,0BAA0B,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,oFAAoF,CAAC;IACnM,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,oBAAoB,EAAE,UAAU,CAAC,OAAO;QACxC,iBAAiB,EAAE,IAAI;QACvB,kBAAkB,EAAE,KAAK;QACzB,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Canonical core version — exported so hosts stop re-resolving
3
+ * require.resolve('@zelari/core/package.json') (2.6.1 plan §7).
4
+ * Kept in sync with package.json by scripts/verify-versions.mjs.
5
+ */
6
+ export declare const CORE_VERSION = "2.6.1";
7
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,YAAY,UAAU,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Canonical core version — exported so hosts stop re-resolving
3
+ * require.resolve('@zelari/core/package.json') (2.6.1 plan §7).
4
+ * Kept in sync with package.json by scripts/verify-versions.mjs.
5
+ */
6
+ export const CORE_VERSION = '2.6.1';
7
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zelari/core",
3
- "version": "2.5.0",
3
+ "version": "2.6.1",
4
4
  "description": "Zelari Code core library — provider-neutral agent loop (AgentHarness), multi-agent council orchestration, and built-in skills. Used by the zelari-code CLI; consumable by other agent frontends.",
5
5
  "author": "Anathema Studio <https://anathema-studio.com/>",
6
6
  "license": "Apache-2.0",