@trazum/core 1.49.0 → 1.50.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.
- package/dist/conform.d.ts +78 -0
- package/dist/conform.d.ts.map +1 -0
- package/dist/conform.js +342 -0
- package/dist/conform.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/conform.ts +418 -0
- package/src/index.ts +7 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Does this document conform, and what will it not be able to answer?
|
|
3
|
+
*
|
|
4
|
+
* Ten releases of arithmetic that refuses to flatter are worth more if other
|
|
5
|
+
* tools can emit and read the same documents. That needs two things, and this
|
|
6
|
+
* module is the second of them: the contracts are written down in `docs/`, and
|
|
7
|
+
* an emitter needs a way to find out whether what it produces actually
|
|
8
|
+
* satisfies one — without reading a specification and hoping.
|
|
9
|
+
*
|
|
10
|
+
* **Two questions, kept apart.** *Is this a valid X* is a yes or no. *What can
|
|
11
|
+
* a valid X of this shape not tell you* is the useful one, and it has nothing
|
|
12
|
+
* to do with validity: a usage log with no `session` field is perfectly valid
|
|
13
|
+
* and simply cannot support conversation growth. An emitter that only learns
|
|
14
|
+
* the first answer ships something Trazum reads and half the findings quietly
|
|
15
|
+
* never appear. So a conforming document still comes back with a list of what
|
|
16
|
+
* it has bought itself out of.
|
|
17
|
+
*
|
|
18
|
+
* **It never repairs and never guesses.** A line that will not parse is
|
|
19
|
+
* reported at its position; a field of the wrong type is named with the type
|
|
20
|
+
* found. Nothing is coerced — the whole point of a conformance check that a
|
|
21
|
+
* third party runs is that it agrees with what the reader will actually do.
|
|
22
|
+
*
|
|
23
|
+
* **Unknown fields are not problems.** Documents here gain fields without a
|
|
24
|
+
* version bump, and a checker that rejects tomorrow's field is a checker
|
|
25
|
+
* nobody upgrades. Only *absent* required fields and *wrong* types fail.
|
|
26
|
+
*/
|
|
27
|
+
/** The documents this project emits, and their names. */
|
|
28
|
+
export type ContractName = 'usage-log' | 'profile' | 'plan' | 'verification' | 'history' | 'connected' | 'cost-answer';
|
|
29
|
+
export interface ConformanceProblem {
|
|
30
|
+
/** Where: `line 12` for a log, or a dotted path inside a document. */
|
|
31
|
+
at: string;
|
|
32
|
+
kind:
|
|
33
|
+
/** A required field is absent. */
|
|
34
|
+
'missing'
|
|
35
|
+
/** Present, and not the type the contract states. */
|
|
36
|
+
| 'wrong-type'
|
|
37
|
+
/** Present as `0` where the contract requires `null` for absence. */
|
|
38
|
+
| 'absence-as-zero'
|
|
39
|
+
/** The line or the document could not be parsed at all. */
|
|
40
|
+
| 'unreadable';
|
|
41
|
+
detail: string;
|
|
42
|
+
}
|
|
43
|
+
/** A finding a valid document of this shape simply cannot support. */
|
|
44
|
+
export interface UnavailableFinding {
|
|
45
|
+
finding: string;
|
|
46
|
+
because: string;
|
|
47
|
+
unlockedBy: string;
|
|
48
|
+
}
|
|
49
|
+
export interface ConformanceReport {
|
|
50
|
+
schemaVersion: 1;
|
|
51
|
+
/** Which contract this looks like, or null when nothing did. */
|
|
52
|
+
contract: ContractName | null;
|
|
53
|
+
/**
|
|
54
|
+
* Why nothing matched. Present only when `contract` is null, and never a
|
|
55
|
+
* bare "invalid": a refusal with nothing after it is indistinguishable from
|
|
56
|
+
* a bug, which is the rule this project applies to every other refusal.
|
|
57
|
+
*/
|
|
58
|
+
because: string | null;
|
|
59
|
+
problems: ConformanceProblem[];
|
|
60
|
+
unavailable: UnavailableFinding[];
|
|
61
|
+
/** Records examined, for a log. Null for a single document. */
|
|
62
|
+
records: number | null;
|
|
63
|
+
conforms: boolean;
|
|
64
|
+
}
|
|
65
|
+
export interface ConformOptions {
|
|
66
|
+
/** Force a contract instead of detecting one, for an emitter under test. */
|
|
67
|
+
contract?: ContractName;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Checks a document or a usage log against the contract it claims.
|
|
71
|
+
*
|
|
72
|
+
* The check is on **required fields and their types**, and stops there.
|
|
73
|
+
* Documents here gain fields without a version bump, so a checker that
|
|
74
|
+
* rejected an unrecognised field would fail every consumer one release after
|
|
75
|
+
* it shipped.
|
|
76
|
+
*/
|
|
77
|
+
export declare function conform(text: string, options?: ConformOptions): ConformanceReport;
|
|
78
|
+
//# sourceMappingURL=conform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conform.d.ts","sourceRoot":"","sources":["../src/conform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,yDAAyD;AACzD,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,SAAS,GACT,MAAM,GACN,cAAc,GACd,SAAS,GACT,WAAW,GACX,aAAa,CAAC;AAElB,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI;IACF,kCAAkC;IAChC,SAAS;IACX,qDAAqD;OACnD,YAAY;IACd,qEAAqE;OACnE,iBAAiB;IACnB,2DAA2D;OACzD,YAAY,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,sEAAsE;AACtE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,CAAC,CAAC;IACjB,gEAAgE;IAChE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B;;;;OAIG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;CACnB;AA0MD,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,iBAAiB,CAgIrF"}
|
package/dist/conform.js
ADDED
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Does this document conform, and what will it not be able to answer?
|
|
3
|
+
*
|
|
4
|
+
* Ten releases of arithmetic that refuses to flatter are worth more if other
|
|
5
|
+
* tools can emit and read the same documents. That needs two things, and this
|
|
6
|
+
* module is the second of them: the contracts are written down in `docs/`, and
|
|
7
|
+
* an emitter needs a way to find out whether what it produces actually
|
|
8
|
+
* satisfies one — without reading a specification and hoping.
|
|
9
|
+
*
|
|
10
|
+
* **Two questions, kept apart.** *Is this a valid X* is a yes or no. *What can
|
|
11
|
+
* a valid X of this shape not tell you* is the useful one, and it has nothing
|
|
12
|
+
* to do with validity: a usage log with no `session` field is perfectly valid
|
|
13
|
+
* and simply cannot support conversation growth. An emitter that only learns
|
|
14
|
+
* the first answer ships something Trazum reads and half the findings quietly
|
|
15
|
+
* never appear. So a conforming document still comes back with a list of what
|
|
16
|
+
* it has bought itself out of.
|
|
17
|
+
*
|
|
18
|
+
* **It never repairs and never guesses.** A line that will not parse is
|
|
19
|
+
* reported at its position; a field of the wrong type is named with the type
|
|
20
|
+
* found. Nothing is coerced — the whole point of a conformance check that a
|
|
21
|
+
* third party runs is that it agrees with what the reader will actually do.
|
|
22
|
+
*
|
|
23
|
+
* **Unknown fields are not problems.** Documents here gain fields without a
|
|
24
|
+
* version bump, and a checker that rejects tomorrow's field is a checker
|
|
25
|
+
* nobody upgrades. Only *absent* required fields and *wrong* types fail.
|
|
26
|
+
*/
|
|
27
|
+
/** Fields a usage record may carry, and the finding each one buys. */
|
|
28
|
+
const USAGE_OPTIONAL = [
|
|
29
|
+
{
|
|
30
|
+
field: 'label',
|
|
31
|
+
finding: 'per-workload bills, per-label budgets, the ranked plan',
|
|
32
|
+
unlockedBy: 'a "label" naming the workload on each record',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
field: 'timestamp',
|
|
36
|
+
finding: 'days, drift, the watch, any rate per period',
|
|
37
|
+
unlockedBy: 'a "timestamp" on each record (ISO 8601 or epoch milliseconds)',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
field: 'session',
|
|
41
|
+
finding: 'conversation growth, per-session budgets, cache TTL fit',
|
|
42
|
+
unlockedBy: 'a "session" grouping the turns of one conversation',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
field: 'cache',
|
|
46
|
+
finding: 'the cache verdict — whether caching is paying for itself',
|
|
47
|
+
unlockedBy: 'cache_read_input_tokens and cache_creation_input_tokens',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
field: 'stop_reason',
|
|
51
|
+
finding: 'truncation and the retry it causes — work billed twice',
|
|
52
|
+
unlockedBy: 'a "stop_reason" carrying what the provider returned',
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
function typeOf(value) {
|
|
56
|
+
if (value === null)
|
|
57
|
+
return 'null';
|
|
58
|
+
return Array.isArray(value) ? 'array' : typeof value;
|
|
59
|
+
}
|
|
60
|
+
/** Whether a record carries usable token counts, nested or flat. */
|
|
61
|
+
function usageOf(record) {
|
|
62
|
+
const nested = record.usage;
|
|
63
|
+
if (typeof nested === 'object' && nested !== null && !Array.isArray(nested)) {
|
|
64
|
+
return nested;
|
|
65
|
+
}
|
|
66
|
+
// A flat record is equally valid — an OTel exporter reshaping spans has no
|
|
67
|
+
// reason to nest — so the absence of `usage` is not itself a problem.
|
|
68
|
+
return record;
|
|
69
|
+
}
|
|
70
|
+
const TOKEN_FIELDS = [
|
|
71
|
+
'input_tokens',
|
|
72
|
+
'prompt_tokens',
|
|
73
|
+
'output_tokens',
|
|
74
|
+
'completion_tokens',
|
|
75
|
+
'cache_read_input_tokens',
|
|
76
|
+
'cache_creation_input_tokens',
|
|
77
|
+
];
|
|
78
|
+
/** Checks a body of one-JSON-object-per-line records. */
|
|
79
|
+
function conformUsageLog(text) {
|
|
80
|
+
const problems = [];
|
|
81
|
+
const seen = new Set();
|
|
82
|
+
let records = 0;
|
|
83
|
+
text.split('\n').forEach((line, index) => {
|
|
84
|
+
if (line.trim() === '')
|
|
85
|
+
return;
|
|
86
|
+
const at = `line ${index + 1}`;
|
|
87
|
+
let parsed;
|
|
88
|
+
try {
|
|
89
|
+
parsed = JSON.parse(line);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
problems.push({ at, kind: 'unreadable', detail: 'not valid JSON' });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
96
|
+
problems.push({ at, kind: 'wrong-type', detail: `a record must be an object, found ${typeOf(parsed)}` });
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
records += 1;
|
|
100
|
+
const record = parsed;
|
|
101
|
+
if (typeof record.model !== 'string' || record.model.trim() === '') {
|
|
102
|
+
problems.push({ at, kind: 'missing', detail: '"model" is required, so the tokens can be priced' });
|
|
103
|
+
}
|
|
104
|
+
const usage = usageOf(record);
|
|
105
|
+
const hasTokens = usage !== null && TOKEN_FIELDS.some((field) => typeof usage[field] === 'number');
|
|
106
|
+
if (!hasTokens) {
|
|
107
|
+
problems.push({
|
|
108
|
+
at,
|
|
109
|
+
kind: 'missing',
|
|
110
|
+
detail: `token counts are required — one of ${TOKEN_FIELDS.join(', ')}, nested under "usage" or flat`,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
for (const field of ['label', 'timestamp', 'session', 'stop_reason']) {
|
|
114
|
+
if (record[field] !== undefined && record[field] !== null)
|
|
115
|
+
seen.add(field);
|
|
116
|
+
}
|
|
117
|
+
if (usage !== null) {
|
|
118
|
+
for (const field of ['cache_read_input_tokens', 'cache_creation_input_tokens']) {
|
|
119
|
+
if (typeof usage[field] === 'number')
|
|
120
|
+
seen.add('cache');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
const unavailable = USAGE_OPTIONAL.filter((entry) => !seen.has(entry.field)).map((entry) => ({
|
|
125
|
+
finding: entry.finding,
|
|
126
|
+
because: `no record carries "${entry.field}"`,
|
|
127
|
+
unlockedBy: entry.unlockedBy,
|
|
128
|
+
}));
|
|
129
|
+
return {
|
|
130
|
+
schemaVersion: 1,
|
|
131
|
+
contract: 'usage-log',
|
|
132
|
+
because: null,
|
|
133
|
+
problems,
|
|
134
|
+
unavailable,
|
|
135
|
+
records,
|
|
136
|
+
conforms: problems.length === 0,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/** Whether a lone JSON object is a usage record rather than a document. */
|
|
140
|
+
function looksLikeUsageRecord(doc) {
|
|
141
|
+
if (typeof doc.model !== 'string')
|
|
142
|
+
return false;
|
|
143
|
+
const usage = usageOf(doc);
|
|
144
|
+
return usage !== null && TOKEN_FIELDS.some((field) => typeof usage[field] === 'number');
|
|
145
|
+
}
|
|
146
|
+
const rule = (path, expected, check) => ({
|
|
147
|
+
path,
|
|
148
|
+
expected,
|
|
149
|
+
check,
|
|
150
|
+
});
|
|
151
|
+
const isArray = (value) => Array.isArray(value);
|
|
152
|
+
const isObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
153
|
+
const isNumber = (value) => typeof value === 'number' && Number.isFinite(value);
|
|
154
|
+
const DOCUMENT_RULES = {
|
|
155
|
+
profile: [
|
|
156
|
+
rule('total', 'an object of token counts and dollars', isObject),
|
|
157
|
+
rule('byLabel', 'an array, largest bill first', isArray),
|
|
158
|
+
rule('byModel', 'an array, largest bill first', isArray),
|
|
159
|
+
rule('byLabelAndModel', 'an array — the grain a routing decision is made at', isArray),
|
|
160
|
+
rule('unpricedModels', 'an array, named rather than costed at zero', isArray),
|
|
161
|
+
rule('skippedLines', 'an array of 1-based positions', isArray),
|
|
162
|
+
rule('span', 'an object, or null when the log carried no clock', (v) => v === null || isObject(v)),
|
|
163
|
+
],
|
|
164
|
+
plan: [
|
|
165
|
+
rule('actions', 'an array, largest money first', isArray),
|
|
166
|
+
rule('projectedSavingUsd', 'a number', isNumber),
|
|
167
|
+
rule('measuredStakeUsd', 'a number, never added to the projection', isNumber),
|
|
168
|
+
rule('totalUsd', 'a number — the bill the plan was made against', isNumber),
|
|
169
|
+
],
|
|
170
|
+
verification: [
|
|
171
|
+
rule('actions', 'an array of judged actions', isArray),
|
|
172
|
+
rule('arrived', 'a number', isNumber),
|
|
173
|
+
rule('notArrived', 'a number', isNumber),
|
|
174
|
+
rule('cannotTell', 'a number — three outcomes, never two', isNumber),
|
|
175
|
+
],
|
|
176
|
+
history: [
|
|
177
|
+
rule('periods', 'an array of dated reports, oldest first', isArray),
|
|
178
|
+
rule('runs', 'an array of named shapes — never forecasts', isArray),
|
|
179
|
+
],
|
|
180
|
+
connected: [
|
|
181
|
+
rule('provider', 'a string', (v) => typeof v === 'string'),
|
|
182
|
+
rule('total', 'an object', isObject),
|
|
183
|
+
rule('unavailable', 'an array of findings this source cannot support', isArray),
|
|
184
|
+
],
|
|
185
|
+
'cost-answer': [
|
|
186
|
+
rule('verdict', 'one of within, over, cannot-tell', (v) => v === 'within' || v === 'over' || v === 'cannot-tell'),
|
|
187
|
+
rule('call', 'an object, or null when nothing was described', (v) => v === null || isObject(v)),
|
|
188
|
+
rule('budget', 'an object, or null when there is no budget', (v) => v === null || isObject(v)),
|
|
189
|
+
],
|
|
190
|
+
};
|
|
191
|
+
/**
|
|
192
|
+
* Which contract a document is claiming to be.
|
|
193
|
+
*
|
|
194
|
+
* By its most distinctive required field, not by trying each in turn and
|
|
195
|
+
* keeping the one with fewest complaints — that would report a broken plan as
|
|
196
|
+
* a slightly-more-broken profile, and send somebody to fix the wrong document.
|
|
197
|
+
*/
|
|
198
|
+
function contractOf(doc) {
|
|
199
|
+
if (Array.isArray(doc.byLabelAndModel))
|
|
200
|
+
return 'profile';
|
|
201
|
+
if (Array.isArray(doc.periods) && Array.isArray(doc.runs))
|
|
202
|
+
return 'history';
|
|
203
|
+
if (Array.isArray(doc.actions) && typeof doc.arrived === 'number')
|
|
204
|
+
return 'verification';
|
|
205
|
+
if (Array.isArray(doc.actions))
|
|
206
|
+
return 'plan';
|
|
207
|
+
if (typeof doc.verdict === 'string' && 'restsOn' in doc)
|
|
208
|
+
return 'cost-answer';
|
|
209
|
+
if (typeof doc.provider === 'string' && Array.isArray(doc.unavailable))
|
|
210
|
+
return 'connected';
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Checks a document or a usage log against the contract it claims.
|
|
215
|
+
*
|
|
216
|
+
* The check is on **required fields and their types**, and stops there.
|
|
217
|
+
* Documents here gain fields without a version bump, so a checker that
|
|
218
|
+
* rejected an unrecognised field would fail every consumer one release after
|
|
219
|
+
* it shipped.
|
|
220
|
+
*/
|
|
221
|
+
export function conform(text, options = {}) {
|
|
222
|
+
const trimmed = text.trim();
|
|
223
|
+
if (trimmed === '') {
|
|
224
|
+
return {
|
|
225
|
+
schemaVersion: 1,
|
|
226
|
+
contract: null,
|
|
227
|
+
because: 'the input is empty',
|
|
228
|
+
problems: [],
|
|
229
|
+
unavailable: [],
|
|
230
|
+
records: null,
|
|
231
|
+
conforms: false,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
if (options.contract === 'usage-log')
|
|
235
|
+
return conformUsageLog(text);
|
|
236
|
+
let parsed;
|
|
237
|
+
try {
|
|
238
|
+
parsed = JSON.parse(trimmed);
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
// More than one line, and not one JSON value: a usage log is the only
|
|
242
|
+
// shape here that looks like that, so it is what the reader would try.
|
|
243
|
+
if (trimmed.includes('\n'))
|
|
244
|
+
return conformUsageLog(text);
|
|
245
|
+
return {
|
|
246
|
+
schemaVersion: 1,
|
|
247
|
+
contract: null,
|
|
248
|
+
because: 'it is neither valid JSON nor one JSON object per line',
|
|
249
|
+
problems: [],
|
|
250
|
+
unavailable: [],
|
|
251
|
+
records: null,
|
|
252
|
+
conforms: false,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
if (!isObject(parsed)) {
|
|
256
|
+
return {
|
|
257
|
+
schemaVersion: 1,
|
|
258
|
+
contract: null,
|
|
259
|
+
because: `a document must be a JSON object, found ${typeOf(parsed)}`,
|
|
260
|
+
problems: [],
|
|
261
|
+
unavailable: [],
|
|
262
|
+
records: null,
|
|
263
|
+
conforms: false,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const doc = parsed;
|
|
267
|
+
/**
|
|
268
|
+
* A one-record log is both one JSON object per line **and** a valid JSON
|
|
269
|
+
* document, so detection has to break the tie. A `model` with token counts
|
|
270
|
+
* beside it is a usage record and nothing else in this project looks like
|
|
271
|
+
* one — every document contract carries `schemaVersion` and an array.
|
|
272
|
+
*
|
|
273
|
+
* `--contract usage-log` remains the way to be explicit, and an emitter
|
|
274
|
+
* testing a single record should use it.
|
|
275
|
+
*/
|
|
276
|
+
if (options.contract === undefined && looksLikeUsageRecord(doc))
|
|
277
|
+
return conformUsageLog(text);
|
|
278
|
+
// `usage-log` has already returned above, so anything left here is a
|
|
279
|
+
// document contract or nothing at all.
|
|
280
|
+
const contract = options.contract ?? contractOf(doc);
|
|
281
|
+
if (contract === null) {
|
|
282
|
+
return {
|
|
283
|
+
schemaVersion: 1,
|
|
284
|
+
contract: null,
|
|
285
|
+
because: 'no contract recognised it — a profile has byLabelAndModel, a plan has actions, a verification adds arrived, a history has periods and runs, a connected report has provider and unavailable, a cost answer has verdict and restsOn',
|
|
286
|
+
problems: [],
|
|
287
|
+
unavailable: [],
|
|
288
|
+
records: null,
|
|
289
|
+
conforms: false,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
const problems = [];
|
|
293
|
+
/**
|
|
294
|
+
* `schemaVersion` is checked for every document and is the one field whose
|
|
295
|
+
* absence is worth calling out separately: a consumer branches on it, and a
|
|
296
|
+
* document without one cannot be told from a document written before the
|
|
297
|
+
* contract existed.
|
|
298
|
+
*/
|
|
299
|
+
if (doc.schemaVersion === undefined) {
|
|
300
|
+
problems.push({
|
|
301
|
+
at: 'schemaVersion',
|
|
302
|
+
kind: 'missing',
|
|
303
|
+
detail: 'required — a consumer branches on it, and its absence cannot be told from a pre-contract document',
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
else if (doc.schemaVersion !== 1) {
|
|
307
|
+
problems.push({
|
|
308
|
+
at: 'schemaVersion',
|
|
309
|
+
kind: 'wrong-type',
|
|
310
|
+
detail: `expected 1, found ${JSON.stringify(doc.schemaVersion)}`,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
for (const field of DOCUMENT_RULES[contract]) {
|
|
314
|
+
const value = doc[field.path];
|
|
315
|
+
if (value === undefined) {
|
|
316
|
+
problems.push({ at: field.path, kind: 'missing', detail: `required: ${field.expected}` });
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
if (!field.check(value)) {
|
|
320
|
+
// A zero where the contract requires null for absence is called out as
|
|
321
|
+
// its own kind, because it is the mistake that produces a wrong report
|
|
322
|
+
// rather than a rejected one — and it is always in the flattering
|
|
323
|
+
// direction.
|
|
324
|
+
const kind = value === 0 && field.expected.includes('null') ? 'absence-as-zero' : 'wrong-type';
|
|
325
|
+
problems.push({
|
|
326
|
+
at: field.path,
|
|
327
|
+
kind,
|
|
328
|
+
detail: `expected ${field.expected}, found ${typeOf(value)}`,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
schemaVersion: 1,
|
|
334
|
+
contract,
|
|
335
|
+
because: null,
|
|
336
|
+
problems,
|
|
337
|
+
unavailable: [],
|
|
338
|
+
records: null,
|
|
339
|
+
conforms: problems.length === 0,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=conform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conform.js","sourceRoot":"","sources":["../src/conform.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ export type { PlanParseFailure, PlanParseResult } from './plan.js';
|
|
|
18
18
|
export type { PlanAction, PlanActionKind, PlanAssumption, PlanDocument } from './plan.js';
|
|
19
19
|
export { verifyPlan } from './verify.js';
|
|
20
20
|
export { buildHistory, storedReportFrom, MIN_RUN } from './history.js';
|
|
21
|
+
export { conform } from './conform.js';
|
|
22
|
+
export type { ConformOptions, ConformanceProblem, ConformanceReport, ContractName, } from './conform.js';
|
|
21
23
|
export { budgetPositions, monthOf, MAX_UNMEASURED_NAMED } from './budget.js';
|
|
22
24
|
export type { BudgetCoverage, BudgetOptions, BudgetPeriod, BudgetStanding, BudgetReport, BudgetScope, BurnDown, BurnShape, } from './budget.js';
|
|
23
25
|
export { waiverHistory, waiverDay, isWaiverUse } from './waivers.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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
|
@@ -21,6 +21,7 @@ export { assignSources, fleetRollup } from './fleet.js';
|
|
|
21
21
|
export { buildPlan, planLabelName, parsePlanDocument, PLAN_ACTION_KINDS } from './plan.js';
|
|
22
22
|
export { verifyPlan } from './verify.js';
|
|
23
23
|
export { buildHistory, storedReportFrom, MIN_RUN } from './history.js';
|
|
24
|
+
export { conform } from './conform.js';
|
|
24
25
|
export { budgetPositions, monthOf, MAX_UNMEASURED_NAMED } from './budget.js';
|
|
25
26
|
export { waiverHistory, waiverDay, isWaiverUse } from './waivers.js';
|
|
26
27
|
export { answerCost } from './answer.js';
|
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": "@trazum/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.50.1",
|
|
4
4
|
"description": "Trazum core: priced advisories for LLM prompts (caching, model tier, batching, schemas), plus deterministic trimming, token counting and pricing.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "David Mu\u00f1oz Rey",
|
package/src/conform.ts
ADDED
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Does this document conform, and what will it not be able to answer?
|
|
3
|
+
*
|
|
4
|
+
* Ten releases of arithmetic that refuses to flatter are worth more if other
|
|
5
|
+
* tools can emit and read the same documents. That needs two things, and this
|
|
6
|
+
* module is the second of them: the contracts are written down in `docs/`, and
|
|
7
|
+
* an emitter needs a way to find out whether what it produces actually
|
|
8
|
+
* satisfies one — without reading a specification and hoping.
|
|
9
|
+
*
|
|
10
|
+
* **Two questions, kept apart.** *Is this a valid X* is a yes or no. *What can
|
|
11
|
+
* a valid X of this shape not tell you* is the useful one, and it has nothing
|
|
12
|
+
* to do with validity: a usage log with no `session` field is perfectly valid
|
|
13
|
+
* and simply cannot support conversation growth. An emitter that only learns
|
|
14
|
+
* the first answer ships something Trazum reads and half the findings quietly
|
|
15
|
+
* never appear. So a conforming document still comes back with a list of what
|
|
16
|
+
* it has bought itself out of.
|
|
17
|
+
*
|
|
18
|
+
* **It never repairs and never guesses.** A line that will not parse is
|
|
19
|
+
* reported at its position; a field of the wrong type is named with the type
|
|
20
|
+
* found. Nothing is coerced — the whole point of a conformance check that a
|
|
21
|
+
* third party runs is that it agrees with what the reader will actually do.
|
|
22
|
+
*
|
|
23
|
+
* **Unknown fields are not problems.** Documents here gain fields without a
|
|
24
|
+
* version bump, and a checker that rejects tomorrow's field is a checker
|
|
25
|
+
* nobody upgrades. Only *absent* required fields and *wrong* types fail.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/** The documents this project emits, and their names. */
|
|
29
|
+
export type ContractName =
|
|
30
|
+
| 'usage-log'
|
|
31
|
+
| 'profile'
|
|
32
|
+
| 'plan'
|
|
33
|
+
| 'verification'
|
|
34
|
+
| 'history'
|
|
35
|
+
| 'connected'
|
|
36
|
+
| 'cost-answer';
|
|
37
|
+
|
|
38
|
+
export interface ConformanceProblem {
|
|
39
|
+
/** Where: `line 12` for a log, or a dotted path inside a document. */
|
|
40
|
+
at: string;
|
|
41
|
+
kind:
|
|
42
|
+
/** A required field is absent. */
|
|
43
|
+
| 'missing'
|
|
44
|
+
/** Present, and not the type the contract states. */
|
|
45
|
+
| 'wrong-type'
|
|
46
|
+
/** Present as `0` where the contract requires `null` for absence. */
|
|
47
|
+
| 'absence-as-zero'
|
|
48
|
+
/** The line or the document could not be parsed at all. */
|
|
49
|
+
| 'unreadable';
|
|
50
|
+
detail: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** A finding a valid document of this shape simply cannot support. */
|
|
54
|
+
export interface UnavailableFinding {
|
|
55
|
+
finding: string;
|
|
56
|
+
because: string;
|
|
57
|
+
unlockedBy: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface ConformanceReport {
|
|
61
|
+
schemaVersion: 1;
|
|
62
|
+
/** Which contract this looks like, or null when nothing did. */
|
|
63
|
+
contract: ContractName | null;
|
|
64
|
+
/**
|
|
65
|
+
* Why nothing matched. Present only when `contract` is null, and never a
|
|
66
|
+
* bare "invalid": a refusal with nothing after it is indistinguishable from
|
|
67
|
+
* a bug, which is the rule this project applies to every other refusal.
|
|
68
|
+
*/
|
|
69
|
+
because: string | null;
|
|
70
|
+
problems: ConformanceProblem[];
|
|
71
|
+
unavailable: UnavailableFinding[];
|
|
72
|
+
/** Records examined, for a log. Null for a single document. */
|
|
73
|
+
records: number | null;
|
|
74
|
+
conforms: boolean;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Fields a usage record may carry, and the finding each one buys. */
|
|
78
|
+
const USAGE_OPTIONAL: { field: string; finding: string; unlockedBy: string }[] = [
|
|
79
|
+
{
|
|
80
|
+
field: 'label',
|
|
81
|
+
finding: 'per-workload bills, per-label budgets, the ranked plan',
|
|
82
|
+
unlockedBy: 'a "label" naming the workload on each record',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
field: 'timestamp',
|
|
86
|
+
finding: 'days, drift, the watch, any rate per period',
|
|
87
|
+
unlockedBy: 'a "timestamp" on each record (ISO 8601 or epoch milliseconds)',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
field: 'session',
|
|
91
|
+
finding: 'conversation growth, per-session budgets, cache TTL fit',
|
|
92
|
+
unlockedBy: 'a "session" grouping the turns of one conversation',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
field: 'cache',
|
|
96
|
+
finding: 'the cache verdict — whether caching is paying for itself',
|
|
97
|
+
unlockedBy: 'cache_read_input_tokens and cache_creation_input_tokens',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
field: 'stop_reason',
|
|
101
|
+
finding: 'truncation and the retry it causes — work billed twice',
|
|
102
|
+
unlockedBy: 'a "stop_reason" carrying what the provider returned',
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
|
|
106
|
+
function typeOf(value: unknown): string {
|
|
107
|
+
if (value === null) return 'null';
|
|
108
|
+
return Array.isArray(value) ? 'array' : typeof value;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Whether a record carries usable token counts, nested or flat. */
|
|
112
|
+
function usageOf(record: Record<string, unknown>): Record<string, unknown> | null {
|
|
113
|
+
const nested = record.usage;
|
|
114
|
+
if (typeof nested === 'object' && nested !== null && !Array.isArray(nested)) {
|
|
115
|
+
return nested as Record<string, unknown>;
|
|
116
|
+
}
|
|
117
|
+
// A flat record is equally valid — an OTel exporter reshaping spans has no
|
|
118
|
+
// reason to nest — so the absence of `usage` is not itself a problem.
|
|
119
|
+
return record;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const TOKEN_FIELDS = [
|
|
123
|
+
'input_tokens',
|
|
124
|
+
'prompt_tokens',
|
|
125
|
+
'output_tokens',
|
|
126
|
+
'completion_tokens',
|
|
127
|
+
'cache_read_input_tokens',
|
|
128
|
+
'cache_creation_input_tokens',
|
|
129
|
+
];
|
|
130
|
+
|
|
131
|
+
/** Checks a body of one-JSON-object-per-line records. */
|
|
132
|
+
function conformUsageLog(text: string): ConformanceReport {
|
|
133
|
+
const problems: ConformanceProblem[] = [];
|
|
134
|
+
const seen = new Set<string>();
|
|
135
|
+
let records = 0;
|
|
136
|
+
|
|
137
|
+
text.split('\n').forEach((line, index) => {
|
|
138
|
+
if (line.trim() === '') return;
|
|
139
|
+
const at = `line ${index + 1}`;
|
|
140
|
+
let parsed: unknown;
|
|
141
|
+
try {
|
|
142
|
+
parsed = JSON.parse(line);
|
|
143
|
+
} catch {
|
|
144
|
+
problems.push({ at, kind: 'unreadable', detail: 'not valid JSON' });
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
148
|
+
problems.push({ at, kind: 'wrong-type', detail: `a record must be an object, found ${typeOf(parsed)}` });
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
records += 1;
|
|
152
|
+
const record = parsed as Record<string, unknown>;
|
|
153
|
+
|
|
154
|
+
if (typeof record.model !== 'string' || record.model.trim() === '') {
|
|
155
|
+
problems.push({ at, kind: 'missing', detail: '"model" is required, so the tokens can be priced' });
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const usage = usageOf(record);
|
|
159
|
+
const hasTokens =
|
|
160
|
+
usage !== null && TOKEN_FIELDS.some((field) => typeof usage[field] === 'number');
|
|
161
|
+
if (!hasTokens) {
|
|
162
|
+
problems.push({
|
|
163
|
+
at,
|
|
164
|
+
kind: 'missing',
|
|
165
|
+
detail: `token counts are required — one of ${TOKEN_FIELDS.join(', ')}, nested under "usage" or flat`,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
for (const field of ['label', 'timestamp', 'session', 'stop_reason']) {
|
|
170
|
+
if (record[field] !== undefined && record[field] !== null) seen.add(field);
|
|
171
|
+
}
|
|
172
|
+
if (usage !== null) {
|
|
173
|
+
for (const field of ['cache_read_input_tokens', 'cache_creation_input_tokens']) {
|
|
174
|
+
if (typeof usage[field] === 'number') seen.add('cache');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
const unavailable = USAGE_OPTIONAL.filter((entry) => !seen.has(entry.field)).map((entry) => ({
|
|
180
|
+
finding: entry.finding,
|
|
181
|
+
because: `no record carries "${entry.field}"`,
|
|
182
|
+
unlockedBy: entry.unlockedBy,
|
|
183
|
+
}));
|
|
184
|
+
|
|
185
|
+
return {
|
|
186
|
+
schemaVersion: 1,
|
|
187
|
+
contract: 'usage-log',
|
|
188
|
+
because: null,
|
|
189
|
+
problems,
|
|
190
|
+
unavailable,
|
|
191
|
+
records,
|
|
192
|
+
conforms: problems.length === 0,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** Whether a lone JSON object is a usage record rather than a document. */
|
|
197
|
+
function looksLikeUsageRecord(doc: Record<string, unknown>): boolean {
|
|
198
|
+
if (typeof doc.model !== 'string') return false;
|
|
199
|
+
const usage = usageOf(doc);
|
|
200
|
+
return usage !== null && TOKEN_FIELDS.some((field) => typeof usage[field] === 'number');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/** A required field of a document contract, and how to check it. */
|
|
204
|
+
interface FieldRule {
|
|
205
|
+
path: string;
|
|
206
|
+
check: (value: unknown) => boolean;
|
|
207
|
+
expected: string;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const rule = (path: string, expected: string, check: (value: unknown) => boolean): FieldRule => ({
|
|
211
|
+
path,
|
|
212
|
+
expected,
|
|
213
|
+
check,
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
const isArray = (value: unknown): boolean => Array.isArray(value);
|
|
217
|
+
const isObject = (value: unknown): boolean =>
|
|
218
|
+
typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
219
|
+
const isNumber = (value: unknown): boolean => typeof value === 'number' && Number.isFinite(value);
|
|
220
|
+
|
|
221
|
+
const DOCUMENT_RULES: Record<Exclude<ContractName, 'usage-log'>, FieldRule[]> = {
|
|
222
|
+
profile: [
|
|
223
|
+
rule('total', 'an object of token counts and dollars', isObject),
|
|
224
|
+
rule('byLabel', 'an array, largest bill first', isArray),
|
|
225
|
+
rule('byModel', 'an array, largest bill first', isArray),
|
|
226
|
+
rule('byLabelAndModel', 'an array — the grain a routing decision is made at', isArray),
|
|
227
|
+
rule('unpricedModels', 'an array, named rather than costed at zero', isArray),
|
|
228
|
+
rule('skippedLines', 'an array of 1-based positions', isArray),
|
|
229
|
+
rule('span', 'an object, or null when the log carried no clock', (v) => v === null || isObject(v)),
|
|
230
|
+
],
|
|
231
|
+
plan: [
|
|
232
|
+
rule('actions', 'an array, largest money first', isArray),
|
|
233
|
+
rule('projectedSavingUsd', 'a number', isNumber),
|
|
234
|
+
rule('measuredStakeUsd', 'a number, never added to the projection', isNumber),
|
|
235
|
+
rule('totalUsd', 'a number — the bill the plan was made against', isNumber),
|
|
236
|
+
],
|
|
237
|
+
verification: [
|
|
238
|
+
rule('actions', 'an array of judged actions', isArray),
|
|
239
|
+
rule('arrived', 'a number', isNumber),
|
|
240
|
+
rule('notArrived', 'a number', isNumber),
|
|
241
|
+
rule('cannotTell', 'a number — three outcomes, never two', isNumber),
|
|
242
|
+
],
|
|
243
|
+
history: [
|
|
244
|
+
rule('periods', 'an array of dated reports, oldest first', isArray),
|
|
245
|
+
rule('runs', 'an array of named shapes — never forecasts', isArray),
|
|
246
|
+
],
|
|
247
|
+
connected: [
|
|
248
|
+
rule('provider', 'a string', (v) => typeof v === 'string'),
|
|
249
|
+
rule('total', 'an object', isObject),
|
|
250
|
+
rule('unavailable', 'an array of findings this source cannot support', isArray),
|
|
251
|
+
],
|
|
252
|
+
'cost-answer': [
|
|
253
|
+
rule('verdict', 'one of within, over, cannot-tell', (v) =>
|
|
254
|
+
v === 'within' || v === 'over' || v === 'cannot-tell'),
|
|
255
|
+
rule('call', 'an object, or null when nothing was described', (v) => v === null || isObject(v)),
|
|
256
|
+
rule('budget', 'an object, or null when there is no budget', (v) => v === null || isObject(v)),
|
|
257
|
+
],
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Which contract a document is claiming to be.
|
|
262
|
+
*
|
|
263
|
+
* By its most distinctive required field, not by trying each in turn and
|
|
264
|
+
* keeping the one with fewest complaints — that would report a broken plan as
|
|
265
|
+
* a slightly-more-broken profile, and send somebody to fix the wrong document.
|
|
266
|
+
*/
|
|
267
|
+
function contractOf(doc: Record<string, unknown>): Exclude<ContractName, 'usage-log'> | null {
|
|
268
|
+
if (Array.isArray(doc.byLabelAndModel)) return 'profile';
|
|
269
|
+
if (Array.isArray(doc.periods) && Array.isArray(doc.runs)) return 'history';
|
|
270
|
+
if (Array.isArray(doc.actions) && typeof doc.arrived === 'number') return 'verification';
|
|
271
|
+
if (Array.isArray(doc.actions)) return 'plan';
|
|
272
|
+
if (typeof doc.verdict === 'string' && 'restsOn' in doc) return 'cost-answer';
|
|
273
|
+
if (typeof doc.provider === 'string' && Array.isArray(doc.unavailable)) return 'connected';
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
export interface ConformOptions {
|
|
278
|
+
/** Force a contract instead of detecting one, for an emitter under test. */
|
|
279
|
+
contract?: ContractName;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Checks a document or a usage log against the contract it claims.
|
|
284
|
+
*
|
|
285
|
+
* The check is on **required fields and their types**, and stops there.
|
|
286
|
+
* Documents here gain fields without a version bump, so a checker that
|
|
287
|
+
* rejected an unrecognised field would fail every consumer one release after
|
|
288
|
+
* it shipped.
|
|
289
|
+
*/
|
|
290
|
+
export function conform(text: string, options: ConformOptions = {}): ConformanceReport {
|
|
291
|
+
const trimmed = text.trim();
|
|
292
|
+
if (trimmed === '') {
|
|
293
|
+
return {
|
|
294
|
+
schemaVersion: 1,
|
|
295
|
+
contract: null,
|
|
296
|
+
because: 'the input is empty',
|
|
297
|
+
problems: [],
|
|
298
|
+
unavailable: [],
|
|
299
|
+
records: null,
|
|
300
|
+
conforms: false,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
if (options.contract === 'usage-log') return conformUsageLog(text);
|
|
305
|
+
|
|
306
|
+
let parsed: unknown;
|
|
307
|
+
try {
|
|
308
|
+
parsed = JSON.parse(trimmed);
|
|
309
|
+
} catch {
|
|
310
|
+
// More than one line, and not one JSON value: a usage log is the only
|
|
311
|
+
// shape here that looks like that, so it is what the reader would try.
|
|
312
|
+
if (trimmed.includes('\n')) return conformUsageLog(text);
|
|
313
|
+
return {
|
|
314
|
+
schemaVersion: 1,
|
|
315
|
+
contract: null,
|
|
316
|
+
because: 'it is neither valid JSON nor one JSON object per line',
|
|
317
|
+
problems: [],
|
|
318
|
+
unavailable: [],
|
|
319
|
+
records: null,
|
|
320
|
+
conforms: false,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (!isObject(parsed)) {
|
|
325
|
+
return {
|
|
326
|
+
schemaVersion: 1,
|
|
327
|
+
contract: null,
|
|
328
|
+
because: `a document must be a JSON object, found ${typeOf(parsed)}`,
|
|
329
|
+
problems: [],
|
|
330
|
+
unavailable: [],
|
|
331
|
+
records: null,
|
|
332
|
+
conforms: false,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const doc = parsed as Record<string, unknown>;
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* A one-record log is both one JSON object per line **and** a valid JSON
|
|
340
|
+
* document, so detection has to break the tie. A `model` with token counts
|
|
341
|
+
* beside it is a usage record and nothing else in this project looks like
|
|
342
|
+
* one — every document contract carries `schemaVersion` and an array.
|
|
343
|
+
*
|
|
344
|
+
* `--contract usage-log` remains the way to be explicit, and an emitter
|
|
345
|
+
* testing a single record should use it.
|
|
346
|
+
*/
|
|
347
|
+
if (options.contract === undefined && looksLikeUsageRecord(doc)) return conformUsageLog(text);
|
|
348
|
+
|
|
349
|
+
// `usage-log` has already returned above, so anything left here is a
|
|
350
|
+
// document contract or nothing at all.
|
|
351
|
+
const contract = options.contract ?? contractOf(doc);
|
|
352
|
+
|
|
353
|
+
if (contract === null) {
|
|
354
|
+
return {
|
|
355
|
+
schemaVersion: 1,
|
|
356
|
+
contract: null,
|
|
357
|
+
because:
|
|
358
|
+
'no contract recognised it — a profile has byLabelAndModel, a plan has actions, a verification adds arrived, a history has periods and runs, a connected report has provider and unavailable, a cost answer has verdict and restsOn',
|
|
359
|
+
problems: [],
|
|
360
|
+
unavailable: [],
|
|
361
|
+
records: null,
|
|
362
|
+
conforms: false,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
const problems: ConformanceProblem[] = [];
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* `schemaVersion` is checked for every document and is the one field whose
|
|
370
|
+
* absence is worth calling out separately: a consumer branches on it, and a
|
|
371
|
+
* document without one cannot be told from a document written before the
|
|
372
|
+
* contract existed.
|
|
373
|
+
*/
|
|
374
|
+
if (doc.schemaVersion === undefined) {
|
|
375
|
+
problems.push({
|
|
376
|
+
at: 'schemaVersion',
|
|
377
|
+
kind: 'missing',
|
|
378
|
+
detail: 'required — a consumer branches on it, and its absence cannot be told from a pre-contract document',
|
|
379
|
+
});
|
|
380
|
+
} else if (doc.schemaVersion !== 1) {
|
|
381
|
+
problems.push({
|
|
382
|
+
at: 'schemaVersion',
|
|
383
|
+
kind: 'wrong-type',
|
|
384
|
+
detail: `expected 1, found ${JSON.stringify(doc.schemaVersion)}`,
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
for (const field of DOCUMENT_RULES[contract]) {
|
|
389
|
+
const value = doc[field.path];
|
|
390
|
+
if (value === undefined) {
|
|
391
|
+
problems.push({ at: field.path, kind: 'missing', detail: `required: ${field.expected}` });
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
if (!field.check(value)) {
|
|
395
|
+
// A zero where the contract requires null for absence is called out as
|
|
396
|
+
// its own kind, because it is the mistake that produces a wrong report
|
|
397
|
+
// rather than a rejected one — and it is always in the flattering
|
|
398
|
+
// direction.
|
|
399
|
+
const kind: ConformanceProblem['kind'] =
|
|
400
|
+
value === 0 && field.expected.includes('null') ? 'absence-as-zero' : 'wrong-type';
|
|
401
|
+
problems.push({
|
|
402
|
+
at: field.path,
|
|
403
|
+
kind,
|
|
404
|
+
detail: `expected ${field.expected}, found ${typeOf(value)}`,
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
return {
|
|
410
|
+
schemaVersion: 1,
|
|
411
|
+
contract,
|
|
412
|
+
because: null,
|
|
413
|
+
problems,
|
|
414
|
+
unavailable: [],
|
|
415
|
+
records: null,
|
|
416
|
+
conforms: problems.length === 0,
|
|
417
|
+
};
|
|
418
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -49,6 +49,13 @@ export type { PlanParseFailure, PlanParseResult } from './plan.js';
|
|
|
49
49
|
export type { PlanAction, PlanActionKind, PlanAssumption, PlanDocument } from './plan.js';
|
|
50
50
|
export { verifyPlan } from './verify.js';
|
|
51
51
|
export { buildHistory, storedReportFrom, MIN_RUN } from './history.js';
|
|
52
|
+
export { conform } from './conform.js';
|
|
53
|
+
export type {
|
|
54
|
+
ConformOptions,
|
|
55
|
+
ConformanceProblem,
|
|
56
|
+
ConformanceReport,
|
|
57
|
+
ContractName,
|
|
58
|
+
} from './conform.js';
|
|
52
59
|
export { budgetPositions, monthOf, MAX_UNMEASURED_NAMED } from './budget.js';
|
|
53
60
|
export type {
|
|
54
61
|
BudgetCoverage,
|