modelrig 0.4.0 → 0.6.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 (189) hide show
  1. package/CHANGELOG.md +238 -0
  2. package/README.md +65 -3
  3. package/dist/adapters/anthropic.d.ts.map +1 -1
  4. package/dist/adapters/anthropic.js +36 -7
  5. package/dist/adapters/attempt-meta-map.d.ts +63 -0
  6. package/dist/adapters/attempt-meta-map.d.ts.map +1 -0
  7. package/dist/adapters/attempt-meta-map.js +154 -0
  8. package/dist/adapters/deepseek.d.ts.map +1 -1
  9. package/dist/adapters/deepseek.js +25 -2
  10. package/dist/adapters/gemini.d.ts +39 -0
  11. package/dist/adapters/gemini.d.ts.map +1 -1
  12. package/dist/adapters/gemini.js +82 -4
  13. package/dist/adapters/grok.d.ts.map +1 -1
  14. package/dist/adapters/grok.js +25 -2
  15. package/dist/adapters/openai-compat.d.ts.map +1 -1
  16. package/dist/adapters/openai-compat.js +25 -2
  17. package/dist/adapters/openai-stream.d.ts +2 -0
  18. package/dist/adapters/openai-stream.d.ts.map +1 -1
  19. package/dist/adapters/openai-stream.js +23 -3
  20. package/dist/adapters/openai.d.ts.map +1 -1
  21. package/dist/adapters/openai.js +36 -6
  22. package/dist/artifacts/artifact.d.ts +3 -2
  23. package/dist/artifacts/artifact.d.ts.map +1 -1
  24. package/dist/artifacts/artifact.js +35 -9
  25. package/dist/artifacts/classification.d.ts +27 -0
  26. package/dist/artifacts/classification.d.ts.map +1 -0
  27. package/dist/artifacts/classification.js +38 -0
  28. package/dist/artifacts/index.d.ts +3 -1
  29. package/dist/artifacts/index.d.ts.map +1 -1
  30. package/dist/artifacts/index.js +10 -1
  31. package/dist/artifacts/run-context.d.ts +33 -2
  32. package/dist/artifacts/run-context.d.ts.map +1 -1
  33. package/dist/artifacts/run-context.js +95 -1
  34. package/dist/artifacts/scrub.d.ts +26 -0
  35. package/dist/artifacts/scrub.d.ts.map +1 -1
  36. package/dist/artifacts/scrub.js +53 -0
  37. package/dist/artifacts/step.d.ts +9 -0
  38. package/dist/artifacts/step.d.ts.map +1 -1
  39. package/dist/artifacts/step.js +9 -0
  40. package/dist/bakeoff/engine.d.ts +46 -4
  41. package/dist/bakeoff/engine.d.ts.map +1 -1
  42. package/dist/bakeoff/engine.js +269 -19
  43. package/dist/bakeoff/eval-cases.d.ts +5 -0
  44. package/dist/bakeoff/eval-cases.d.ts.map +1 -1
  45. package/dist/bakeoff/eval-cases.js +3 -0
  46. package/dist/bakeoff/judge.d.ts +39 -0
  47. package/dist/bakeoff/judge.d.ts.map +1 -0
  48. package/dist/bakeoff/judge.js +102 -0
  49. package/dist/bakeoff/quality.d.ts +44 -0
  50. package/dist/bakeoff/quality.d.ts.map +1 -0
  51. package/dist/bakeoff/quality.js +126 -0
  52. package/dist/bakeoff/reference.d.ts +34 -0
  53. package/dist/bakeoff/reference.d.ts.map +1 -0
  54. package/dist/bakeoff/reference.js +68 -0
  55. package/dist/bakeoff/replay.d.ts +25 -0
  56. package/dist/bakeoff/replay.d.ts.map +1 -1
  57. package/dist/bakeoff/replay.js +65 -2
  58. package/dist/bakeoff/report.d.ts +8 -1
  59. package/dist/bakeoff/report.d.ts.map +1 -1
  60. package/dist/bakeoff/report.js +83 -12
  61. package/dist/bakeoff/samples.d.ts +35 -2
  62. package/dist/bakeoff/samples.d.ts.map +1 -1
  63. package/dist/bakeoff/samples.js +67 -6
  64. package/dist/bakeoff/stats.d.ts +17 -1
  65. package/dist/bakeoff/stats.d.ts.map +1 -1
  66. package/dist/bakeoff/stats.js +67 -0
  67. package/dist/bakeoff/types.d.ts +76 -5
  68. package/dist/bakeoff/types.d.ts.map +1 -1
  69. package/dist/bakeoff/types.js +4 -3
  70. package/dist/cli-query.d.ts +14 -0
  71. package/dist/cli-query.d.ts.map +1 -0
  72. package/dist/cli-query.js +59 -0
  73. package/dist/cli.d.ts +2 -1
  74. package/dist/cli.d.ts.map +1 -1
  75. package/dist/cli.js +47 -24
  76. package/dist/config.d.ts +6 -0
  77. package/dist/config.d.ts.map +1 -1
  78. package/dist/config.js +14 -0
  79. package/dist/detect/detector.d.ts +82 -0
  80. package/dist/detect/detector.d.ts.map +1 -0
  81. package/dist/detect/detector.js +23 -0
  82. package/dist/index.d.ts +34 -23
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +49 -12
  85. package/dist/query/analytics.d.ts +84 -0
  86. package/dist/query/analytics.d.ts.map +1 -0
  87. package/dist/query/analytics.js +280 -0
  88. package/dist/query/columns.d.ts +59 -0
  89. package/dist/query/columns.d.ts.map +1 -0
  90. package/dist/query/columns.js +89 -0
  91. package/dist/query/grammar.d.ts +74 -7
  92. package/dist/query/grammar.d.ts.map +1 -1
  93. package/dist/query/grammar.js +179 -71
  94. package/dist/query/saved.d.ts +26 -0
  95. package/dist/query/saved.d.ts.map +1 -0
  96. package/dist/query/saved.js +51 -0
  97. package/dist/registry/select.d.ts +59 -0
  98. package/dist/registry/select.d.ts.map +1 -1
  99. package/dist/registry/select.js +66 -0
  100. package/dist/routes/loader-warnings.d.ts +28 -0
  101. package/dist/routes/loader-warnings.d.ts.map +1 -0
  102. package/dist/routes/loader-warnings.js +56 -0
  103. package/dist/routes/loader.d.ts +1 -11
  104. package/dist/routes/loader.d.ts.map +1 -1
  105. package/dist/routes/loader.js +54 -31
  106. package/dist/routes/objective-loader.d.ts +35 -0
  107. package/dist/routes/objective-loader.d.ts.map +1 -0
  108. package/dist/routes/objective-loader.js +286 -0
  109. package/dist/run/accept.d.ts +43 -0
  110. package/dist/run/accept.d.ts.map +1 -0
  111. package/dist/run/accept.js +65 -0
  112. package/dist/run/cost.d.ts +13 -0
  113. package/dist/run/cost.d.ts.map +1 -1
  114. package/dist/run/cost.js +27 -0
  115. package/dist/run/dispatch.d.ts +24 -1
  116. package/dist/run/dispatch.d.ts.map +1 -1
  117. package/dist/run/dispatch.js +19 -0
  118. package/dist/run/ladder-key.d.ts +4 -0
  119. package/dist/run/ladder-key.d.ts.map +1 -1
  120. package/dist/run/ladder-key.js +3 -0
  121. package/dist/run/quality-gate.d.ts +39 -0
  122. package/dist/run/quality-gate.d.ts.map +1 -0
  123. package/dist/run/quality-gate.js +70 -0
  124. package/dist/run/raw-defaults.d.ts +52 -0
  125. package/dist/run/raw-defaults.d.ts.map +1 -0
  126. package/dist/run/raw-defaults.js +123 -0
  127. package/dist/run/raw.d.ts +12 -0
  128. package/dist/run/raw.d.ts.map +1 -1
  129. package/dist/run/raw.js +107 -8
  130. package/dist/run/record-attempt.d.ts.map +1 -1
  131. package/dist/run/record-attempt.js +22 -1
  132. package/dist/run/resolve.d.ts +17 -1
  133. package/dist/run/resolve.d.ts.map +1 -1
  134. package/dist/run/resolve.js +20 -4
  135. package/dist/run/routing-docs.d.ts.map +1 -1
  136. package/dist/run/routing-docs.js +12 -5
  137. package/dist/run/run.d.ts +7 -1
  138. package/dist/run/run.d.ts.map +1 -1
  139. package/dist/run/run.js +54 -69
  140. package/dist/run/variant.d.ts +43 -0
  141. package/dist/run/variant.d.ts.map +1 -0
  142. package/dist/run/variant.js +86 -0
  143. package/dist/savings/emit.d.ts +33 -0
  144. package/dist/savings/emit.d.ts.map +1 -1
  145. package/dist/savings/emit.js +75 -3
  146. package/dist/settings/index.d.ts +1 -1
  147. package/dist/settings/index.d.ts.map +1 -1
  148. package/dist/settings/index.js +2 -1
  149. package/dist/settings/task-settings.d.ts +10 -0
  150. package/dist/settings/task-settings.d.ts.map +1 -1
  151. package/dist/settings/task-settings.js +17 -0
  152. package/dist/telemetry/attempt-meta.d.ts +178 -0
  153. package/dist/telemetry/attempt-meta.d.ts.map +1 -0
  154. package/dist/telemetry/attempt-meta.js +319 -0
  155. package/dist/telemetry/exporter.d.ts.map +1 -1
  156. package/dist/telemetry/exporter.js +6 -0
  157. package/dist/telemetry/ingest-protocol.d.ts +11 -0
  158. package/dist/telemetry/ingest-protocol.d.ts.map +1 -1
  159. package/dist/telemetry/ingest-protocol.js +3 -0
  160. package/dist/telemetry/otel-map.d.ts +10 -0
  161. package/dist/telemetry/otel-map.d.ts.map +1 -1
  162. package/dist/telemetry/otel-map.js +64 -0
  163. package/dist/telemetry/store-migrations.d.ts.map +1 -1
  164. package/dist/telemetry/store-migrations.js +15 -0
  165. package/dist/telemetry/store.d.ts.map +1 -1
  166. package/dist/telemetry/store.js +25 -7
  167. package/dist/types/failures-teaching.d.ts.map +1 -1
  168. package/dist/types/failures-teaching.js +20 -0
  169. package/dist/types/failures.d.ts +1 -1
  170. package/dist/types/failures.d.ts.map +1 -1
  171. package/dist/types/failures.js +1 -0
  172. package/dist/types/provider.d.ts +9 -0
  173. package/dist/types/provider.d.ts.map +1 -1
  174. package/dist/types/quality.d.ts +41 -0
  175. package/dist/types/quality.d.ts.map +1 -0
  176. package/dist/types/quality.js +12 -0
  177. package/dist/types/route.d.ts +120 -0
  178. package/dist/types/route.d.ts.map +1 -1
  179. package/dist/types/telemetry.d.ts +13 -0
  180. package/dist/types/telemetry.d.ts.map +1 -1
  181. package/dist/validate-cli.d.ts.map +1 -1
  182. package/dist/validate-cli.js +10 -0
  183. package/dist/watch/evaluate.d.ts +27 -1
  184. package/dist/watch/evaluate.d.ts.map +1 -1
  185. package/dist/watch/evaluate.js +13 -0
  186. package/dist/watch/proposals.d.ts +28 -0
  187. package/dist/watch/proposals.d.ts.map +1 -1
  188. package/dist/watch/proposals.js +51 -0
  189. package/package.json +1 -1
@@ -23,6 +23,7 @@
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.TRACEPARENT_TAG = exports.SEMCONV_VERSION = void 0;
25
25
  exports.parseTraceparent = parseTraceparent;
26
+ exports.metaSpanAttributes = metaSpanAttributes;
26
27
  exports.inferenceToSpan = inferenceToSpan;
27
28
  exports.cacheDecisionSpanAttributes = cacheDecisionSpanAttributes;
28
29
  exports.buildExportTraceRequest = buildExportTraceRequest;
@@ -92,6 +93,65 @@ function toUnixNano(iso, plusMs = 0) {
92
93
  function isSearchRow(row) {
93
94
  return row.provider === "search";
94
95
  }
96
+ /** The classification-rule guard, inlined here to keep otel-map dependency-light
97
+ * (WI-1b): a string attribute is emitted only if it is an enum/identifier/hash
98
+ * (≤128 chars, no whitespace). The envelope is already sanitized at production +
99
+ * ingest; this is belt-and-braces so the OTLP wire can never carry content. */
100
+ function isMetaSafeStr(v) {
101
+ return typeof v === "string" && v.length > 0 && v.length <= 128 && !/\s/.test(v);
102
+ }
103
+ const finite = (v) => typeof v === "number" && Number.isFinite(v);
104
+ /**
105
+ * The attempt-envelope span attributes (WI-1b spec §5) — `modelrig.meta.*`,
106
+ * enums/numbers/booleans/hashes/identifiers ONLY. Mirrors the query grammar's
107
+ * metadata-safe columns; a value that is not an enum/identifier/hash is dropped
108
+ * by {@link isMetaSafeStr}, so the metadata-safe property test extends cleanly to
109
+ * the emitted span. Absent fields emit no attribute (byte-identical to a pre-WI-1
110
+ * row's span).
111
+ */
112
+ function metaSpanAttributes(meta) {
113
+ if (meta === null || meta === undefined)
114
+ return [];
115
+ const attrs = [];
116
+ if (isMetaSafeStr(meta.finish_reason))
117
+ attrs.push(strAttr("modelrig.meta.finish_reason", meta.finish_reason));
118
+ if (typeof meta.refusal === "boolean")
119
+ attrs.push(boolAttr("modelrig.meta.refusal", meta.refusal));
120
+ if (typeof meta.streaming === "boolean")
121
+ attrs.push(boolAttr("modelrig.meta.streaming", meta.streaming));
122
+ if (isMetaSafeStr(meta.context_bucket))
123
+ attrs.push(strAttr("modelrig.meta.context_bucket", meta.context_bucket));
124
+ if (isMetaSafeStr(meta.model_snapshot))
125
+ attrs.push(strAttr("modelrig.meta.model_snapshot", meta.model_snapshot));
126
+ if (isMetaSafeStr(meta.error_code))
127
+ attrs.push(strAttr("modelrig.meta.error_code", meta.error_code));
128
+ if (isMetaSafeStr(meta.region))
129
+ attrs.push(strAttr("modelrig.meta.region", meta.region));
130
+ if (isMetaSafeStr(meta.input_hash))
131
+ attrs.push(strAttr("modelrig.meta.input_hash", meta.input_hash));
132
+ if (isMetaSafeStr(meta.output_hash))
133
+ attrs.push(strAttr("modelrig.meta.output_hash", meta.output_hash));
134
+ if (finite(meta.http_status))
135
+ attrs.push(intAttr("modelrig.meta.http_status", meta.http_status));
136
+ if (finite(meta.reasoning_tokens))
137
+ attrs.push(intAttr("modelrig.meta.reasoning_tokens", meta.reasoning_tokens));
138
+ if (finite(meta.response_chars))
139
+ attrs.push(intAttr("modelrig.meta.response_chars", meta.response_chars));
140
+ const cost = meta.cost;
141
+ if (cost !== undefined && cost !== null) {
142
+ if (finite(cost.in))
143
+ attrs.push(dblAttr("modelrig.meta.cost.in", cost.in));
144
+ if (finite(cost.out))
145
+ attrs.push(dblAttr("modelrig.meta.cost.out", cost.out));
146
+ if (finite(cost.cache_read))
147
+ attrs.push(dblAttr("modelrig.meta.cost.cache_read", cost.cache_read));
148
+ if (finite(cost.cache_write))
149
+ attrs.push(dblAttr("modelrig.meta.cost.cache_write", cost.cache_write));
150
+ if (finite(cost.other))
151
+ attrs.push(dblAttr("modelrig.meta.cost.other", cost.other));
152
+ }
153
+ return attrs;
154
+ }
95
155
  function readTraceparentTag(row) {
96
156
  let tags;
97
157
  try {
@@ -160,6 +220,10 @@ function inferenceToSpan(row) {
160
220
  }
161
221
  if (row.failureClass !== null)
162
222
  attrs.push(strAttr("modelrig.failure_class", row.failureClass));
223
+ // WI-1b: the attempt envelope's metadata-safe fields as `modelrig.meta.*`
224
+ // (enums/numbers/booleans/hashes/identifiers only — never content).
225
+ for (const a of metaSpanAttributes(row.meta))
226
+ attrs.push(a);
163
227
  const parent = readTraceparentTag(row);
164
228
  const traceId = parent !== null ? parent.traceId : traceIdFor(row.id);
165
229
  const span = {
@@ -1 +1 @@
1
- {"version":3,"file":"store-migrations.d.ts","sourceRoot":"","sources":["../../src/telemetry/store-migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C;sCACsC;AACtC,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAuG9D"}
1
+ {"version":3,"file":"store-migrations.d.ts","sourceRoot":"","sources":["../../src/telemetry/store-migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C;sCACsC;AACtC,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAsH9D"}
@@ -116,4 +116,19 @@ function runStoreMigrations(db) {
116
116
  add("candidate_index", "candidate_index INTEGER");
117
117
  db.pragma("user_version = 11");
118
118
  }
119
+ // v12 (WI-1a): the attempt/run metadata envelope columns. Additive, nullable;
120
+ // old rows read null ("recorded before WI-1a"). meta_json goes on BOTH
121
+ // inferences (AttemptMeta@v1) and runs (RunMeta@v1) — the local mirror of the
122
+ // Postgres 00056/00057 columns. Same ALTER-if-absent pattern as v10/v11.
123
+ if (db.pragma("user_version", { simple: true }) < 12) {
124
+ const infCols = db.prepare("PRAGMA table_info(inferences)").all();
125
+ if (!infCols.some((c) => c.name === "meta_json")) {
126
+ db.exec("ALTER TABLE inferences ADD COLUMN meta_json TEXT");
127
+ }
128
+ const runCols = db.prepare("PRAGMA table_info(runs)").all();
129
+ if (!runCols.some((c) => c.name === "meta_json")) {
130
+ db.exec("ALTER TABLE runs ADD COLUMN meta_json TEXT");
131
+ }
132
+ db.pragma("user_version = 12");
133
+ }
119
134
  }
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/telemetry/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,MAAM,EACN,OAAO,EACP,YAAY,EACZ,cAAc,EACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAA2B,KAAK,cAAc,EAAuB,MAAM,UAAU,CAAC;AAG7F;;;;;GAKG;AACH,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,qEAAqE;IACrE,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACpG,uEAAuE;IACvE,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;IACjG;mEAC+D;IAC/D,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iFAAiF;IACjF,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,kEAAkE;IAClE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxF,mEAAmE;IACnE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC1F;;iFAE6E;IAC7E,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClE,iEAAiE;IACjE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;IAC3C,aAAa,IAAI,WAAW,EAAE,CAAC;IAC/B,oEAAoE;IACpE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D;;;;;OAKG;IACH,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;CAC3E;AA0SD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CA+Q3E"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/telemetry/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,MAAM,EACN,OAAO,EACP,YAAY,EACZ,cAAc,EACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAA2B,KAAK,cAAc,EAAuB,MAAM,UAAU,CAAC;AAG7F;;;;;GAKG;AACH,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,qEAAqE;IACrE,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACpG,uEAAuE;IACvE,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;IACjG;mEAC+D;IAC/D,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iFAAiF;IACjF,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,kEAAkE;IAClE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxF,mEAAmE;IACnE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC1F;;iFAE6E;IAC7E,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClE,iEAAiE;IACjE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;IAC3C,aAAa,IAAI,WAAW,EAAE,CAAC;IAC/B,oEAAoE;IACpE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D;;;;;OAKG;IACH,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;CAC3E;AAyTD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CAoR3E"}
@@ -53,7 +53,11 @@ CREATE TABLE IF NOT EXISTS inferences (
53
53
  -- databases gain them via the ALTER ladder. Null = recorded pre-0.4.0.
54
54
  call_id TEXT,
55
55
  attempt_seq INTEGER,
56
- candidate_index INTEGER
56
+ candidate_index INTEGER,
57
+ -- v12 (WI-1a): the attempt metadata envelope (AttemptMeta@v1), serialized
58
+ -- JSON. Fresh here; older databases gain it via the ALTER ladder. Null =
59
+ -- the producer could not build it / recorded before WI-1a.
60
+ meta_json TEXT
57
61
  );
58
62
  CREATE INDEX IF NOT EXISTS idx_inferences_route_ts ON inferences (route, ts);
59
63
  -- v8 (G-4 observed-health): per-endpoint windowed aggregation filters by
@@ -121,7 +125,10 @@ CREATE TABLE IF NOT EXISTS runs (
121
125
  started_at TEXT NOT NULL,
122
126
  ended_at TEXT,
123
127
  status TEXT NOT NULL CHECK (status IN ('running','succeeded','failed','abandoned')),
124
- export_seq INTEGER NOT NULL
128
+ export_seq INTEGER NOT NULL,
129
+ -- v12 (WI-1a): the run metadata envelope (RunMeta@v1), serialized JSON. Null
130
+ -- when unset (run.start without a meta) or recorded before WI-1a.
131
+ meta_json TEXT
125
132
  );
126
133
  CREATE INDEX IF NOT EXISTS idx_runs_export_seq ON runs (export_seq);
127
134
 
@@ -154,6 +161,9 @@ function toRunRow(r) {
154
161
  startedAt: r.started_at,
155
162
  endedAt: r.ended_at,
156
163
  status: r.status,
164
+ // v12 (WI-1a): `?? null` — a pre-WI-1a database returns undefined for the
165
+ // meta_json ALTER column, and those rows genuinely predate RunMeta.
166
+ meta: r.meta_json != null ? JSON.parse(r.meta_json) : null,
157
167
  };
158
168
  }
159
169
  function toStepRow(r) {
@@ -224,6 +234,9 @@ function toTelemetryRow(r) {
224
234
  callId: r.call_id ?? null,
225
235
  attemptSeq: r.attempt_seq ?? null,
226
236
  candidateIndex: r.candidate_index ?? null,
237
+ // Attempt envelope (WI-1a) — `?? null`: a pre-v12 database returns undefined
238
+ // for the meta_json ALTER column, and those rows predate the envelope.
239
+ meta: r.meta_json != null ? JSON.parse(r.meta_json) : null,
227
240
  };
228
241
  }
229
242
  function toEnvelopeRow(r) {
@@ -249,13 +262,13 @@ function openTelemetryStore(dbPath) {
249
262
  tokens_in, tokens_out, tokens_cached, cost_estimate_usd, latency_ms, ttfb_ms,
250
263
  failure_class, attempts_json, tags_json, fingerprint_cell, served_variant, repaired_by, pricing_missing,
251
264
  tokens_cache_write, tokens_cache_write_1h, cache_key, prefix_fingerprint,
252
- call_id, attempt_seq, candidate_index
265
+ call_id, attempt_seq, candidate_index, meta_json
253
266
  ) VALUES (
254
267
  @id, @ts, @route, @route_version, @provider, @model, @requested_tier, @served_tier,
255
268
  @tokens_in, @tokens_out, @tokens_cached, @cost_estimate_usd, @latency_ms, @ttfb_ms,
256
269
  @failure_class, @attempts_json, @tags_json, @fingerprint_cell, @served_variant, @repaired_by, @pricing_missing,
257
270
  @tokens_cache_write, @tokens_cache_write_1h, @cache_key, @prefix_fingerprint,
258
- @call_id, @attempt_seq, @candidate_index
271
+ @call_id, @attempt_seq, @candidate_index, @meta_json
259
272
  )
260
273
  `);
261
274
  const selectByTag = db.prepare(`
@@ -288,8 +301,8 @@ function openTelemetryStore(dbPath) {
288
301
  // synchronous, so the MAX(export_seq)+1 read is race-free.
289
302
  const nextRunSeq = db.prepare("SELECT COALESCE(MAX(export_seq), 0) + 1 AS n FROM runs");
290
303
  const upsertRun = db.prepare(`
291
- INSERT INTO runs (id, pipeline, pipeline_version, environment, episode_key, started_at, ended_at, status, export_seq)
292
- VALUES (@id, @pipeline, @pipeline_version, @environment, @episode_key, @started_at, @ended_at, @status, @export_seq)
304
+ INSERT INTO runs (id, pipeline, pipeline_version, environment, episode_key, started_at, ended_at, status, export_seq, meta_json)
305
+ VALUES (@id, @pipeline, @pipeline_version, @environment, @episode_key, @started_at, @ended_at, @status, @export_seq, @meta_json)
293
306
  ON CONFLICT (id) DO UPDATE SET
294
307
  pipeline = excluded.pipeline,
295
308
  pipeline_version = excluded.pipeline_version,
@@ -298,7 +311,8 @@ function openTelemetryStore(dbPath) {
298
311
  started_at = excluded.started_at,
299
312
  ended_at = excluded.ended_at,
300
313
  status = excluded.status,
301
- export_seq = excluded.export_seq
314
+ export_seq = excluded.export_seq,
315
+ meta_json = excluded.meta_json
302
316
  `);
303
317
  const insertStep = db.prepare(`
304
318
  INSERT OR IGNORE INTO steps (
@@ -346,6 +360,9 @@ function openTelemetryStore(dbPath) {
346
360
  call_id: row.callId ?? null,
347
361
  attempt_seq: row.attemptSeq ?? null,
348
362
  candidate_index: row.candidateIndex ?? null,
363
+ // WI-1a: serialize the envelope, or null — better-sqlite3 rejects an
364
+ // `undefined` bound param, and a row that omits it has no envelope.
365
+ meta_json: row.meta != null ? JSON.stringify(row.meta) : null,
349
366
  });
350
367
  },
351
368
  recordFeedback(row) {
@@ -380,6 +397,7 @@ function openTelemetryStore(dbPath) {
380
397
  ended_at: row.endedAt,
381
398
  status: row.status,
382
399
  export_seq: seq,
400
+ meta_json: row.meta != null ? JSON.stringify(row.meta) : null,
383
401
  });
384
402
  },
385
403
  recordStep(row) {
@@ -1 +1 @@
1
- {"version":3,"file":"failures-teaching.d.ts","sourceRoot":"","sources":["../../src/types/failures-teaching.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3D,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1C,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;4EACwE;IACxE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,eAAe,GAAG,IAAI,CAAC;CAC5E;AAID,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CA+I5E,CAAC;AAiBF;6EAC6E;AAC7E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;CAClD;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG,gBAAgB,CAU3D;AAED;gEACgE;AAChE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAapE"}
1
+ {"version":3,"file":"failures-teaching.d.ts","sourceRoot":"","sources":["../../src/types/failures-teaching.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3D,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1C,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;4EACwE;IACxE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,eAAe,GAAG,IAAI,CAAC;CAC5E;AAID,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CAuK5E,CAAC;AAiBF;6EAC6E;AAC7E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;CAClD;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG,gBAAgB,CAU3D;AAED;gEACgE;AAChE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAapE"}
@@ -137,6 +137,26 @@ exports.FAILURE_TEACHING = {
137
137
  "model that appeared.",
138
138
  docsUrl: `${DOCS_BASE}#invariant_violation`,
139
139
  },
140
+ quality_rejected: {
141
+ class: "quality_rejected",
142
+ what: "The output met the schema your route requires, but the quality gate you supplied " +
143
+ "(`rig.run(route, { qualityGate })`) judged it below your bar and rejected it — so the " +
144
+ "ladder fell through rather than passing it downstream.",
145
+ fixHint: "This is your own predicate talking, not the model failing a shape check. If good outputs " +
146
+ "are being rejected, the bar is too tight — loosen the gate. If you want the same candidate " +
147
+ "re-sampled before falling through, give this class a budget under `policy.retries`; it " +
148
+ "defaults to 0 (immediate fall-through) and never enters the repair rung.",
149
+ docsUrl: `${DOCS_BASE}#quality_rejected`,
150
+ // Mechanical: give the class a small retry budget so sampling variance gets
151
+ // a second draw on the SAME candidate before the ladder falls through.
152
+ suggestedChange: () => ({
153
+ op: "replace",
154
+ path: "/policy/retries/quality_rejected",
155
+ value: 1,
156
+ because: "A quality miss is often sampling variance; one retry re-draws the same candidate before " +
157
+ "falling through, at the cost of one extra call.",
158
+ }),
159
+ },
140
160
  };
141
161
  /** Provider → the env var that keys it. Mirrors config.ts's PROVIDER_KEY_ENV;
142
162
  * kept as a local lookup so this table has no import cycle with config. */
@@ -4,7 +4,7 @@
4
4
  * errors never cross the adapter boundary. Retry budgets are per-class and
5
5
  * non-fungible (see run/retry.ts).
6
6
  */
7
- export type FailureClass = "content_invalid" | "capacity_shed" | "network" | "refusal" | "cache_invalid" | "timeout" | "config_auth" | "budget_exhausted" | "invariant_violation";
7
+ export type FailureClass = "content_invalid" | "capacity_shed" | "network" | "refusal" | "cache_invalid" | "timeout" | "config_auth" | "budget_exhausted" | "invariant_violation" | "quality_rejected";
8
8
  export interface RigFailure {
9
9
  readonly class: FailureClass;
10
10
  readonly message: string;
@@ -1 +1 @@
1
- {"version":3,"file":"failures.d.ts","sourceRoot":"","sources":["../../src/types/failures.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,YAAY,GACpB,iBAAiB,GACjB,eAAe,GACf,SAAS,GACT,SAAS,GACT,eAAe,GACf,SAAS,GACT,aAAa,GACb,kBAAkB,GAClB,qBAAqB,CAAC;AAE1B,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,YAAY,CAGrD,CAAC;AAcH;kFACkF;AAClF,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;gBAEjB,OAAO,EAAE,UAAU;CAKhC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAIhE"}
1
+ {"version":3,"file":"failures.d.ts","sourceRoot":"","sources":["../../src/types/failures.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,YAAY,GACpB,iBAAiB,GACjB,eAAe,GACf,SAAS,GACT,SAAS,GACT,eAAe,GACf,SAAS,GACT,aAAa,GACb,kBAAkB,GAClB,qBAAqB,GACrB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,YAAY,CAGrD,CAAC;AAeH;kFACkF;AAClF,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;gBAEjB,OAAO,EAAE,UAAU;CAKhC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAIhE"}
@@ -22,6 +22,7 @@ const FAILURE_CLASSES = new Set([
22
22
  "config_auth",
23
23
  "budget_exhausted",
24
24
  "invariant_violation",
25
+ "quality_rejected",
25
26
  ]);
26
27
  /** Error subclass for the rare paths that must throw (config errors, terminal
27
28
  * failures surfacing to the caller). The failure travels intact on `.failure`. */
@@ -4,6 +4,7 @@
4
4
  * and CandidateRef is a branded type constructible ONLY in run/resolve.ts.
5
5
  */
6
6
  import type { RigFailure } from "./failures";
7
+ import type { AttemptMetaV1 } from "../telemetry/attempt-meta";
7
8
  export type ProviderId = "gemini" | "openai" | "deepseek" | "anthropic" | "grok" | "deepinfra" | "fireworks";
8
9
  /** Runtime enumeration of every ProviderId — the single list a raw-model lane
9
10
  * (`provider/model`) validates against (http gateway spec §3.3). Kept in sync
@@ -199,6 +200,13 @@ export type AdapterResult = {
199
200
  * A tool-call turn carries these instead of (or alongside) `text`; the
200
201
  * run loop surfaces them and does NOT schema-validate the turn. */
201
202
  readonly toolCalls?: readonly ToolCall[];
203
+ /** NATIVE attempt metadata (WI-1, spec §2) — finish reason, refusal,
204
+ * reasoning tokens, model snapshot, provider request id, sampling echo,
205
+ * tool-call names/counts. ADDITIVE: an adapter that reports nothing omits
206
+ * it and changes nothing. The single producer (`summarizeAttemptMeta`)
207
+ * adds hashes/sizes/cost and enforces the classification rule; adapters
208
+ * NEVER build the full envelope. */
209
+ readonly meta?: Partial<AttemptMetaV1>;
202
210
  }
203
211
  /** F1 (C1 finding, closed Phase 3 step 0): failures that still BILLED
204
212
  * tokens (refusals, truncations, post-stream rejections) carry `usage` so
@@ -208,6 +216,7 @@ export type AdapterResult = {
208
216
  readonly ok: false;
209
217
  readonly failure: RigFailure;
210
218
  readonly usage?: AdapterUsage;
219
+ readonly meta?: Partial<AttemptMetaV1>;
211
220
  };
212
221
  /** One event from an adapter's streaming variant (G-1/G-5 Phase A). A stream
213
222
  * emits zero or more `delta` events (raw, pre-validation text) and closes with
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/types/provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/types/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Quality gate (Q1, quality-gate spec §3) — an SDK-lane predicate that rejects a
3
+ * schema-VALID output the builder judges too low, so the candidate ladder falls
4
+ * through on *quality*, not just shape.
5
+ *
6
+ * This is the SDK lane only, by construction: a `QualityGate` is a JavaScript
7
+ * function, and a function cannot cross the hosted (jsonb bundle) boundary — the
8
+ * hosted lane's route-declared judge is Q2 (spec §3, boundary B1). See the
9
+ * doc-comment on `RunOptions.qualityGate` in ./route.ts.
10
+ */
11
+ import type { ProviderId } from "./provider";
12
+ /** The predicate's answer for one candidate output.
13
+ * `ok:false` rejects the output and falls the ladder through (recorded
14
+ * `quality_rejected`); `score`/`reason` are optional and ride telemetry + meta. */
15
+ export interface QualityVerdict {
16
+ /** True accepts the output; false rejects it and falls through. */
17
+ readonly ok: boolean;
18
+ /** Optional 0..1-ish quality score — stamped on `tags.quality_score`, averaged
19
+ * into a bake-off's `valueAccuracy`, and surfaced on `RunMeta.quality.score`. */
20
+ readonly score?: number;
21
+ /** Optional one-line reason — carried in the `quality_rejected` failure
22
+ * message so a stuck engineer sees WHY the output was rejected. */
23
+ readonly reason?: string;
24
+ }
25
+ /** What the gate is told about the candidate whose output it is judging. */
26
+ export interface QualityGateMeta {
27
+ readonly route: string;
28
+ readonly provider: ProviderId;
29
+ readonly model: string;
30
+ /** Position of the serving candidate in the run's effective candidate list. */
31
+ readonly candidateIndex: number;
32
+ /** The attempt_seq the judged output's telemetry row will carry (1-based). */
33
+ readonly attemptSeq: number;
34
+ /** Variant that served this run — null = the route's base config. */
35
+ readonly servedVariant: string | null;
36
+ }
37
+ /** A builder-supplied quality predicate. Sync or async; a throwing gate rejects
38
+ * fail-closed (spec §4.1 step 4). Evaluated ONLY on a schema-valid, non-tool-call
39
+ * output (spec §4.1 steps 6–7). */
40
+ export type QualityGate = (output: unknown, meta: QualityGateMeta) => QualityVerdict | Promise<QualityVerdict>;
41
+ //# sourceMappingURL=quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality.d.ts","sourceRoot":"","sources":["../../src/types/quality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;mFAEmF;AACnF,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB;qFACiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;uEACmE;IACnE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED;;mCAEmC;AACnC,MAAM,MAAM,WAAW,GAAG,CACxB,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,eAAe,KAClB,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * Quality gate (Q1, quality-gate spec §3) — an SDK-lane predicate that rejects a
4
+ * schema-VALID output the builder judges too low, so the candidate ladder falls
5
+ * through on *quality*, not just shape.
6
+ *
7
+ * This is the SDK lane only, by construction: a `QualityGate` is a JavaScript
8
+ * function, and a function cannot cross the hosted (jsonb bundle) boundary — the
9
+ * hosted lane's route-declared judge is Q2 (spec §3, boundary B1). See the
10
+ * doc-comment on `RunOptions.qualityGate` in ./route.ts.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -4,9 +4,27 @@
4
4
  */
5
5
  import type { FailureClass } from "./failures";
6
6
  import type { ProviderId, SamplingParams, ServiceTier, ToolCall, ToolChoice, ToolDefinition } from "./provider";
7
+ import type { QualityGate } from "./quality";
7
8
  export interface CandidateSpec {
8
9
  readonly provider: ProviderId;
9
10
  readonly model: string;
11
+ /**
12
+ * Declare-first experiment flag (routing-console spec §4.4, R3). A `trial`
13
+ * candidate is DECLARED — it is in the list the brand type, the loader and the
14
+ * runtime candidate-set guard all derive from, so the candidate-set invariant
15
+ * is untouched — but `resolveCandidates` drops it on EVERY live path
16
+ * (`rig.run`, `runStream`, `runBundle`, the hosted gateway slug lane) exactly
17
+ * as it drops a `providers.ignore` entry. Only the bake-off replay path
18
+ * (`replayVariant`, run `mode: "trial"`) keeps it, so a customer can measure a
19
+ * new model on real captured traffic before promoting it to a live candidate.
20
+ * Optional & additive (S3): absent ⇒ false ⇒ an ordinary live candidate.
21
+ *
22
+ * OLDER-SDK CAVEAT (spec §7): the pre-0.4.0 loader is TOLERANT of unknown
23
+ * candidate keys — it would ignore `trial` and serve the candidate LIVE. A
24
+ * bundle using `trial: true` therefore REQUIRES the SDK release that
25
+ * understands it; the console's declare-YAML says so.
26
+ */
27
+ readonly trial?: boolean;
10
28
  }
11
29
  export type Requirement = "schema_conformant" | "grounded" | "zero_retention" | "trace_visible";
12
30
  export type Preference = "cost" | "latency";
@@ -57,6 +75,71 @@ export interface RouteVariant {
57
75
  /** JSON rung override for this variant. */
58
76
  readonly json?: "native" | "json_mode";
59
77
  readonly repair?: RepairPolicy;
78
+ /**
79
+ * COMPUTED at load (not authored): true when every candidate this variant
80
+ * narrows to is a declared `trial` candidate (routing-console spec §4.4). A
81
+ * trial variant is valid for `rig.bakeoff` but a `RouteConfigError` if a live
82
+ * caller selects it — trial candidates are declared, never live-served. The
83
+ * declare-first flow's `trial-<provider>-<model>` variant is exactly this.
84
+ */
85
+ readonly trialOnly?: boolean;
86
+ }
87
+ /** Bake-off objective (RB-1, near-optimal spec §3) — replaces the implicit
88
+ * cost-first gate with a declared one. Additive & optional (S3): an absent
89
+ * `objective:` block ⇒ `quality-first` with no bound ⇒ regret is REPORTED but
90
+ * nothing is proposed until a `max_regret` or `price_ceiling` is declared, so
91
+ * the default flip never actuates silently. */
92
+ export type ObjectiveMode = "quality-first" | "balanced" | "cost-first";
93
+ /** The per-unit-of-work budget a customer considers reasonable. Exactly one of
94
+ * the two units is set (loader-enforced). `usd_per_1k` = max effective cost per
95
+ * 1k quality-passing outputs (the existing effective-$/1k axis); `usd_per_run` =
96
+ * a flat per-run envelope. */
97
+ export interface PriceCeiling {
98
+ readonly usdPer1k?: number;
99
+ readonly usdPerRun?: number;
100
+ }
101
+ export interface RouteObjective {
102
+ readonly mode: ObjectiveMode;
103
+ /** Quality-regret bound ε, on the arm's named quality metric (points, 0..1). */
104
+ readonly maxRegret?: number;
105
+ readonly priceCeiling?: PriceCeiling;
106
+ /** `balanced` only — weight on normalized cost in `regret + lambda·cost_norm`. */
107
+ readonly lambda?: number;
108
+ }
109
+ /** A deterministic value assertion on a bake-off sample's output (RB-1 spec §3).
110
+ * `path` is a JSON pointer (RFC 6901) into the parsed output; `expect` is either
111
+ * a literal to equal (normalized) or a regex the stringified value must match. A
112
+ * route's value_checks give value-accuracy WITHOUT an eval case or a judge. */
113
+ export interface ValueCheck {
114
+ readonly path: string;
115
+ readonly expect: {
116
+ readonly literal: unknown;
117
+ } | {
118
+ readonly regex: string;
119
+ };
120
+ }
121
+ /** Bake-off configuration (RB-1 spec §3) — the reference (ceiling) arm and an
122
+ * optional SDK-side capped judge. Additive & optional. */
123
+ export interface BakeoffConfig {
124
+ /** The ceiling arm. `auto` = the strongest declared candidate for the route's
125
+ * task (registry probed conformance; see bakeoff/reference.ts). An explicit
126
+ * `provider/model` MUST be a declared candidate unless `referenceAllowExternal`. */
127
+ readonly reference?: "auto" | {
128
+ readonly provider: ProviderId;
129
+ readonly model: string;
130
+ };
131
+ /** Records that an out-of-candidate reference was deliberately allowed. */
132
+ readonly referenceAllowExternal?: boolean;
133
+ /** The reference is dear by definition — its own replay envelope. */
134
+ readonly referenceEnvelopeUsd?: number;
135
+ /** Opt-in judge for value accuracy where no eval case / value check applies
136
+ * (metric precedence tier 3). The judge model MUST be a declared candidate
137
+ * (#223 F3); every judge call is a metered inference tagged `judge`; capped at
138
+ * `maxSamples` per arm. */
139
+ readonly judge?: {
140
+ readonly model: CandidateSpec;
141
+ readonly maxSamples: number;
142
+ };
60
143
  }
61
144
  export interface RouteBundle {
62
145
  readonly route: string;
@@ -91,6 +174,13 @@ export interface RouteBundle {
91
174
  /** Schema-fingerprint cell key, computed at load from outputSchema
92
175
  * (registry/fingerprint.ts); null for unstructured routes. */
93
176
  readonly fingerprintCell: string | null;
177
+ /** Bake-off objective (RB-1) — absent ⇒ quality-first, no bound (regret shown,
178
+ * nothing proposed). */
179
+ readonly objective?: RouteObjective;
180
+ /** Bake-off reference arm + optional judge (RB-1). */
181
+ readonly bakeoff?: BakeoffConfig;
182
+ /** Deterministic value assertions for bake-off quality (RB-1). */
183
+ readonly valueChecks?: readonly ValueCheck[];
94
184
  }
95
185
  export interface RunTags {
96
186
  readonly run_id?: string;
@@ -100,6 +190,12 @@ export interface RunTags {
100
190
  export interface RunOptions {
101
191
  readonly input: Record<string, unknown>;
102
192
  readonly tags: RunTags;
193
+ /** Names the ground-truth step this run records (G1 spec §3) — the same field
194
+ * the raw lane exposes, so a routed and a raw call, plus an `artifact.save`,
195
+ * can be composed into ONE step group. Resolution: `stepKey ?? tags.step ??`
196
+ * an auto-minted `route#n`. Validated `[A-Za-z0-9_.:#-]{1,128}`; an invalid
197
+ * value is warned and dropped to the auto key. Absent ⇒ unchanged behavior. */
198
+ readonly stepKey?: string;
103
199
  readonly budget?: {
104
200
  readonly envelope: string;
105
201
  /** Budget for this envelope when it is FIRST opened (open-or-get: the first
@@ -163,6 +259,20 @@ export interface RunOptions {
163
259
  * the customer's own heartbeat governs the actual resource TTL. */
164
260
  readonly ttlSeconds?: number;
165
261
  };
262
+ /**
263
+ * Quality gate (Q1, quality-gate spec §3/§4.1) — a builder-supplied predicate
264
+ * evaluated on a schema-VALID output before it is accepted. `ok:false` rejects
265
+ * the output, records a `quality_rejected` attempt (its OWN retry budget under
266
+ * `policy.retries`, default 0), and falls the ladder through — WITHOUT ever
267
+ * entering the repair rung. A throwing gate rejects fail-closed. Tool-call
268
+ * turns and unstructured (`schema: null`) routes are handled per spec §4.1.
269
+ *
270
+ * SDK LANE ONLY: this is a JavaScript function, and a function cannot cross the
271
+ * hosted (jsonb bundle) boundary — the hosted gateway builds `RunOptions` from
272
+ * parsed JSON (`mapToRunOptions`), which can NEVER populate this field. The
273
+ * hosted equivalent is the route-declared judge (Q2). See boundary B1.
274
+ */
275
+ readonly qualityGate?: QualityGate;
166
276
  }
167
277
  export interface RunMeta {
168
278
  /** Telemetry row id of the serving attempt — the handle rig.feedback()
@@ -202,6 +312,16 @@ export interface RunMeta {
202
312
  * present only on a tool-call turn, where `validated` is false and
203
313
  * `RunResult.output` is null. The caller runs the tool(s) and continues. */
204
314
  readonly toolCalls?: readonly ToolCall[];
315
+ /** Quality-gate verdict on the accepted output (Q1, spec §2/§4.1) — present
316
+ * only when a gate ran on this run. `score` is the predicate's score (null when
317
+ * it returned none); `verdict` is always `"pass"` on a returned run (a `"fail"`
318
+ * fell the ladder through and never reached here); `judgedBy` is null for an
319
+ * SDK predicate (a route-declared model judge, Q2, would name the judge). */
320
+ readonly quality?: {
321
+ readonly score: number | null;
322
+ readonly verdict: "pass" | "fail";
323
+ readonly judgedBy: string | null;
324
+ };
205
325
  }
206
326
  export interface RunResult {
207
327
  readonly output: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/types/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/types/route.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import type { FailureClass } from "./failures";
6
6
  import type { RunTags } from "./route";
7
+ import type { AttemptMetaV1, RunMetaV1 } from "../telemetry/attempt-meta";
7
8
  /**
8
9
  * The rung a telemetry row occupied on the candidate ladder (routing-console R1
9
10
  * review ruling F1). SDK-stamped into `tags.rung` on EVERY row so the dashboard
@@ -91,6 +92,13 @@ export interface TelemetryRow {
91
92
  * row carries the index of the candidate being repaired; the raw lane is 0.
92
93
  * Optional/additive; null for a pre-0.4.0 row. */
93
94
  readonly candidateIndex?: number | null;
95
+ /** The attempt metadata envelope (WI-1, spec §2) — `AttemptMeta@v1`, a
96
+ * metadata-safe rollup of finish reason / refusal / hashes / cost components /
97
+ * context bucket etc. Built by the single producer (`summarizeAttemptMeta`)
98
+ * and persisted to `inferences.meta` (migration 00056). Optional/additive:
99
+ * null when the producer could not build it (byte-identical run result) and
100
+ * for rows recorded before the WI-1a migration. */
101
+ readonly meta?: AttemptMetaV1 | null;
94
102
  }
95
103
  export interface EnvelopeRow {
96
104
  readonly envelopeKey: string;
@@ -145,6 +153,11 @@ export interface RunRow {
145
153
  readonly startedAt: string;
146
154
  readonly endedAt: string | null;
147
155
  readonly status: "running" | "succeeded" | "failed" | "abandoned";
156
+ /** The run metadata envelope (WI-1, spec §3) — `RunMeta@v1`: pipeline sha,
157
+ * config hash, trigger, actor, input hash. Set via `run.start({ meta })`;
158
+ * `pipeline_sha` auto-fills from git when available. Persisted to `runs.meta`
159
+ * (migration 00057). Optional/additive; null when unset or pre-WI-1a. */
160
+ readonly meta?: RunMetaV1 | null;
148
161
  }
149
162
  /** One ATTEMPT of one operation within a run (Expansion E2 chunk A, ruling c).
150
163
  * A fact — one row per attempt, PK (run_id, step_key, attempt_no). Provenance is