modelrig 0.3.0 → 0.5.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 (111) hide show
  1. package/CHANGELOG.md +269 -0
  2. package/README.md +79 -14
  3. package/dist/adapters/deepseek.d.ts.map +1 -1
  4. package/dist/adapters/deepseek.js +8 -1
  5. package/dist/adapters/gemini.d.ts +45 -0
  6. package/dist/adapters/gemini.d.ts.map +1 -1
  7. package/dist/adapters/gemini.js +67 -6
  8. package/dist/adapters/grok.d.ts +7 -0
  9. package/dist/adapters/grok.d.ts.map +1 -1
  10. package/dist/adapters/grok.js +23 -1
  11. package/dist/adapters/openai-compat.d.ts +7 -0
  12. package/dist/adapters/openai-compat.d.ts.map +1 -1
  13. package/dist/adapters/openai-compat.js +24 -1
  14. package/dist/adapters/openai.d.ts +7 -0
  15. package/dist/adapters/openai.d.ts.map +1 -1
  16. package/dist/adapters/openai.js +23 -1
  17. package/dist/artifacts/artifact.d.ts +3 -2
  18. package/dist/artifacts/artifact.d.ts.map +1 -1
  19. package/dist/artifacts/artifact.js +11 -4
  20. package/dist/artifacts/run-context.d.ts +21 -2
  21. package/dist/artifacts/run-context.d.ts.map +1 -1
  22. package/dist/artifacts/run-context.js +46 -1
  23. package/dist/bakeoff/replay.d.ts.map +1 -1
  24. package/dist/bakeoff/replay.js +17 -1
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +26 -5
  27. package/dist/config.d.ts +7 -1
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/index.d.ts +21 -15
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +39 -26
  32. package/dist/init/init-cli.d.ts.map +1 -1
  33. package/dist/init/init-cli.js +2 -1
  34. package/dist/init/observe-cli.d.ts.map +1 -1
  35. package/dist/init/observe-cli.js +2 -1
  36. package/dist/registry/select.d.ts +59 -0
  37. package/dist/registry/select.d.ts.map +1 -1
  38. package/dist/registry/select.js +66 -0
  39. package/dist/routes/loader-warnings.d.ts +28 -0
  40. package/dist/routes/loader-warnings.d.ts.map +1 -0
  41. package/dist/routes/loader-warnings.js +56 -0
  42. package/dist/routes/loader.d.ts +1 -11
  43. package/dist/routes/loader.d.ts.map +1 -1
  44. package/dist/routes/loader.js +44 -26
  45. package/dist/routes/sampling-config.d.ts.map +1 -1
  46. package/dist/routes/sampling-config.js +11 -0
  47. package/dist/run/dispatch.d.ts +14 -2
  48. package/dist/run/dispatch.d.ts.map +1 -1
  49. package/dist/run/dispatch.js +31 -2
  50. package/dist/run/ladder-key.d.ts +40 -0
  51. package/dist/run/ladder-key.d.ts.map +1 -0
  52. package/dist/run/ladder-key.js +39 -0
  53. package/dist/run/raw-defaults.d.ts +52 -0
  54. package/dist/run/raw-defaults.d.ts.map +1 -0
  55. package/dist/run/raw-defaults.js +123 -0
  56. package/dist/run/raw-support.d.ts +123 -0
  57. package/dist/run/raw-support.d.ts.map +1 -0
  58. package/dist/run/raw-support.js +150 -0
  59. package/dist/run/raw.d.ts +53 -11
  60. package/dist/run/raw.d.ts.map +1 -1
  61. package/dist/run/raw.js +157 -31
  62. package/dist/run/rawonly.d.ts +60 -0
  63. package/dist/run/rawonly.d.ts.map +1 -0
  64. package/dist/run/rawonly.js +120 -0
  65. package/dist/run/record-attempt.d.ts +14 -1
  66. package/dist/run/record-attempt.d.ts.map +1 -1
  67. package/dist/run/record-attempt.js +43 -2
  68. package/dist/run/resolve.d.ts +21 -1
  69. package/dist/run/resolve.d.ts.map +1 -1
  70. package/dist/run/resolve.js +29 -6
  71. package/dist/run/routing-docs.d.ts +73 -0
  72. package/dist/run/routing-docs.d.ts.map +1 -0
  73. package/dist/run/routing-docs.js +222 -0
  74. package/dist/run/run.d.ts +7 -1
  75. package/dist/run/run.d.ts.map +1 -1
  76. package/dist/run/run.js +38 -55
  77. package/dist/run/variant.d.ts +43 -0
  78. package/dist/run/variant.d.ts.map +1 -0
  79. package/dist/run/variant.js +86 -0
  80. package/dist/savings/emit.d.ts +33 -0
  81. package/dist/savings/emit.d.ts.map +1 -1
  82. package/dist/savings/emit.js +75 -3
  83. package/dist/telemetry/exporter.d.ts.map +1 -1
  84. package/dist/telemetry/exporter.js +6 -0
  85. package/dist/telemetry/ingest-protocol.d.ts +7 -0
  86. package/dist/telemetry/ingest-protocol.d.ts.map +1 -1
  87. package/dist/telemetry/load-error-report.d.ts.map +1 -1
  88. package/dist/telemetry/load-error-report.js +4 -1
  89. package/dist/telemetry/otel-map.d.ts.map +1 -1
  90. package/dist/telemetry/otel-map.js +8 -0
  91. package/dist/telemetry/store-migrations.d.ts +15 -0
  92. package/dist/telemetry/store-migrations.d.ts.map +1 -0
  93. package/dist/telemetry/store-migrations.js +119 -0
  94. package/dist/telemetry/store.d.ts.map +1 -1
  95. package/dist/telemetry/store.js +26 -93
  96. package/dist/types/failures-teaching.js +1 -1
  97. package/dist/types/provider.d.ts +13 -0
  98. package/dist/types/provider.d.ts.map +1 -1
  99. package/dist/types/route.d.ts +37 -1
  100. package/dist/types/route.d.ts.map +1 -1
  101. package/dist/types/telemetry.d.ts +31 -0
  102. package/dist/types/telemetry.d.ts.map +1 -1
  103. package/dist/validate-cli.d.ts.map +1 -1
  104. package/dist/validate-cli.js +17 -4
  105. package/dist/watch/evaluate.d.ts +27 -1
  106. package/dist/watch/evaluate.d.ts.map +1 -1
  107. package/dist/watch/evaluate.js +13 -0
  108. package/dist/watch/proposals.d.ts +28 -0
  109. package/dist/watch/proposals.d.ts.map +1 -1
  110. package/dist/watch/proposals.js +51 -0
  111. package/package.json +1 -1
@@ -146,6 +146,14 @@ function inferenceToSpan(row) {
146
146
  attrs.push(strAttr("modelrig.served_variant", row.servedVariant));
147
147
  if (row.repairedBy !== null)
148
148
  attrs.push(strAttr("modelrig.repaired_by", row.repairedBy));
149
+ // Per-call ladder key (spec §2.1 R0) — emitted only when present, so a pre-0.4.0
150
+ // row's span is byte-identical to before R0.
151
+ if (row.callId != null)
152
+ attrs.push(strAttr("modelrig.call_id", row.callId));
153
+ if (row.attemptSeq != null)
154
+ attrs.push(intAttr("modelrig.attempt_seq", row.attemptSeq));
155
+ if (row.candidateIndex != null)
156
+ attrs.push(intAttr("modelrig.candidate_index", row.candidateIndex));
149
157
  if (row.fingerprintCell !== null) {
150
158
  // Irreversible by construction (a schema hash) — safe to emit (spec §3).
151
159
  attrs.push(strAttr("modelrig.fingerprint_cell", row.fingerprintCell));
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SQLite telemetry-store migration ladder — extracted from store.ts.
3
+ *
4
+ * Every rung is idempotent on every open: a FRESH database gets the full current
5
+ * schema from `SCHEMA_SQL` (store.ts) and each rung only stamps `user_version`;
6
+ * an OLDER database (whose CREATEs were no-ops) gains the additive columns via
7
+ * `ALTER TABLE … ADD COLUMN`, existing rows reading the nullable/default value.
8
+ * The ladder lives here so store.ts stays under the LOC cap and a new schema
9
+ * epoch is one self-contained rung to add.
10
+ */
11
+ import type Database from "better-sqlite3";
12
+ /** Apply every pending schema migration to an open telemetry database. Safe to
13
+ * call on every open (idempotent). */
14
+ export declare function runStoreMigrations(db: Database.Database): void;
15
+ //# sourceMappingURL=store-migrations.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * SQLite telemetry-store migration ladder — extracted from store.ts.
4
+ *
5
+ * Every rung is idempotent on every open: a FRESH database gets the full current
6
+ * schema from `SCHEMA_SQL` (store.ts) and each rung only stamps `user_version`;
7
+ * an OLDER database (whose CREATEs were no-ops) gains the additive columns via
8
+ * `ALTER TABLE … ADD COLUMN`, existing rows reading the nullable/default value.
9
+ * The ladder lives here so store.ts stays under the LOC cap and a new schema
10
+ * epoch is one self-contained rung to add.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.runStoreMigrations = runStoreMigrations;
14
+ /** Apply every pending schema migration to an open telemetry database. Safe to
15
+ * call on every open (idempotent). */
16
+ function runStoreMigrations(db) {
17
+ // v1 databases (tables pre-existing, so SCHEMA_SQL's CREATEs were no-ops) gain
18
+ // the fingerprint_cell column additively — existing rows read it as NULL.
19
+ if (db.pragma("user_version", { simple: true }) < 2) {
20
+ const columns = db.prepare("PRAGMA table_info(inferences)").all();
21
+ if (!columns.some((c) => c.name === "fingerprint_cell")) {
22
+ db.exec("ALTER TABLE inferences ADD COLUMN fingerprint_cell TEXT");
23
+ }
24
+ db.pragma("user_version = 2");
25
+ }
26
+ // v3 (Phase 3): captures table (from SCHEMA_SQL — a no-op CREATE on fresh
27
+ // databases) + the variant/repair columns, additive and nullable.
28
+ if (db.pragma("user_version", { simple: true }) < 3) {
29
+ const columns = db.prepare("PRAGMA table_info(inferences)").all();
30
+ if (!columns.some((c) => c.name === "served_variant")) {
31
+ db.exec("ALTER TABLE inferences ADD COLUMN served_variant TEXT");
32
+ }
33
+ if (!columns.some((c) => c.name === "repaired_by")) {
34
+ db.exec("ALTER TABLE inferences ADD COLUMN repaired_by TEXT");
35
+ }
36
+ db.pragma("user_version = 3");
37
+ }
38
+ // v4 (addendum A1): pricing_missing flag — additive; old rows read false.
39
+ if (db.pragma("user_version", { simple: true }) < 4) {
40
+ const columns = db.prepare("PRAGMA table_info(inferences)").all();
41
+ if (!columns.some((c) => c.name === "pricing_missing")) {
42
+ db.exec("ALTER TABLE inferences ADD COLUMN pricing_missing INTEGER NOT NULL DEFAULT 0");
43
+ }
44
+ db.pragma("user_version = 4");
45
+ }
46
+ // v5 (Phase 4 WS2): feedback table — purely additive; SCHEMA_SQL's
47
+ // CREATE IF NOT EXISTS handles fresh AND migrating databases identically, so
48
+ // the bump only stamps the version.
49
+ if (db.pragma("user_version", { simple: true }) < 5) {
50
+ db.pragma("user_version = 5");
51
+ }
52
+ // v6 (Phase 4 WS3): ttfb_ms — additive, nullable; old rows read null.
53
+ if (db.pragma("user_version", { simple: true }) < 6) {
54
+ const columns = db.prepare("PRAGMA table_info(inferences)").all();
55
+ if (!columns.some((c) => c.name === "ttfb_ms")) {
56
+ db.exec("ALTER TABLE inferences ADD COLUMN ttfb_ms INTEGER");
57
+ }
58
+ db.pragma("user_version = 6");
59
+ }
60
+ // v7 (Phase 6 WS2): feedback.org_id + feedback.created_by — additive,
61
+ // nullable. Old verdicts read null on both, which is TRUE of them: they were
62
+ // recorded before either concept existed, and backfilling a guess into an
63
+ // unrecomputable record is exactly what 00017 refused to do.
64
+ if (db.pragma("user_version", { simple: true }) < 7) {
65
+ const columns = db.prepare("PRAGMA table_info(feedback)").all();
66
+ if (!columns.some((c) => c.name === "org_id")) {
67
+ db.exec("ALTER TABLE feedback ADD COLUMN org_id TEXT");
68
+ }
69
+ if (!columns.some((c) => c.name === "created_by")) {
70
+ db.exec("ALTER TABLE feedback ADD COLUMN created_by TEXT");
71
+ }
72
+ db.pragma("user_version = 7");
73
+ }
74
+ // v8 (G-4 observed-health): idx_inferences_provider_model_ts — index-only, no
75
+ // data change. SCHEMA_SQL's CREATE INDEX IF NOT EXISTS handles fresh AND
76
+ // migrating databases identically (it ran above), so the bump only stamps the
77
+ // version. Kept explicit rather than folded into v5's bare-stamp branch so the
78
+ // migration ladder reads one rung per schema epoch.
79
+ if (db.pragma("user_version", { simple: true }) < 8) {
80
+ db.exec("CREATE INDEX IF NOT EXISTS idx_inferences_provider_model_ts ON inferences (provider, model, ts)");
81
+ db.pragma("user_version = 8");
82
+ }
83
+ // v9 (Expansion E2 chunk A): runs + steps local outbox. Purely additive —
84
+ // SCHEMA_SQL's CREATE TABLE IF NOT EXISTS handles fresh AND migrating
85
+ // databases identically (it ran above), so the bump only stamps the version.
86
+ // A rig that never enables the artifact namespace simply never writes to them.
87
+ if (db.pragma("user_version", { simple: true }) < 9) {
88
+ db.pragma("user_version = 9");
89
+ }
90
+ // v10 (WS-A cache accounting): cache-write buckets + cache-key/prefix
91
+ // substrate. Additive; old rows read 0 / null (true of them — recorded before
92
+ // caching was accounted). Same ALTER pattern as v2–v6, folded over a list.
93
+ if (db.pragma("user_version", { simple: true }) < 10) {
94
+ const cols = db.prepare("PRAGMA table_info(inferences)").all();
95
+ const add = (name, ddl) => {
96
+ if (!cols.some((c) => c.name === name))
97
+ db.exec(`ALTER TABLE inferences ADD COLUMN ${ddl}`);
98
+ };
99
+ add("tokens_cache_write", "tokens_cache_write INTEGER NOT NULL DEFAULT 0");
100
+ add("tokens_cache_write_1h", "tokens_cache_write_1h INTEGER NOT NULL DEFAULT 0");
101
+ add("cache_key", "cache_key TEXT");
102
+ add("prefix_fingerprint", "prefix_fingerprint TEXT");
103
+ db.pragma("user_version = 10");
104
+ }
105
+ // v11 (routing-console R0, spec §2.1): the per-call ladder key. Three nullable
106
+ // columns; old rows read null ("recorded by an SDK older than 0.4.0"). Additive;
107
+ // same ALTER-over-a-list pattern as v10. No backfill (it cannot be derived).
108
+ if (db.pragma("user_version", { simple: true }) < 11) {
109
+ const cols = db.prepare("PRAGMA table_info(inferences)").all();
110
+ const add = (name, ddl) => {
111
+ if (!cols.some((c) => c.name === name))
112
+ db.exec(`ALTER TABLE inferences ADD COLUMN ${ddl}`);
113
+ };
114
+ add("call_id", "call_id TEXT");
115
+ add("attempt_seq", "attempt_seq INTEGER");
116
+ add("candidate_index", "candidate_index INTEGER");
117
+ db.pragma("user_version = 11");
118
+ }
119
+ }
@@ -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;AAE7F;;;;;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;AA6RD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CA8V3E"}
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"}
@@ -19,6 +19,7 @@ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
19
19
  const node_fs_1 = require("node:fs");
20
20
  const node_path_1 = require("node:path");
21
21
  const health_1 = require("./health");
22
+ const store_migrations_1 = require("./store-migrations");
22
23
  const SCHEMA_SQL = `
23
24
  CREATE TABLE IF NOT EXISTS inferences (
24
25
  id TEXT PRIMARY KEY,
@@ -47,7 +48,12 @@ CREATE TABLE IF NOT EXISTS inferences (
47
48
  tokens_cache_write INTEGER NOT NULL DEFAULT 0,
48
49
  tokens_cache_write_1h INTEGER NOT NULL DEFAULT 0,
49
50
  cache_key TEXT,
50
- prefix_fingerprint TEXT
51
+ prefix_fingerprint TEXT,
52
+ -- v11 (routing-console R0): the per-call ladder key. Fresh here; older
53
+ -- databases gain them via the ALTER ladder. Null = recorded pre-0.4.0.
54
+ call_id TEXT,
55
+ attempt_seq INTEGER,
56
+ candidate_index INTEGER
51
57
  );
52
58
  CREATE INDEX IF NOT EXISTS idx_inferences_route_ts ON inferences (route, ts);
53
59
  -- v8 (G-4 observed-health): per-endpoint windowed aggregation filters by
@@ -213,6 +219,11 @@ function toTelemetryRow(r) {
213
219
  tokensCacheWrite1h: r.tokens_cache_write_1h ?? 0,
214
220
  cacheKey: r.cache_key ?? null,
215
221
  prefixFingerprint: r.prefix_fingerprint ?? null,
222
+ // Ladder key (spec §2.1 R0) — `?? null`: a v10-or-earlier database returns
223
+ // undefined for a v11 ALTER column, and those rows genuinely predate the key.
224
+ callId: r.call_id ?? null,
225
+ attemptSeq: r.attempt_seq ?? null,
226
+ candidateIndex: r.candidate_index ?? null,
216
227
  };
217
228
  }
218
229
  function toEnvelopeRow(r) {
@@ -228,107 +239,23 @@ function openTelemetryStore(dbPath) {
228
239
  const db = new better_sqlite3_1.default(dbPath);
229
240
  db.pragma("journal_mode = WAL");
230
241
  db.exec(SCHEMA_SQL);
231
- // Migrations, idempotent on every open. Fresh databases get the full v2
232
- // schema from SCHEMA_SQL above; v1 databases (tables pre-existing, so the
233
- // CREATEs were no-ops) gain the fingerprint_cell column additively —
234
- // existing rows are untouched and read back with fingerprint_cell = NULL.
235
- if (db.pragma("user_version", { simple: true }) < 2) {
236
- const columns = db.prepare("PRAGMA table_info(inferences)").all();
237
- if (!columns.some((c) => c.name === "fingerprint_cell")) {
238
- db.exec("ALTER TABLE inferences ADD COLUMN fingerprint_cell TEXT");
239
- }
240
- db.pragma("user_version = 2");
241
- }
242
- // v3 (Phase 3): captures table (from SCHEMA_SQL above — a no-op CREATE on
243
- // fresh databases) + the variant/repair columns, additive and nullable.
244
- if (db.pragma("user_version", { simple: true }) < 3) {
245
- const columns = db.prepare("PRAGMA table_info(inferences)").all();
246
- if (!columns.some((c) => c.name === "served_variant")) {
247
- db.exec("ALTER TABLE inferences ADD COLUMN served_variant TEXT");
248
- }
249
- if (!columns.some((c) => c.name === "repaired_by")) {
250
- db.exec("ALTER TABLE inferences ADD COLUMN repaired_by TEXT");
251
- }
252
- db.pragma("user_version = 3");
253
- }
254
- // v4 (addendum A1): pricing_missing flag — additive; old rows read false.
255
- if (db.pragma("user_version", { simple: true }) < 4) {
256
- const columns = db.prepare("PRAGMA table_info(inferences)").all();
257
- if (!columns.some((c) => c.name === "pricing_missing")) {
258
- db.exec("ALTER TABLE inferences ADD COLUMN pricing_missing INTEGER NOT NULL DEFAULT 0");
259
- }
260
- db.pragma("user_version = 4");
261
- }
262
- // v5 (Phase 4 WS2): feedback table — purely additive; SCHEMA_SQL's
263
- // CREATE IF NOT EXISTS handles fresh AND migrating databases identically,
264
- // so the bump only stamps the version.
265
- if (db.pragma("user_version", { simple: true }) < 5) {
266
- db.pragma("user_version = 5");
267
- }
268
- // v6 (Phase 4 WS3): ttfb_ms — additive, nullable; old rows read null.
269
- if (db.pragma("user_version", { simple: true }) < 6) {
270
- const columns = db.prepare("PRAGMA table_info(inferences)").all();
271
- if (!columns.some((c) => c.name === "ttfb_ms")) {
272
- db.exec("ALTER TABLE inferences ADD COLUMN ttfb_ms INTEGER");
273
- }
274
- db.pragma("user_version = 6");
275
- }
276
- // v7 (Phase 6 WS2): feedback.org_id + feedback.created_by — additive,
277
- // nullable. Old verdicts read null on both, which is TRUE of them: they were
278
- // recorded before either concept existed, and backfilling a guess into an
279
- // unrecomputable record is exactly what 00017 refused to do.
280
- if (db.pragma("user_version", { simple: true }) < 7) {
281
- const columns = db.prepare("PRAGMA table_info(feedback)").all();
282
- if (!columns.some((c) => c.name === "org_id")) {
283
- db.exec("ALTER TABLE feedback ADD COLUMN org_id TEXT");
284
- }
285
- if (!columns.some((c) => c.name === "created_by")) {
286
- db.exec("ALTER TABLE feedback ADD COLUMN created_by TEXT");
287
- }
288
- db.pragma("user_version = 7");
289
- }
290
- // v8 (G-4 observed-health): idx_inferences_provider_model_ts — index-only, no
291
- // data change. SCHEMA_SQL's CREATE INDEX IF NOT EXISTS handles fresh AND
292
- // migrating databases identically (it ran above), so the bump only stamps the
293
- // version. Kept explicit rather than folded into v5's bare-stamp branch so the
294
- // migration ladder reads one rung per schema epoch.
295
- if (db.pragma("user_version", { simple: true }) < 8) {
296
- db.exec("CREATE INDEX IF NOT EXISTS idx_inferences_provider_model_ts ON inferences (provider, model, ts)");
297
- db.pragma("user_version = 8");
298
- }
299
- // v9 (Expansion E2 chunk A): runs + steps local outbox. Purely additive —
300
- // SCHEMA_SQL's CREATE TABLE IF NOT EXISTS handles fresh AND migrating
301
- // databases identically (it ran above), so the bump only stamps the version.
302
- // A rig that never enables the artifact namespace simply never writes to them.
303
- if (db.pragma("user_version", { simple: true }) < 9) {
304
- db.pragma("user_version = 9");
305
- }
306
- // v10 (WS-A cache accounting): cache-write buckets + cache-key/prefix
307
- // substrate. Additive; old rows read 0 / null (true of them — recorded before
308
- // caching was accounted). Same ALTER pattern as v2–v6, folded over a list.
309
- if (db.pragma("user_version", { simple: true }) < 10) {
310
- const cols = db.prepare("PRAGMA table_info(inferences)").all();
311
- const add = (name, ddl) => {
312
- if (!cols.some((c) => c.name === name))
313
- db.exec(`ALTER TABLE inferences ADD COLUMN ${ddl}`);
314
- };
315
- add("tokens_cache_write", "tokens_cache_write INTEGER NOT NULL DEFAULT 0");
316
- add("tokens_cache_write_1h", "tokens_cache_write_1h INTEGER NOT NULL DEFAULT 0");
317
- add("cache_key", "cache_key TEXT");
318
- add("prefix_fingerprint", "prefix_fingerprint TEXT");
319
- db.pragma("user_version = 10");
320
- }
242
+ // Schema migrations — idempotent on every open (telemetry/store-migrations.ts).
243
+ // Fresh databases get the full current schema from SCHEMA_SQL above; older
244
+ // databases gain the additive columns via the ALTER ladder.
245
+ (0, store_migrations_1.runStoreMigrations)(db);
321
246
  const insertInference = db.prepare(`
322
247
  INSERT INTO inferences (
323
248
  id, ts, route, route_version, provider, model, requested_tier, served_tier,
324
249
  tokens_in, tokens_out, tokens_cached, cost_estimate_usd, latency_ms, ttfb_ms,
325
250
  failure_class, attempts_json, tags_json, fingerprint_cell, served_variant, repaired_by, pricing_missing,
326
- tokens_cache_write, tokens_cache_write_1h, cache_key, prefix_fingerprint
251
+ tokens_cache_write, tokens_cache_write_1h, cache_key, prefix_fingerprint,
252
+ call_id, attempt_seq, candidate_index
327
253
  ) VALUES (
328
254
  @id, @ts, @route, @route_version, @provider, @model, @requested_tier, @served_tier,
329
255
  @tokens_in, @tokens_out, @tokens_cached, @cost_estimate_usd, @latency_ms, @ttfb_ms,
330
256
  @failure_class, @attempts_json, @tags_json, @fingerprint_cell, @served_variant, @repaired_by, @pricing_missing,
331
- @tokens_cache_write, @tokens_cache_write_1h, @cache_key, @prefix_fingerprint
257
+ @tokens_cache_write, @tokens_cache_write_1h, @cache_key, @prefix_fingerprint,
258
+ @call_id, @attempt_seq, @candidate_index
332
259
  )
333
260
  `);
334
261
  const selectByTag = db.prepare(`
@@ -413,6 +340,12 @@ function openTelemetryStore(dbPath) {
413
340
  tokens_cache_write_1h: row.tokensCacheWrite1h ?? 0,
414
341
  cache_key: row.cacheKey ?? null,
415
342
  prefix_fingerprint: row.prefixFingerprint ?? null,
343
+ // `?? null`: the ladder-key fields are optional on TelemetryRow, and
344
+ // better-sqlite3 rejects an `undefined` bound param — a row that omits
345
+ // them (pre-0.4.0 read-back) binds null (the nullable-column default).
346
+ call_id: row.callId ?? null,
347
+ attempt_seq: row.attemptSeq ?? null,
348
+ candidate_index: row.candidateIndex ?? null,
416
349
  });
417
350
  },
418
351
  recordFeedback(row) {
@@ -22,7 +22,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.FAILURE_TEACHING = void 0;
23
23
  exports.teach = teach;
24
24
  exports.renderFailureForTerminal = renderFailureForTerminal;
25
- const DOCS_BASE = "https://modelrig.dev/docs/failures";
25
+ const DOCS_BASE = "https://modelrig.dev/routing-reliability.html";
26
26
  exports.FAILURE_TEACHING = {
27
27
  content_invalid: {
28
28
  class: "content_invalid",
@@ -136,6 +136,19 @@ export interface AdapterRequest {
136
136
  * the gemini adapter rejects a non-thinking model (adapters/gemini.ts).
137
137
  */
138
138
  readonly reasoning?: ReasoningParams;
139
+ /**
140
+ * Declared response-format shaping (CE-9, spec R4). Threaded from the raw
141
+ * lane's `RawRunInput.responseFormat` (run/raw.ts). `"json_object"` maps to
142
+ * each provider's syntactic-JSON directive: the OpenAI-dialect providers
143
+ * (openai/deepseek/grok/deepinfra/fireworks) → `response_format: { type:
144
+ * "json_object" }`; gemini → `responseMimeType: "application/json"` WITHOUT a
145
+ * schema. This is MIME-SHAPING, NOT schema enforcement — F4 stands: the raw
146
+ * lane never validates or repairs and `meta.validated` stays false. Anthropic
147
+ * has no equivalent and FAILS CLOSED at the raw-lane guard (run/raw.ts);
148
+ * absent ⇒ no key added (byte-identical). Never set alongside a non-null
149
+ * `outputSchema` — the routed lane uses `outputSchema`, the raw lane this
150
+ * field; where both could appear, `outputSchema` (native/strict) wins. */
151
+ readonly responseFormat?: "json_object";
139
152
  /** Unified tool-calling (spec §4.4) — tools the model may call. Adapters map
140
153
  * to native tool shapes; absent => no tool surface (identical to today). */
141
154
  readonly tools?: readonly ToolDefinition[];
@@ -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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"}
@@ -7,6 +7,23 @@ import type { ProviderId, SamplingParams, ServiceTier, ToolCall, ToolChoice, Too
7
7
  export interface CandidateSpec {
8
8
  readonly provider: ProviderId;
9
9
  readonly model: string;
10
+ /**
11
+ * Declare-first experiment flag (routing-console spec §4.4, R3). A `trial`
12
+ * candidate is DECLARED — it is in the list the brand type, the loader and the
13
+ * runtime candidate-set guard all derive from, so the candidate-set invariant
14
+ * is untouched — but `resolveCandidates` drops it on EVERY live path
15
+ * (`rig.run`, `runStream`, `runBundle`, the hosted gateway slug lane) exactly
16
+ * as it drops a `providers.ignore` entry. Only the bake-off replay path
17
+ * (`replayVariant`, run `mode: "trial"`) keeps it, so a customer can measure a
18
+ * new model on real captured traffic before promoting it to a live candidate.
19
+ * Optional & additive (S3): absent ⇒ false ⇒ an ordinary live candidate.
20
+ *
21
+ * OLDER-SDK CAVEAT (spec §7): the pre-0.4.0 loader is TOLERANT of unknown
22
+ * candidate keys — it would ignore `trial` and serve the candidate LIVE. A
23
+ * bundle using `trial: true` therefore REQUIRES the SDK release that
24
+ * understands it; the console's declare-YAML says so.
25
+ */
26
+ readonly trial?: boolean;
10
27
  }
11
28
  export type Requirement = "schema_conformant" | "grounded" | "zero_retention" | "trace_visible";
12
29
  export type Preference = "cost" | "latency";
@@ -57,6 +74,14 @@ export interface RouteVariant {
57
74
  /** JSON rung override for this variant. */
58
75
  readonly json?: "native" | "json_mode";
59
76
  readonly repair?: RepairPolicy;
77
+ /**
78
+ * COMPUTED at load (not authored): true when every candidate this variant
79
+ * narrows to is a declared `trial` candidate (routing-console spec §4.4). A
80
+ * trial variant is valid for `rig.bakeoff` but a `RouteConfigError` if a live
81
+ * caller selects it — trial candidates are declared, never live-served. The
82
+ * declare-first flow's `trial-<provider>-<model>` variant is exactly this.
83
+ */
84
+ readonly trialOnly?: boolean;
60
85
  }
61
86
  export interface RouteBundle {
62
87
  readonly route: string;
@@ -100,6 +125,12 @@ export interface RunTags {
100
125
  export interface RunOptions {
101
126
  readonly input: Record<string, unknown>;
102
127
  readonly tags: RunTags;
128
+ /** Names the ground-truth step this run records (G1 spec §3) — the same field
129
+ * the raw lane exposes, so a routed and a raw call, plus an `artifact.save`,
130
+ * can be composed into ONE step group. Resolution: `stepKey ?? tags.step ??`
131
+ * an auto-minted `route#n`. Validated `[A-Za-z0-9_.:#-]{1,128}`; an invalid
132
+ * value is warned and dropped to the auto key. Absent ⇒ unchanged behavior. */
133
+ readonly stepKey?: string;
103
134
  readonly budget?: {
104
135
  readonly envelope: string;
105
136
  /** Budget for this envelope when it is FIRST opened (open-or-get: the first
@@ -144,7 +175,7 @@ export interface RunOptions {
144
175
  * `AdapterRequest.cache` for the matching-provider candidate; ModelRig passes
145
176
  * it through verbatim and **never creates, refreshes, or deletes the underlying
146
177
  * resource** — long jobs that outlive the provider's default TTL need the
147
- * customer's OWN heartbeat (see modelrig.dev/docs/caching-lifecycle). This wins
178
+ * customer's OWN heartbeat (see modelrig.dev/caching-lifecycle.html). This wins
148
179
  * over the WS-C `cache: auto` generated stamp; absent, WS-C behavior stands
149
180
  * byte-for-byte.
150
181
  */
@@ -186,6 +217,11 @@ export interface RunMeta {
186
217
  /** "provider/model" that repaired the output — null when unrepaired
187
218
  * (Phase 3 WS2). */
188
219
  readonly repairedBy: string | null;
220
+ /** The per-call ladder key (routing-console spec §2.1 R0) — the `call_id`
221
+ * shared by every telemetry row this `run`/`runStream`/`runBundle`/`runRaw`
222
+ * invocation wrote, so a caller can correlate a `RunResult` with its ladder in
223
+ * the console. Additive & optional: a pre-0.4.0 caller's meta omits it. */
224
+ readonly callId?: string;
189
225
  /** Normalized url_citation annotations (Phase 3 WS3) — present when the
190
226
  * grounding-inject rung served this run. */
191
227
  readonly citations?: ReadonlyArray<{
@@ -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,21 @@
4
4
  */
5
5
  import type { FailureClass } from "./failures";
6
6
  import type { RunTags } from "./route";
7
+ /**
8
+ * The rung a telemetry row occupied on the candidate ladder (routing-console R1
9
+ * review ruling F1). SDK-stamped into `tags.rung` on EVERY row so the dashboard
10
+ * and ladder view can tell a real candidate dispatch apart from a tool-call turn
11
+ * or a pre-dispatch failure without column heuristics:
12
+ * • `primary` — the first dispatch of a candidate on this call.
13
+ * • `retry` — a later same-candidate dispatch after a transient fail.
14
+ * • `repair` — a repair-rung re-ask (carries the repaired candidate).
15
+ * • `search` — the grounding-inject search-cost row (`provider="search"`).
16
+ * • `tool_call` — a tool-call turn (a real model call, but not a serve).
17
+ * • `predispatch_fail` — a terminal failure recorded before any dispatch.
18
+ * Rows written by an SDK older than this release carry no `rung`; the rollup
19
+ * falls back to column heuristics (`repaired_by`, `provider="search"`).
20
+ */
21
+ export type TelemetryRung = "primary" | "retry" | "repair" | "search" | "tool_call" | "predispatch_fail";
7
22
  export interface TelemetryRow {
8
23
  readonly id: string;
9
24
  readonly ts: string;
@@ -60,6 +75,22 @@ export interface TelemetryRow {
60
75
  /** "provider/model" of the repair model that produced this row's output
61
76
  * (Phase 3 WS2) — null for unrepaired attempts. */
62
77
  readonly repairedBy: string | null;
78
+ /** The per-CALL ladder key (routing-console spec §2.1 R0). One `callId` per
79
+ * `rig.run`/`runStream`/`runBundle`/`runRaw` invocation; every attempt row of
80
+ * that call (primary, retry, repair, grounding-search, tool-call) carries it,
81
+ * so a dashboard can reconstruct the exact ladder one call walked. OPTIONAL &
82
+ * additive (same shape as {@link cacheKey}): a row that omits it — from an SDK
83
+ * older than 0.4.0, read back as `null` — predates the ladder key and is never
84
+ * backfilled. Every SDK write path (run loop, raw lane) sets all three. */
85
+ readonly callId?: string | null;
86
+ /** 1-based order of this row WITHIN its call, monotonic across every row kind
87
+ * (spec §2.1). Optional/additive; null for a pre-0.4.0 row. */
88
+ readonly attemptSeq?: number | null;
89
+ /** Position of the dispatched candidate in the call's EFFECTIVE declared list
90
+ * (after variant narrowing and per-run filters; 0 = first eligible). A repair
91
+ * row carries the index of the candidate being repaired; the raw lane is 0.
92
+ * Optional/additive; null for a pre-0.4.0 row. */
93
+ readonly candidateIndex?: number | null;
63
94
  }
64
95
  export interface EnvelopeRow {
65
96
  readonly envelopeKey: string;
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/types/telemetry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/types/telemetry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate-cli.d.ts","sourceRoot":"","sources":["../src/validate-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,wBAAgB,cAAc,IAAI,MAAM,CAmCvC"}
1
+ {"version":3,"file":"validate-cli.d.ts","sourceRoot":"","sources":["../src/validate-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,wBAAgB,cAAc,IAAI,MAAM,CA8CvC"}
@@ -13,11 +13,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.runValidateCli = runValidateCli;
14
14
  const node_path_1 = require("node:path");
15
15
  const config_1 = require("./config");
16
+ const rawonly_1 = require("./run/rawonly");
16
17
  const loader_1 = require("./routes/loader");
17
18
  const manifest_1 = require("./routes/manifest");
18
19
  function runValidateCli() {
19
20
  const config = (0, config_1.loadConfigFromEnv)();
20
- const rigDir = (0, node_path_1.dirname)(config.routesDir);
21
+ const routesDir = (0, rawonly_1.requireRoutesDir)(config, "modelrig validate");
22
+ const rigDir = (0, node_path_1.dirname)(routesDir);
21
23
  let failures = 0;
22
24
  // rig.yaml (manifest) — absence is fine (never gates); a malformed one is a
23
25
  // config error surfaced like any route.
@@ -29,10 +31,21 @@ function runValidateCli() {
29
31
  failures += 1;
30
32
  console.error(`FAIL rig.yaml: ${configErrorText(err)}`);
31
33
  }
32
- // Every route bundle — one bad file never hides the rest.
33
- const results = (0, loader_1.validateRoutesDir)(config.routesDir);
34
+ // Every route bundle — one bad file never hides the rest. A validation command
35
+ // should REPORT, never throw: a missing/unreadable routes dir is a FAIL line +
36
+ // nonzero exit, not a rejected promise (so an embedder calling this gets a clean
37
+ // return, and the CLI output stays uniform).
38
+ let results;
39
+ try {
40
+ results = (0, loader_1.validateRoutesDir)(routesDir);
41
+ }
42
+ catch (err) {
43
+ console.error(`FAIL routes: ${configErrorText(err)}`);
44
+ console.error(`\n${failures + 1} problem(s) found.`);
45
+ return 1;
46
+ }
34
47
  if (results.length === 0) {
35
- console.log(`(no route bundles in ${config.routesDir})`);
48
+ console.log(`(no route bundles in ${routesDir})`);
36
49
  }
37
50
  for (const r of results) {
38
51
  if (r.ok) {